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