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: