1*ab8db090SAndroid Build Coastguard Worker #ifndef MARISA_SCOPED_PTR_H_ 2*ab8db090SAndroid Build Coastguard Worker #define MARISA_SCOPED_PTR_H_ 3*ab8db090SAndroid Build Coastguard Worker 4*ab8db090SAndroid Build Coastguard Worker #include "marisa/base.h" 5*ab8db090SAndroid Build Coastguard Worker 6*ab8db090SAndroid Build Coastguard Worker namespace marisa { 7*ab8db090SAndroid Build Coastguard Worker 8*ab8db090SAndroid Build Coastguard Worker template <typename T> 9*ab8db090SAndroid Build Coastguard Worker class scoped_ptr { 10*ab8db090SAndroid Build Coastguard Worker public: scoped_ptr()11*ab8db090SAndroid Build Coastguard Worker scoped_ptr() : ptr_(NULL) {} scoped_ptr(T * ptr)12*ab8db090SAndroid Build Coastguard Worker explicit scoped_ptr(T *ptr) : ptr_(ptr) {} 13*ab8db090SAndroid Build Coastguard Worker ~scoped_ptr()14*ab8db090SAndroid Build Coastguard Worker ~scoped_ptr() { 15*ab8db090SAndroid Build Coastguard Worker delete ptr_; 16*ab8db090SAndroid Build Coastguard Worker } 17*ab8db090SAndroid Build Coastguard Worker 18*ab8db090SAndroid Build Coastguard Worker void reset(T *ptr = NULL) { 19*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF((ptr != NULL) && (ptr == ptr_), MARISA_RESET_ERROR); 20*ab8db090SAndroid Build Coastguard Worker scoped_ptr(ptr).swap(*this); 21*ab8db090SAndroid Build Coastguard Worker } 22*ab8db090SAndroid Build Coastguard Worker 23*ab8db090SAndroid Build Coastguard Worker T &operator*() const { 24*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF(ptr_ == NULL, MARISA_STATE_ERROR); 25*ab8db090SAndroid Build Coastguard Worker return *ptr_; 26*ab8db090SAndroid Build Coastguard Worker } 27*ab8db090SAndroid Build Coastguard Worker T *operator->() const { 28*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF(ptr_ == NULL, MARISA_STATE_ERROR); 29*ab8db090SAndroid Build Coastguard Worker return ptr_; 30*ab8db090SAndroid Build Coastguard Worker } get()31*ab8db090SAndroid Build Coastguard Worker T *get() const { 32*ab8db090SAndroid Build Coastguard Worker return ptr_; 33*ab8db090SAndroid Build Coastguard Worker } 34*ab8db090SAndroid Build Coastguard Worker clear()35*ab8db090SAndroid Build Coastguard Worker void clear() { 36*ab8db090SAndroid Build Coastguard Worker scoped_ptr().swap(*this); 37*ab8db090SAndroid Build Coastguard Worker } swap(scoped_ptr & rhs)38*ab8db090SAndroid Build Coastguard Worker void swap(scoped_ptr &rhs) { 39*ab8db090SAndroid Build Coastguard Worker marisa::swap(ptr_, rhs.ptr_); 40*ab8db090SAndroid Build Coastguard Worker } 41*ab8db090SAndroid Build Coastguard Worker 42*ab8db090SAndroid Build Coastguard Worker private: 43*ab8db090SAndroid Build Coastguard Worker T *ptr_; 44*ab8db090SAndroid Build Coastguard Worker 45*ab8db090SAndroid Build Coastguard Worker // Disallows copy and assignment. 46*ab8db090SAndroid Build Coastguard Worker scoped_ptr(const scoped_ptr &); 47*ab8db090SAndroid Build Coastguard Worker scoped_ptr &operator=(const scoped_ptr &); 48*ab8db090SAndroid Build Coastguard Worker }; 49*ab8db090SAndroid Build Coastguard Worker 50*ab8db090SAndroid Build Coastguard Worker } // namespace marisa 51*ab8db090SAndroid Build Coastguard Worker 52*ab8db090SAndroid Build Coastguard Worker #endif // MARISA_SCOPED_PTR_H_ 53