#ifndef _MEMORY_H_ #define _MEMORY_H #include namespace TinySTL{ template struct default_delete{ void operator ()(T* ptr){ delete ptr; } }; template struct default_delete < T[] > { void operator ()(T* ptr){ delete[] ptr; } }; template> class unique_ptr{ public: typedef T element_type; typedef D deleter_type; typedef element_type *pointer; public: explicit unique_ptr(T *data = nullptr) :data_(data){} unique_ptr(T *data, deleter_type del) :data_(data), deleter(del){} unique_ptr(unique_ptr&& up){ clean(); swap(data_, up.data_); } unique_ptr& operator = (unique_ptr&& up){ if (&up != this){ clean(); swap(*this, up); } } unique_ptr(const unique_ptr&) = delete; unique_ptr& operator = (const unique_ptr&) = delete; ~unique_ptr(){ clean(); } pointer get()const{ return data_; } deleter_type& get_deleter(){ return deleter; } const deleter_type& get_deleter()const{ return deleter; } operator bool()const{ return get() != nullptr; } pointer release(){ auto p = nullptr; swap(p, data_); return p; } void reset(pointer p = pointer()){ clean(); data_ = p; } void swap(unique_ptr& up){ swap(data_, up.data_); } element_type operator *()const{ return *data_; } pointer operator ->()const{ return data_; } private: inline void clean(){ deleter(data_); data_ = nullptr; } private: element_type *data_; deleter_type deleter; }; template void swap(unique_ptr& x, unique_ptr& y){ x.swap(y); } template bool operator == (const unique_ptr& lhs, const unique_ptr& rhs){ return lhs.get() == rhs.get(); } template bool operator != (const unique_ptr& lhs, const unique_ptr& rhs){ return !(lhs == rhs); } template unique_ptr make_unique(Args&&... args){ return unique_ptr(new T(std::forward(args)...)); }; } #endif