Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __XPATH2MEMORYMANAGER_HPP
00021 #define __XPATH2MEMORYMANAGER_HPP
00022
00023 #include <algorithm>
00024 #include <assert.h>
00025 #include <cstddef>
00026
00027 #include <xqilla/framework/XQillaExport.hpp>
00028
00029 #include <xercesc/framework/MemoryManager.hpp>
00030
00031 XERCES_CPP_NAMESPACE_BEGIN
00032 class DOMNode;
00033 class XMLGrammarPool;
00034 XERCES_CPP_NAMESPACE_END
00035
00036 class VariableStore;
00037 class VariableTypeStore;
00038 class DynamicContext;
00039 class Collation;
00040 class CollationHelper;
00041 class XQillaNSResolver;
00042 class ATDecimalOrDerived;
00043 class StringPool;
00044
00045 class XQILLA_API XPath2MemoryManager : public XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager
00046 {
00047 public:
00048 virtual ~XPath2MemoryManager() {}
00049
00051 virtual void reset() = 0;
00052
00054 virtual const XMLCh* getPooledString(const XMLCh *src) = 0;
00055 virtual const XMLCh* getPooledString(const XMLCh *src, unsigned int length) = 0;
00056 virtual const XMLCh* getPooledString(const char *src) = 0;
00057
00058
00059 #if _XERCES_VERSION >= 30000
00060 virtual void* allocate(XMLSize_t numElements) = 0;
00061 #else
00062 virtual void* allocate(size_t numElements) = 0;
00063 #endif
00064 virtual void deallocate(void* p) = 0;
00065
00067 virtual Collation* createCollation(CollationHelper* helper) = 0;
00068
00070 virtual XQillaNSResolver* createNSResolver(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *resolverNode) = 0;
00071
00073 virtual VariableTypeStore* createVariableTypeStore() = 0;
00074
00076 virtual ATDecimalOrDerived* createInteger(int value) = 0;
00077
00078 virtual void dumpStatistics() const = 0;
00079 virtual size_t getAllocatedObjectCount() const = 0;
00080 virtual size_t getTotalAllocatedMemory() const = 0;
00081 virtual const StringPool *getStringPool() const = 0;
00082 };
00083
00084 template <class _Tp>
00085 class XQillaAllocator
00086 {
00087 public:
00088 typedef size_t size_type;
00089 typedef ptrdiff_t difference_type;
00090 typedef _Tp* pointer;
00091 typedef const _Tp* const_pointer;
00092 typedef _Tp& reference;
00093 typedef const _Tp& const_reference;
00094 typedef _Tp value_type;
00095
00096 template <class _Tp1> struct rebind {
00097 typedef XQillaAllocator<_Tp1> other;
00098 };
00099
00100
00101 XQillaAllocator()
00102 {
00103 assert(false);
00104 }
00105
00106 XQillaAllocator(XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager* memMgr)
00107 {
00108 _memMgr=memMgr;
00109 }
00110
00111
00112 XQillaAllocator(const XQillaAllocator<_Tp>& o)
00113 {
00114 _memMgr=o._memMgr;
00115 }
00116 #if _MSC_VER >= 1500
00117
00118 template<class _Tp1> XQillaAllocator(const XQillaAllocator<_Tp1>& o)
00119 {
00120 _memMgr = o._memMgr;
00121 }
00122 #endif
00123 pointer allocate(size_t _n, const void* = 0)
00124 {
00125 if(_n==1)
00126 return (pointer)_singleton;
00127
00128 if(_memMgr)
00129 return _n != 0 ? static_cast<pointer>(_memMgr->allocate(_n*sizeof(_Tp))) : 0;
00130 else
00131 return _n != 0 ? static_cast<pointer>(malloc(_n*sizeof(_Tp))) : 0;
00132 }
00133
00134 void deallocate(void* _p, size_t _n)
00135 {
00136
00137 if(_p) {
00138 if(_p!=_singleton) {
00139 if(_memMgr)
00140 _memMgr->deallocate(_p);
00141 else
00142 free(_p);
00143 }
00144 }
00145 }
00146
00147 void construct(pointer _p, const_reference _v)
00148 {
00149 new ((void *)_p) _Tp(_v);
00150 }
00151
00152 void destroy(pointer _p)
00153 {
00154 _p->~_Tp();
00155 }
00156
00157 size_type max_size() const
00158 {
00159 return 0xFFFFFFFF;
00160 }
00161
00162 size_type max_size(size_type) const
00163 {
00164 return 0xFFFFFFFF;
00165 }
00166
00167 bool operator==(const XQillaAllocator<_Tp>& o) const
00168 {
00169 return &o == this;
00170 }
00171
00172 bool operator!=(const XQillaAllocator<_Tp>& o) const
00173 {
00174 return &o != this;
00175 }
00176
00177 bool operator!=(XQillaAllocator<_Tp>& o)
00178 {
00179 return _memMgr != o._memMgr;
00180 }
00181
00182 char _singleton[sizeof(_Tp)];
00183 XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager* _memMgr;
00184 };
00185
00186
00187
00188
00189
00190
00191
00192 inline void * operator new(size_t amt, XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager* memMgr)
00193 {
00194 void *p = memMgr->allocate(amt);
00195 return p;
00196 }
00197
00198 inline void operator delete(void* ptr, XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager* memMgr)
00199 {
00200 memMgr->deallocate(ptr);
00201 }
00202
00203 template<class TYPE>
00204 class AutoRelease
00205 {
00206 public:
00207 AutoRelease(TYPE *p)
00208 : p_(p) {}
00209 ~AutoRelease()
00210 {
00211 if(p_ != 0)
00212 p_->release();
00213 }
00214
00215 TYPE &operator*() const
00216 {
00217 return *p_;
00218 }
00219 TYPE *operator->() const
00220 {
00221 return p_;
00222 }
00223 operator TYPE*() const
00224 {
00225 return p_;
00226 }
00227 TYPE *get() const
00228 {
00229 return p_;
00230 }
00231 TYPE *adopt()
00232 {
00233 TYPE *tmp = p_;
00234 p_ = 0;
00235 return tmp;
00236 }
00237 TYPE *swap(TYPE *p)
00238 {
00239 TYPE *tmp = p_;
00240 p_ = p;
00241 return tmp;
00242 }
00243 void set(TYPE *p)
00244 {
00245 if(p_ != 0)
00246 p_->release();
00247 p_ = p;
00248 }
00249
00250 private:
00251 AutoRelease(const AutoRelease<TYPE> &);
00252 AutoRelease<TYPE> &operator=(const AutoRelease<TYPE> &);
00253
00254 TYPE *p_;
00255 };
00256
00257 template<class TYPE>
00258 class AutoDelete
00259 {
00260 public:
00261 AutoDelete(TYPE *p)
00262 : p_(p) {}
00263 ~AutoDelete()
00264 {
00265 delete p_;
00266 }
00267
00268 TYPE &operator*() const
00269 {
00270 return *p_;
00271 }
00272 TYPE *operator->() const
00273 {
00274 return p_;
00275 }
00276 operator TYPE*() const
00277 {
00278 return p_;
00279 }
00280 TYPE *get() const
00281 {
00282 return p_;
00283 }
00284 TYPE *adopt()
00285 {
00286 TYPE *tmp = p_;
00287 p_ = 0;
00288 return tmp;
00289 }
00290 TYPE *swap(TYPE *p)
00291 {
00292 TYPE *tmp = p_;
00293 p_ = p;
00294 return tmp;
00295 }
00296 void set(TYPE *p)
00297 {
00298 delete p_;
00299 p_ = p;
00300 }
00301
00302 private:
00303 AutoDelete(const AutoDelete<TYPE> &);
00304 AutoDelete<TYPE> &operator=(const AutoDelete<TYPE> &);
00305
00306 TYPE *p_;
00307 };
00308
00309 template<class TYPE>
00310 class AutoDeleteArray
00311 {
00312 public:
00313 AutoDeleteArray(TYPE *p)
00314 : p_(p) {}
00315 ~AutoDeleteArray()
00316 {
00317 delete [] p_;
00318 }
00319
00320 TYPE &operator*() const
00321 {
00322 return *p_;
00323 }
00324 TYPE *operator->() const
00325 {
00326 return p_;
00327 }
00328 operator TYPE*() const
00329 {
00330 return p_;
00331 }
00332 TYPE *get() const
00333 {
00334 return p_;
00335 }
00336 TYPE *adopt()
00337 {
00338 TYPE *tmp = p_;
00339 p_ = 0;
00340 return tmp;
00341 }
00342 TYPE *swap(TYPE *p)
00343 {
00344 TYPE *tmp = p_;
00345 p_ = p;
00346 return tmp;
00347 }
00348 void set(TYPE *p)
00349 {
00350 delete [] p_;
00351 p_ = p;
00352 }
00353
00354 private:
00355 AutoDeleteArray(const AutoDeleteArray<TYPE> &);
00356 AutoDeleteArray<TYPE> &operator=(const AutoDeleteArray<TYPE> &);
00357
00358 TYPE *p_;
00359 };
00360
00361 template<class TYPE>
00362 class AutoDeallocate
00363 {
00364 public:
00365 AutoDeallocate(XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager *mmgr, size_t size = sizeof(TYPE))
00366 : p_(0), mmgr_(mmgr) {
00367 p_ = (TYPE*)mmgr_->allocate(size);
00368 }
00369 AutoDeallocate(TYPE *p, XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager *mmgr)
00370 : p_(p), mmgr_(mmgr) {}
00371 ~AutoDeallocate()
00372 {
00373 if(p_ != 0)
00374 mmgr_->deallocate((void*)p_);
00375 }
00376
00377 TYPE &operator*() const
00378 {
00379 return *p_;
00380 }
00381 TYPE *operator->() const
00382 {
00383 return p_;
00384 }
00385 operator TYPE*() const
00386 {
00387 return p_;
00388 }
00389 TYPE *get() const
00390 {
00391 return p_;
00392 }
00393 TYPE *adopt()
00394 {
00395 TYPE *tmp = p_;
00396 p_ = 0;
00397 return tmp;
00398 }
00399 TYPE *swap(TYPE *p)
00400 {
00401 TYPE *tmp = p_;
00402 p_ = p;
00403 return tmp;
00404 }
00405 void set(TYPE *p)
00406 {
00407 if(p_ != 0)
00408 mmgr_->deallocate((void*)p_);
00409 p_ = p;
00410 }
00411
00412 private:
00413 AutoDeallocate(const AutoDeallocate<TYPE> &);
00414 AutoDeallocate<TYPE> &operator=(const AutoDeallocate<TYPE> &);
00415
00416 TYPE *p_;
00417 XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager *mmgr_;
00418 };
00419
00420 #endif //__XPATH2MEMORYMANAGER_HPP
00421