00001 #ifndef DVUTIL_SHARED_PTR_H 00002 #define DVUTIL_SHARED_PTR_H 00003 // $Id: shared_ptr.h,v 1.6 2008/03/15 08:57:10 dvermeir Exp $ 00004 00005 #include <stdexcept> 00006 #include <dvutil/trace.h> 00007 00008 namespace Dv { 00009 /** A simple shared_ptr class. */ 00010 template<class T> 00011 class shared_ptr { 00012 public: 00013 explicit shared_ptr(T* t = 0): ptr_(t), cnt_(new unsigned int(1)) {} 00014 00015 shared_ptr(const shared_ptr<T>& r): ptr_(r.ptr()), cnt_(r.n()) { 00016 ++*cnt_; 00017 } 00018 00019 template<typename X> 00020 explicit shared_ptr(const shared_ptr<X>& r): ptr_(r.ptr()), 00021 cnt_(r.n()) { ++*cnt_; } 00022 00023 ~shared_ptr() { 00024 if (--*cnt_) 00025 return; 00026 delete ptr_; 00027 delete cnt_; 00028 } 00029 00030 unsigned int* n() const { return cnt_; } 00031 00032 T* ptr() const { return ptr_; } 00033 operator bool() const { return (ptr_!=0); } 00034 00035 T* operator->() const throw (std::logic_error) { 00036 if (! ptr_) 00037 throw std::logic_error(FUNCTION_S + ": exception: null shared_ptr"); 00038 return ptr_; 00039 } 00040 00041 T& operator*() const throw (std::logic_error) { 00042 if (! ptr_) 00043 throw std::logic_error(FUNCTION_S + ": exception: null shared_ptr"); 00044 return *ptr_; 00045 } 00046 00047 shared_ptr<T>& operator=(const shared_ptr<T>& r) { 00048 if (this==&r) 00049 return *this; 00050 if (--*cnt_==0) { 00051 delete ptr_; 00052 delete cnt_; 00053 } 00054 ptr_ = r.ptr_; 00055 cnt_=r.cnt_; 00056 ++*cnt_; 00057 return *this; 00058 } 00059 00060 friend bool operator==(const shared_ptr<T>& p1, 00061 const shared_ptr<T>& p2) { 00062 return p1.ptr() == p2.ptr(); 00063 } 00064 00065 friend bool operator!=(const shared_ptr<T>& p1, 00066 const shared_ptr<T>& p2) { 00067 return ! (p1 == p2); 00068 } 00069 00070 friend bool operator>(const shared_ptr<T>& p1, 00071 const shared_ptr<T>& p2) { 00072 return p1.ptr() > p2.ptr(); 00073 } 00074 00075 friend bool operator<(const shared_ptr<T>& p1, 00076 const shared_ptr<T>& p2) { 00077 return ! ( (p1 == p2) || (p1 > p2) ); 00078 } 00079 00080 template<typename X> 00081 operator shared_ptr<X>() const { return shared_ptr<X>(*this); } 00082 00083 private: 00084 T* ptr_; 00085 unsigned int* cnt_; 00086 }; 00087 } 00088 #endif
dvutil-1.0.10 | [ 5 December, 2009] |