00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef HxRcObject_h
00012 #define HxRcObject_h
00013
00014 #include "HxStd.h"
00015
00016
00021 class L_HXBASIS HxRcObject
00022 {
00023 public:
00024 HxRcObject* addRef();
00025 void removeRef();
00026 HxRcObject* assign(HxRcObject* rhs);
00027 int isShared() const;
00028 HxRcObject* getUnshared();
00029 HxRcObject* doGetUnshared();
00030 virtual HxRcObject* clone() const ;
00031 int refCnt() const;
00032 protected:
00033 HxRcObject();
00034 virtual ~HxRcObject();
00035 private:
00036 int _refCnt;
00037 };
00038
00039
00040 inline
00041 HxRcObject::HxRcObject() : _refCnt(0)
00042 {
00043 }
00044
00045 inline
00046 HxRcObject::~HxRcObject()
00047 {
00048 }
00049
00050 inline HxRcObject*
00051 HxRcObject::addRef()
00052 {
00053 _refCnt++;
00054 return this;
00055 }
00056
00057 inline void
00058 HxRcObject::removeRef()
00059 {
00060 if (--_refCnt <= 0)
00061 delete this;
00062 }
00063
00064 inline HxRcObject*
00065 HxRcObject::assign(HxRcObject* rhs)
00066 {
00067 rhs->addRef();
00068 removeRef();
00069 return rhs;
00070 }
00071
00072 inline int
00073 HxRcObject::isShared() const
00074 {
00075 return _refCnt > 1;
00076 }
00077
00078 inline HxRcObject*
00079 HxRcObject::getUnshared()
00080 {
00081 return (_refCnt <= 1) ? this : doGetUnshared();
00082 }
00083
00084 inline int
00085 HxRcObject::refCnt() const
00086 {
00087 return _refCnt;
00088 }
00089
00090 #endif