#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; 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(data_, up.data_); } } unique_ptr(const unique_ptr&) = delete; unique_ptr& operator = (const unique_ptr&) = delete; ~unique_ptr(){ clean(); } private: inline void clean(){ deleter(data_); data_ = nullptr; } private: element_type *data_; deleter_type deleter; }; template unique_ptr make_unique(Args&&... args){ return unique_ptr(new T(std::forward(args)...)); }; } #endif