From 5193a0b96beae45d00c8eeec919aed10c86cab61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=99=93=E8=88=AA?= <1210603696@qq.com> Date: Thu, 12 Mar 2015 11:32:04 +0800 Subject: [PATCH] unique_ptr --- TinySTL/Memory.h | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 TinySTL/Memory.h diff --git a/TinySTL/Memory.h b/TinySTL/Memory.h new file mode 100644 index 0000000..dfa804f --- /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 -- GitLab