diff --git a/TinySTL/Memory.h b/TinySTL/Memory.h new file mode 100644 index 0000000000000000000000000000000000000000..dfa804f6a21824b43f8d2ec19919cbd411ccdde3 --- /dev/null +++ b/TinySTL/Memory.h @@ -0,0 +1,56 @@ +#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 \ No newline at end of file