00001 #ifndef SCOPED_PTR 00002 #define SCOPED_PTR 00003 00004 #include <memory> 00005 #include <cassert> 00006 00007 00008 template<class T> 00009 class scoped_ptr 00010 { 00011 public: 00012 typedef T element_type; 00013 00014 explicit scoped_ptr(T *p = 0) : px(p) 00015 { 00016 } 00017 00018 explicit scoped_ptr(std::auto_ptr<T> p): px( p.release() ) 00019 { 00020 } 00021 00022 ~scoped_ptr() 00023 { 00024 delete px; 00025 px = NULL; 00026 } 00027 00028 void reset(T *p = 0) 00029 { 00030 assert(p == 0 || p != px); 00031 this_type(p).swap(*this); 00032 } 00033 00034 T &operator*() const 00035 { 00036 assert(px != 0); 00037 return *px; 00038 } 00039 00040 T *operator->() const 00041 { 00042 assert(px != 0); 00043 return px; 00044 } 00045 00046 T *get() const 00047 { 00048 return px; 00049 } 00050 00051 void swap(scoped_ptr &b) 00052 { 00053 T *tmp = b.px; 00054 b.px = px; 00055 px = tmp; 00056 } 00057 00058 private: 00059 T *px; 00060 00061 scoped_ptr(scoped_ptr const &); 00062 scoped_ptr &operator=(scoped_ptr const &); 00063 00064 typedef scoped_ptr<T> this_type; 00065 00066 void operator==(scoped_ptr const &) const; 00067 void operator!=(scoped_ptr const &) const; 00068 }; 00069 00070 template<class T> inline void swap(scoped_ptr<T> &a, scoped_ptr<T> &b) 00071 { 00072 a.swap(b); 00073 } 00074 00075 template<class T> inline T *get_pointer(scoped_ptr<T> const &p) 00076 { 00077 return p.get(); 00078 } 00079 00080 #endif