Annotation of parser3/src/main/pa_hash.C, revision 1.2
1.1 paf 1: /*
1.2 ! paf 2: $Id: pa_hash.C,v 1.1 2001/01/27 10:03:31 paf Exp $
1.1 paf 3: */
4:
5: /*
6: The prime numbers used from zend_hash.c,
7: the part of Zend scripting engine library,
8: Copyrighted (C) 1999-2000 Zend Technologies Ltd.
9: http://www.zend.com/license/0_92.txt
10: For more information about Zend please visit http://www.zend.com/
11: */
12:
13: #include "pa_pool.h"
14:
1.2 ! paf 15:
! 16: void *Hash::Pair::operator new(size_t size, Pool *apool) {
! 17: return apool->malloc(size);
! 18: }
! 19:
1.1 paf 20: /* Zend comment: Generated on an Octa-ALPHA 300MHz CPU & 2.5GB RAM monster */
21: uint Hash::sizes[]={
22: 5, 11, 19, 53, 107, 223, 463, 983, 1979, 3907, 7963,
23: 16229, 32531, 65407, 130987, 262237, 524521, 1048793,
24: 2097397, 4194103, 8388857, 16777447, 33554201, 67108961,
25: 134217487, 268435697, 536870683, 1073741621, 2147483399};
26: int Hash::sizes_count=
27: sizeof(sizes)/sizeof(uint);
28:
29: void *Hash::operator new(size_t size, Pool *apool) {
30: return apool->malloc(size);
31: }
32:
33: Hash::Hash(Pool *apool) {
34: pool=apool;
35:
36: size=sizes[size_index=0];
1.2 ! paf 37: threshold=size*THRESHOLD_PERCENT/100;
1.1 paf 38: used=0;
1.2 ! paf 39: refs=static_cast<Pair **>(pool->calloc(sizeof(Pair *)*size));
1.1 paf 40: }
41:
42: void Hash::expand() {
1.2 ! paf 43: int old_size=size;
! 44: Pair **old_refs=refs;
! 45:
! 46: // allocated bigger refs array
! 47: size_index=size_index+1<sizes_count?size_index+1:sizes_count-1;
! 48: size=sizes[size_index];
! 49: Pair **refs=static_cast<Pair **>(pool->calloc(sizeof(Pair *)*size));
1.1 paf 50:
51: // rehash
1.2 ! paf 52: Pair **old_ref=old_refs;
! 53: for(int old_index=0; old_index<old_size; old_index++)
! 54: for(Pair *pair=*old_ref++; pair; ) {
! 55: Pair *linked_pair=pair->link;
! 56:
! 57: uint new_index=pair->code%size;
! 58: Pair **new_ref=&refs[new_index];
! 59: pair->link=*new_ref;
! 60: *new_ref=pair;
1.1 paf 61:
1.2 ! paf 62: pair=linked_pair;
! 63: }
1.1 paf 64: }
65:
66: uint Hash::generic_code(uint aresult, char *start, uint size) {
67: uint result=aresult, g;
68: char *end=start+size;
69:
70: while (start<end) {
71: result=(result<<4)+*start++;
72: if ((g=(result&0xF0000000))) {
73: result=result^(g>>24);
74: result=result^g;
75: }
76: }
77: return result;
78: }
79:
1.2 ! paf 80: void Hash::put(Key& key, Value *value) {
1.1 paf 81: if(full())
82: expand();
83:
1.2 ! paf 84: uint code=key.hash_code();
! 85: uint index=code%size;
! 86: Pair **ref=&refs[index];
! 87: for(Pair *pair=*ref; pair; pair=pair->link)
! 88: if(pair->code==code && pair->key==key) {
! 89: // found a pair with the same key
! 90: pair->value=value;
! 91: return;
1.1 paf 92: }
1.2 ! paf 93:
! 94: // not found proper pair -- create&link_in new pair
! 95: *ref=new(pool) Pair(code, key, value, *ref);
1.1 paf 96: }
97:
98: Value* Hash::get(Key& key) {
1.2 ! paf 99: uint code=key.hash_code();
1.1 paf 100: uint index=code%size;
1.2 ! paf 101: for(Pair *pair=refs[index]; pair; pair=pair->link)
1.1 paf 102: if(pair->code==code && pair->key==key)
103: return pair->value;
104:
105: return 0;
106: }
E-mail: