|
|
| version 1.35, 2001/05/17 19:33:33 | version 1.41, 2001/10/05 08:20:26 |
|---|---|
| Line 2 | Line 2 |
| Parser: hash class. | Parser: hash class. |
| Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) | Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) |
| Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf) | Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf) |
| $Id$ | $Id$ |
| Line 32 int Hash::allocates_count= | Line 31 int Hash::allocates_count= |
| sizeof(allocates)/sizeof(uint); | sizeof(allocates)/sizeof(uint); |
| void Hash::construct(Pool& apool) { | void Hash::construct_new() { |
| allocated=allocates[allocates_index=0]; | allocated=allocates[allocates_index=0]; |
| threshold=allocated*THRESHOLD_PERCENT/100; | threshold=allocated*THRESHOLD_PERCENT/100; |
| used=0; | count=used=0; |
| refs=static_cast<Pair **>(calloc(sizeof(Pair *)*allocated)); | refs=static_cast<Pair **>(calloc(sizeof(Pair *)*allocated)); |
| } | } |
| void Hash::construct_copy(const Hash& source) { | |
| allocates_index=source.allocates_index; | |
| allocated=source.allocated; | |
| threshold=source.threshold; | |
| used=source.used; | |
| count=source.count; | |
| size_t size=sizeof(Pair *)*allocated; | |
| refs=static_cast<Pair **>(malloc(size)); memcpy(refs, source.refs, size); | |
| } | |
| void Hash::expand() { | void Hash::expand() { |
| int old_size=allocated; | int old_size=allocated; |
| Pair **old_refs=refs; | Pair **old_refs=refs; |
| Line 96 bool Hash::put(const Key& key, Val *valu | Line 105 bool Hash::put(const Key& key, Val *valu |
| if(!*ref) // root cell were used? | if(!*ref) // root cell were used? |
| used++; // not, we'll use it and record the fact | used++; // not, we'll use it and record the fact |
| *ref=NEW Pair(code, key, value, *ref); | *ref=NEW Pair(code, key, value, *ref); |
| count++; | |
| return false; | return false; |
| } | } |
| Line 137 bool Hash::put_dont_replace(const Key& k | Line 147 bool Hash::put_dont_replace(const Key& k |
| } | } |
| // proper pair not found -- create&link_in new pair | // proper pair not found -- create&link_in new pair |
| *ref=NEW Pair(code, key, value, *ref); | |
| if(!*ref) // root cell were used? | if(!*ref) // root cell were used? |
| used++; // not, we'll use it and record the fact | used++; // not, we'll use it and record the fact |
| *ref=NEW Pair(code, key, value, *ref); | |
| count++; | |
| return false; | return false; |
| } | } |
| Line 158 void Hash::for_each(For_each_func func, | Line 169 void Hash::for_each(For_each_func func, |
| (*func)(pair->key, pair->value, info); | (*func)(pair->key, pair->value, info); |
| } | } |
| Hash::Val* Hash::first_that(First_that_func func, void *info) const { | void* Hash::first_that(First_that_func func, void *info) const { |
| Pair **ref=refs; | Pair **ref=refs; |
| for(int index=0; index<allocated; index++) | for(int index=0; index<allocated; index++) |
| for(Pair *pair=*ref++; pair; pair=pair->link) | for(Pair *pair=*ref++; pair; pair=pair->link) |
| if(pair->value) | if(pair->value) |
| if((*func)(pair->key, pair->value, info)) | if(void *result=(*func)(pair->key, pair->value, info)) |
| return pair->value; | return result; |
| return 0; | return 0; |
| } | } |
| void Hash::clear() { | void Hash::clear() { |
| memset(refs, 0, sizeof(*refs)*allocated); | memset(refs, 0, sizeof(*refs)*allocated); |
| used=0; | count=used=0; |
| } | } |