Annotation of parser3/src/include/pa_pool.h, revision 1.64
1.34 paf 1: /** @file
1.36 paf 2: Parser: pool class decl.
3:
1.27 paf 4: Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
1.36 paf 5:
1.28 paf 6: Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
1.27 paf 7:
1.64 ! parser 8: $Id: pa_pool.h,v 1.63 2001/10/18 13:09:37 parser Exp $
1.1 paf 9: */
10:
11: #ifndef PA_POOL_H
12: #define PA_POOL_H
13:
1.52 parser 14: #include "pa_config_includes.h"
1.1 paf 15:
1.59 parser 16: #ifdef XML
1.55 parser 17: #include <XalanDOM/XalanDOMString.hpp>
18: #include <util/TransService.hpp>
1.59 parser 19: #endif
1.55 parser 20:
21: // forwards
22:
1.21 paf 23: class Exception;
1.25 paf 24: class Temp_exception;
1.55 parser 25: class String;
26:
1.35 paf 27: /**
1.34 paf 28: Pool mechanizm allows users not to free up allocated memory,
29: leaving that problem to 'pools'.
30:
1.38 paf 31: @see Pooled
1.34 paf 32: */
1.47 paf 33:
1.1 paf 34: class Pool {
35: public:
1.18 paf 36:
1.55 parser 37: Pool(void *astorage);
1.56 parser 38: ~Pool();
1.18 paf 39:
1.40 paf 40: void set_context(void *acontext) { fcontext=acontext; }
1.64 ! parser 41: void *get_context() { return fcontext; }
1.39 paf 42:
1.47 paf 43: void set_tag(void *atag) { ftag=atag; }
44: void *tag() { return ftag; }
1.44 paf 45:
1.34 paf 46: /// allocates some bytes on pool
1.51 parser 47: void *malloc(size_t size/*, int place=0*/) {
48: return check(real_malloc(size/*, place*/), size);
1.18 paf 49: }
1.34 paf 50: /// allocates some bytes clearing them with zeros
1.18 paf 51: void *calloc(size_t size) {
52: return check(real_calloc(size), size);
53: }
1.39 paf 54:
1.53 parser 55: /// registers a routine to clean up non-pooled allocations
1.54 parser 56: void register_cleanup(void (*cleanup) (void *), void *data) {
57: if(!real_register_cleanup(cleanup, data))
58: fail_register_cleanup();
59: }
1.53 parser 60:
1.60 parser 61: /// resets transcoder if they change charset
62: void set_charset(const String &charset);
63: /// returns current charset
64: const String& get_charset() { return *charset; }
65:
1.39 paf 66: private:
67:
68: void *fstorage;
1.40 paf 69: void *fcontext;
1.47 paf 70: void *ftag;
1.60 parser 71: const String *charset;
1.8 paf 72:
1.50 parser 73: private:
74:
75: //{
76: /// @name implementation defined
1.51 parser 77: void *real_malloc(size_t size/*, int place*/);
1.20 paf 78: void *real_calloc(size_t size);
1.54 parser 79: bool real_register_cleanup(void (*cleanup) (void *), void *data);
1.50 parser 80: //}
1.17 paf 81:
1.23 paf 82: private:
1.17 paf 83:
1.34 paf 84: /// checks whether mem allocated OK. throws exception otherwise
1.23 paf 85: void *check(void *ptr, size_t size) {
86: if(ptr)
87: return ptr;
88:
1.54 parser 89: fail_alloc(size);
1.23 paf 90:
91: // never reached
92: return 0;
93: }
1.54 parser 94: /// throws allocation exception
95: void fail_alloc(size_t size) const;
96:
97: /// throws register cleanup exception
98: void fail_register_cleanup() const;
1.23 paf 99:
1.59 parser 100: #ifdef XML
101:
102: public:
103: /// converts Xalan string to char *
104: const char *transcode_cstr(const XalanDOMString& s);
105: /// converts Xalan string to parser String
106: String& transcode(const XalanDOMString& s);
1.63 parser 107: /// converts char * to Xalan string
108: XalanDOMString& Pool::transcode_buf(const char *buf, size_t buf_size);
109: /// converts parser String to Xalan string
110: XalanDOMString& Pool::transcode(const String& s);
1.59 parser 111:
112: private:
113:
114: void set_charset(const char *new_scharset);
115: void update_transcoder();
116:
117: private:
118:
119: XMLTranscoder *transcoder;
120:
121: #endif
122:
1.8 paf 123: private: //disabled
124:
1.64 ! parser 125: Pool(const Pool&);
! 126: Pool& operator= (const Pool&);
1.21 paf 127: };
128:
1.35 paf 129: /**
1.34 paf 130: Base for all classes that are allocated in 'pools'.
131:
132: Holds Pool object. Contains useful wrappers to it's methods.
1.38 paf 133:
1.64 ! parser 134: @see NEW
1.34 paf 135: */
1.21 paf 136: class Pooled {
1.23 paf 137: // the pool i'm allocated on
1.49 paf 138: Pool *fpool;
1.21 paf 139: public:
1.37 paf 140:
141: /// the Pooled-sole: Pooled instances can be allocated in Pool rather then on heap
1.21 paf 142: static void *operator new(size_t size, Pool& apool) {
1.51 parser 143: return apool.malloc(size/*, 1*/);
1.21 paf 144: }
145:
1.49 paf 146: Pooled(Pool& apool) : fpool(&apool) {}
1.23 paf 147:
1.34 paf 148: /// my pool
1.49 paf 149: Pool& pool() const { return *fpool; }
150:
151: /** used for moving objects from one pool to another.
152: in between object can have no pool and can not be used
153: @see SQL_Driver_manager
154: */
155: void set_pool(Pool *apool) { fpool=apool; }
1.21 paf 156:
1.57 parser 157: //{
158: /// @name useful wrapper around pool
1.49 paf 159: void *malloc(size_t size) const { return fpool->malloc(size); }
160: void *calloc(size_t size) const { return fpool->calloc(size); }
1.57 parser 161: void register_cleanup(void (*cleanup) (void *), void *data) { fpool->register_cleanup(cleanup, data); }
1.59 parser 162: #ifdef XML
1.57 parser 163: const char *transcode_cstr(const XalanDOMString& s) { return fpool->transcode_cstr(s); }
164: String& transcode(const XalanDOMString& s) { return fpool->transcode(s); }
1.59 parser 165: #endif
1.57 parser 166: //}
1.23 paf 167: };
1.34 paf 168: /// useful macro for creating objects on current Pooled object Pooled::pool()
1.23 paf 169: #define NEW new(pool())
1.1 paf 170:
171: #endif
E-mail: