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