Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
TinySTL
提交
c5a3ab8a
T
TinySTL
项目概览
OpenDocCN
/
TinySTL
通知
4
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TinySTL
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
c5a3ab8a
编写于
3月 15, 2015
作者:
邹
邹晓航
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
为ref添加deleter
上级
bff17935
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
24 addition
and
7 deletion
+24
-7
TinySTL/Detail/Ref.h
TinySTL/Detail/Ref.h
+22
-5
TinySTL/Test/RefTest.cpp
TinySTL/Test/RefTest.cpp
+2
-2
未找到文件。
TinySTL/Detail/Ref.h
浏览文件 @
c5a3ab8a
...
...
@@ -2,27 +2,44 @@
#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_
;
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
<
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
++
(){
++
ncount_
;
return
*
this
;
}
ref_t
operator
++
(
int
){
auto
t
=
*
this
;
...
...
TinySTL/Test/RefTest.cpp
浏览文件 @
c5a3ab8a
...
...
@@ -7,8 +7,8 @@ namespace TinySTL{
assert
(
r1
.
count
()
==
0
);
assert
(
r1
.
get_data
()
==
nullptr
);
int
n
=
0
;
ref_t
<
int
>
r2
(
&
n
);
int
*
p
=
new
int
(
0
)
;
ref_t
<
int
>
r2
(
p
);
assert
(
r2
.
count
()
==
1
);
assert
(
r2
.
get_data
()
!=
nullptr
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录