--- parser3/src/main/pa_string.C 2001/01/26 15:28:39 1.2 +++ parser3/src/main/pa_string.C 2001/01/27 10:02:59 1.7 @@ -1,17 +1,22 @@ +/* + $Id: pa_string.C,v 1.7 2001/01/27 10:02:59 paf Exp $ +*/ + #include #include "pa_pool.h" +#include "pa_hash.h" void *String::operator new(size_t size, Pool *apool) { - return apool->alloc(size); + return apool->malloc(size); } void String::construct(Pool *apool) { pool=apool; head.count=curr_chunk_rows=CR_PREALLOCATED_COUNT; - append_here=head.first; + append_here=head.rows; head.preallocated_link=0; - link_row=&head.first[curr_chunk_rows]; + link_row=&head.rows[curr_chunk_rows]; } void String::expand() { @@ -20,10 +25,36 @@ void String::expand() { pool->calloc(sizeof(Chunk::Row)*curr_chunk_rows+sizeof(Chunk *))); chunk->count=curr_chunk_rows; link_row->link=chunk; - append_here=chunk->first; - link_row=&chunk->first[curr_chunk_rows]; + append_here=chunk->rows; + link_row=&chunk->rows[curr_chunk_rows]; } +String::String(String& src) {/* + int src_used_rows=src.used_rows(); { + curr_chunk_rows=src_total_rows + Chunk *chunk=static_cast( + pool->calloc(sizeof(Chunk::Row)*curr_chunk_rows+sizeof(Chunk *))); + chunk->count=curr_chunk_rows; + link_row->link=chunk; + append_here=chunk->rows; + link_row=&chunk->rows[curr_chunk_rows]; + } + + Chunk *chunk=&head; + do { + result+=chunk->count; + chunk=row->link; + } while(chunk); +break2: + return result;*/ + +} + +String& String::operator = (String& src) { + return *this; +} + + String& String::operator += (char *src) { if(chunk_is_full()) expand(); @@ -37,9 +68,10 @@ String& String::operator += (char *src) size_t String::size() { int result=0; + Chunk *chunk=&head; do { - Chunk::Row *row=chunk->first; + Chunk::Row *row=chunk->rows; for(int i=0; icount; i++) { if(row==append_here) goto break2; @@ -54,12 +86,12 @@ break2: } char *String::c_str() { - char *result=static_cast(pool->alloc(size()+1)); + char *result=static_cast(pool->malloc(size()+1)); char *copy_here=result; Chunk *chunk=&head; do { - Chunk::Row *row=chunk->first; + Chunk::Row *row=chunk->rows; for(int i=0; icount; i++) { if(row==append_here) goto break2; @@ -75,3 +107,40 @@ break2: return result; } +int String::used_rows() { + int result=0; + + Chunk *chunk=&head; + do { + int count=chunk->count; + result+=count; + chunk=chunk->rows[count].link; + } while(chunk); + + result-=link_row-append_here; + + return result; +} + +uint String::hash_code() { + uint result=0; + + Chunk *chunk=&head; + do { + Chunk::Row *row=chunk->rows; + for(int i=0; icount; i++) { + if(row==append_here) + goto break2; + + result=Hash::generic_code(result, row->item.ptr, row->item.size); + row++; + } + chunk=row->link; + } while(chunk); +break2: + return result; +} + +bool String::operator == (String& src) { + return false; +}