home *** CD-ROM | disk | FTP | other *** search
- head 0.10;
- access;
- symbols;
- locks; strict;
- comment @ * @;
-
-
- 0.10
- date 92.08.18.04.46.58; author dglattin; state Exp;
- branches;
- next 0.9;
-
- 0.9
- date 92.04.13.11.43.08; author dennisg; state Exp;
- branches;
- next 0.8;
-
- 0.8
- date 91.12.10.12.05.28; author dennisg; state Exp;
- branches;
- next 0.7;
-
- 0.7
- date 91.12.03.02.01.23; author dennisg; state Exp;
- branches;
- next 0.6;
-
- 0.6
- date 91.11.24.01.20.02; author dennisg; state Exp;
- branches;
- next 0.5;
-
- 0.5
- date 91.11.23.22.19.21; author dennisg; state Exp;
- branches;
- next 0.4;
-
- 0.4
- date 91.11.21.22.25.19; author dennisg; state Exp;
- branches;
- next 0.3;
-
- 0.3
- date 91.11.07.23.23.40; author dennisg; state Exp;
- branches;
- next 0.2;
-
- 0.2
- date 91.11.07.22.30.54; author dennisg; state Exp;
- branches;
- next 0.1;
-
- 0.1
- date 91.10.24.00.45.39; author dennisg; state Exp;
- branches;
- next ;
-
-
- desc
- @This is the definition file for a hash table used within
- the Objective-C run-time system.
- Hash tables are used to cache class and meta class pointers.
- They are also used to cache class and meta class methods.
- There are other uses of hash tables within the run-time.
- The hash table is very general purpose in nature.
- @
-
-
- 0.10
- log
- @Saving a working version before release.
- @
- text
- @/* -*-c-*- */
-
- /* Copyright (C) 1989, 1992 Free Software Foundation, Inc.
-
- This file is part of GNU CC.
-
- GNU CC 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 2, or (at your option)
- any later version.
-
- GNU CC 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 have received a copy of the GNU General Public License
- along with GNU CC; see the file COPYING. If not, write to
- the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-
- /* As a special exception, if you link this library with files
- compiled with GCC to produce an executable, this does not cause
- the resulting executable to be covered by the GNU General Public License.
- This exception does not however invalidate any other reasons why
- the executable file might be covered by the GNU General Public License. */
-
- /*
- $Header: /usr/user/dennis_glatting/ObjC/c-runtime/dispatch.common/RCS/hash.h,v 0.9 1992/04/13 11:43:08 dennisg Exp dennisg $
- $Author: dennisg $
- $Date: 1992/04/13 11:43:08 $
- $Log: hash.h,v $
- * Revision 0.9 1992/04/13 11:43:08 dennisg
- * Check in after array version of run-time works.
- * Expect more changes as hash version and other changes are made.
- *
- * Revision 0.8 1991/12/10 12:05:28 dennisg
- * Cleaned up file format for a distribution.
- *
- * Revision 0.7 1991/12/03 02:01:23 dennisg
- * fixed assert macro.
- * added memory allocation adjustment macro for hash size allocation.
- *
- * Revision 0.6 1991/11/24 01:20:02 dennisg
- * changed shorts back to ints.
- * the efficiency gained didn't out weight the grossness of the code.
- *
- * 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 <assert.h>
- #include <sys/types.h>
-
- #include <mutex.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 type is the function that computes a hash code given a key.
- * Therefore, the key can be a pointer to anything and the function specific
- * to the key type.
- *
- * Unfortunately there is a mutual data structure reference problem with this
- * typedef. Therefore, to remove compiler warnings the functions passed to
- * hash_new() will have to be casted to this type.
- */
- typedef u_int (*HashFunc)(void*, void*);
-
- /*
- * This data type is the function that compares two hash keys and returns an
- * integer greater than, equal to, or less than 0, according as the first
- * parameter is lexico-graphically greater than, equal to, or less than the
- * second.
- */
-
- typedef int (*CompareFunc)(void*, void*);
-
-
- /*
- * 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"). Must be
- a power of two. */
- entriesInHash, /* Current number of entries
- in the hash table. */
- mask; /* Precomputed mask. */
- /*
- * Variables used to implement indexing
- * through the hash table.
- */
- u_int lastBucket; /* Tracks which entry in the
- array where the last value
- was returned. */
- /* Function used to compute
- a hash code given a key.
- This function is specified
- when the hash table is
- created. */
- HashFunc hashFunc;
- /* Function used to compare
- two hash keys to determine
- if they are equal. */
- CompareFunc compareFunc;
- } Cache, *Cache_t;
-
-
- /* Prototypes for hash
- functions. */
- /* Allocate and initialize
- a hash table. */
- Cache_t
- hash_new (u_int sizeOfHash, HashFunc aHashFunc, CompareFunc aCompareFunc);
- /* 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);
-
- /* Used to return a value from
- a hash table using a given
- key. */
- void*
- hash_value_for_key (Cache_t theCache, void* aKey);
-
-
- /************************************************
-
- Useful hashing functions.
-
- Declared inline for your pleaseure.
-
- ************************************************/
-
- /* Calculate a hash code by
- performing some manipulation
- of the key pointer. */
- static inline u_int
- intHash(Cache_t theCache, void* aKey) {
-
-
- assert(sizeof (u_int) == sizeof (aKey));
-
- return ((u_int)aKey >> (sizeof(void*) - 1)) & theCache->mask ;
- }
-
- /* Calculate a hash code by
- iterating over a NULL
- terminate string. */
- static inline u_int
- strHash(Cache_t theCache, void* aKey) {
-
- u_int ret = 0;
- u_int ctr = 0;
-
-
- while(*(char*)aKey) {
- ret ^= *(char*)aKey++ << ctr;
- ctr = (ctr + 1) % sizeof(void*);
- }
-
- return ret & theCache->mask ;
- }
-
-
- /* Compare two integers. */
- static inline int
- intCmp(void* k1, void* k2) {
-
-
- return !((int)k1 - (int)k2);
- }
-
-
- /* Compare two strings. */
- static inline int
- strCmp(void* k1, void* k2) {
-
-
- return !strcmp( k1, k2 );
- }
-
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif
- @
-
-
- 0.9
- log
- @Check in after array version of run-time works.
- Expect more changes as hash version and other changes are made.
- @
- text
- @d1 28
- a28 24
- /* -*-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/hash/RCS/hash.h,v 0.8 1991/12/10 12:05:28 dennisg Exp dennisg $
- d30 1
- a30 1
- $Date: 1991/12/10 12:05:28 $
- d32 4
- d79 1
- a79 1
- #include <assert.h>
- d82 1
- a82 1
- #include <mutex.h>
- d114 1
- a114 1
- typedef u_int (*HashFunc)(void*, void*);
- d123 1
- a123 1
- typedef int (*CompareFunc)(void*, void*);
- d151 1
- a151 1
- mask; /* Precomputed mask. */
- d159 10
- a168 10
- /* Function used to compute
- a hash code given a key.
- This function is specified
- when the hash table is
- created. */
- HashFunc hashFunc;
- /* Function used to compare
- two hash keys to determine
- if they are equal. */
- CompareFunc compareFunc;
- d214 3
- a216 3
- /* Used to return a value from
- a hash table using a given
- key. */
- d223 4
- a226 4
- Useful hashing functions.
-
- Declared inline for your pleaseure.
-
- d230 2
- a231 2
- performing some manipulation
- of the key pointer. */
- d238 1
- a238 1
- return ((u_int)aKey >> (sizeof(void*) - 1)) & theCache->mask ;
- d242 2
- a243 2
- iterating over a NULL
- terminate string. */
- d247 8
- a254 8
- u_int ret = 0;
- u_int ctr = 0;
-
-
- while(*(char*)aKey) {
- ret ^= *(char*)aKey++ << ctr;
- ctr = (ctr + 1) % sizeof(void*);
- }
- d256 1
- a256 1
- return ret & theCache->mask ;
- d260 1
- a260 1
- /* Compare two integers. */
- d265 1
- a265 1
- return !((int)k1 - (int)k2);
- d269 1
- a269 1
- /* Compare two strings. */
- d274 1
- a274 1
- return !strcmp( k1, k2 );
- @
-
-
- 0.8
- log
- @Cleaned up file format for a distribution.
- @
- text
- @d24 1
- a24 1
- $Header: /usr/user/dennis_glatting/ObjC/c-runtime/lib/RCS/hash.h,v 0.7 1991/12/03 02:01:23 dennisg Exp dennisg $
- d26 1
- a26 1
- $Date: 1991/12/03 02:01:23 $
- d28 3
- d71 1
- d74 1
- d98 21
- d141 3
- a143 2
- entriesInHash; /* Current number of entries
- in ther hash table. */
- d151 10
- d167 3
- a169 3
- a hash table. Hash table
- size taken as a parameter. */
- Cache_t hash_new (u_int sizeOfHash);
- d173 2
- a174 1
- void hash_delete (Cache_t theCache);
- d183 2
- a184 1
- void hash_add (Cache_t* theCache, void* aKey, void* aValue);
- d189 2
- a190 1
- void hash_remove (Cache_t theCache, void* aKey);
- d203 65
- a267 1
- CacheNode_t hash_next (Cache_t theCache, CacheNode_t aCacheNode);
- @
-
-
- 0.7
- log
- @fixed assert macro.
- added memory allocation adjustment macro for hash size allocation.
- @
- text
- @d24 1
- a24 1
- $Header: /usr/user/dennis_glatting/ObjC/c-runtime/lib/RCS/hash.h,v 0.6 1991/11/24 01:20:02 dennisg Exp dennisg $
- d26 1
- a26 1
- $Date: 1991/11/24 01:20:02 $
- d28 4
- d105 4
- a108 4
- /*
- * Variables used to track the size of the hash
- * table so to determine when to resize it.
- */
- d114 3
- a116 3
- a power of two. */
- entriesInHash; /* Current number of entries
- in ther hash table. */
- d139 6
- a144 6
- hash table reaches a
- level of fullnes then
- it will be resized.
-
- assert() if the key is
- already in the hash. */
- @
-
-
- 0.6
- log
- @changed shorts back to ints.
- the efficiency gained didn't out weight the grossness of the code.
- @
- text
- @d9 1
- a9 1
- * Copyright (C) 1991 Threaded Technologies Inc.
- d24 1
- a24 1
- $Header: /usr/user/dennis_glatting/ObjC/c-runtime/lib/RCS/hash.h,v 0.5 1991/11/23 22:19:21 dennisg Exp dennisg $
- d26 1
- a26 1
- $Date: 1991/11/23 22:19:21 $
- d28 4
- d35 1
- a35 1
- * in the hashIndex() routine.
- d92 1
- a92 1
- * (except for new).
- d99 1
- a99 1
- CacheNode_t (* theNodeTable )[]; /* Pointer to an array of
- d105 1
- a105 1
- u_int sizeOfHash, /* Number of buckets
- d107 1
- a107 1
- table (number of array
- d109 2
- a110 1
- "theNodeTable"). */
- d127 2
- a128 4
- size taken as a parameter.
- A value of 0 is not
- allowed. */
- Cache_t hash_new( u_int sizeOfHash );
- d132 1
- a132 1
- void hash_delete( Cache_t theCache );
- d141 1
- a141 1
- void hash_add( Cache_t* theCache, void* aKey, void* aValue );
- d146 1
- a146 1
- void hash_remove( Cache_t theCache, void* aKey );
- d159 1
- a159 1
- CacheNode_t hash_next( Cache_t theCache, CacheNode_t aCacheNode );
- @
-
-
- 0.5
- log
- @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.
- @
- text
- @d24 1
- a24 1
- $Header: /usr/user/dennis_glatting/ObjC/c-runtime/lib/RCS/hash.h,v 0.4 1991/11/21 22:25:19 dennisg Exp dennisg $
- d26 1
- a26 1
- $Date: 1991/11/21 22:25:19 $
- d28 5
- d101 1
- a101 1
- u_short sizeOfHash, /* Number of buckets
- @
-
-
- 0.4
- log
- @deleted hash mask information from hash struct.
- changed hashing algorithm. those values are no longer needed.
- @
- text
- @d24 1
- a24 1
- $Header: /usr/user/dennis_glatting/ObjC/c-runtime/lib/RCS/hash.h,v 0.3 1991/11/07 23:23:40 dennisg Exp dennisg $
- d26 1
- a26 1
- $Date: 1991/11/07 23:23:40 $
- d28 4
- d96 1
- a96 1
- u_int sizeOfHash, /* Number of buckets
- a138 5
- /* Given key, return its
- value. Return NULL if the
- key/value pair isn't in
- the hash. */
- void* hash_value_for_key( Cache_t theCache, void* aKey );
- @
-
-
- 0.3
- log
- @implemented hash table expansion as suggested by rms.
- @
- text
- @d24 1
- a24 1
- $Header: /usr/user/dennis_glatting/ObjC/c-runtime/lib/RCS/hash.h,v 0.2 1991/11/07 22:30:54 dennisg Exp dennisg $
- d26 1
- a26 1
- $Date: 1991/11/07 22:30:54 $
- d28 3
- a98 12
- /*
- * Variables used to compute hash
- * values.
- */
- u_int mask, /* The number of bits set
- in the mask that is
- contained in the next
- member variable. */
- numberOfMaskBits; /* Number of bits used for
- the mask. Useful for
- efficient hash value
- calculation. */
- @
-
-
- 0.2
- log
- @added copyleft
- @
- text
- @d24 1
- a24 1
- $Header: /usr/user/dennis_glatting/ObjC/c-runtime/lib/RCS/hash.h,v 0.1 1991/10/24 00:45:39 dennisg Exp dennisg $
- d26 1
- a26 1
- $Date: 1991/10/24 00:45:39 $
- d28 3
- d85 5
- a89 1
- u_int numberOfBuckets, /* Number of buckets
- d93 11
- a103 6
- "theCache"). */
- mask, /* Mask used when computing
- a hash value. The number
- of bits set in the mask
- is contained in the next
- member variable. */
- d125 1
- a125 1
- Cache_t hash_new( u_int numberOfBuckets );
- d131 8
- a138 4
- to the hash table. assert()
- if the key is already in
- the hash. */
- void hash_add( Cache_t theCache, void* aKey, void* aValue );
- @
-
-
- 0.1
- log
- @Initial check in. Preliminary development stage.
- @
- text
- @d9 22
- a30 4
- $Header$
- $Author$
- $Date$
- $Log$
- @
-