Annotation of parser3/src/include/pa_array.h, revision 1.37
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.37 ! paf 8: $Id: pa_array.h,v 1.36 2001/04/26 14:55:25 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:
1.35 paf 42: /*/// for_each iterator function type, const info
43: typedef void (*For_each_func_const)(Item *value, const void *info);
44: */
45:
1.29 paf 46: /// for_each iterator function type
47: typedef void (*For_each_func)(Item *value, void *info);
48:
1.32 paf 49: /// first_that iterator function type, const info
50: typedef bool (*First_that_func_const)(Item *value, const void *info);
51:
1.29 paf 52: /// first_that iterator function type
1.32 paf 53: typedef bool (*First_that_func)(Item *value, void *info);
1.10 paf 54:
1.1 paf 55: enum {
1.24 paf 56: CR_INITIAL_ROWS_DEFAULT=10, ///< default preallocated row count
57: CR_GROW_PERCENT=60 ///< each time the Array chunk_is_full() array expanded()
1.1 paf 58: };
59:
1.6 paf 60: public:
61:
1.11 paf 62: Array(Pool& apool, int initial_rows=CR_INITIAL_ROWS_DEFAULT);
1.7 paf 63:
1.33 paf 64: /**
65: size Array. how many items are in it.
66: must be used with quick_get like this:
67: @code
68: int size=src.quick_size();
69: for(int i=0; i<size; i++) {
70: z=src.quick_get(i);
71: }
72: @endcode
73: */
74: int quick_size() const {
75: // for quick_get
1.18 paf 76: cache_chunk_base=0;
77: cache_chunk=head;
1.33 paf 78: return size();
1.18 paf 79: }
1.33 paf 80: /// size Array. how many items are in it
81: int size() const { return fused_rows; }
1.24 paf 82: /// append Item to array
1.15 paf 83: Array& operator += (Item *src);
1.37 ! paf 84: /// append int value to array
! 85: Array& operator += (int value) { return *this+=reinterpret_cast<Item *>(value); }
1.24 paf 86:
87: /// dirty hack to allow constant items storage. I long for Array<const Item*>
1.37 ! paf 88: Array& operator += (const Item *src) { return *this+=const_cast<Item *>(src); }
1.24 paf 89:
90: /// append other Array portion to this one. starting from offset
1.19 paf 91: Array& append_array(const Array& src, int offset=0);
1.24 paf 92:
1.25 paf 93: /**
94: quickly gets some item considering...
1.24 paf 95:
96: these true:
97: - index increments from 0 to size()-1
98: - index>=0 && index<size()
99: - index>=cache_chunk_base
100: */
1.16 paf 101: Item *quick_get(int index) const {
1.14 paf 102: // next chunk will be with "index" row
103: if(!(index<cache_chunk_base+cache_chunk->count)) {
104: int count=cache_chunk->count;
105: cache_chunk_base+=count;
106: cache_chunk=cache_chunk->rows[count].link;
107: }
108:
109: return cache_chunk->rows[index-cache_chunk_base].item;
110: }
111:
1.15 paf 112: Item *get(int index) const;
1.37 ! paf 113: int get_int(int index) const { return reinterpret_cast<int>(get(index)); }
! 114:
1.17 paf 115: void put(int index, Item *item);
1.24 paf 116: /// convinient way to get strings from Array. I long for Array<const String *>
1.12 paf 117: const String *get_string(int index) const {
1.28 paf 118: return const_cast<const String *>(static_cast<String *>(get(index)));
1.34 paf 119: }
120: const String *quick_get_string(int index) const {
121: return const_cast<const String *>(static_cast<String *>(quick_get(index)));
1.12 paf 122: }
1.35 paf 123:
124: /*/// iterate over all elements, const info
125: void for_each(For_each_func_const func, const void *info=0) const;
126: /*/
1.29 paf 127:
128: /// iterate over all elements
1.31 paf 129: void for_each(For_each_func func, void *info=0) const;
1.29 paf 130:
1.32 paf 131: /// iterate over all elements until condition, const info
132: void* first_that(First_that_func_const func, const void *info=0) const;
133:
1.29 paf 134: /// iterate over all elements until condition
1.32 paf 135: void* first_that(First_that_func func, void *info=0) const;
1.1 paf 136:
1.7 paf 137: private:
138:
1.36 paf 139: /// several record elements
1.1 paf 140: struct Chunk {
1.36 paf 141: int count; ///< the number of rows in chunk
142: /// item or a link to next chunk union
1.1 paf 143: union Row {
1.15 paf 144: Item *item;
1.36 paf 145: Chunk *link; ///< link to the next chunk in chain
1.1 paf 146: } rows[1];
147: // next rows are here
148: }
1.36 paf 149: *head; ///< the head chunk of the chunk chain
1.1 paf 150:
1.36 paf 151: /** last allocated chunk
152: helps appending Arrays
153: */
1.5 paf 154: Chunk *tail;
155:
1.36 paf 156: /// next append would write to this record
1.1 paf 157: Chunk::Row *append_here;
158:
1.36 paf 159: /** the address of place where lies address
160: of the link to the next chunk to allocate
161: */
1.1 paf 162: Chunk::Row *link_row;
163:
164: private:
1.7 paf 165:
1.1 paf 166: // array size
167: int fused_rows;
168:
1.12 paf 169: mutable int cache_chunk_base;
170: mutable Chunk *cache_chunk;
1.2 paf 171:
1.1 paf 172: private:
173:
174: bool chunk_is_full() {
175: return append_here == link_row;
176: }
1.5 paf 177: void expand(int chunk_rows);
1.2 paf 178:
1.1 paf 179: private: //disabled
180:
1.11 paf 181: //Array(Array&) { }
1.12 paf 182: Array& operator = (const Array&) { return *this; }
1.1 paf 183: };
184:
185: #endif
E-mail: