Annotation of parser3/src/include/pa_pool.h, revision 1.1.1.1

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

E-mail: