1// Copyright (C) 2011 Tim Blechmann
2//
3// Distributed under the Boost Software License, Version 1.0. (See
4// accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt)
6
7#include <boost/lockfree/stack.hpp>
8#include <boost/lockfree/spsc_queue.hpp>
9
10#define BOOST_TEST_MAIN
11#ifdef BOOST_LOCKFREE_INCLUDE_TESTS
12#include <boost/test/included/unit_test.hpp>
13#else
14#include <boost/test/unit_test.hpp>
15#endif
16
17
18int g_instance_counter = 0;
19
20struct tester
21{
22 tester()
23 {
24 ++g_instance_counter;
25 }
26
27 tester(tester const&)
28 {
29 ++g_instance_counter;
30 }
31
32 ~tester()
33 {
34 --g_instance_counter;
35 }
36};
37
38BOOST_AUTO_TEST_CASE( stack_instance_deleter_test )
39{
40 {
41 boost::lockfree::stack<tester> q(128);
42 q.push(v: tester());
43 q.push(v: tester());
44 q.push(v: tester());
45 q.push(v: tester());
46 q.push(v: tester());
47 }
48
49 assert(g_instance_counter == 0);
50 BOOST_REQUIRE(g_instance_counter == 0);
51}
52
53
54BOOST_AUTO_TEST_CASE( spsc_queue_instance_deleter_test )
55{
56 {
57 boost::lockfree::spsc_queue<tester> q(128);
58 q.push(t: tester());
59 q.push(t: tester());
60 q.push(t: tester());
61 q.push(t: tester());
62 q.push(t: tester());
63 }
64
65 assert(g_instance_counter == 0);
66 BOOST_REQUIRE(g_instance_counter == 0);
67}
68
69BOOST_AUTO_TEST_CASE( spsc_queue_fixed_sized_instance_deleter_test )
70{
71 {
72 boost::lockfree::spsc_queue<tester, boost::lockfree::capacity<128> > q;
73 q.push(t: tester());
74 q.push(t: tester());
75 q.push(t: tester());
76 q.push(t: tester());
77 q.push(t: tester());
78 }
79
80 assert(g_instance_counter == 0);
81 BOOST_REQUIRE(g_instance_counter == 0);
82}
83
84struct no_default_init_tester
85{
86 int value;
87
88 no_default_init_tester(int value) : value(value)
89 {
90 ++g_instance_counter;
91 }
92
93 no_default_init_tester(no_default_init_tester const& t)
94 {
95 value = t.value;
96
97 ++g_instance_counter;
98 }
99
100 ~no_default_init_tester()
101 {
102 --g_instance_counter;
103 }
104};
105
106BOOST_AUTO_TEST_CASE( stack_instance_deleter_no_default_init_test )
107{
108 {
109 boost::lockfree::stack<no_default_init_tester> q(128);
110 q.push(v: no_default_init_tester(1));
111 q.push(v: no_default_init_tester(2));
112 q.push(v: no_default_init_tester(3));
113 q.push(v: no_default_init_tester(4));
114 q.push(v: no_default_init_tester(5));
115 }
116
117 assert(g_instance_counter == 0);
118 BOOST_REQUIRE(g_instance_counter == 0);
119}
120
121
122BOOST_AUTO_TEST_CASE( spsc_queue_instance_deleter_no_default_init_test )
123{
124 {
125 boost::lockfree::spsc_queue<no_default_init_tester> q(128);
126 q.push(t: no_default_init_tester(1));
127 q.push(t: no_default_init_tester(2));
128 q.push(t: no_default_init_tester(3));
129 q.push(t: no_default_init_tester(4));
130 q.push(t: no_default_init_tester(5));
131 }
132
133 assert(g_instance_counter == 0);
134 BOOST_REQUIRE(g_instance_counter == 0);
135}
136
137BOOST_AUTO_TEST_CASE( spsc_queue_fixed_sized_instance_deleter_no_default_init_test )
138{
139 {
140 boost::lockfree::spsc_queue<no_default_init_tester, boost::lockfree::capacity<128> > q;
141 q.push(t: no_default_init_tester(1));
142 q.push(t: no_default_init_tester(2));
143 q.push(t: no_default_init_tester(3));
144 q.push(t: no_default_init_tester(4));
145 q.push(t: no_default_init_tester(5));
146 }
147
148 assert(g_instance_counter == 0);
149 BOOST_REQUIRE(g_instance_counter == 0);
150}
151

source code of boost/libs/lockfree/test/destructor_test.cpp