lux/scoped_ptr.h

00001 #ifndef LUX_SCOPED_PTR_H
00002 #define LUX_SCOPED_PTR_H
00003 
00004 #include <cstring>
00005 #include <string>
00006 
00007 namespace Lux {
00008 
00009   template<class T> class scoped_ptr {
00010   private:
00011     T * ptr_;
00012     scoped_ptr(scoped_ptr const &);
00013     scoped_ptr & operator=(scoped_ptr const &);
00014     typedef scoped_ptr<T> this_type;
00015 
00016   public:
00017     typedef T element_type;
00018     explicit scoped_ptr(T * p = 0): ptr_(p) {}
00019     virtual ~scoped_ptr() { delete ptr_; }
00020     void reset(T * p = 0) {
00021       delete ptr_;
00022       ptr_ = p;
00023     }
00024     T & operator*() const   { return *ptr_; }
00025     T * operator->() const  { return ptr_;  }
00026     T * get() const         { return ptr_;  }
00027   };
00028 
00029   template<class T> class scoped_array {
00030   private:
00031     T * ptr_;
00032     scoped_array(scoped_array const &);
00033     scoped_array & operator=(scoped_array const &);
00034     typedef scoped_array<T> this_type;
00035 
00036   public:
00037     typedef T element_type;
00038     explicit scoped_array(T * p = 0): ptr_(p) {}
00039     virtual ~scoped_array() { delete [] ptr_; }
00040     void reset(T * p = 0) {
00041       delete [] ptr_;
00042       ptr_ = p;
00043     }
00044     T & operator*() const   { return *ptr_; }
00045     T * operator->() const  { return ptr_;  }
00046     T * get() const         { return ptr_;  }
00047     T & operator[](size_t i) const   { return ptr_[i]; }
00048   };
00049 
00050   class scoped_string: public scoped_array<char> {
00051   public:
00052     explicit scoped_string() { reset_string(""); }
00053     explicit scoped_string(const std::string &str) {
00054       reset_string(str);
00055     }
00056 
00057     void reset_string(const std::string &str) {
00058       char *p = new char[str.size() + 1];
00059       strcpy(p, str.c_str());
00060       reset(p);
00061     }
00062 
00063     void reset_string(const char *str) {
00064       char *p = new char[std::strlen(str) + 1];
00065       strcpy(p, str);
00066       reset(p);
00067     }
00068   };
00069 }
00070 #endif

Generated on Fri Feb 5 15:50:30 2010 for Lux by  doxygen 1.4.7