SourceForge.net Logo

XPath2MemoryManager.hpp

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2001, 2008,
00003  *     DecisionSoft Limited. All rights reserved.
00004  * Copyright (c) 2004, 2011,
00005  *     Oracle and/or its affiliates. All rights reserved.
00006  *
00007  * Licensed under the Apache License, Version 2.0 (the "License");
00008  * you may not use this file except in compliance with the License.
00009  * You may obtain a copy of the License at
00010  *
00011  *     http://www.apache.org/licenses/LICENSE-2.0
00012  *
00013  * Unless required by applicable law or agreed to in writing, software
00014  * distributed under the License is distributed on an "AS IS" BASIS,
00015  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00016  * See the License for the specific language governing permissions and
00017  * limitations under the License.
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   // from MemoryManager
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 };//XPath2MemoryManager
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   // Should never be used - for compiling on AIX only
00101   XQillaAllocator()
00102   {
00103     assert(false);
00104   }
00105 
00106   XQillaAllocator(XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager* memMgr)
00107   {
00108     _memMgr=memMgr;
00109   }
00110 
00111   // define a copy constructor, because we don't want to copy the singleton object
00112   XQillaAllocator(const XQillaAllocator<_Tp>& o)
00113   {
00114     _memMgr=o._memMgr;
00115   }
00116 #if _MSC_VER >= 1500
00117   // Needed for Visual Studio 2008      
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     //std::cout << "XQillaAllocator::allocate(" << _n << ")" << std::endl;
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     //std::cout << "XQillaAllocator::deallocate(" << _n << ")" << std::endl;
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 //  Operator new.  Global overloaded version, lets any object be allocated on
00189 //                 the heap owned by a MemoryManager.
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