xref: /aosp_15_r20/external/marisa-trie/include/marisa/scoped-ptr.h (revision ab8db090fce404b23716c4c9194221ee27efe31c)
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