Manual Pages for UNIX Darwin command on man Tcl_InitHashTable
MyWebUniversity

Manual Pages for UNIX Darwin command on man Tcl_InitHashTable

TclHash(3) Tcl Library Procedures TclHash(3)

NAME

TclInitHashTable, TclInitCustomHashTable, TclInitObjHashTable, TclDeleteHashTable, TclCreateHashEntry, TclDeleteHashEntry, TclFindHashEntry, TclGetHashValue, TclSetHashValue, TclGetHashKey,

TclFirstHashEntry, TclNextHashEntry, TclHashStats - procedures to

manage hash tables

SYNOPSIS

##iinncclluuddee <>

TTccllIInniittHHaasshhTTaabbllee(tablePtr, keyType) TTccllIInniittCCuussttoommHHaasshhTTaabbllee(tablePtr, keyType, typePtr) TTccllIInniittOObbjjHHaasshhTTaabbllee(tablePtr) TTccllDDeelleetteeHHaasshhTTaabbllee(tablePtr) TclHashEntry * TTccllCCrreeaatteeHHaasshhEEnnttrryy(tablePtr, key, newPtr) TTccllDDeelleetteeHHaasshhEEnnttrryy(entryPtr) TclHashEntry * TTccllFFiinnddHHaasshhEEnnttrryy(tablePtr, key) ClientData TTccllGGeettHHaasshhVVaalluuee(entryPtr) TTccllSSeettHHaasshhVVaalluuee(entryPtr, value) char * TTccllGGeettHHaasshhKKeeyy(tablePtr, entryPtr) TclHashEntry * TTccllFFiirrssttHHaasshhEEnnttrryy(tablePtr, searchPtr) TclHashEntry * TTccllNNeexxttHHaasshhEEnnttrryy(searchPtr) CONST char * TTccllHHaasshhSSttaattss(tablePtr) AARRGGUUMMEENNTTSS TclHashTable *tablePtr (in) Address of hash table structure (for all procedures but TTccllIInniittHHaasshhTTaabbllee, this must

have been initialized by previ-

ous call to TTccllIInniittHHaasshhTTaabbllee). int keyType (in) Kind of keys to use for new hash table. Must be either TCLSTRINGKEYS,

TCLONEWORDKEYS, TCLCUS-

TOMTYPEKEYS, TCLCUS-

TOMPTRKEYS, or an integer value greater than 1. TclHashKeyType *typePtr (in) Address of structure which defines the behaviour of the hash table.

CONST char *key (in) Key to use for probe into ta-

ble. Exact form depends on keyType used to create table. int *newPtr (out) The word at *newPtr is set to 1 if a new entry was created and 0 if there was already an entry for key. TclHashEntry *entryPtr (in) Pointer to hash table entry.

ClientData value (in) New value to assign to hash ta-

ble entry. Need not have type ClientData, but must fit in same space as ClientData. TclHashSearch *searchPtr (in) Pointer to record to use to

keep track of progress in enu-

merating all the entries in a hash table.

DESCRIPTION

A hash table consists of zero or more entries, each consisting of a key and a value. Given the key for an entry, the hashing routines can very quickly locate the entry, and hence its value. There may be at most one entry in a hash table with a particular key, but many entries may have

the same value. Keys can take one of four forms: strings, one-word

values, integer arrays, or custom keys defined by a TclHashKeyType structure (See section TTHHEE TTCCLLHHAASSHHKKEEYYTTYYPPEE SSTTRRUUCCTTUURREE below). All of the keys in a given table have the same form, which is specified when the table is initialized. The value of a hash table entry can be anything that fits in the same

space as a ``char *'' pointer. Values for hash table entries are man-

aged entirely by clients, not by the hash module itself. Typically each entry's value is a pointer to a data structure managed by client code. Hash tables grow gracefully as the number of entries increases, so that there are always less than three entries per hash bucket, on average. This allows for fast lookups regardless of the number of entries in a table. The core provides three functions for the initialization of hash

tables, TclInitHashTable, TclInitObjHashTable and TclInitCus-

tomHashTable.

TTccllIInniittHHaasshhTTaabbllee initializes a structure that describes a new hash ta-

ble. The space for the structure is provided by the caller, not by the hash module. The value of keyType indicates what kinds of keys will be used for all entries in the table. All of the key types described later

