|
|
| version 1.1, 2001/01/26 14:47:52 | version 1.2, 2001/01/26 15:28:39 |
|---|---|
| Line 6 void *String::operator new(size_t size, | Line 6 void *String::operator new(size_t size, |
| return apool->alloc(size); | return apool->alloc(size); |
| } | } |
| void String::construct(Pool *apool, int achunk_items) { | void String::construct(Pool *apool) { |
| pool=apool; | pool=apool; |
| chunk_items=achunk_items; | head.count=curr_chunk_rows=CR_PREALLOCATED_COUNT; |
| append_here=head.first; | |
| head_chunk=static_cast<Chunk *>( | head.preallocated_link=0; |
| pool->calloc(sizeof(Chunk::Row)*chunk_items+sizeof(Chunk *))); | link_row=&head.first[curr_chunk_rows]; |
| append_here=&head_chunk->first; | |
| chunk_link_row=&head_chunk->first+chunk_items; | |
| } | } |
| void String::expand() { | void String::expand() { |
| chunk_link_row->link=static_cast<Chunk *>( | curr_chunk_rows=curr_chunk_rows*100/CR_GROW_PERCENT; |
| pool->calloc(sizeof(Chunk::Row)*chunk_items+sizeof(Chunk *))); | Chunk *chunk=static_cast<Chunk *>( |
| append_here=&chunk_link_row->link->first; | pool->calloc(sizeof(Chunk::Row)*curr_chunk_rows+sizeof(Chunk *))); |
| chunk_link_row=&chunk_link_row->link->first+chunk_items; | chunk->count=curr_chunk_rows; |
| link_row->link=chunk; | |
| append_here=chunk->first; | |
| link_row=&chunk->first[curr_chunk_rows]; | |
| } | } |
| String& String::operator += (char *src) { | String& String::operator += (char *src) { |
| Line 36 String& String::operator += (char *src) | Line 37 String& String::operator += (char *src) |
| size_t String::size() { | size_t String::size() { |
| int result=0; | int result=0; |
| for(Chunk::Row *row=&head_chunk->first; row; row=&row->link->first) | Chunk *chunk=&head; |
| for(int i=0; i<chunk_items; i++) { | do { |
| Chunk::Row *row=chunk->first; | |
| for(int i=0; i<chunk->count; i++) { | |
| if(row==append_here) | if(row==append_here) |
| goto break2; | goto break2; |
| result+=row->item.size; | result+=row->item.size; |
| row++; | row++; |
| } | } |
| chunk=row->link; | |
| } while(chunk); | |
| break2: | break2: |
| return result; | return result; |
| } | } |
| Line 52 char *String::c_str() { | Line 57 char *String::c_str() { |
| char *result=static_cast<char *>(pool->alloc(size()+1)); | char *result=static_cast<char *>(pool->alloc(size()+1)); |
| char *copy_here=result; | char *copy_here=result; |
| for(Chunk::Row *row=&head_chunk->first; row; row=&row->link->first) | Chunk *chunk=&head; |
| for(int i=0; i<chunk_items; i++) { | do { |
| Chunk::Row *row=chunk->first; | |
| for(int i=0; i<chunk->count; i++) { | |
| if(row==append_here) | if(row==append_here) |
| goto break2; | goto break2; |
| Line 61 char *String::c_str() { | Line 68 char *String::c_str() { |
| copy_here+=row->item.size; | copy_here+=row->item.size; |
| row++; | row++; |
| } | } |
| chunk=row->link; | |
| } while(chunk); | |
| break2: | break2: |
| *copy_here=0; | *copy_here=0; |
| return result; | return result; |