AutoPtr.h

00001 // $Id: AutoPtr.h 3 2010-08-07 08:19:10Z cschwarz1 $
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