00001
00002
00003 #ifndef BASE_AUTOPTR_H
00004 #define BASE_AUTOPTR_H
00005
00028 namespace base {
00035 template<class T> class AutoPtr {
00036 public:
00038 AutoPtr(T *obj = 0) {
00039 _obj = obj;
00040 _own = _obj != 0;
00041 }
00042
00044 template<class U> AutoPtr(AutoPtr<U> &src) {
00045 _own = src.isOwner();
00046 _obj = src.get();
00047 }
00048
00050 ~AutoPtr() {
00051 if (_own)
00052 delete _obj;
00053 }
00054
00056 T *get() {
00057 _own = false;
00058 return _obj;
00059 }
00060
00062 bool isOwner() const {
00063 return _own;
00064 }
00065
00067 AutoPtr &operator=(T *obj) {
00068 if (obj != _obj) {
00069 delete _obj;
00070 _obj = obj;
00071 }
00072 _own = _obj != 0;
00073 return *this;
00074 }
00075
00077 template<class U> AutoPtr &operator=(AutoPtr<U> &src) {
00078 _own = src.isOwner();
00079 T *obj = src.get();
00080 if (obj != _obj) {
00081 delete _obj;
00082 _obj = obj;
00083 }
00084 return *this;
00085 }
00086
00088 T &operator*() const {
00089 return *_obj;
00090 }
00091
00093 T *operator->() const {
00094 return _obj;
00095 }
00096
00097 private:
00098 T *_obj;
00099 bool _own;
00100 };
00101 }
00102
00103 #endif