|
|
| version 1.2, 2001/01/27 15:21:05 | version 1.7, 2001/01/29 15:56:03 |
|---|---|
| Line 26 class Pool; | Line 26 class Pool; |
| class Array { | class Array { |
| public: | public: |
| typedef void *Item; | typedef void *Item; |
| enum { | enum { |
| CR_PREALLOCATED_COUNT=10, | CR_INITIAL_ROWS_DEFAULT=10, |
| CR_GROW_PERCENT=60 | CR_GROW_PERCENT=60 |
| }; | }; |
| private: | public: |
| friend Pool; | |
| void *operator new(size_t size, Pool *apool); | |
| Array(Pool *apool, int initial_rows=CR_INITIAL_ROWS_DEFAULT); | |
| int size() { return fused_rows; } | |
| Array& operator += (Item src); | |
| Array& operator += (Array& src); | |
| Item& operator [] (int index); | |
| protected: | |
| // the pool I'm allocated on | // the pool I'm allocated on |
| Pool *pool; | Pool *pool; |
| private: | |
| struct Chunk { | struct Chunk { |
| // the number of rows in chunk | // the number of rows in chunk |
| int count; | int count; |
| Line 50 private: | Line 62 private: |
| } | } |
| *head; // the head chunk of the chunk chain | *head; // the head chunk of the chunk chain |
| // last allocated chunk | |
| // helps appending Arrays | |
| Chunk *tail; | |
| // next append would write to this record | // next append would write to this record |
| Chunk::Row *append_here; | Chunk::Row *append_here; |
| Line 58 private: | Line 74 private: |
| Chunk::Row *link_row; | Chunk::Row *link_row; |
| private: | private: |
| // last chank allocated count | |
| int curr_chunk_rows; | |
| // array size | // array size |
| int fused_rows; | int fused_rows; |
| int cache_index; | int cache_chunk_base; |
| Chunk::Row *cache_row; | Chunk *cache_chunk; |
| int cache_countdown; | |
| Chunk::Row *cache_link_row; | |
| private: | private: |
| // new&constructors made private to enforce factory manufacturing at pool | |
| void *operator new(size_t size, Pool *apool); | |
| void construct(Pool *apool, int initial_rows); | |
| Array(Pool *apool) { | |
| construct(apool, CR_PREALLOCATED_COUNT); | |
| } | |
| Array(Pool *apool, int initial_rows) { | |
| construct(apool, initial_rows); | |
| } | |
| bool chunk_is_full() { | bool chunk_is_full() { |
| return append_here == link_row; | return append_here == link_row; |
| } | } |
| void expand(); | void expand(int chunk_rows); |
| public: | |
| int size() { return fused_rows; } | |
| Array& operator += (Item src); | |
| /* | |
| void put(int index, Item item); | |
| Item get(int index); | |
| */ | |
| Item& operator [] (int index); | |
| private: //disabled | private: //disabled |
| Array& operator = (Array& src) { return *this; } | Array(Array&) {} |
| Array(Array& src) {} | Array& operator = (Array&) { return *this; } |
| }; | }; |
| #endif | #endif |