Annotation of parser3/src/main/pa_array.C, revision 1.4

1.1       paf         1: /*
1.4     ! paf         2:   $Id: pa_array.C,v 1.3 2001/01/27 15:45:24 paf Exp $
1.1       paf         3: */
                      4: 
                      5: #include <string.h>
                      6: 
                      7: #include "pa_pool.h"
                      8: 
                      9: void *Array::operator new(size_t size, Pool *apool) {
                     10:        return apool->malloc(size);
                     11: }
                     12: 
                     13: void Array::construct(Pool *apool, int initial_rows) {
                     14:        pool=apool;
                     15:        curr_chunk_rows=initial_rows;
                     16:        head=static_cast<Chunk *>(
                     17:                pool->malloc(sizeof(int)+sizeof(Chunk::Row)*curr_chunk_rows+sizeof(Chunk *)));
1.3       paf        18:        head->count=curr_chunk_rows;
1.1       paf        19:        append_here=head->rows;
                     20:        link_row=&head->rows[curr_chunk_rows];
                     21:        link_row->link=0;
                     22:        fused_rows=0;
1.2       paf        23: 
1.3       paf        24:        cache_chunk_base=0;
                     25:        cache_chunk=head;
1.1       paf        26: }
                     27: 
                     28: void Array::expand() {
                     29:        curr_chunk_rows+=curr_chunk_rows*CR_GROW_PERCENT/100;
                     30:        Chunk *chunk=static_cast<Chunk *>(
                     31:                pool->malloc(sizeof(int)+sizeof(Chunk::Row)*curr_chunk_rows+sizeof(Chunk *)));
                     32:        chunk->count=curr_chunk_rows;
                     33:        link_row->link=chunk;
                     34:        append_here=chunk->rows;
                     35:        link_row=&chunk->rows[curr_chunk_rows];
                     36:        link_row->link=0;
                     37: }
                     38: 
                     39: 
                     40: Array& Array::operator += (Item src) {
                     41:        if(chunk_is_full())
                     42:                expand();
                     43: 
                     44:        append_here->item=src;
                     45:        append_here++; fused_rows++;
                     46: 
                     47:        return *this;
                     48: }
                     49: 
1.2       paf        50: Array::Item& Array::operator [] (int index) {
1.3       paf        51:        if(!(index>=0 && index<size())) {
                     52:                // FIX: some sort of thread-global error
                     53:                Item *result=0;
                     54:                return *result;
1.2       paf        55:        }
                     56: 
1.3       paf        57:        // if they ask index to the left of cached position, forget cache
                     58:        if(index<cache_chunk_base) {
                     59:                cache_chunk_base=0;
                     60:                cache_chunk=head;
                     61:        }
                     62: 
                     63:        // navigate to chunk with "index" row
                     64:        while(!(index>=cache_chunk_base && index<cache_chunk_base+cache_chunk->count)) {
                     65:                int count=cache_chunk->count;
                     66:                cache_chunk_base+=count;
                     67:                cache_chunk=cache_chunk->rows[count].link;
                     68:        }
                     69: 
                     70:        return cache_chunk->rows[index-cache_chunk_base].item;
1.4     ! paf        71: }
        !            72: 
        !            73: Array& Array::operator += (Array& src) {
        !            74:        int src_size=src.size();
        !            75:        int last_chunk_rows_left=link_row-append_here;
        !            76:        
        !            77:        // src fits into our lask chunk?
        !            78:        if(src_size<=last_chunk_rows_left) {
        !            79:                Chunk *src_chunk=src.head; 
        !            80:                Chunk::Row *dest_rows=append_here;
        !            81:                int rows_left_to_copy=src_size;
        !            82:                while(true) {
        !            83:                        int src_count=src_chunk->count;
        !            84:                        Chunk *next_chunk=src_chunk->rows[src_count].link;
        !            85:                        if(next_chunk) {
        !            86:                                // not last source chunk
        !            87:                                // taking it all
        !            88:                                memcpy(dest_rows, src_chunk->rows, sizeof(Chunk::Row)*src_count);
        !            89:                                dest_rows+=src_count;
        !            90:                                rows_left_to_copy-=src_count;
        !            91: 
        !            92:                                src_chunk=next_chunk;
        !            93:                        } else {
        !            94:                                // the last source chunk
        !            95:                                // taking only those rows of chunk that _left_to_copy
        !            96:                                memcpy(dest_rows, src_chunk->rows, sizeof(Chunk::Row)*rows_left_to_copy);
        !            97:                                break;
        !            98:                        }
        !            99:                }
        !           100:        } else {
        !           101:        }
        !           102: 
        !           103:        return *this;
        !           104: }
        !           105: 
        !           106: void Array::remove(int index, int count=1) {
        !           107: }

E-mail: