00001
00002 #ifndef AKAXISO2_UTIL_DEEP_PTR_H__
00003 #define AKAXISO2_UTIL_DEEP_PTR_H__
00004
00011 namespace aka2 {
00012
00018 template <class T>
00019 class deep_ptr {
00020 public:
00021 typedef T value_type;
00022
00027 explicit deep_ptr(T* ptr = 0) : ptr_(ptr) {}
00028 ~deep_ptr() {
00029 delete ptr_;
00030 }
00031
00038 deep_ptr(const deep_ptr &rhs) {
00039 if (rhs.ptr_ == 0)
00040 ptr_ = 0;
00041 else
00042 ptr_ = new T(*rhs.ptr_);
00043 }
00044
00049 void reset(T* ptr = 0) {
00050 delete ptr_;
00051 ptr_ = ptr;
00052 }
00053
00059 const deep_ptr<T>& operator=(const deep_ptr<T> &rhs) {
00060 delete ptr_;
00061 if (rhs.ptr_ == 0)
00062 ptr_ = 0;
00063 else
00064 ptr_ = new T(*rhs.ptr_);
00065 return *this;
00066 }
00067
00073 bool operator ==(const deep_ptr<T> &rhs) {
00074 return ptr_ == rhs.ptr_;
00075 }
00076
00081 T* get() const { return ptr_; }
00082
00087 T& operator*() const { return *ptr_; }
00092 T* operator->() const { return ptr_; }
00093
00094 private:
00095 T* ptr_;
00096 };
00097
00098 }
00099
00100 #endif