a46ecc2682
the efficiency gained didn't out weight the grossness of the code. From-SVN: r69
164 lines
6.9 KiB
C
164 lines
6.9 KiB
C
/* -*-c-*-
|
|
* This is a general purpose hash object.
|
|
*
|
|
* The hash object used throughout the run-time
|
|
* is an integer hash. The key and data is of type
|
|
* void*. The hashing function converts the key to
|
|
* an integer and computes it hash value.
|
|
*
|
|
* Copyright (C) 1991 Threaded Technologies Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published
|
|
* by the Free Software Foundation; either version 1, or any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should receive a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*
|
|
$Header: /usr/user/dennis_glatting/ObjC/c-runtime/lib/RCS/hash.h,v 0.5 1991/11/23 22:19:21 dennisg Exp dennisg $
|
|
$Author: dennisg $
|
|
$Date: 1991/11/23 22:19:21 $
|
|
$Log: hash.h,v $
|
|
* Revision 0.5 1991/11/23 22:19:21 dennisg
|
|
* converted some entries in the hash structure from ints to shorts.
|
|
* this was done to use a less expensive division instruction
|
|
* in the hashIndex() routine.
|
|
*
|
|
* Revision 0.4 1991/11/21 22:25:19 dennisg
|
|
* deleted hash mask information from hash struct.
|
|
* changed hashing algorithm. those values are no longer needed.
|
|
*
|
|
* Revision 0.3 1991/11/07 23:23:40 dennisg
|
|
* implemented hash table expansion as suggested by rms.
|
|
*
|
|
* Revision 0.2 1991/11/07 22:30:54 dennisg
|
|
* added copyleft
|
|
*
|
|
* Revision 0.1 1991/10/24 00:45:39 dennisg
|
|
* Initial check in. Preliminary development stage.
|
|
*
|
|
*/
|
|
|
|
|
|
#ifndef _hash_INCLUDE_GNU
|
|
#define _hash_INCLUDE_GNU
|
|
|
|
/* If someone is using a c++
|
|
compiler then adjust the
|
|
types in the file back
|
|
to C. */
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
|
/*
|
|
* This data structure is used to hold items
|
|
* stored in a hash table. Each node holds
|
|
* a key/value pair.
|
|
*
|
|
* Items in the cache are really of type void*.
|
|
*/
|
|
typedef struct cache_node {
|
|
struct cache_node* nextNode; /* Pointer to next entry on
|
|
the list. NULL indicates
|
|
end of list. */
|
|
void* theKey; /* Key used to locate the
|
|
value. Used to locate
|
|
value when more than one
|
|
key computes the same hash
|
|
value. */
|
|
void* theValue; /* Value stored for the
|
|
key. */
|
|
} CacheNode, *CacheNode_t;
|
|
|
|
|
|
/*
|
|
* This data structure is the cache.
|
|
*
|
|
* It must be passed to all of the hashing routines
|
|
* (except for new).
|
|
*/
|
|
typedef struct cache {
|
|
/*
|
|
* Variables used to implement the
|
|
* hash itself.
|
|
*/
|
|
CacheNode_t (* theNodeTable )[]; /* Pointer to an array of
|
|
hash nodes. */
|
|
/*
|
|
* Variables used to track the size of the hash
|
|
* table so to determine when to resize it.
|
|
*/
|
|
u_int sizeOfHash, /* Number of buckets
|
|
allocated for the hash
|
|
table (number of array
|
|
entries allocated for
|
|
"theNodeTable"). */
|
|
entriesInHash; /* Current number of entries
|
|
in ther hash table. */
|
|
/*
|
|
* Variables used to implement indexing
|
|
* through the hash table.
|
|
*/
|
|
u_int lastBucket; /* Tracks which entry in the
|
|
array where the last value
|
|
was returned. */
|
|
} Cache, *Cache_t;
|
|
|
|
|
|
/* Prototypes for hash
|
|
functions. */
|
|
/* Allocate and initialize
|
|
a hash table. Hash table
|
|
size taken as a parameter.
|
|
A value of 0 is not
|
|
allowed. */
|
|
Cache_t hash_new( u_int sizeOfHash );
|
|
/* Deallocate all of the
|
|
hash nodes and the cache
|
|
itself. */
|
|
void hash_delete( Cache_t theCache );
|
|
/* Add the key/value pair
|
|
to the hash table. If the
|
|
hash table reaches a
|
|
level of fullnes then
|
|
it will be resized.
|
|
|
|
assert() if the key is
|
|
already in the hash. */
|
|
void hash_add( Cache_t* theCache, void* aKey, void* aValue );
|
|
/* Remove the key/value pair
|
|
from the hash table.
|
|
assert() if the key isn't
|
|
in the table. */
|
|
void hash_remove( Cache_t theCache, void* aKey );
|
|
/* Used to index through the
|
|
hash table. Start with NULL
|
|
to get the first entry.
|
|
|
|
Successive calls pass the
|
|
value returned previously.
|
|
** Don't modify the hash
|
|
during this operation ***
|
|
|
|
Cache nodes are returned
|
|
such that key or value can
|
|
ber extracted. */
|
|
CacheNode_t hash_next( Cache_t theCache, CacheNode_t aCacheNode );
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|