|
|
1.1 ! root 1: /* -*- Mode:C++ -*- ! 2: $Header: /usr2/odi/objectstore.src/libos/RCS/hash.H,v 1.4 89/09/26 09:37:31 benson Exp $ ! 3: ! 4: Copyright (c) 1989 by Object Design, Inc., Burlington, Mass. ! 5: All rights reserved. ! 6: ! 7: */ ! 8: ! 9: #ifndef _Hash_h ! 10: #define _Hash_h 1 ! 11: ! 12: typedef void (*Error_Proc) (const char*) ; ! 13: ! 14: extern void default_Hash_error_handler (const char*) ; ! 15: extern Error_Proc Hash_error_handler ; ! 16: extern Error_Proc set_Hash_error_handler (Error_Proc f) ; ! 17: ! 18: #ifndef _hash_typedefs ! 19: #define _hash_typedefs 1 ! 20: typedef void (*intProc)(int) ; ! 21: #endif ! 22: ! 23: #define DEFAULT_INITIAL_HASH_SIZE 100 ! 24: ! 25: struct HashTableEntry ! 26: { ! 27: int key ; ! 28: int cont ; ! 29: char status ; ! 30: } ; ! 31: ! 32: class HashWalker ; ! 33: ! 34: class Hash ! 35: { ! 36: friend class HashWalker ; ! 37: ! 38: HashTableEntry* tab ; ! 39: int size ; ! 40: int entry_count ; ! 41: ! 42: public: ! 43: unsigned int (*key_hash_function)(int) ; ! 44: int (*key_key_equality_function) (int, int) ; ! 45: ! 46: unsigned int key_hash(int a) ; ! 47: int key_key_eq(int a, int b); ! 48: ! 49: Hash(int sz) ; ! 50: Hash(Hash& a) ; ! 51: ~Hash() ; ! 52: ! 53: Hash& operator= (Hash& a) ; ! 54: ! 55: int count() ; ! 56: int empty() ; ! 57: int full() ; ! 58: int capacity() ; ! 59: ! 60: void clear() ; ! 61: void resize(int newsize) ; ! 62: ! 63: enum insert_action { probe, insert, replace }; ! 64: void action (int key, int val, insert_action what, ! 65: int& found, int& old_val); ! 66: int& operator [] (int k) ; ! 67: int contains(int key) ; ! 68: int del(int key) ; ! 69: ! 70: void apply (intProc f) ; ! 71: void error(const char* msg) ; ! 72: } ; ! 73: ! 74: class HashWalker ! 75: { ! 76: Hash* h ; ! 77: int pos ; ! 78: ! 79: public: ! 80: HashWalker(Hash& l) ; ! 81: ~HashWalker() ; ! 82: ! 83: int null() ; ! 84: int valid() ; ! 85: operator void* () ; ! 86: int operator ! () ; ! 87: void advance() ; ! 88: void reset() ; ! 89: void reset(Hash& l) ; ! 90: const int& key() ; ! 91: int& get() ; ! 92: } ; ! 93: ! 94: inline unsigned int Hash::key_hash(int a) ! 95: { ! 96: #ifdef HASHFUNCTION ! 97: return HASHFUNCTION(a) ; ! 98: #else ! 99: return (*key_hash_function)(a) ; ! 100: #endif ! 101: } ! 102: ! 103: inline int Hash::key_key_eq(int a, int b) ! 104: { ! 105: #ifdef EQUALITYFUNCTION ! 106: return EQUALITYFUNCTION(a, b) ; ! 107: #else ! 108: return (*key_key_equality_function)(a, b) ; ! 109: #endif ! 110: } ! 111: ! 112: ! 113: inline Hash::~Hash() ! 114: { ! 115: delete [size] tab ; ! 116: } ! 117: ! 118: inline int Hash::count() ! 119: { ! 120: return entry_count ; ! 121: } ! 122: ! 123: inline int Hash::empty() ! 124: { ! 125: return entry_count == 0 ; ! 126: } ! 127: ! 128: inline int Hash::full() ! 129: { ! 130: return entry_count == size ; ! 131: } ! 132: ! 133: inline int Hash::capacity() ! 134: { ! 135: return size ; ! 136: } ! 137: inline HashWalker::HashWalker(Hash& a) ! 138: { ! 139: h = &a ; ! 140: reset() ; ! 141: } ! 142: ! 143: inline void HashWalker::reset(Hash& a) ! 144: { ! 145: h = &a ; ! 146: reset() ; ! 147: } ! 148: ! 149: ! 150: inline HashWalker::~HashWalker() {} ! 151: ! 152: inline int HashWalker::null() ! 153: { ! 154: return pos < 0 ; ! 155: } ! 156: ! 157: inline int HashWalker::valid() ! 158: { ! 159: return pos >= 0 ; ! 160: } ! 161: ! 162: inline HashWalker::operator void* () ! 163: { ! 164: return (pos < 0)? 0 : this ; ! 165: } ! 166: ! 167: inline int HashWalker::operator ! () ! 168: { ! 169: return (pos < 0) ; ! 170: } ! 171: ! 172: ! 173: inline const int& HashWalker::key() ! 174: { ! 175: if (pos < 0) ! 176: h->error("operation on null Walker") ; ! 177: return h->tab[pos].key ; ! 178: } ! 179: ! 180: inline int& HashWalker::get() ! 181: { ! 182: if (pos < 0) ! 183: h->error("operation on null Walker") ; ! 184: return h->tab[pos].cont ; ! 185: } ! 186: ! 187: #endif ! 188: ! 189: ! 190: ! 191: ! 192: /* ! 193: $Log: hash.H,v $ ! 194: Revision 1.4 89/09/26 09:37:31 benson ! 195: Don't refer to hash functions using syntax that suggests staticity. ! 196: ! 197: Revision 1.3 89/09/26 09:34:22 benson ! 198: hash functions aren't static anymore. They never had any business ! 199: being static, and nothing should depend on it. ! 200: ! 201: ! 202: Revision 1.2 89/07/11 09:03:46 benson ! 203: add a procedure to Hash to circument the idiotic [] interface. ! 204: ! 205: Revision 1.1 89/05/22 13:31:29 cwl ! 206: Initial revision ! 207: ! 208: * Revision 1.1 89/05/17 16:06:08 cwl ! 209: * Initial revision ! 210: * ! 211: * Revision 1.2 89/05/15 14:55:43 cwl ! 212: * remove static rcs decls ! 213: * ! 214: * Revision 1.1 89/05/12 14:26:52 cwl ! 215: * Initial revision ! 216: * ! 217: ! 218: end_log ! 219: */ ! 220: ! 221:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.