ReferenceCounted.hpp

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2001-2006
00003  *     DecisionSoft Limited. All rights reserved.
00004  * Copyright (c) 2004-2006
00005  *     Progress Software Corporation. All rights reserved.
00006  * Copyright (c) 2004-2006
00007  *     Oracle. All rights reserved.
00008  *
00009  * See the file LICENSE for redistribution information.
00010  *
00011  * $Id: ReferenceCounted.hpp,v 1.7 2006/11/01 16:37:12 jpcs Exp $
00012  */
00013 
00014 #ifndef _REFERENCECOUNTED_HPP
00015 #define _REFERENCECOUNTED_HPP
00016 
00017 #include <xqilla/framework/XQillaExport.hpp>
00018 #include <xercesc/framework/MemoryManager.hpp>
00019 
00020 // for null RefCountPointer instances
00021 #define NULLRCP ((void *)0)
00022 
00024 class XQILLA_API ReferenceCounted
00025 {
00026 public:
00027   ReferenceCounted()
00028     : _ref_count(0) {}
00029   virtual ~ReferenceCounted() {}
00030 
00032   void incrementRefCount() const
00033   {
00034     ++const_cast<unsigned int&>(_ref_count);
00035   }
00036 
00038   virtual void decrementRefCount() const
00039   {
00040     if(--const_cast<unsigned int&>(_ref_count) == 0) {
00041       delete this;
00042     }
00043   }
00044 
00045 protected:
00046   unsigned int _ref_count; // mutable
00047 };
00048 
00050 template<class T> class RefCountPointer
00051 {
00052 public:
00053   RefCountPointer(T *p = 0) : _p(p)
00054   {
00055     if(_p != 0) _p->incrementRefCount();
00056   }
00057 
00058   template<class T2> RefCountPointer(const RefCountPointer<T2> &o) : _p((T*)(T2*)o)
00059   {
00060     if(_p != 0) _p->incrementRefCount();
00061   }
00062 
00063   RefCountPointer(const RefCountPointer<T> &o) : _p(o._p)
00064   {
00065     if(_p != 0) _p->incrementRefCount();
00066   }
00067 
00068   RefCountPointer &operator=(const RefCountPointer<T> &o)
00069   {
00070     if(_p != o._p) {
00071       if(_p != 0) _p->decrementRefCount();
00072       _p = o._p;
00073       if(_p != 0) _p->incrementRefCount();
00074     }
00075     return *this;
00076   }
00077 
00078   ~RefCountPointer()
00079   {
00080     if(_p != 0) _p->decrementRefCount();
00081   }
00082 
00083   T *operator->() const
00084   {
00085     return _p;
00086   }
00087 
00088   operator T*() const
00089   {
00090     return _p;
00091   }
00092 
00093   T *get() const
00094   {
00095     return _p;
00096   }
00097 
00098   bool isNull() const
00099   {
00100     return (_p == 0);
00101   }
00102 
00103   bool notNull() const
00104   {
00105     return (_p != 0);
00106   }
00107 
00108 protected:
00109   T *_p;
00110 };
00111 
00112 template<class T1, class T2>
00113 inline bool operator==(const RefCountPointer<T1> &a, const RefCountPointer<T2> &b)
00114 {
00115   return (void*)(T1*)a == (void*)(T2*)b;
00116 }
00117 
00118 template<class T1, class T2>
00119 inline bool operator!=(const RefCountPointer<T1> &a, const RefCountPointer<T2> &b)
00120 {
00121   return (void*)(T1*)a != (void*)(T2*)b;
00122 }
00123 
00124 template<class T>
00125 inline bool operator==(const RefCountPointer<T> &a, void *b)
00126 {
00127   return (T*)a == (T*)b;
00128 }
00129 
00130 template<class T>
00131 inline bool operator!=(const RefCountPointer<T> &a, void *b)
00132 {
00133   return (T*)a != (T*)b;
00134 }
00135 
00136 #endif

Generated on Tue Dec 12 00:18:56 2006 for XQilla Simple API by  doxygen 1.4.6