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 #ifndef QORE_REFERENCE_HOLDER_H_
00027 #define QORE_REFERENCE_HOLDER_H_
00028
00029 #include <stdlib.h>
00030
00032
00041 template<typename T>
00042 class ReferenceHolder {
00043 private:
00044 DLLLOCAL ReferenceHolder(const ReferenceHolder&);
00045 DLLLOCAL ReferenceHolder& operator=(const ReferenceHolder&);
00046 DLLLOCAL void* operator new(size_t);
00047
00048 T* p;
00049 ExceptionSink* xsink;
00050
00051 public:
00053 DLLLOCAL ReferenceHolder(ExceptionSink* xsink_) : p(0), xsink(xsink_) {}
00054
00056 DLLLOCAL ReferenceHolder(T* p_, ExceptionSink* xsink_) : p(p_), xsink(xsink_) {}
00057
00059 DLLLOCAL ~ReferenceHolder() { if (p) p->deref(xsink);}
00060
00062 DLLLOCAL T* operator->() { return p; }
00063
00065 DLLLOCAL T* operator*() { return p; }
00066
00068 DLLLOCAL void operator=(T *nv)
00069 {
00070 if (p)
00071 p->deref(xsink);
00072 p = nv;
00073 }
00074
00076 DLLLOCAL T *release()
00077 {
00078 T *rv = p;
00079 p = 0;
00080 return rv;
00081 }
00082
00084 DLLLOCAL operator bool() const { return p != 0; }
00085
00087 DLLLOCAL T **getPtrPtr() { return &p; }
00088 };
00089
00091
00097 template<typename T>
00098 class SimpleRefHolder
00099 {
00100 private:
00101 DLLLOCAL SimpleRefHolder(const SimpleRefHolder&);
00102 DLLLOCAL SimpleRefHolder& operator=(const SimpleRefHolder&);
00103 DLLLOCAL void* operator new(size_t);
00104
00105 T* p;
00106
00107 public:
00108 DLLLOCAL SimpleRefHolder() : p(0) {}
00109 DLLLOCAL SimpleRefHolder(T* p_) : p(p_) {}
00110 DLLLOCAL ~SimpleRefHolder() { if (p) p->deref(); }
00111
00112 DLLLOCAL T* operator->() { return p; }
00113 DLLLOCAL T* operator*() { return p; }
00114 DLLLOCAL void operator=(T *nv)
00115 {
00116 if (p)
00117 p->deref();
00118 p = nv;
00119 }
00120 DLLLOCAL T *release()
00121 {
00122 T *rv = p;
00123 p = 0;
00124 return rv;
00125 }
00126 DLLLOCAL operator bool() const { return p != 0; }
00127 };
00128
00129 #endif
00130
00131
00132
00133