Annotation of researchv10no/cmd/cfront/ptcfront/hash.h, revision 1.1.1.1

1.1       root        1: /* ident "@(#)ctrans:src/hash.h        1.2" */
                      2: /* Compiler interface to hash tables from odi library. 
                      3:        $Source: /usr3/lang/benson/work/stripped_cfront/RCS/hash.h,v $ $RCSfile: hash.h,v $
                      4:        $Revision: 1.1 $                $Date: 89/11/20 08:50:36 $
                      5:        $Author: benson $               $Locker:  $
                      6:        $State: Exp $
                      7: 
                      8:     $Header: /usr2/odi/objectstore.src/libos/RCS/hash.H,v 1.4 89/09/26 09:37:31 benson Exp $
                      9: 
                     10:     Copyright (c) 1989 by Object Design, Inc., Burlington, Mass.
                     11:     All rights reserved.
                     12: 
                     13: */
                     14: 
                     15: #ifndef _HASH_H
                     16: #define _HASH_H
                     17: 
                     18: #include <string.h>
                     19: 
                     20: typedef void (*Error_Proc) (const char*) ;
                     21: 
                     22: extern void default_Hash_error_handler (const char*) ;
                     23: extern Error_Proc Hash_error_handler ;
                     24: extern Error_Proc set_Hash_error_handler (Error_Proc f) ;
                     25: 
                     26: #ifndef _hash_typedefs
                     27: #define _hash_typedefs 1
                     28: typedef void (*intProc)(int) ;
                     29: #endif
                     30: 
                     31: #define DEFAULT_INITIAL_HASH_SIZE 100
                     32: 
                     33: struct HashTableEntry
                     34: {
                     35:   int                   key ;
                     36:   int                   cont ;
                     37:   char                  status ;
                     38: } ;
                     39: 
                     40: class HashWalker ;
                     41: 
                     42: class Hash
                     43: {
                     44:   friend class          HashWalker ;
                     45: 
                     46:   HashTableEntry*       tab ;
                     47:   int                   size ;
                     48:   int                   entry_count ;
                     49: 
                     50: public:
                     51:   unsigned int         (*key_hash_function)(int)  ;
                     52:    int                 (*key_key_equality_function) (int, int) ;
                     53: 
                     54:   unsigned int          key_hash(int  a) ;
                     55:   int                   key_key_eq(int a, int  b);    
                     56: 
                     57:                         Hash(int sz) ;
                     58:                         Hash(Hash& a) ;
                     59:                         ~Hash() ;
                     60: 
                     61:   Hash&                 operator= (Hash& a) ;
                     62: 
                     63:   int                   count() ;
                     64:   int                   empty() ;
                     65:   int                   full() ;
                     66:   int                   capacity() ;
                     67: 
                     68:   void                  clear() ;
                     69:   void                  resize(int newsize) ;
                     70: 
                     71:   enum insert_action   { probe, insert, replace };
                     72:   void                 action (int key, int val, insert_action what,
                     73:                                int& found, int& old_val);
                     74:   int&                  operator [] (int  k) ;
                     75:   int                   contains(int  key) ;
                     76:   int                   del(int  key) ;
                     77: 
                     78:   void                  apply (intProc f) ;
                     79:   void                  error(const char* msg) ;
                     80: } ;
                     81: 
                     82: class HashWalker
                     83: {
                     84:   Hash*     h ;
                     85:   int                   pos ;
                     86: 
                     87: public:
                     88:                         HashWalker(Hash& l) ;
                     89:                         ~HashWalker() ;
                     90: 
                     91:   int                   null() ;
                     92:   int                   valid() ;
                     93:                         operator void* () ;
                     94:   int                   operator ! () ;
                     95:   void                  advance() ;
                     96:   void                  reset() ;
                     97:   void                  reset(Hash& l) ;
                     98:   const int&            key() ;
                     99:   int&                  get() ;
                    100: } ;
                    101: 
                    102: inline unsigned int Hash::key_hash(int a)
                    103: {
                    104: #ifdef HASHFUNCTION
                    105:   return HASHFUNCTION(a) ;
                    106: #else
                    107:   return (*key_hash_function)(a) ;
                    108: #endif
                    109: }
                    110: 
                    111: inline int Hash::key_key_eq(int a, int b)
                    112: {
                    113: #ifdef EQUALITYFUNCTION
                    114:   return EQUALITYFUNCTION(a, b) ;
                    115: #else
                    116:   return (*key_key_equality_function)(a, b) ;
                    117: #endif
                    118: }
                    119: 
                    120: 
                    121: inline Hash::~Hash()
                    122: {
                    123:   delete [size] tab ;
                    124: }
                    125: 
                    126: inline int Hash::count()
                    127: {
                    128:   return entry_count ;
                    129: }
                    130: 
                    131: inline int Hash::empty()
                    132: {
                    133:   return entry_count == 0 ;
                    134: }
                    135: 
                    136: inline int Hash::full()
                    137: {
                    138:   return entry_count == size ;
                    139: }
                    140: 
                    141: inline int Hash::capacity()
                    142: {
                    143:   return size ;
                    144: }
                    145: inline HashWalker::HashWalker(Hash& a)
                    146: {
                    147:   h = &a ;
                    148:   reset() ;
                    149: }
                    150: 
                    151: inline void HashWalker::reset(Hash& a)
                    152: {
                    153:   h = &a ;
                    154:   reset() ;
                    155: }
                    156: 
                    157: 
                    158: inline HashWalker::~HashWalker() {}
                    159: 
                    160: inline int HashWalker::null()
                    161: {
                    162:   return pos < 0 ;
                    163: }
                    164: 
                    165: inline int HashWalker::valid()
                    166: {
                    167:   return pos >= 0 ;
                    168: }
                    169: 
                    170: inline HashWalker::operator void* ()
                    171: {
                    172:   return (pos < 0)? 0 : this ;
                    173: }
                    174: 
                    175: inline int HashWalker::operator ! ()
                    176: {
                    177:   return (pos < 0) ;
                    178: }
                    179: 
                    180: 
                    181: inline const int& HashWalker::key()
                    182: {
                    183:   if (pos < 0)
                    184:     h->error("operation on null Walker") ;
                    185:   return h->tab[pos].key ;
                    186: }
                    187: 
                    188: inline int& HashWalker::get()
                    189: {
                    190:   if (pos < 0)
                    191:     h->error("operation on null Walker") ;
                    192:   return h->tab[pos].cont ;
                    193: }
                    194: 
                    195: inline int pointer_hasheq (int a, int b)
                    196: {
                    197:     return a == b;
                    198: };
                    199: 
                    200: inline unsigned int pointer_hash_fcn (int x)
                    201: {
                    202:     unsigned X = (unsigned) x;
                    203:     return ((X << 16) | (X >> 16)) ^ x;
                    204: }
                    205: 
                    206: class pointer_hash : public Hash {
                    207:   public:
                    208:     pointer_hash (int sz = 0) : Hash (sz) {
                    209:        key_hash_function = pointer_hash_fcn;
                    210:        key_key_equality_function = pointer_hasheq;
                    211:     }
                    212: 
                    213:     pointer_hash (pointer_hash& h) : Hash (h) {};
                    214: };
                    215: 
                    216: inline int string_hasheq (int a, int b)
                    217: {
                    218:     return !strcmp((char *)a, (char *) b);
                    219: };
                    220: 
                    221: static unsigned int string_hash_fcn (int x)
                    222: {
                    223:     char * str = (char *)x;
                    224:     int l = strlen(str);
                    225:        
                    226:     if(x <= 4) return str[0];
                    227:     else {
                    228:        unsigned int * f4 = (unsigned int *) str;
                    229:        if (l < 8) return ((*f4 << 16) | (*f4 >> 16)) ^ *f4;
                    230:        else {
                    231:            unsigned int * s4 = f4 ++;
                    232:            return ((*f4 << 16) | (*f4 >> 16)) ^ *s4;
                    233:        }
                    234:     }
                    235: };
                    236: 
                    237: 
                    238: class string_hash : public Hash {
                    239:     public:
                    240: 
                    241:     string_hash (int sz = 0) : Hash (sz) {
                    242:        key_hash_function = string_hash_fcn;
                    243:        key_key_equality_function = string_hasheq;
                    244:     };
                    245: 
                    246:     string_hash (string_hash& h) : Hash (h) {};
                    247: };
                    248: 
                    249: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.