Diff for /parser3/src/main/Attic/pa_array.C between versions 1.26 and 1.30

version 1.26, 2001/03/24 10:54:46 version 1.30, 2001/03/29 17:11:41
Line 13 Line 13
 #include "pa_pool.h"  #include "pa_pool.h"
 #include "pa_array.h"  #include "pa_array.h"
 #include "pa_exception.h"  #include "pa_exception.h"
   #include "pa_common.h"
   
 Array::Array(Pool& apool, int initial_rows) :  Array::Array(Pool& apool, int initial_rows) :
         Pooled(apool) {          Pooled(apool) {
           initial_rows=min(3, initial_rows);
   
         head=tail=static_cast<Chunk *>(          head=tail=static_cast<Chunk *>(
                 malloc(sizeof(int)+sizeof(Chunk::Row)*initial_rows+sizeof(Chunk *)));                  malloc(sizeof(int)+sizeof(Chunk::Row)*initial_rows+sizeof(Chunk *)));
         head->count=initial_rows;          head->count=initial_rows;
Line 148  Array& Array::append_array(const Array& Line 151  Array& Array::append_array(const Array&
         return *this;          return *this;
 }  }
   
 void Array::for_each(For_each_func func, void *info) {  void Array::for_each(For_each_func func, void *info) const {
         Chunk *chunk=head;          Chunk *chunk=head;
         while(true) {          while(true) {
                 if(chunk==tail) { // last chunk?                  if(chunk==tail) { // last chunk?
Line 164  void Array::for_each(For_each_func func, Line 167  void Array::for_each(For_each_func func,
         }          }
 }  }
   
 Array::Item* Array::first_that(First_that_func func, const void *info) {  Array::Item* Array::first_that(First_that_func_const func, const void *info) const {
         Chunk *chunk=head;          Chunk *chunk=head;
         while(true) {          while(true) {
                 if(chunk==tail) { // last chunk?                  if(chunk==tail) { // last chunk?
                         for(Chunk::Row *row=chunk->rows; row!=append_here; row++)                          for(Chunk::Row *row=chunk->rows; row!=append_here; row++)
                                 if(Item *result=(*func)(row->item, info))                                  if((*func)(row->item, info))
                                         return result;                                          return row->item;
                         break;                          break;
                 } else {                  } else {
                         int count=chunk->count;                          int count=chunk->count;
                         for(int i=0; i<count; i++)                          for(int i=0; i<count; i++) {
                                 if(Item *result=(*func)(chunk->rows[i].item, info))                                  Item* item=chunk->rows[i].item;
                                         return result;                                  if((*func)(item, info))
                                           return item;
                           }
                           chunk=chunk->rows[count].link;
                   }
           }
           return 0;
   }
   
   Array::Item* Array::first_that(First_that_func func, void *info) const {
           Chunk *chunk=head;
           while(true) {
                   if(chunk==tail) { // last chunk?
                           for(Chunk::Row *row=chunk->rows; row!=append_here; row++)
                                   if((*func)(row->item, info))
                                           return row->item;
                           break;
                   } else {
                           int count=chunk->count;
                           for(int i=0; i<count; i++) {
                                   Item* item=chunk->rows[i].item;
                                   if((*func)(item, info))
                                           return item;
                           }
                         chunk=chunk->rows[count].link;                          chunk=chunk->rows[count].link;
                 }                  }
         }          }

Removed from v.1.26  
changed lines
  Added in v.1.30


E-mail: