1*ab8db090SAndroid Build Coastguard Worker #ifndef MARISA_SCOPED_ARRAY_H_ 2*ab8db090SAndroid Build Coastguard Worker #define MARISA_SCOPED_ARRAY_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_array { 10*ab8db090SAndroid Build Coastguard Worker public: scoped_array()11*ab8db090SAndroid Build Coastguard Worker scoped_array() : array_(NULL) {} scoped_array(T * array)12*ab8db090SAndroid Build Coastguard Worker explicit scoped_array(T *array) : array_(array) {} 13*ab8db090SAndroid Build Coastguard Worker ~scoped_array()14*ab8db090SAndroid Build Coastguard Worker ~scoped_array() { 15*ab8db090SAndroid Build Coastguard Worker delete [] array_; 16*ab8db090SAndroid Build Coastguard Worker } 17*ab8db090SAndroid Build Coastguard Worker 18*ab8db090SAndroid Build Coastguard Worker void reset(T *array = NULL) { 19*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF((array != NULL) && (array == array_), MARISA_RESET_ERROR); 20*ab8db090SAndroid Build Coastguard Worker scoped_array(array).swap(*this); 21*ab8db090SAndroid Build Coastguard Worker } 22*ab8db090SAndroid Build Coastguard Worker 23*ab8db090SAndroid Build Coastguard Worker T &operator[](std::size_t i) const { 24*ab8db090SAndroid Build Coastguard Worker MARISA_DEBUG_IF(array_ == NULL, MARISA_STATE_ERROR); 25*ab8db090SAndroid Build Coastguard Worker return array_[i]; 26*ab8db090SAndroid Build Coastguard Worker } get()27*ab8db090SAndroid Build Coastguard Worker T *get() const { 28*ab8db090SAndroid Build Coastguard Worker return array_; 29*ab8db090SAndroid Build Coastguard Worker } 30*ab8db090SAndroid Build Coastguard Worker clear()31*ab8db090SAndroid Build Coastguard Worker void clear() { 32*ab8db090SAndroid Build Coastguard Worker scoped_array().swap(*this); 33*ab8db090SAndroid Build Coastguard Worker } swap(scoped_array & rhs)34*ab8db090SAndroid Build Coastguard Worker void swap(scoped_array &rhs) { 35*ab8db090SAndroid Build Coastguard Worker marisa::swap(array_, rhs.array_); 36*ab8db090SAndroid Build Coastguard Worker } 37*ab8db090SAndroid Build Coastguard Worker 38*ab8db090SAndroid Build Coastguard Worker private: 39*ab8db090SAndroid Build Coastguard Worker T *array_; 40*ab8db090SAndroid Build Coastguard Worker 41*ab8db090SAndroid Build Coastguard Worker // Disallows copy and assignment. 42*ab8db090SAndroid Build Coastguard Worker scoped_array(const scoped_array &); 43*ab8db090SAndroid Build Coastguard Worker scoped_array &operator=(const scoped_array &); 44*ab8db090SAndroid Build Coastguard Worker }; 45*ab8db090SAndroid Build Coastguard Worker 46*ab8db090SAndroid Build Coastguard Worker } // namespace marisa 47*ab8db090SAndroid Build Coastguard Worker 48*ab8db090SAndroid Build Coastguard Worker #endif // MARISA_SCOPED_ARRAY_H_ 49