164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others. 264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html 3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru****************************************************************************** 5c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* Copyright (C) 1997-2015, International Business Machines 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru****************************************************************************** 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Date Name Description 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 03/22/00 aliu Adapted from original C++ ICU Hashtable. 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 07/06/01 aliu Modified to support int32_t keys on 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* platforms with sizeof(void*) < 32. 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru****************************************************************************** 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef UHASH_H 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define UHASH_H 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 1983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#include "cmemory.h" 2083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#include "uelement.h" 211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#include "unicode/localpointer.h" 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UHashtable stores key-value pairs and does moderately fast lookup 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * based on keys. It provides a good tradeoff between access time and 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * storage space. As elements are added to it, it grows to accomodate 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * them. By default, the table never shrinks, even if all elements 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * are removed from it. 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Keys and values are stored as void* pointers. These void* pointers 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * may be actual pointers to strings, objects, or any other structure 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * in memory, or they may simply be integral values cast to void*. 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UHashtable doesn't care and manipulates them via user-supplied 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * functions. These functions hash keys, compare keys, delete keys, 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and delete values. Some function pointers are optional (may be 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * NULL); others must be supplied. Several prebuilt functions exist 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * to handle common key types. 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UHashtable ownership of keys and values is flexible, and controlled 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * by whether or not the key deleter and value deleter functions are 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * set. If a void* key is actually a pointer to a deletable object, 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * then UHashtable can be made to delete that object by setting the 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * key deleter function pointer to a non-NULL value. If this is done, 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * then keys passed to uhash_put() are owned by the hashtable and will 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * be deleted by it at some point, either as keys are replaced, or 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * when uhash_close() is finally called. The same is true of values 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and the value deleter function pointer. Keys passed to methods 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * other than uhash_put() are never owned by the hashtable. 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * NULL values are not allowed. uhash_get() returns NULL to indicate 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * a key that is not in the table, and having a NULL value in the 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * table would generate an ambiguous result. If a key and a NULL 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * value is passed to uhash_put(), this has the effect of doing a 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * uhash_remove() on that key. This keeps uhash_get(), uhash_count(), 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and uhash_nextElement() consistent with one another. 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * To see everything in a hashtable, use uhash_nextElement() to 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * iterate through its contents. Each call to this function returns a 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UHashElement pointer. A hash element contains a key, value, and 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * hashcode. During iteration an element may be deleted by calling 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * uhash_removeElement(); iteration may safely continue thereafter. 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * The uhash_remove() function may also be safely called in 63c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * mid-iteration. If uhash_put() is called during iteration, 64c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * the iteration is still guaranteed to terminate reasonably, but 65c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * there is no guarantee that every element will be returned or that 66c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * some won't be returned more than once. 67c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * 68c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * Under no circumstances should the UHashElement returned by 69c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * uhash_nextElement be modified directly. 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * By default, the hashtable grows when necessary, but never shrinks, 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * even if all items are removed. For most applications this is 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * optimal. However, in a highly dynamic usage where memory is at a 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * premium, the table can be set to both grow and shrink by calling 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * uhash_setResizePolicy() with the policy U_GROW_AND_SHRINK. In a 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * situation where memory is critical and the client wants a table 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * that does not grow at all, the constant U_FIXED can be used. 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/******************************************************************** 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Data Structures 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/ 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CDECL_BEGIN 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 8783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius * A key or value within a UHashtable. 8883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius * The hashing and comparison functions take a pointer to a 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UHashTok, but the deleter receives the void* pointer within it. 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 9183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliustypedef UElement UHashTok; 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This is a single hash element. 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct UHashElement { 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Reorder these elements to pack nicely if necessary */ 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t hashcode; 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UHashTok value; 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UHashTok key; 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct UHashElement UHashElement; 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * A hashing function. 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key A key stored in a hashtable 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return A NON-NEGATIVE hash code for parm. 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef int32_t U_CALLCONV UHashFunction(const UHashTok key); 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 11283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius * A key equality (boolean) comparison function. 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 11483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliustypedef UElementsAreEqual UKeyComparator; 11583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 11783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius * A value equality (boolean) comparison function. 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 11983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliustypedef UElementsAreEqual UValueComparator; 12083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 12183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius/* see cmemory.h for UObjectDeleter and uprv_deleteUObject() */ 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This specifies whether or not, and how, the hastable resizes itself. 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * See uhash_setResizePolicy(). 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruenum UHashResizePolicy { 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_GROW, /* Grow on demand, do not shrink */ 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_GROW_AND_SHRINK, /* Grow and shrink on demand */ 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_FIXED /* Never change size */ 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * The UHashtable struct. Clients should treat this as an opaque data 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * type and manipulate it only through the uhash_... API. 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct UHashtable { 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Main key-value pair storage array */ 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UHashElement *elements; 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Function pointers */ 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UHashFunction *keyHasher; /* Computes hash from key. 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Never null. */ 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UKeyComparator *keyComparator; /* Compares keys for equality. 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Never null. */ 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UValueComparator *valueComparator; /* Compares the values for equality */ 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UObjectDeleter *keyDeleter; /* Deletes keys when required. 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * If NULL won't do anything */ 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UObjectDeleter *valueDeleter; /* Deletes values when required. 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * If NULL won't do anything */ 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Size parameters */ 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t count; /* The number of key-value pairs in this table. 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 0 <= count <= length. In practice we 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * never let count == length (see code). */ 161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t length; /* The physical size of the arrays hashes, keys 162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and values. Must be prime. */ 163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Rehashing thresholds */ 165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t highWaterMark; /* If count > highWaterMark, rehash */ 167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t lowWaterMark; /* If count < lowWaterMark, rehash */ 168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru float highWaterRatio; /* 0..1; high water as a fraction of length */ 169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru float lowWaterRatio; /* 0..1; low water as a fraction of length */ 170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 17185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int8_t primeIndex; /* Index into our prime table for length. 17285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * length == PRIMES[primeIndex] */ 173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool allocated; /* Was this UHashtable allocated? */ 174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct UHashtable UHashtable; 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CDECL_END 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/******************************************************************** 180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * API 181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/ 182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Initialize a new UHashtable. 185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param keyHash A pointer to the key hashing function. Must not be 186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * NULL. 187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param keyComp A pointer to the function that compares keys. Must 188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * not be NULL. 189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param status A pointer to an UErrorCode to receive any errors. 190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return A pointer to a UHashtable, or 0 if an error occurred. 191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @see uhash_openSize 192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UHashtable* U_EXPORT2 194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_open(UHashFunction *keyHash, 195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UKeyComparator *keyComp, 196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UValueComparator *valueComp, 197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode *status); 198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Initialize a new UHashtable with a given initial size. 201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param keyHash A pointer to the key hashing function. Must not be 202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * NULL. 203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param keyComp A pointer to the function that compares keys. Must 204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * not be NULL. 205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param size The initial capacity of this hash table. 206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param status A pointer to an UErrorCode to receive any errors. 207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return A pointer to a UHashtable, or 0 if an error occurred. 208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @see uhash_open 209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UHashtable* U_EXPORT2 211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_openSize(UHashFunction *keyHash, 212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UKeyComparator *keyComp, 213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UValueComparator *valueComp, 214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t size, 215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode *status); 216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Initialize an existing UHashtable. 219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param keyHash A pointer to the key hashing function. Must not be 220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * NULL. 221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param keyComp A pointer to the function that compares keys. Must 222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * not be NULL. 223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param status A pointer to an UErrorCode to receive any errors. 224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return A pointer to a UHashtable, or 0 if an error occurred. 225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @see uhash_openSize 226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UHashtable* U_EXPORT2 228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_init(UHashtable *hash, 229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UHashFunction *keyHash, 230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UKeyComparator *keyComp, 231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UValueComparator *valueComp, 232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode *status); 233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Close a UHashtable, releasing the memory used. 23685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * @param hash The UHashtable to close. If hash is NULL no operation is performed. 237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2 239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_close(UHashtable *hash); 240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Set the function used to hash keys. 245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The UHashtable to set 246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param fn the function to be used hash keys; must not be NULL 247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return the previous key hasher; non-NULL 248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UHashFunction *U_EXPORT2 250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_setKeyHasher(UHashtable *hash, UHashFunction *fn); 251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Set the function used to compare keys. The default comparison is a 254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * void* pointer comparison. 255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The UHashtable to set 256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param fn the function to be used compare keys; must not be NULL 257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return the previous key comparator; non-NULL 258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UKeyComparator *U_EXPORT2 260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_setKeyComparator(UHashtable *hash, UKeyComparator *fn); 261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Set the function used to compare values. The default comparison is a 264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * void* pointer comparison. 265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The UHashtable to set 266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param fn the function to be used compare keys; must not be NULL 267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return the previous key comparator; non-NULL 268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UValueComparator *U_EXPORT2 270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_setValueComparator(UHashtable *hash, UValueComparator *fn); 271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Set the function used to delete keys. If this function pointer is 274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * NULL, this hashtable does not delete keys. If it is non-NULL, this 275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * hashtable does delete keys. This function should be set once 276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * before any elements are added to the hashtable and should not be 277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * changed thereafter. 278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The UHashtable to set 279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param fn the function to be used delete keys, or NULL 280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return the previous key deleter; may be NULL 281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UObjectDeleter *U_EXPORT2 283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_setKeyDeleter(UHashtable *hash, UObjectDeleter *fn); 284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Set the function used to delete values. If this function pointer 287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * is NULL, this hashtable does not delete values. If it is non-NULL, 288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * this hashtable does delete values. This function should be set 289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * once before any elements are added to the hashtable and should not 290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * be changed thereafter. 291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The UHashtable to set 292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param fn the function to be used delete values, or NULL 293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return the previous value deleter; may be NULL 294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UObjectDeleter *U_EXPORT2 296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_setValueDeleter(UHashtable *hash, UObjectDeleter *fn); 297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Specify whether or not, and how, the hastable resizes itself. 300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * By default, tables grow but do not shrink (policy U_GROW). 301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * See enum UHashResizePolicy. 302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The UHashtable to set 303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param policy The way the hashtable resizes itself, {U_GROW, U_GROW_AND_SHRINK, U_FIXED} 304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2 306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_setResizePolicy(UHashtable *hash, enum UHashResizePolicy policy); 307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Get the number of key-value pairs stored in a UHashtable. 310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The UHashtable to query. 311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The number of key-value pairs stored in hash. 312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_count(const UHashtable *hash); 315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Put a (key=pointer, value=pointer) item in a UHashtable. If the 318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * keyDeleter is non-NULL, then the hashtable owns 'key' after this 319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * call. If the valueDeleter is non-NULL, then the hashtable owns 320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 'value' after this call. Storing a NULL value is the same as 321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * calling uhash_remove(). 322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key The key to store. 324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param value The value to store, may be NULL (see above). 325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param status A pointer to an UErrorCode to receive any errors. 326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The previous value, or NULL if none. 327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @see uhash_get 328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void* U_EXPORT2 330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_put(UHashtable *hash, 331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void *key, 332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void *value, 333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode *status); 334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Put a (key=integer, value=pointer) item in a UHashtable. 337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * keyDeleter must be NULL. If the valueDeleter is non-NULL, then the 338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * hashtable owns 'value' after this call. Storing a NULL value is 339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * the same as calling uhash_remove(). 340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key The integer key to store. 342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param value The value to store, may be NULL (see above). 343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param status A pointer to an UErrorCode to receive any errors. 344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The previous value, or NULL if none. 345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @see uhash_get 346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void* U_EXPORT2 348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_iput(UHashtable *hash, 349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t key, 350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void* value, 351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode *status); 352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Put a (key=pointer, value=integer) item in a UHashtable. If the 355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * keyDeleter is non-NULL, then the hashtable owns 'key' after this 356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * call. valueDeleter must be NULL. Storing a 0 value is the same as 357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * calling uhash_remove(). 358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key The key to store. 360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param value The integer value to store. 361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param status A pointer to an UErrorCode to receive any errors. 362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The previous value, or 0 if none. 363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @see uhash_get 364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_puti(UHashtable *hash, 367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void* key, 368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t value, 369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode *status); 370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Put a (key=integer, value=integer) item in a UHashtable. If the 373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * keyDeleter is non-NULL, then the hashtable owns 'key' after this 374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * call. valueDeleter must be NULL. Storing a 0 value is the same as 375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * calling uhash_remove(). 376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key The key to store. 378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param value The integer value to store. 379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param status A pointer to an UErrorCode to receive any errors. 380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The previous value, or 0 if none. 381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @see uhash_get 382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_iputi(UHashtable *hash, 385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t key, 386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t value, 387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode *status); 388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Retrieve a pointer value from a UHashtable using a pointer key, 391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * as previously stored by uhash_put(). 392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key A pointer key stored in a hashtable 394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The requested item, or NULL if not found. 395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void* U_EXPORT2 397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_get(const UHashtable *hash, 398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const void *key); 399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Retrieve a pointer value from a UHashtable using a integer key, 402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * as previously stored by uhash_iput(). 403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key An integer key stored in a hashtable 405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The requested item, or NULL if not found. 406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void* U_EXPORT2 408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_iget(const UHashtable *hash, 409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t key); 410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Retrieve an integer value from a UHashtable using a pointer key, 413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * as previously stored by uhash_puti(). 414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key A pointer key stored in a hashtable 416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The requested item, or 0 if not found. 417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_geti(const UHashtable *hash, 420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const void* key); 421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Retrieve an integer value from a UHashtable using an integer key, 423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * as previously stored by uhash_iputi(). 424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key An integer key stored in a hashtable 426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The requested item, or 0 if not found. 427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_igeti(const UHashtable *hash, 430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t key); 431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Remove an item from a UHashtable stored by uhash_put(). 434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key A key stored in a hashtable 436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The item removed, or NULL if not found. 437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void* U_EXPORT2 439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_remove(UHashtable *hash, 440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const void *key); 441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Remove an item from a UHashtable stored by uhash_iput(). 444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key An integer key stored in a hashtable 446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The item removed, or NULL if not found. 447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void* U_EXPORT2 449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_iremove(UHashtable *hash, 450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t key); 451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Remove an item from a UHashtable stored by uhash_puti(). 454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key An key stored in a hashtable 456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The item removed, or 0 if not found. 457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_removei(UHashtable *hash, 460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const void* key); 461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Remove an item from a UHashtable stored by uhash_iputi(). 464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key An integer key stored in a hashtable 466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The item removed, or 0 if not found. 467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_iremovei(UHashtable *hash, 470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t key); 471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Remove all items from a UHashtable. 474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2 477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_removeAll(UHashtable *hash); 478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Locate an element of a UHashtable. The caller must not modify the 481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * returned object. The primary use of this function is to obtain the 482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * stored key when it may not be identical to the search key. For 483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * example, if the compare function is a case-insensitive string 484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * compare, then the hash key may be desired in order to obtain the 485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * canonical case corresponding to a search key. 486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key A key stored in a hashtable 488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return a hash element, or NULL if the key is not found. 489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI const UHashElement* U_EXPORT2 491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_find(const UHashtable *hash, const void* key); 492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 4941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * \def UHASH_FIRST 4951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * Constant for use with uhash_nextElement 4961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * @see uhash_nextElement 4971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert */ 4981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#define UHASH_FIRST (-1) 4991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 5001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert/** 501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Iterate through the elements of a UHashtable. The caller must not 502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * modify the returned object. However, uhash_removeElement() may be 503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * called during iteration to remove an element from the table. 504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Iteration may safely be resumed afterwards. If uhash_put() is 505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * called during iteration the iteration will then be out of sync and 506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * should be restarted. 507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The target UHashtable. 5081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * @param pos This should be set to UHASH_FIRST initially, and left untouched 509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * thereafter. 510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return a hash element, or NULL if no further key-value pairs 511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * exist in the table. 512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI const UHashElement* U_EXPORT2 514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_nextElement(const UHashtable *hash, 515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t *pos); 516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Remove an element, returned by uhash_nextElement(), from the table. 519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Iteration may be safely continued afterwards. 520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash The hashtable 521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param e The element, returned by uhash_nextElement(), to remove. 522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Must not be NULL. Must not be an empty or deleted element (as long 523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * as this was returned by uhash_nextElement() it will not be empty or 524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * deleted). Note: Although this parameter is const, it will be 525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * modified. 526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return the value that was removed. 527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void* U_EXPORT2 529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_removeElement(UHashtable *hash, const UHashElement* e); 530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/******************************************************************** 532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UHashTok convenience 533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/ 534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Return a UHashTok for an integer. 537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param i The given integer 538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return a UHashTok for an integer. 539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*U_CAPI UHashTok U_EXPORT2 541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_toki(int32_t i);*/ 542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Return a UHashTok for a pointer. 545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param p The given pointer 546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return a UHashTok for a pointer. 547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*U_CAPI UHashTok U_EXPORT2 549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_tokp(void* p);*/ 550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/******************************************************************** 552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UChar* and char* Support Functions 553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/ 554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Generate a hash code for a null-terminated UChar* string. If the 557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * string is not null-terminated do not use this function. Use 558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * together with uhash_compareUChars. 559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key The string (const UChar*) to hash. 560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return A hash code for the key. 561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_hashUChars(const UHashTok key); 564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 566ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Generate a hash code for a null-terminated char* string. If the 567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * string is not null-terminated do not use this function. Use 568ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * together with uhash_compareChars. 569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key The string (const char*) to hash. 570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return A hash code for the key. 571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_hashChars(const UHashTok key); 574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Generate a case-insensitive hash code for a null-terminated char* 577ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * string. If the string is not null-terminated do not use this 578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * function. Use together with uhash_compareIChars. 579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key The string (const char*) to hash. 580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return A hash code for the key. 581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_hashIChars(const UHashTok key); 584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Comparator for null-terminated UChar* strings. Use together with 587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * uhash_hashUChars. 588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key1 The string for comparison 589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key2 The string for comparison 590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return true if key1 and key2 are equal, return false otherwise. 591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_compareUChars(const UHashTok key1, const UHashTok key2); 594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Comparator for null-terminated char* strings. Use together with 597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * uhash_hashChars. 598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key1 The string for comparison 599ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key2 The string for comparison 600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return true if key1 and key2 are equal, return false otherwise. 601ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_compareChars(const UHashTok key1, const UHashTok key2); 604ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Case-insensitive comparator for null-terminated char* strings. Use 607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * together with uhash_hashIChars. 608ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key1 The string for comparison 609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key2 The string for comparison 610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return true if key1 and key2 are equal, return false otherwise. 611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_compareIChars(const UHashTok key1, const UHashTok key2); 614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/******************************************************************** 616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UnicodeString Support Functions 617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/ 618ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Hash function for UnicodeString* keys. 621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key The string (const char*) to hash. 622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return A hash code for the key. 623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 62583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusuhash_hashUnicodeString(const UElement key); 626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Hash function for UnicodeString* keys (case insensitive). 629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Make sure to use together with uhash_compareCaselessUnicodeString. 630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key The string (const char*) to hash. 631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return A hash code for the key. 632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 63483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusuhash_hashCaselessUnicodeString(const UElement key); 635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/******************************************************************** 637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * int32_t Support Functions 638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/ 639ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 641ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Hash function for 32-bit integer keys. 642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key The string (const char*) to hash. 643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return A hash code for the key. 644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_hashLong(const UHashTok key); 647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Comparator function for 32-bit integer keys. 650ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param key1 The integer for comparison 651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param Key2 The integer for comparison 652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return true if key1 and key2 are equal, return false otherwise 653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_compareLong(const UHashTok key1, const UHashTok key2); 656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/******************************************************************** 658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Other Support Functions 659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/ 660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Deleter for Hashtable objects. 663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param obj The object to be deleted 664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2 666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_deleteHashtable(void *obj); 667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 66883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius/* Use uprv_free() itself as a deleter for any key or value allocated using uprv_malloc. */ 669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Checks if the given hash tables are equal or not. 672ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash1 673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param hash2 674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return true if the hashtables are equal and false if not. 675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UBool U_EXPORT2 677ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuhash_equals(const UHashtable* hash1, const UHashtable* hash2); 678ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 6791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 6801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#if U_SHOW_CPLUSPLUS_API 6811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 6821b7d32f919554dda9c193b32188251337bc756f1Fredrik RoubertU_NAMESPACE_BEGIN 6831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 6841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert/** 68564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert * \class LocalUHashtablePointer 68664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert * "Smart pointer" class, closes a UHashtable via uhash_close(). 6871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * For most methods see the LocalPointerBase base class. 6881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * 6891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * @see LocalPointerBase 6901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * @see LocalPointer 6911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * @stable ICU 4.4 6921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert */ 6931b7d32f919554dda9c193b32188251337bc756f1Fredrik RoubertU_DEFINE_LOCAL_OPEN_POINTER(LocalUHashtablePointer, UHashtable, uhash_close); 6941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 6951b7d32f919554dda9c193b32188251337bc756f1Fredrik RoubertU_NAMESPACE_END 6961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 6971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#endif 6981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 699ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 700