欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-24 19:55:15
...

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

#pragma once
#ifndef _REF_H_
#define _REF_H_

#include <atomic>
#include <functional>
#include <memory>

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
相关标签: c++ tinystl stl