are allowed, with the exception of TTCCLLCCUUSSTTOOMMTTYYPPEEKKEEYYSS and TTCCLLCCUUSS-

TTOOMMPPTTRRKKEEYYSS. TTccllIInniittOObbjjHHaasshhTTaabbllee is a wrapper around TTccllIInniittCCuussttoommHHaasshhTTaabbllee and initializes a hash table whose keys are TclObj *. TTccllIInniittCCuussttoommHHaasshhTTaabbllee initializes a structure that describes a new hash table. The space for the structure is provided by the caller, not by the hash module. The value of keyType indicates what kinds of keys will be used for all entries in the table. KeyType must have one of the following values:

TTCCLLSSTTRRIINNGGKKEEYYSS Keys are null-terminated strings. They are

passed to hashing routines using the address of the first character of the string.

TTCCLLOONNEEWWOORRDDKKEEYYSS Keys are single-word values; they are passed

to hashing routines and stored in hash table entries as ``char *'' values. The pointer value is the key; it need not (and usually doesn't) actually point to a string. TTCCLLCCUUSSTTOOMMTTYYPPEEKKEEYYSS Keys are of arbitrary type, and are stored in

the entry. Hashing and comparison is deter-

mined by typePtr. The TclHashKeyType struc-

ture is described in the section TTHHEE TTCCLLHHAASSHHKKEEYYTTYYPPEE SSTTRRUUCCTTUURREE below. TTCCLLCCUUSSTTOOMMPPTTRRKKEEYYSS Keys are pointers to an arbitrary type, and

are stored in the entry. Hashing and compari-

son is determined by typePtr. The TclHashKey-

Type structure is described in the section TTHHEE TTCCLLHHAASSHHKKEEYYTTYYPPEE SSTTRRUUCCTTUURREE below. other If keyType is not one of the above, then it must be an integer value greater than 1. In this case the keys will be arrays of ``int'' values, where keyType gives the number of ints in each key. This allows structures to be used as keys. All keys must have the same size. Array keys are passed into hashing functions using the address of the first int in the array. TTccllDDeelleetteeHHaasshhTTaabbllee deletes all of the entries in a hash table and frees up the memory associated with the table's bucket array and entries. It does not free the actual table structure (pointed to by tablePtr), since that memory is assumed to be managed by the client.

TTccllDDeelleetteeHHaasshhTTaabbllee also does not free or otherwise manipulate the val-

ues of the hash table entries. If the entry values point to dynami-

cally-allocated memory, then it is the client's responsibility to free

these structures before deleting the table. TTccllCCrreeaatteeHHaasshhEEnnttrryy locates the entry corresponding to a particular key, creating a new entry in the table if there wasn't already one with the given key. If an entry already existed with the given key then *newPtr is set to zero. If a new entry was created, then *newPtr is

set to a non-zero value and the value of the new entry will be set to

zero. The return value from TTccllCCrreeaatteeHHaasshhEEnnttrryy is a pointer to the entry, which may be used to retrieve and modify the entry's value or to delete the entry from the table. TTccllDDeelleetteeHHaasshhEEnnttrryy will remove an existing entry from a table. The memory associated with the entry itself will be freed, but the client is responsible for any cleanup associated with the entry's value, such as freeing a structure that it points to. TTccllFFiinnddHHaasshhEEnnttrryy is similar to TTccllCCrreeaatteeHHaasshhEEnnttrryy except that it doesn't create a new entry if the key doesn't exist; instead, it returns NULL as result. TTccllGGeettHHaasshhVVaalluuee and TTccllSSeettHHaasshhVVaalluuee are used to read and write an entry's value, respectively. Values are stored and retrieved as type ``ClientData'', which is large enough to hold a pointer value. On almost all machines this is large enough to hold an integer value too. TTccllGGeettHHaasshhKKeeyy returns the key for a given hash table entry, either as

a pointer to a string, a one-word (``char *'') key, or as a pointer to

the first word of an array of integers, depending on the keyType used to create a hash table. In all cases TTccllGGeettHHaasshhKKeeyy returns a result with type ``char *''. When the key is a string or array, the result of

TTccllGGeettHHaasshhKKeeyy points to information in the table entry; this informa-

tion will remain valid until the entry is deleted or its table is deleted. TTccllFFiirrssttHHaasshhEEnnttrryy and TTccllNNeexxttHHaasshhEEnnttrryy may be used to scan all of the

entries in a hash table. A structure of type ``TclHashSearch'', pro-

vided by the client, is used to keep track of progress through the ta-

ble. TTccllFFiirrssttHHaasshhEEnnttrryy initializes the search record and returns the

first entry in the table (or NULL if the table is empty). Each subse-

quent call to TTccllNNeexxttHHaasshhEEnnttrryy returns the next entry in the table or NULL if the end of the table has been reached. A call to TTccllFFiirrssttHHaasshhEEnnttrryy followed by calls to TTccllNNeexxttHHaasshhEEnnttrryy will return each of the entries in the table exactly once, in an arbitrary order.

It is unadvisable to modify the structure of the table, e.g. by creat-

ing or deleting entries, while the search is in progress.

TTccllHHaasshhSSttaattss returns a dynamically-allocated string with overall

information about a hash table, such as the number of entries it con-

tains, the number of buckets in its hash array, and the utilization of the buckets. It is the caller's responsibility to free the result string by passing it to cckkffrreeee.

The header file ttccll..hh defines the actual data structures used to imple-

ment hash tables. This is necessary so that clients can allocate TclHashTable structures and so that macros can be used to read and write the values of entries. However, users of the hashing routines

should never refer directly to any of the fields of any of the hash-

related data structures; use the procedures and macros defined here. TTHHEE TTCCLLHHAASSHHKKEEYYTTYYPPEE SSTTRRUUCCTTUURREE

Extension writers can define new hash key types by defining four proce-

dures, initializing a TclHashKeyType structure to describe the type, and calling TTccllIInniittCCuussttoommHHaasshhTTaabbllee. The TTccllHHaasshhKKeeyyTTyyppee structure is defined as follows: typedef struct TclHashKeyType { int version; int flags; TclHashKeyProc *hashKeyProc; TclCompareHashKeysProc *compareKeysProc; TclAllocHashEntryProc *allocEntryProc; TclFreeHashEntryProc *freeEntryProc; } TclHashKeyType; The version member is the version of the table. If this structure is extended in future then the version can be used to distinguish between different structures. It should be set to TTCCLLHHAASSHHKKEEYYTTYYPPEEVVEERRSSIIOONN. The flags member is one or more of the following values OR'ed together: TTCCLLHHAASSHHKKEEYYRRAANNDDOOMMIIZZEEHHAASSHH There are some things, pointers for example which don't hash well because they do not use the lower bits. If this flag is set then the hash table will attempt to rectify this by randomising the bits and then using the upper N bits as the index into the table. The hashKeyProc member contains the address of a function called to calculate a hash value for the key. typedef unsigned int (TclHashKeyProc) ( TclHashTable *tablePtr, VOID *keyPtr); If this is NULL then keyPtr is used and TTCCLLHHAASSHHKKEEYYRRAANNDDOOMMIIZZEEHHAASSHH is assumed. The compareKeysProc member contains the address of a function called to compare two keys. typedef int (TclCompareHashKeysProc) (VOID *keyPtr, TclHashEntry *hPtr); If this is NULL then the keyPtr pointers are compared. If the keys don't match then the function returns 0, otherwise it returns 1. The allocEntryProc member contains the address of a function called to allocate space for an entry and initialise the key. typedef TclHashEntry *(TclAllocHashEntryProc) ( TclHashTable *tablePtr, VOID *keyPtr); If this is NULL then TclAlloc is used to allocate enough space for a TclHashEntry and the key pointer is assigned to key.oneWordValue. String keys and array keys use this function to allocate enough space for the entry and the key in one block, rather than doing it in two blocks. This saves space for a pointer to the key from the entry and another memory allocation. TclObj * keys use this function to allocate enough space for an entry and increment the reference count on the object. If The freeEntryProc member contains the address of a function called to free space for an entry. typedef void (TclFreeHashEntryProc) (TclHashEntry *hPtr); If this is NULL then TclFree is used to free the space for the entry. TclObj * keys use this function to decrement the reference count on the object. KKEEYYWWOORRDDSS hash table, key, lookup, search, value Tcl TclHash(3)




Contact us      |      About us      |      Term of use      |       Copyright © 2000-2019 MyWebUniversity.com ™