|
|
| version 1.7, 2001/01/29 15:56:03 | version 1.17, 2001/02/21 17:36:29 |
|---|---|
| Line 20 | Line 20 |
| #include <stddef.h> | #include <stddef.h> |
| #include "pa_pool.h" | |
| #include "pa_types.h" | #include "pa_types.h" |
| #include "pa_string.h" | |
| class Pool; | class Array : public Pooled { |
| class Array { | |
| public: | public: |
| typedef void *Item; | typedef void Item; |
| enum { | enum { |
| CR_INITIAL_ROWS_DEFAULT=10, | CR_INITIAL_ROWS_DEFAULT=10, |
| Line 36 public: | Line 36 public: |
| public: | public: |
| void *operator new(size_t size, Pool *apool); | Array(Pool& apool, int initial_rows=CR_INITIAL_ROWS_DEFAULT); |
| 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: | int size() const { return fused_rows; } |
| Array& operator += (Item *src); | |
| Array& append_array(const Array& src); | |
| Item *quick_get(int index) const { | |
| // considering these true: | |
| // index increments from 0 to size()-1 | |
| // index>=0 && index<size() | |
| // index>=cache_chunk_base | |
| // next chunk will be with "index" row | |
| if(!(index<cache_chunk_base+cache_chunk->count)) { | |
| int count=cache_chunk->count; | |
| cache_chunk_base+=count; | |
| cache_chunk=cache_chunk->rows[count].link; | |
| } | |
| return cache_chunk->rows[index-cache_chunk_base].item; | |
| } | |
| // the pool I'm allocated on | Item *get(int index) const; |
| Pool *pool; | void put(int index, Item *item); |
| const char *get_cstr(int index) const { | |
| return static_cast<const char *>(get(index)); | |
| } | |
| const String *get_string(int index) const { | |
| return static_cast<const String *>(get(index)); | |
| } | |
| private: | private: |
| Line 55 private: | Line 72 private: |
| // the number of rows in chunk | // the number of rows in chunk |
| int count; | int count; |
| union Row { | union Row { |
| Item item; | Item *item; |
| Chunk *link; // link to the next chunk in chain | Chunk *link; // link to the next chunk in chain |
| } rows[1]; | } rows[1]; |
| // next rows are here | // next rows are here |
| Line 78 private: | Line 95 private: |
| // array size | // array size |
| int fused_rows; | int fused_rows; |
| int cache_chunk_base; | mutable int cache_chunk_base; |
| Chunk *cache_chunk; | mutable Chunk *cache_chunk; |
| private: | private: |
| Line 90 private: | Line 107 private: |
| private: //disabled | private: //disabled |
| Array(Array&) {} | //Array(Array&) { } |
| Array& operator = (Array&) { return *this; } | Array& operator = (const Array&) { return *this; } |
| }; | }; |
| #endif | #endif |