Annotation of parser3/src/include/pa_pool.h, revision 1.86.2.30
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.30! paf 12: static const char* IDENT_POOL_H="$Date: 2003/02/17 09:56:15 $";
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) {
1.86.2.30! paf 144: pa_free(ptr);
! 145: }
! 146: inline void operator delete (void *ptr) {
1.86.2.28 paf 147: pa_free(ptr);
148: }
149:
150: class PA_Allocated {
151: public:
152: /// the sole: instances allocated using our functions
153: static void *operator new(size_t size) {
154: return pa_malloc(size);
155: }
156: static void operator delete(void *ptr) {
157: pa_free(ptr);
158: }
159: static void *malloc(size_t size) {
160: return pa_malloc(size);
161: }
162: static void *calloc(size_t size) {
163: return pa_calloc(size);
164: }
1.86.2.29 paf 165: static void free(void *ptr) {
166: pa_free(ptr);
167: }
1.86.2.28 paf 168: static void *realloc(void *ptr, size_t size) {
169: return pa_realloc(ptr, size);
170: }
171:
172: };
173:
174: /**
175: Base for all Parser classes, memory allocation/dallocation goes via pa_malloc/pa_free.
176: */
177: class PA_Object: public PA_Allocated {
178: mutable unsigned long freferences;
179: public:
180: PA_Object(): freferences(0) {}
181: virtual ~PA_Object() {}
182:
183: void ref() const {
184: freferences++;
185: }
186: void unref() const {
187: if(freferences) {
188: if(--freferences==0)
189: delete this;
190: }
191: }
192: };
193: DECLARE_OBJECT_PTR(PA_Object);
194:
1.86.2.5 paf 195: // convinient types
196:
1.86.2.6 paf 197: typedef smart_ptr<char> CharPtr;
1.1 paf 198:
199: #endif
E-mail: