Annotation of parser3/src/include/pa_array.h, revision 1.30
1.24 paf 1: /** @file
1.26 paf 2: Parser: array class decl.
3:
1.21 paf 4: Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
1.26 paf 5:
1.22 paf 6: Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
1.21 paf 7:
1.30 ! paf 8: $Id: pa_array.h,v 1.29 2001/03/24 10:54:44 paf Exp $
1.1 paf 9: */
10:
1.24 paf 11: #ifndef PA_ARRAY_H
12: #define PA_ARRAY_H
13:
14: #include <stddef.h>
15:
16: #include "pa_pool.h"
17: #include "pa_types.h"
18: #include "pa_string.h"
19:
1.25 paf 20: /**
1.24 paf 21: Pooled Array.
22:
1.27 paf 23: Internal structure:
24: @verbatim
25: Array Chunk0
26: ====== ========
27: head--------------->[ptr]
28: append_here-------->[ptr]
29: link_row ........
30: . .
31: . [ptr]
32: ...........>[link to the next chunk]
1.24 paf 33: @endverbatim
1.1 paf 34: */
35:
1.13 paf 36: class Array : public Pooled {
1.1 paf 37: public:
1.7 paf 38:
1.29 paf 39: /// Array item type
40: typedef void Item;
41:
42: /// for_each iterator function type
43: typedef void (*For_each_func)(Item *value, void *info);
44:
45: /// first_that iterator function type
1.30 ! paf 46: typedef bool (*First_that_func)(Item *value, const void *info);
1.10 paf 47:
1.1 paf 48: enum {
1.24 paf 49: CR_INITIAL_ROWS_DEFAULT=10, ///< default preallocated row count
50: CR_GROW_PERCENT=60 ///< each time the Array chunk_is_full() array expanded()
1.1 paf 51: };
52:
1.6 paf 53: public:
54:
1.11 paf 55: Array(Pool& apool, int initial_rows=CR_INITIAL_ROWS_DEFAULT);
1.7 paf 56:
1.24 paf 57: /// size Array. how many items are in it
1.18 paf 58: int size() const {
59: // for get and quick_get
60: cache_chunk_base=0;
61: cache_chunk=head;
62: return fused_rows;
63: }
1.24 paf 64: /// append Item to array
1.15 paf 65: Array& operator += (Item *src);
1.24 paf 66:
67: /// dirty hack to allow constant items storage. I long for Array<const Item*>
1.20 paf 68: Array& operator += (const Item *src) { return *this+=const_cast<Item*>(src); }
1.24 paf 69:
70: /// append other Array portion to this one. starting from offset
1.19 paf 71: Array& append_array(const Array& src, int offset=0);
1.24 paf 72:
1.25 paf 73: /**
74: quickly gets some item considering...
1.24 paf 75:
76: these true:
77: - index increments from 0 to size()-1
78: - index>=0 && index<size()
79: - index>=cache_chunk_base
80: */
1.16 paf 81: Item *quick_get(int index) const {
1.14 paf 82: // next chunk will be with "index" row
83: if(!(index<cache_chunk_base+cache_chunk->count)) {
84: int count=cache_chunk->count;
85: cache_chunk_base+=count;
86: cache_chunk=cache_chunk->rows[count].link;
87: }
88:
89: return cache_chunk->rows[index-cache_chunk_base].item;
90: }
91:
1.15 paf 92: Item *get(int index) const;
1.17 paf 93: void put(int index, Item *item);
1.24 paf 94: /// convinient way to get strings from Array. I long for Array<const String *>
1.12 paf 95: const String *get_string(int index) const {
1.28 paf 96: return const_cast<const String *>(static_cast<String *>(get(index)));
1.12 paf 97: }
1.29 paf 98:
99: /// iterate over all elements
100: void for_each(For_each_func func, void *info=0);
101:
102: /// iterate over all elements until condition
103: void* first_that(First_that_func func, const void *info=0);
1.1 paf 104:
1.7 paf 105: private:
106:
1.1 paf 107: struct Chunk {
108: // the number of rows in chunk
109: int count;
110: union Row {
1.15 paf 111: Item *item;
1.1 paf 112: Chunk *link; // link to the next chunk in chain
113: } rows[1];
114: // next rows are here
115: }
116: *head; // the head chunk of the chunk chain
117:
1.5 paf 118: // last allocated chunk
119: // helps appending Arrays
120: Chunk *tail;
121:
1.1 paf 122: // next append would write to this record
123: Chunk::Row *append_here;
124:
125: // the address of place where lies address
126: // of the link to the next chunk to allocate
127: Chunk::Row *link_row;
128:
129: private:
1.7 paf 130:
1.1 paf 131: // array size
132: int fused_rows;
133:
1.12 paf 134: mutable int cache_chunk_base;
135: mutable Chunk *cache_chunk;
1.2 paf 136:
1.1 paf 137: private:
138:
139: bool chunk_is_full() {
140: return append_here == link_row;
141: }
1.5 paf 142: void expand(int chunk_rows);
1.2 paf 143:
1.1 paf 144: private: //disabled
145:
1.11 paf 146: //Array(Array&) { }
1.12 paf 147: Array& operator = (const Array&) { return *this; }
1.1 paf 148: };
149:
150: #endif
E-mail: