File Coverage

t/intrusive_chain.cc
Criterion Covered Total %
statement 209 209 100.0
branch 2063 4904 42.0
condition n/a
subroutine n/a
pod n/a
total 2272 5113 44.4


line stmt bran cond sub pod time code
1             #include "test.h"
2             #include
3             #include
4             #include
5              
6             using namespace panda;
7             using std::shared_ptr;
8             using test::Tracer;
9              
10 280           struct MyPtr : IntrusiveChainNode {};
11              
12 700 50         struct MyIPtr : Refcnt, IntrusiveChainNode> {};
    50          
13              
14 560           struct MySPtr : IntrusiveChainNode> {};
15              
16             struct MyCustom : IntrusiveChainNode {
17 280           MyCustom () : p(), n() {}
18              
19             MyCustom* p;
20             MyCustom* n;
21             };
22              
23 298           MyCustom* intrusive_chain_next (MyCustom* n) { return n->n; }
24 88           MyCustom* intrusive_chain_prev (MyCustom* n) { return n->p; }
25              
26 115           void intrusive_chain_next (MyCustom* n, MyCustom* v) { n->n = v; }
27 88           void intrusive_chain_prev (MyCustom* n, MyCustom* v) { n->p = v; }
28              
29             template
30             struct Test {
31             using IC = IntrusiveChain;
32             using CIt = typename IC::const_iterator;
33              
34 140           static void check_content (CIt begin, CIt end) {
35 140 50         CHECK(begin == end);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
36 140           }
37              
38             template
39 308           static void check_content (CIt begin, CIt end, const T& v, Args&&... rest) {
40 308 50         REQUIRE(begin != end);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
41 308 50         CHECK(*begin == v);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
42 308           ++begin;
43 308 50         check_content(begin, end, rest...);
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
44 308           }
45              
46             template
47 140           static void check_content (const IC& list, Args&&... rest) {
48 140 50         CHECK(list.size() == sizeof...(Args));
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
49 140 50         check_content(list.begin(), list.end(), rest...);
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
50 140           }
51              
52             //checks that elements has been properly removed from chain: next/prev properties must be reset
53 84           static void check_removed (const T& v) {
54 84 50         CHECK(!intrusive_chain_next(v));
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
55 84 50         CHECK(!intrusive_chain_prev(v));
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
56 84           }
57              
58 56           static void test (function ctor) {
59 462 100         T v[10];
    0          
    100          
    100          
    0          
60 616 100         for (int i = 0; i < 10; ++i) v[i] = ctor();
    50          
    100          
    50          
    100          
    50          
    100          
    50          
61              
62 60 50         SECTION("ctor: empty") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
63 8           IC list;
64 4 50         check_content(list);
    50          
    50          
    50          
65 4 50         CHECK(list.empty());
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
66             }
67              
68 60 50         SECTION("push_back") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
69 8           IC list;
70 4 50         list.push_back(v[0]);
    50          
    50          
    50          
71 4 50         check_content(list, v[0]);
    50          
    50          
    50          
72 4 50         list.push_back(v[1]);
    50          
    50          
    50          
73 4 50         check_content(list, v[0], v[1]);
    50          
    50          
    50          
74             }
75              
76 60 50         SECTION("push_front") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
77 8           IC list;
78 4 50         list.push_front(v[0]);
    50          
    50          
    50          
79 4 50         check_content(list, v[0]);
    50          
    50          
    50          
80 4 50         list.push_front(v[1]);
    50          
    50          
    50          
81 4 50         check_content(list, v[1], v[0]);
    50          
    50          
    50          
82             }
83              
84 60 50         SECTION("ctor: initializer list") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    0          
    50          
    50          
    50          
    50          
    100          
    0          
    50          
    50          
    50          
    50          
    100          
85 14 50         IC list({v[0], v[1], v[2]});
    50          
    100          
    50          
    100          
    50          
86 4 50         check_content(list, v[0], v[1], v[2]);
    50          
    50          
    50          
87             }
88              
89 60 50         SECTION("pop_back") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    0          
    50          
    50          
    50          
    50          
    100          
    0          
    50          
    50          
    50          
    50          
    100          
90 14 50         IC list({v[0], v[1], v[2]});
    50          
    100          
    50          
    100          
    50          
91 4 50         CHECK(list.pop_back());
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
92 4 50         check_content(list, v[0], v[1]);
    50          
    50          
    50          
93 4 50         check_removed(v[2]);
    50          
    50          
    50          
94 4 50         CHECK(list.pop_back());
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
95 4 50         check_content(list, v[0]);
    50          
    50          
    50          
96 4 50         check_removed(v[1]);
    50          
    50          
    50          
97 4 50         CHECK(!list.pop_back());
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
98 4 50         check_content(list);
    50          
    50          
    50          
99 4 50         check_removed(v[0]);
    50          
    50          
    50          
100             }
101              
102 60 50         SECTION("pop_front") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    0          
    50          
    50          
    50          
    50          
    100          
    0          
    50          
    50          
    50          
    50          
    100          
103 14 50         IC list({v[0], v[1], v[2]});
    50          
    100          
    50          
    100          
    50          
104 4 50         CHECK(list.pop_front());
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
105 4 50         check_content(list, v[1], v[2]);
    50          
    50          
    50          
106 4 50         check_removed(v[0]);
    50          
    50          
    50          
107 4 50         CHECK(list.pop_front());
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
108 4 50         check_content(list, v[2]);
    50          
    50          
    50          
109 4 50         check_removed(v[1]);
    50          
    50          
    50          
110 4 50         CHECK(!list.pop_front());
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
111 4 50         check_content(list);
    50          
    50          
    50          
112 4 50         check_removed(v[2]);
    50          
    50          
    50          
113             }
114              
115 60 50         SECTION("insert") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
116 8           IC list;
117 6 50         auto it = list.insert(list.begin(), v[0]);
    50          
    50          
    50          
    50          
    50          
    50          
    50          
118 4 50         check_content(list, v[0]);
    50          
    50          
    50          
119 4 50         CHECK(*it == v[0]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
120              
121 4 50         it = list.insert(list.begin(), v[1]);
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
122 4 50         check_content(list, v[1], v[0]);
    50          
    50          
    50          
123 4 50         CHECK(*it == v[1]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
124              
125 4 50         it = list.insert(list.end(), v[2]);
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
126 4 50         check_content(list, v[1], v[0], v[2]);
    50          
    50          
    50          
127 4 50         CHECK(*it == v[2]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
128              
129 4 50         --it;
    50          
    50          
    50          
130 4 50         it = list.insert(it, v[3]);
    50          
    50          
    50          
    50          
131 4 50         check_content(list, v[1], v[3], v[0], v[2]);
    50          
    50          
    50          
132 4 50         CHECK(*it == v[3]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
133              
134 4 50         list.insert(T(), v[4]);
    50          
    50          
    50          
135 4 50         check_content(list, v[1], v[3], v[0], v[2], v[4]);
    50          
    50          
    50          
136              
137 4 50         list.insert(v[1], v[5]);
    50          
    50          
    50          
138 4 50         check_content(list, v[5], v[1], v[3], v[0], v[2], v[4]);
    50          
    50          
    50          
139              
140 4 50         list.insert(v[3], v[6]);
    50          
    50          
    50          
141 4 50         check_content(list, v[5], v[1], v[6], v[3], v[0], v[2], v[4]);
    50          
    50          
    50          
142             }
143              
144 76 50         SECTION("erase") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    0          
    50          
    50          
    50          
    50          
    100          
    0          
    50          
    50          
    50          
    50          
    100          
145 80 50         IC list({v[0], v[1], v[2], v[3]});
    50          
    100          
    50          
    100          
    50          
146              
147 24 50         SECTION("at end") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
148 6 50         auto it = list.erase(list.end());
    50          
    50          
    50          
    50          
    50          
    50          
    50          
149 4 50         check_content(list, v[0], v[1], v[2], v[3]);
    50          
    50          
    50          
150 4 50         CHECK(it == list.end());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
151 4 50         list.erase(T());
    50          
    50          
    50          
152 4 50         check_content(list, v[0], v[1], v[2], v[3]);
    50          
    50          
    50          
153             }
154              
155 24 50         SECTION("from head") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
156 6 50         auto it = list.erase(list.begin());
    50          
    50          
    50          
    50          
    50          
    50          
    50          
157 4 50         check_content(list, v[1], v[2], v[3]);
    50          
    50          
    50          
158 4 50         CHECK(*it == v[1]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
159 4 50         check_removed(v[0]);
    50          
    50          
    50          
160              
161 4 50         it = list.erase(list.begin());
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
162 4 50         check_content(list, v[2], v[3]);
    50          
    50          
    50          
163 4 50         CHECK(*it == v[2]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
164 4 50         check_removed(v[1]);
    50          
    50          
    50          
165              
166 4 50         list.erase(v[2]);
    50          
    50          
    50          
167 4 50         check_content(list, v[3]);
    50          
    50          
    50          
168 4 50         check_removed(v[2]);
    50          
    50          
    50          
169              
170 4 50         list.erase(v[3]);
    50          
    50          
    50          
171 4 50         check_content(list);
    50          
    50          
    50          
172 4 50         check_removed(v[3]);
    50          
    50          
    50          
173             }
174              
175 24 50         SECTION("from tail") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
176 6 50         auto pos = list.end(); --pos;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
177 6 50         auto it = list.erase(pos);
    50          
    50          
    50          
178 4 50         check_content(list, v[0], v[1], v[2]);
    50          
    50          
    50          
179 4 50         CHECK(it == list.end());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
180 4 50         check_removed(v[3]);
    50          
    50          
    50          
181              
182 4 50         pos = list.end(); --pos;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
183 4 50         it = list.erase(pos);
    50          
    50          
    50          
    50          
184 4 50         check_content(list, v[0], v[1]);
    50          
    50          
    50          
185 4 50         CHECK(it == list.end());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
186 4 50         check_removed(v[2]);
    50          
    50          
    50          
187              
188 4 50         list.erase(v[1]);
    50          
    50          
    50          
189 4 50         check_content(list, v[0]);
    50          
    50          
    50          
190 4 50         check_removed(v[1]);
    50          
    50          
    50          
191              
192 4 50         list.erase(v[0]);
    50          
    50          
    50          
193 4 50         check_content(list);
    50          
    50          
    50          
194 4 50         check_removed(v[0]);
    50          
    50          
    50          
195             }
196              
197 24 50         SECTION("from the middle") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
198 6 50         auto pos = list.begin(); ++pos; ++pos;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
199 6 50         auto it = list.erase(pos);
    50          
    50          
    50          
200 4 50         check_content(list, v[0], v[1], v[3]);
    50          
    50          
    50          
201 4 50         CHECK(*it == v[3]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
202 4 50         check_removed(v[2]);
    50          
    50          
    50          
203              
204 4 50         pos = list.begin(); ++pos;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
205 4 50         it = list.erase(pos);
    50          
    50          
    50          
    50          
206 4 50         check_content(list, v[0], v[3]);
    50          
    50          
    50          
207 4 50         CHECK(*it == v[3]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
208 4 50         check_removed(v[1]);
    50          
    50          
    50          
209              
210 4 50         list.push_back(v[4]);
    50          
    50          
    50          
211 4 50         list.push_back(v[5]);
    50          
    50          
    50          
212              
213 4 50         list.erase(v[3]);
    50          
    50          
    50          
214 4 50         check_content(list, v[0], v[4], v[5]);
    50          
    50          
    50          
215 4 50         check_removed(v[3]);
    50          
    50          
    50          
216              
217 4 50         list.erase(v[4]);
    50          
    50          
    50          
218 4 50         check_content(list, v[0], v[5]);
    50          
    50          
    50          
219 4 50         check_removed(v[4]);
    50          
    50          
    50          
220             }
221 24 50         SECTION("element not in the list") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
222 6 50         auto it = list.erase(v[4]);
    50          
    50          
    50          
223 4 50         check_content(list, v[0], v[1], v[2], v[3]);
    50          
    50          
    50          
224 4 50         CHECK(it == list.end());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
225             }
226             }
227              
228 60 50         SECTION("clear") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    0          
    50          
    50          
    50          
    50          
    100          
    0          
    50          
    50          
    50          
    50          
    100          
229 14 50         IC list({v[0], v[1], v[2]});
    50          
    100          
    50          
    100          
    50          
230 4 50         list.clear();
    50          
    50          
    50          
231 4 50         check_content(list);
    50          
    50          
    50          
232 4 50         CHECK(list.empty());
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
233 4 50         check_removed(v[0]);
    50          
    50          
    50          
234 4 50         check_removed(v[1]);
    50          
    50          
    50          
235 4 50         check_removed(v[2]);
    50          
    50          
    50          
236             }
237              
238 60 50         SECTION("front/back") {
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
239 8           IC list;
240 4 50         CHECK(list.front() == T());
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
241 4 50         CHECK(list.back() == T());
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
242 4 50         CHECK(list.size() == 0);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
243              
244 4 50         list.push_back(v[0]);
    50          
    50          
    50          
245 4 50         CHECK(list.front() == v[0]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
246 4 50         CHECK(list.back() == v[0]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
247 4 50         CHECK(list.size() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
248              
249 4 50         list.push_back(v[1]);
    50          
    50          
    50          
250 4 50         CHECK(list.front() == v[0]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
251 4 50         CHECK(list.back() == v[1]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
252 4 50         CHECK(list.size() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
253              
254 4 50         list.push_back(v[2]);
    50          
    50          
    50          
255 4 50         CHECK(list.front() == v[0]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
256 4 50         CHECK(list.back() == v[2]);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
257 4 50         CHECK(list.size() == 3);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
258             }
259              
260 56           }
261             };
262              
263 32           TEST_CASE("pointer type", "[intrusive_chain]") {
264 28           std::vector objs;
265 168 50         Test::test([&]() -> MyPtr* {
266 140 50         MyPtr* obj = new MyPtr();
    50          
267 140 50         objs.push_back(obj);
268 140           return obj;
269 14 50         });
270 154 100         for (auto o : objs) {
271 140           delete o;
272             }
273 14           }
274              
275 32           TEST_CASE("iptr type", "[intrusive_chain]") {
276 182 50         Test>::test([&]() -> iptr {
277 140 50         return new MyIPtr();
278 28 50         });
279 14           }
280              
281 32           TEST_CASE("shared_ptr type", "[intrusive_chain]") {
282 182 50         Test>::test([&]() -> shared_ptr {
283 140 50         return shared_ptr(new MySPtr());
284 28 50         });
285 14           }
286              
287 32           TEST_CASE("custom type", "[intrusive_chain]") {
288 28           std::vector objs;
289 168 50         Test::test([&]() -> MyCustom* {
290 140 50         MyCustom* obj = new MyCustom();
    50          
291 140 50         objs.push_back(obj);
292 140           return obj;
293 14 50         });
294 154 100         for (auto o : objs) {
295 140           delete o;
296             }
297 86 50         }
    50