Annotation of parser3/src/include/pa_pool.h, revision 1.86.2.29
1.34 paf 1: /** @file
1.86.2.1 paf 2: Parser: Parser: reference counting classes decls.
1.36 paf 3:
1.86.2.22 paf 4: Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
1.36 paf 5:
1.78 paf 6: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.1 paf 7: */
8:
9: #ifndef PA_POOL_H
10: #define PA_POOL_H
1.82 paf 11:
1.86.2.29! paf 12: static const char* IDENT_POOL_H="$Date: 2003/02/14 16:52:21 $";
1.86.2.17 paf 13:
14: // include
1.1 paf 15:
1.52 parser 16: #include "pa_config_includes.h"
1.1 paf 17:
1.59 parser 18: #ifdef XML
1.75 paf 19: # include "gdome.h"
1.76 paf 20: // for xmlChar
21: # include "libxml/tree.h"
1.59 parser 22: #endif
1.55 parser 23:
1.86.2.17 paf 24: // forwards
25:
1.86.2.1 paf 26: void *pa_malloc(size_t size);
27: void *pa_calloc(size_t size);
28: void pa_free(void *ptr);
29: void *pa_realloc(void *ptr, size_t size);
1.55 parser 30:
1.21 paf 31: class Exception;
1.55 parser 32: class String;
1.73 paf 33: class Charset;
1.75 paf 34: class GdomeDOMString_auto_ptr;
1.55 parser 35:
1.86.2.3 paf 36: template<typename T> class object_ptr {
1.86.2.1 paf 37: T *ptr;
38: public:
39: typedef T element_type;
1.86.2.2 paf 40:
1.86.2.3 paf 41: explicit object_ptr(T *ptr = 0) {
1.86.2.1 paf 42: this->ptr=ptr;
43: if(ptr)
1.86.2.2 paf 44: ptr->ref();
1.86.2.1 paf 45: }
1.86.2.21 paf 46: template<class B> object_ptr(const object_ptr<B>& src) {
47: this->ptr=src.get();
1.86.2.23 paf 48: if(ptr)
49: ptr->ref();
1.86.2.21 paf 50: }
1.86.2.3 paf 51: object_ptr(const object_ptr<T>& src) {
1.86.2.1 paf 52: ptr=src.get();
1.86.2.29! paf 53: if(ptr)
! 54: ptr->ref();
1.86.2.1 paf 55: }
1.86.2.21 paf 56: object_ptr(T *ptr, int) {
57: this->ptr=ptr;
58: }
1.86.2.7 paf 59: object_ptr<T>& operator=(const object_ptr<T>& src) {
1.86.2.1 paf 60: if(this!=&src)
61: if(ptr!=src.get()) {
62: if(ptr)
1.86.2.2 paf 63: ptr->unref();
1.86.2.1 paf 64: ptr=src.get();
65: if(ptr)
1.86.2.2 paf 66: ptr->ref();
1.86.2.1 paf 67: }
1.86.2.6 paf 68: return *this;
1.86.2.1 paf 69: }
1.86.2.3 paf 70: ~object_ptr() {
1.86.2.1 paf 71: if(ptr)
1.86.2.2 paf 72: ptr->unref();
1.86.2.1 paf 73: }
74: T& operator*() const {
75: return *get();
76: }
77: T *operator->() const {
78: return get();
79: }
80: T *get() const {
81: return ptr;
1.86.2.7 paf 82: }
1.86.2.8 paf 83: operator bool() const {
1.86.2.7 paf 84: return get()!=0;
85: }
1.86.2.24 paf 86: bool operator !() const {
1.86.2.8 paf 87: return get()==0;
88: }
1.86.2.1 paf 89: };
1.86.2.2 paf 90:
1.86.2.16 paf 91: #define DECLARE_OBJECT_PTR(name) \
1.86.2.20 paf 92: typedef object_ptr<name> name##Ptr
1.86.2.18 paf 93:
1.86.2.24 paf 94: /// TEMPLATE CLASS smart_ptr, stolen from stl:auto_ptr & renamed field/params [not compiled on gcc]
1.86.2.2 paf 95: template<class T>
1.86.2.3 paf 96: class smart_ptr {
1.86.2.24 paf 97: bool owns;
98: T *ptr;
1.86.2.2 paf 99: public:
100: typedef T element_type;
1.86.2.24 paf 101: explicit smart_ptr(T *aptr = 0)
102: : owns(aptr != 0), ptr(aptr) {}
103: smart_ptr(const smart_ptr<T>& src)
104: : owns(src.owns), ptr(src.release()) {}
105: smart_ptr<T>& operator=(const smart_ptr<T>& src)
106: {if (this != &src)
1.86.2.25 paf 107: {if (ptr != src.get())
1.86.2.24 paf 108: {if (owns)
1.86.2.25 paf 109: delete ptr;
1.86.2.24 paf 110: owns = src.owns; }
111: else if (src.owns)
112: owns = true;
1.86.2.25 paf 113: ptr = src.release(); }
1.86.2.2 paf 114: return (*this); }
1.86.2.3 paf 115: ~smart_ptr()
1.86.2.24 paf 116: {if (owns)
1.86.2.25 paf 117: delete ptr; }
1.86.2.2 paf 118: T& operator*() const
119: {return (*get()); }
120: T *get() const
1.86.2.25 paf 121: {return ptr; }
1.86.2.2 paf 122: T *release() const
1.86.2.24 paf 123: {((smart_ptr<T> *)this)->owns = false;
1.86.2.25 paf 124: return (ptr); }
1.86.2.8 paf 125: operator bool() const {
1.86.2.10 paf 126: return get()!=0;
1.86.2.7 paf 127: }
1.86.2.9 paf 128: operator T*() const {
1.86.2.24 paf 129: return ptr;
1.86.2.9 paf 130: }
1.86.2.2 paf 131: };
132:
1.86.2.28 paf 133: // defines
134:
135: #define override
136: #define rethrow throw
137:
138: // memory
139:
140: inline void *operator new[] (size_t size) {
141: return pa_malloc(size);
142: }
143: inline void operator delete[] (void *ptr) {
144: pa_free(ptr);
145: }
146:
147: class PA_Allocated {
148: public:
149: /// the sole: instances allocated using our functions
150: static void *operator new(size_t size) {
151: return pa_malloc(size);
152: }
153: static void operator delete(void *ptr) {
154: pa_free(ptr);
155: }
156: static void *malloc(size_t size) {
157: return pa_malloc(size);
158: }
159: static void *calloc(size_t size) {
160: return pa_calloc(size);
161: }
1.86.2.29! paf 162: static void free(void *ptr) {
! 163: pa_free(ptr);
! 164: }
1.86.2.28 paf 165: static void *realloc(void *ptr, size_t size) {
166: return pa_realloc(ptr, size);
167: }
168:
169: };
170:
171: /**
172: Base for all Parser classes, memory allocation/dallocation goes via pa_malloc/pa_free.
173: */
174: class PA_Object: public PA_Allocated {
175: mutable unsigned long freferences;
176: public:
177: PA_Object(): freferences(0) {}
178: virtual ~PA_Object() {}
179:
180: void ref() const {
181: freferences++;
182: }
183: void unref() const {
184: if(freferences) {
185: if(--freferences==0)
186: delete this;
187: }
188: }
189: };
190: DECLARE_OBJECT_PTR(PA_Object);
191:
1.86.2.5 paf 192: // convinient types
193:
1.86.2.6 paf 194: typedef smart_ptr<char> CharPtr;
1.1 paf 195:
196: #endif
E-mail: