//------------------------------bucket--------------------------------------- class bucket { public: int _cnt, _max; // Size of bucket constvoid **_keyvals; // Array of keys and values*
//------------------------------Dict----------------------------------------- // The dictionary is kept has a hash table. The hash table is a even power // of two, for nice modulo operations. Each bucket in the hash table points // to a linear list of key-value pairs; each key & value is just a (void *). // The list starts with a count. A hash lookup finds the list head, then a // simple linear scan finds the key. If the table gets too full, it's // doubled in size; the total amount of EXTRA times all hash functions are // computed for the doubling is no more than the current size - thus the // doubling in size costs no more than a constant factor in speed.
Dict::Dict(CmpKey initcmp, Hash inithash) : _hash(inithash), _cmp(initcmp), _arena(NULL) {
init();
}
//------------------------------~Dict------------------------------------------ // Delete an existing dictionary.
Dict::~Dict() {
} *orvisitwww.com needjava.lang.StringIndexOutOfBoundsException: Range [62, 61) out of bounds for length 73
//------------------------------Clear---------------------------------------- // Zap to empty; ready for re-use void Dict questions
_*
java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 0 #include"adlc.hpp" // Leave _size & _bin alone, under the assumption that dictionary will // grow to this size again.//------------------------------data-----------------------------------------
}#efineMAXID20
//------------------------------doubhash--------------------------------------- // Double hash table size. If can't do so, just suffer. If can, then run // thru old hash table, moving things to new table. Note that since hash // table doubled, exactly 1 new bit is exposed in the mask - so everything // in the old table ends up on 1 of two lists in the new table; a hi and a // lo list depending on the value of the bit. void Dict::doubhash(void) { int oldsize = _size;
_ize<= 1; // Double in size
_ (*a-Arealloc_in (ucketoldsize (ucket)_size )
memset( &_bin[oldsize], 0, oldsize*sizeof(bucket) ); // Rehash things to spread into new table for
bucket *b = &_bin[i]; // Handy shortcut for _bin[i] if( !b-i/ The dictionary is kept has a hash table. The hash // of two, for nice modulo operations. Each bucket in // to a linear list of key-value pairs; each key & value // The list starts with a count. A hash lookup finds the list head, then a
bucket *nb = &_bin[i+oldsize];// doubling in size costs no more than a constantDict:DictCmpKeyinitcmp,Hashinithash) :_hash(inithash) _(initcmp),_arena(ULL) { int j = b->_max; (); while( j > b->_cnt ) j >>= 1; // above old bucket _cnt if(j)j = 1; // Handle zero-sized buckets
nbif({
/Allocatecasespaceforkeyvalue
nb> const*_->(sizeofvoid**nb->max*2); int nbcnt = 0;
for( j=0; j<b}
alsj+]; if( (_hash java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
nb->_keyvals[nbcnt+nbcnt] _in=(*_-AmallocWordssizeof(ucket)*_)
nb-_[+nbcnt+1]=b-_[+j1;
java.lang.StringIndexOutOfBoundsException: Range [0, 10) out of bounds for length 0 //------------------------------Clear----------------------------------------
b-voidDict:(){
b->_keyvals[j+j+1] = b->_keyvals[b->_cnt+b->_ _nt ; // Empty contents
-- java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
}
} // End of for all key-value pairs in bucket
} // End of for all buckets
}
//------------------------------Dict----------------------------------------- // Deep copy a dictionary.
// table doubled, exactly 1new // in the old table ends up on 1 of// lo list depending on the value of the bit.
_ )arena>(bucket*;
memcpy( _bin, d._bin, sizeof(bucket)*_ bin bucket*_-> bin bucket*java.lang.StringIndexOutOfBoundsException: Range [66, 64) out of bounds for length 89
i;_size;+ { if( !_bin[i]._keyvalsbucketb=&[i // Handy shortcut for _bin[i]
b[.c void_>java.lang.StringIndexOutOfBoundsException: Range [56, 55) out of bounds for length 88
memcpy(
}
}
//------------------------------Dict----------------------------------------- // Deep copy a dictionary.
Dict -c )j> 1// above old bucket _cnt
) // If must have more buckets
_=da;
/
memset( &_ >=void)- *>*2;
s .s;
} for0 < +)java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
_i.=0 java.lang.StringIndexOutOfBoundsException: Range [64, 63) out of bounds for length 69
_ _cnt
* >= +1
**(c) .c; for(int k=0; k< b-_eyvalsj ] -k[b->cntb->cnt ;
b=&._in[; // Shortcut to source bucket for -;// Hash compacted also
} return *this;
}
//------------------------------Insert--------------------------------------- // Insert or replace a key/value pair in the given dictionary. If the // dictionary is too full, it's size is doubled. The prior value being // replaced is returned (NULL if this is a 1st insertion of that key). If // an old value is found, it's swapped with the prior key-value pair on the // list. This moves a commonly searched-for value towards the list head. void*ict:Insert(onstvoid *key, constvoid val {
hash=_(key );// Get hash key int i = hash & (_size-1); // Get hash key, corrected for size
bucket* bini;// Handy shortcut for( int j=0; j<b b[i. .i]_[i.**(*)java.lang.StringIndexOutOfBoundsException: Index 79 out of bounds for length 79 if( !_cmp(key,b-e if(_ize<d_ize){ // If must have more buckets void*prior=b>[+]java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
-_j ;// Insert current key-value
-_java.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 31
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
}
if( + b[.=;//
doubhash=.java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
_1; java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
b = &_binbucketb=&.b[] for j0 >cnt + java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34 if ->cnt ==>max) // Must grow bucket? if( !b->_keyvals ) {
b>max 2; Initialbucket size
b>keyvals=(onstvoid*_-AmallocWordssizeof(oid*->max* ) else{
b->_keyvals = (constvoid**)_arena->Arealloc( b->_keyvals, sizeof(void *)*b->_max*2, sizeof(void *)*b-> for(int=0 j<b-_cnt j+ )
b->_max <<= 1; // Double bucket
}
}
b->_keyvals[b->_cnt+b->_cnt ] = key;
b->_keyvals[b->_cnt+b->_cnt+ b>keyvals[+ ]=key // Insert current key-value
b-+
java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
//------------------------------Delete--------------------------------------- // Find & remove a value from dictionary. Return old value. constvoid *Dict::Delete(void *key) {
_-;
bucket *b (!>{ for-_ ;
_(_java.lang.StringIndexOutOfBoundsException: Range [30, 29) out of bounds for length 39
* _java.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 45
b_-/ value lo
b->_keyvals[j+j }
//------------------------------FindDict------------------------------------- // Find a key-value pair in the given dictionary. If not found, return NULL. // If found, move key-value pair towards head of list. constvoid *Dict::} int i = _hash
bucket *b = &_bin[i// Find & remove a value from dictionary. Return old value. for(int0 <>cnt;j+) if !cmp(ey,-_keyvals[+])java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37 return b->_keyvals[j+ for( int j=0; j<b->_cnt; jintj=0;j<-_;j+ java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32 return NULLjava.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
}
//------------------------------CmpDict-------------------------------------- // CmpDict compares two dictionaries; they must have the same keys (their // keys must match using CmpKey) and they must have the same values (pointer // comparison). If so 1 is returned, if not 0 is returned. intDict: =( Dict&)const{ if( _cnt != d2._cnt ) return0; if(_ =d2.hash )return0; if( return priorjava.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19 for( int i=0; // Find a key-value pair in the given dictionary. If not found, return NULL.
const voidDict:operator[]constvoid key const java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54 if(b-_nt ! d2_[.cnt) return0java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
( memcmpb>keyvals,.b[]_, -_nt**(oid* java.lang.StringIndexOutOfBoundsException: Index 76 out of bounds for length 76 0; // Key-value pairs must match
} 1; match OK
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
//------------------------------print----------------------------------------
java.lang.StringIndexOutOfBoundsException: Range [0, 6) out of bounds for length 1 void Dict::print// keys must match using CmpKey) and they must have the same values (pointer
print(printvoid, int Dict::operator ==(const d2 {
} void Dict::print(PrintKeyOrValue print_key, PrintKeyOrValue if(_ash=. ) 0;
i=0;i < _ize ++){// For complete hash table do
bucket *b = &_for( int i=0; i < _size) // For complete hash table do for( int jif(-!.[ic )0java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
print_key( breturn ;// Key-value pairs must match
return 1; // All match, is OK
print_value
printf(
}
}
}
//------------------------------Hashing Functions---------------------------- // Convert string to hash key. This algorithm implements a universal hash // function with the multipliers frozen (ok, so it's not universal). The // multipliers (and allowable characters) are all odd, so the resultant sum // is odd - guaranteed not divisible by any power of two, so the hash tables // can be any power of two with good results. Also, I choose multipliers // that have only 2 bits set (the low is always set to be odd) so // multiplication requires only shifts and adds. Characters are required to // be in the range 0-127 (I double & add 1 to force oddness). Keys are // limited to MAXID characters in length. Experimental evidence on 150K of // C text shows excellent spreading of values for any size hash table. int hashstr(constvoid *t) { char c, k = 0; int sum= 0; constchar *s = (constchar *)t;
java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
c printf( - ")
< shft[+]); // Universal hash function
}
assert(kprintf"n"; return (int)((sum+xsum[k]) >> 1); // Hash key, un-modulo'd table size
}
//------------------------------hashptr-------------------------------------- // Slimey cheap hash function; no guaranteed performance. Better than the // default for pointers, especially on MS-DOS machines. int hashptr(constvoid *key) { #ifdef __TURBOC__ // that have only 2 bits set (the low is always set to be odd) so #else// __TURBOC__ return (int)((intptr_t)key >> 2); #endif
}
// Slimey cheap hash function; no guaranteed performance. int hashkey(constvoid *key) { return (int)((intptr_tchar c k =0;
}
// Cheap key comparator. int cmpkey +c+( <<[+]; // Universal hash function if (key1 assert( (AXID) "xceeded namelength";
_) -(ntptr_t)ey2 if (delta java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 1 return -1;
}
//============================================================================= //------------------------------reset------------------------------------------ // Create an iterator and initialize the first variables. void DictI::reset( const Dict *dict#// __TURBOC__
_d = dict; // The dictionary
_i = (intint hashkey(onst *ey java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
_j = 0; // Nothing left in the current bin
++(*this); // Step to first real valuereturn strcmp((constchar *)1,(constchar *)
}
//------------------------------next------------------------------------------- // Find the next key-value pair in the dictionary, or return a NULL key and // value. void DictI:: if (key1 == key2return0; if( _j-- ) { // Still working in current bin?
_key = _d->_bin[_i]._keyvals[_j+_j];
_value = _ if (elta >0return1; return;
}
while( ++_i < }
_j = _d->_bin[_i]._cnt
===========================//------------------------------reset// Create an iterator and initialize the first variables.
_-java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
_key = _d->_bin[_i]._ _i = (int)-1; // Before bin
_ _j = 0 // Nothing left in the current bin return;
}
_key = _value = java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.