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
下一篇: PWA技术深入学习
推荐阅读
-
[Vue 牛刀小试]:第十四章 - 编程式导航与实现组件与 Vue Router 之间的解耦
-
.NET Core实战项目之CMS 第十六章 用户登录及验证码功能实现
-
数据库-实现篇 第十五讲
-
【leetcode 简单】第十题 实现strStr()
-
编程大赛即将拉开序幕,由于人选有限,将选出10人参加全国大赛,为了体现公平的原则,采用如下的方法实现抽签:随机生成0到1000的整数,其中能被3整除的就是幸运儿之一并将其存储起来,直到第十个幸运儿产生
-
Java实现第十届蓝桥杯试题F特别数的和
-
统计学习方法第十一章作业:随机条件场—概率计算问题、IIS/GD学习算法、维特比预测算法 代码实现
-
Vue学习之路第十篇:简单计算器的实现
-
Pipes实现LeetCode(195.第十行)
-
.NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现