--- parser3/src/main/Attic/pa_array.C 2001/03/29 17:11:41 1.30 +++ parser3/src/main/Attic/pa_array.C 2002/03/27 15:30:36 1.48 @@ -1,42 +1,39 @@ /** @file Parser: array class. - Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexandr Petrosian (http://paf.design.ru) - Author: Alexander Petrosyan (http://design.ru/paf) - - $Id: pa_array.C,v 1.30 2001/03/29 17:11:41 paf Exp $ + $Id: pa_array.C,v 1.48 2002/03/27 15:30:36 paf Exp $ */ -#include "pa_config_includes.h" - #include "pa_pool.h" #include "pa_array.h" #include "pa_exception.h" #include "pa_common.h" -Array::Array(Pool& apool, int initial_rows) : - Pooled(apool) { - initial_rows=min(3, initial_rows); - +void Array::construct_new(int initial_rows) { head=tail=static_cast( - malloc(sizeof(int)+sizeof(Chunk::Row)*initial_rows+sizeof(Chunk *))); + malloc(sizeof(int)+sizeof(Chunk::Row)*initial_rows+sizeof(Chunk *), 19)); head->count=initial_rows; append_here=head->rows; link_row=&head->rows[initial_rows]; link_row->link=0; fused_rows=0; +} - cache_chunk_base=0; - cache_chunk=head; +Array::Array(Pool& apool, int initial_rows) : Pooled(apool) { + construct_new(max(initial_rows, CR_INITIAL_ROWS_DEFAULT)); } -void Array::expand(int chunk_rows) { - if(chunk_rows( - malloc(sizeof(int)+sizeof(Chunk::Row)*chunk_rows+sizeof(Chunk *))); + malloc(sizeof(int)+sizeof(Chunk::Row)*chunk_rows+sizeof(Chunk *), 2)); chunk->count=chunk_rows; link_row->link=chunk; append_here=chunk->rows; @@ -47,7 +44,7 @@ void Array::expand(int chunk_rows) { Array& Array::operator += (Item *src) { if(chunk_is_full()) - expand(tail->count*CR_GROW_PERCENT/100); + expand(tail->count+CR_GROW_COUNT); append_here->item=src; append_here++; fused_rows++; @@ -57,48 +54,42 @@ Array& Array::operator += (Item *src) { Array::Item *Array::get(int index) const { if(!(index>=0 && index=cache_chunk_base && indexcount)) { - int count=cache_chunk->count; - cache_chunk_base+=count; - cache_chunk=cache_chunk->rows[count].link; + while(!(index>=base && indexcount)) { + int count=chunk->count; + base+=count; + chunk=chunk->rows[count].link; } - return cache_chunk->rows[index-cache_chunk_base].item; + return chunk->rows[index-base].item; } void Array::put(int index, Item *item) { if(!(index>=0 && index=cache_chunk_base && indexcount)) { - int count=cache_chunk->count; - cache_chunk_base+=count; - cache_chunk=cache_chunk->rows[count].link; + while(!(index>=base && indexcount)) { + int count=chunk->count; + base+=count; + chunk=chunk->rows[count].link; } - cache_chunk->rows[index-cache_chunk_base].item=item; + chunk->rows[index-base].item=item; } Array& Array::append_array(const Array& src, int offset) { @@ -167,20 +158,53 @@ void Array::for_each(For_each_func func, } } -Array::Item* Array::first_that(First_that_func_const func, const void *info) const { +/*void Array::for_each(For_each_func_storage func, void *info) { + Chunk *chunk=head; + while(true) { + if(chunk==tail) { // last chunk? + for(Chunk::Row *row=chunk->rows; row!=append_here; row++) + (*func)(&row->item, info); + break; + } else { + int count=chunk->count; + for(int i=0; irows[i].item, info); + chunk=chunk->rows[count].link; + } + } +} +*/ + +/*void Array::for_each(For_each_func_const func, const void *info) const { + Chunk *chunk=head; + while(true) { + if(chunk==tail) { // last chunk? + for(Chunk::Row *row=chunk->rows; row!=append_here; row++) + (*func)(row->item, info); + break; + } else { + int count=chunk->count; + for(int i=0; irows[i].item, info); + chunk=chunk->rows[count].link; + } + } +} +*/ +void* Array::first_that(Item_that_func_const func, const 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; + if(void *result=(*func)(row->item, info)) + return result; break; } else { int count=chunk->count; for(int i=0; irows[i].item; - if((*func)(item, info)) - return item; + if(void *result=(*func)(item, info)) + return result; } chunk=chunk->rows[count].link; } @@ -188,20 +212,20 @@ Array::Item* Array::first_that(First_tha return 0; } -Array::Item* Array::first_that(First_that_func func, void *info) const { +void* Array::first_that(Item_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; + if(void *result=(*func)(row->item, info)) + return result; break; } else { int count=chunk->count; for(int i=0; irows[i].item; - if((*func)(item, info)) - return item; + if(void *result=(*func)(item, info)) + return result; } chunk=chunk->rows[count].link; }