scoped_ptr.hpp

Go to the documentation of this file.
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 
Generated on Sun Apr 11 12:23:09 2010 for RenderStack by  doxygen 1.6.3