00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef __XPLC_PTR_H__
00034 #define __XPLC_PTR_H__
00035
00041 #include <xplc/IObject.h>
00042
00043 #ifndef UNSTABLE
00044 #error "xplc_ptr is experimental!"
00045 #endif
00046
00047
00051 template<class T>
00052 class xplc_ptr {
00053 private:
00054 T* ptr;
00055
00056 class ProtectedPtr: public T {
00057 private:
00058 virtual unsigned int addRef() = 0;
00059 virtual unsigned int release() = 0;
00060 #ifndef __XPLC_DELETE_H__
00061 void operator delete(void*);
00062 #endif
00063 };
00064
00065 xplc_ptr& operator=(const xplc_ptr&);
00066
00067 public:
00068 xplc_ptr():
00069 ptr(0) {
00070 }
00076 explicit xplc_ptr(T* aObj):
00077 ptr(aObj) {
00078 }
00083 template<class P>
00084 explicit xplc_ptr(const xplc_ptr<P>& aObj):
00085 ptr(aObj) {
00086 if(ptr)
00087 ptr->addRef();
00088 }
00089 ~xplc_ptr() {
00090 if(ptr)
00091 ptr->release();
00092 }
00100 ProtectedPtr* operator->() const {
00101 return static_cast<ProtectedPtr*>(ptr);
00102 }
00108 operator ProtectedPtr*() const {
00109 return static_cast<ProtectedPtr*>(ptr);
00110 }
00116 xplc_ptr& operator=(T* _ptr) {
00117 if(_ptr)
00118 _ptr->addRef();
00119
00120 if(ptr)
00121 ptr->release();
00122
00123 ptr = _ptr;
00124
00125 return *this;
00126 }
00127 };
00128
00129
00134 template<class T>
00135 T* do_addRef(T* obj) {
00136 if (obj)
00137 obj->addRef();
00138
00139 return obj;
00140 }
00141
00142
00143 #endif