00001
00002
00003
00004
00005
00006
00007
00008 #ifndef BOOSTER_HOLD_PTR_H
00009 #define BOOSTER_HOLD_PTR_H
00010
00011 namespace booster {
00012
00017 template<typename T>
00018 class hold_ptr {
00019 T *ptr_;
00020 hold_ptr(hold_ptr const &other);
00021 hold_ptr const &operator=(hold_ptr const &other);
00022 public:
00023 hold_ptr() : ptr_(0) {}
00024 explicit hold_ptr(T *v) : ptr_(v) {}
00025 ~hold_ptr()
00026 {
00027 if(ptr_) delete ptr_;
00028 }
00029
00030 T const *get() const { return ptr_; }
00031 T *get() { return ptr_; }
00032
00033 T const &operator *() const { return *ptr_; }
00034 T &operator *() { return *ptr_; }
00035 T const *operator->() const { return ptr_; }
00036 T *operator->() { return ptr_; }
00037 T *release() { T *tmp=ptr_; ptr_=0; return tmp; }
00038 void reset(T *p=0)
00039 {
00040 if(ptr_) delete ptr_;
00041 ptr_=p;
00042 }
00043 void swap(hold_ptr &other)
00044 {
00045 T *tmp=other.ptr_;
00046 other.ptr_=ptr_;
00047 ptr_=tmp;
00048 }
00049 };
00050 }
00051
00052 #endif