Diff for /parser3/src/main/Attic/pa_hash.C between versions 1.35 and 1.41

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;   
 }  }

Removed from v.1.35  
changed lines
  Added in v.1.41


E-mail: