From c5a3ab8aad6f221f9a4a6f97d0fd6e4440ac4f20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=99=93=E8=88=AA?= <1210603696@qq.com> Date: Sun, 15 Mar 2015 18:59:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BAref=E6=B7=BB=E5=8A=A0deleter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TinySTL/Detail/Ref.h | 27 ++++++++++++++++++++++----- TinySTL/Test/RefTest.cpp | 4 ++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/TinySTL/Detail/Ref.h b/TinySTL/Detail/Ref.h index 18b0de5..3d5f8a8 100644 --- a/TinySTL/Detail/Ref.h +++ b/TinySTL/Detail/Ref.h @@ -2,27 +2,44 @@ #define _REF_H_ #include +#include +#include namespace TinySTL{ namespace Detail{ + template + struct _default_delete{ + void operator ()(T* ptr){ if (ptr) delete ptr; } + }; + template struct ref_t{ + using deleter_type = std::function < void(T*) >; + std::atomic ncount_; T *data_; - - explicit ref_t(T *p = nullptr): ncount_(0), data_(p){ + deleter_type deleter_; + + explicit ref_t(T *p = nullptr, deleter_type pfunc = deleter_type(_default_delete())) + : ncount_(0), data_(p), deleter_(pfunc){ if (data_) ncount_ = 1; } ref_t(const ref_t&) = delete; ref_t& operator = (const ref_t&) = delete; + ~ref_t(){ + --ncount_; + if (ncount_ == 0) + deleter_(data_); + } + size_t count()const{ return ncount_.load(); } T *get_data()const{ return data_; } - ref_t& operator ++(){ - ++ncount_; - return *this; + ref_t& operator ++(){ + ++ncount_; + return *this; } ref_t operator ++(int){ auto t = *this; diff --git a/TinySTL/Test/RefTest.cpp b/TinySTL/Test/RefTest.cpp index d009526..bd24625 100644 --- a/TinySTL/Test/RefTest.cpp +++ b/TinySTL/Test/RefTest.cpp @@ -7,8 +7,8 @@ namespace TinySTL{ assert(r1.count() == 0); assert(r1.get_data() == nullptr); - int n = 0; - ref_t r2(&n); + int *p = new int(0); + ref_t r2(p); assert(r2.count() == 1); assert(r2.get_data() != nullptr);