-
Notifications
You must be signed in to change notification settings - Fork 0
/
ptr.tpp
65 lines (57 loc) · 1.47 KB
/
ptr.tpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "brick-ptr"
#include "brick-unit"
template< bool atomic >
struct ref_test : brq::refcount_base< uint16_t, atomic >
{
int &cnt;
ref_test( int &cnt ) : cnt( cnt ) { ++cnt; }
~ref_test() { --cnt; }
};
template< bool atomic_cnt >
struct test_obj : brq::refcount_base< uint16_t, atomic_cnt > {};
template< bool atomic_ptr, bool atomic_cnt >
void test_ptr()
{
using obj = test_obj< atomic_cnt >;
brq::test_case( "simple" ) = [=]
{
auto a = brq::make_refcount< obj, atomic_ptr >();
ASSERT_EQ( a->_refcount, 1 );
};
brq::test_case( "dtor" ) = [=]
{
auto a = brq::make_refcount< obj, atomic_ptr >();
ASSERT_EQ( a->_refcount, 1 );
{
auto b = a;
ASSERT_EQ( a->_refcount, 2 );
}
ASSERT_EQ( a->_refcount, 1 );
};
brq::test_case( "assign" ) = [=]
{
auto a = brq::make_refcount< obj, atomic_ptr >();
decltype( a ) b;
ASSERT_EQ( a->_refcount, 1 );
b = a;
ASSERT_EQ( a->_refcount, 2 );
*&b = b;
ASSERT_EQ( a->_refcount, 2 );
};
brq::test_case( "destroy" ) = [=]
{
int objs = 0;
{
auto a = brq::make_refcount< ref_test< atomic_cnt >, atomic_ptr >( objs );
ASSERT_EQ( objs, 1 );
}
ASSERT_EQ( objs, 0 );
};
}
int main()
{
test_ptr< true, true >();
test_ptr< false, true >();
test_ptr< true, false >();
test_ptr< false, false >();
}