tinystl实现(第十八步:ref.h实现)

经过长时间的学习终于可以开始tinystl的仿(chao)写工作了,本文参考了这位大神的github,坦白讲我只是补充了注释,因为tinystl的代码真的非常经典而我又没什么这种大型项目的经验,所以只能这样做,不过相信能够有助于大家的学习
#强烈建议按顺序阅读本专栏
阅读这篇文章了解c11新特性atomic(原子性)
阅读这篇文章了解为什么需要ref,ref与引用的区别
这个部分几乎完全看不懂,只能照抄了
ref.h

#pragma once
#ifndef _REF_H_
#define _REF_H_

#include 
#include 
#include 

namespace TinySTL {
	namespace Detail {
		template<class T>
		struct _default_delete {
			void operator ()(T* ptr) { if (ptr) delete ptr; }
		};

		template<class T>
		struct ref_t {
			using deleter_type = std::function < void(T*) >;

			std::atomic<size_t> ncount_;
			T *data_;
			deleter_type deleter_;

			explicit ref_t(T *p = nullptr, deleter_type pfunc = deleter_type(_default_delete<T>()))
				: 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 ++(int) {
				auto t = *this;
				++*this;
				return t;
			}
			ref_t& operator --() {
				--ncount_;
				return *this;
			}
			ref_t operator --(int) {
				auto t = *this;
				--*this;
				return t;
			}
		};
		template<class T>
		bool operator ==(const ref_t<T>& lhs, const ref_t<T>& rhs) {
			return lhs.get_data() == rhs.get_data();
		}
		template<class T>
		bool operator !=(const ref_t<T>& lhs, const ref_t<T>& rhs) {
			return !(lhs == rhs);
		}
	}
}

#endif

你可能感兴趣的:(tinystl,c++再学习,学生)