|
|
1.1 paf 1: /*
2:
3: String Chunk0
4: ====== ========
5: head_chunk--------->[ptr, size]
6: append_here-------->[ptr, size]
7: chunk_link_row ........
8: . .
9: . [ptr, size]
10: ...........>[link to the next chunk]
11:
12: */
13:
14: #ifndef PA_POOL_H
15: #define PA_POOL_H
16:
17: #include <stddef.h>
18:
19: class Pool;
20:
21: class String {
22: friend Pool;
23:
24: // the pool I'm allocated on
25: Pool *pool;
26:
27: // the number of records per chunk
28: int chunk_items;
29: enum {
30: CI_CONST_STRING_GROW=5,
31: CI_DYNAMIC_STRING_GROW_DEFAULT=10
32: };
33:
34: struct Chunk {
35: union Row {
36: // chunk item
37: struct {
38: char *ptr; // pointer to the start of string fragment
39: size_t size; // length of the fragment
40: } item;
41: Chunk *link; // link to the next chunk in chain
42: } first;
43: // next rows are here
44: }
45: *head_chunk; // the head chunk of the chunk chain
46:
47: // next append would write to this record
48: Chunk::Row *append_here;
49:
50: // the address of place where lies address
51: // of the link to the next chunk to allocate
52: Chunk::Row *chunk_link_row;
53:
54: // new&constructors made private to enforce factory manufacturing at pool
55: void *operator new(size_t size, Pool *apool);
56:
57: void construct(Pool *apool, int achunk_items);
58: String(Pool *apool, int achunk_items=CI_DYNAMIC_STRING_GROW_DEFAULT) {
59: construct(apool, achunk_items);
60: }
61: String(Pool *apool, char *src) {
62: construct(apool, CI_CONST_STRING_GROW);
63: *this+=src;
64: }
65:
66: bool chunk_is_full() {
67: return append_here == chunk_link_row;
68: }
69: void expand();
70:
71: public:
72:
73: size_t size();
74: char *c_str();
75: String& operator += (char *src);
76: };
77:
78: class Pool {
79: public:
80: Pool();
81: ~Pool();
82: void *alloc(size_t size);
83: void *calloc(size_t size);
84:
85: String *makeString() {
86: return new(this) String(this);
87: }
88: String *makeString(int chunk_items) {
89: return new(this) String(this, chunk_items);
90: }
91: String *makeString(char *src) {
92: return new(this) String(this, src);
93: }
94: };
95:
96: #endif