3 #include "cppunit/cppunit_proxy.h"
4 #include <cds/intrusive/fcqueue.h>
8 class TestIntrusiveFCQueue: public CppUnitMini::TestCase
10 template <typename Hook>
11 struct base_hook_item: public Hook
21 template <typename Hook>
22 struct member_hook_item
36 void operator ()( T * p )
42 template <typename Queue>
49 template <class Queue>
50 void test_with( Queue& q )
52 typedef typename Queue::value_type value_type;
53 value_type v1, v2, v3;
54 CPPUNIT_ASSERT( q.empty() );
59 CPPUNIT_ASSERT( q.push(v1));
60 CPPUNIT_ASSERT( !q.empty() );
61 CPPUNIT_ASSERT( q.push(v2));
62 CPPUNIT_ASSERT( !q.empty() );
63 CPPUNIT_ASSERT( q.push(v3));
64 CPPUNIT_ASSERT( !q.empty() );
66 CPPUNIT_CHECK( v1.nDisposeCount == 0 );
67 CPPUNIT_CHECK( v2.nDisposeCount == 0 );
68 CPPUNIT_CHECK( v3.nDisposeCount == 0 );
72 CPPUNIT_ASSERT( pv != NULL );
73 CPPUNIT_ASSERT( pv->nVal == 1 );
74 CPPUNIT_ASSERT( !q.empty() );
75 CPPUNIT_CHECK( v1.nDisposeCount == 0 );
76 CPPUNIT_CHECK( v2.nDisposeCount == 0 );
77 CPPUNIT_CHECK( v3.nDisposeCount == 0 );
80 CPPUNIT_ASSERT( pv != NULL );
81 CPPUNIT_ASSERT( pv->nVal == 2 );
82 CPPUNIT_ASSERT( !q.empty() );
83 CPPUNIT_CHECK( v1.nDisposeCount == 0 );
84 CPPUNIT_CHECK( v2.nDisposeCount == 0 );
85 CPPUNIT_CHECK( v3.nDisposeCount == 0 );
88 CPPUNIT_ASSERT( pv != NULL );
89 CPPUNIT_ASSERT( pv->nVal == 3 );
90 CPPUNIT_ASSERT( q.empty() );
91 CPPUNIT_CHECK( v1.nDisposeCount == 0 );
92 CPPUNIT_CHECK( v2.nDisposeCount == 0 );
93 CPPUNIT_CHECK( v3.nDisposeCount == 0 );
96 CPPUNIT_ASSERT( pv == NULL );
97 CPPUNIT_CHECK( v1.nDisposeCount == 0 );
98 CPPUNIT_CHECK( v2.nDisposeCount == 0 );
99 CPPUNIT_CHECK( v3.nDisposeCount == 0 );
101 CPPUNIT_ASSERT( q.enqueue(v1));
102 CPPUNIT_ASSERT( !q.empty() );
103 CPPUNIT_ASSERT( q.enqueue(v2));
104 CPPUNIT_ASSERT( !q.empty() );
105 CPPUNIT_ASSERT( q.enqueue(v3));
106 CPPUNIT_ASSERT( !q.empty() );
108 CPPUNIT_CHECK( v1.nDisposeCount == 0 );
109 CPPUNIT_CHECK( v2.nDisposeCount == 0 );
110 CPPUNIT_CHECK( v3.nDisposeCount == 0 );
111 q.clear( true ); // call disposer
112 CPPUNIT_CHECK( q.empty() );
113 CPPUNIT_CHECK( v1.nDisposeCount == 1 );
114 CPPUNIT_CHECK( v2.nDisposeCount == 1 );
115 CPPUNIT_CHECK( v3.nDisposeCount == 1 );
117 CPPUNIT_ASSERT( q.push(v1));
118 CPPUNIT_ASSERT( !q.empty() );
119 CPPUNIT_ASSERT( q.push(v2));
120 CPPUNIT_ASSERT( !q.empty() );
121 CPPUNIT_ASSERT( q.push(v3));
122 CPPUNIT_ASSERT( !q.empty() );
123 q.clear( false ); // no disposer called
124 CPPUNIT_CHECK( q.empty() );
125 CPPUNIT_CHECK( v1.nDisposeCount == 1 );
126 CPPUNIT_CHECK( v2.nDisposeCount == 1 );
127 CPPUNIT_CHECK( v3.nDisposeCount == 1 );
131 void FCQueue_base_stat();
132 void FCQueue_base_elimination();
133 void FCQueue_base_elimination_mutex();
134 void FCQueue_base_seqcst();
135 void FCQueue_member();
136 void FCQueue_member_stat();
137 void FCQueue_member_elimination();
138 void FCQueue_member_elimination_mutex();
139 void FCQueue_member_seqcst();
141 CPPUNIT_TEST_SUITE(TestIntrusiveFCQueue)
142 CPPUNIT_TEST(FCQueue_base)
143 CPPUNIT_TEST(FCQueue_base_stat)
144 CPPUNIT_TEST(FCQueue_base_elimination)
145 CPPUNIT_TEST(FCQueue_base_elimination_mutex)
146 CPPUNIT_TEST(FCQueue_base_seqcst)
147 CPPUNIT_TEST(FCQueue_member)
148 CPPUNIT_TEST(FCQueue_member_stat)
149 CPPUNIT_TEST(FCQueue_member_elimination)
150 CPPUNIT_TEST(FCQueue_member_elimination_mutex)
151 CPPUNIT_TEST(FCQueue_member_seqcst)
152 CPPUNIT_TEST_SUITE_END()
156 void TestIntrusiveFCQueue::FCQueue_base()
158 typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
159 typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >,
160 cds::intrusive::fcqueue::make_traits<
161 cds::intrusive::opt::disposer< disposer >
168 void TestIntrusiveFCQueue::FCQueue_base_stat()
170 typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
171 typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >,
172 cds::intrusive::fcqueue::make_traits<
173 cds::intrusive::opt::disposer< disposer >
174 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
181 void TestIntrusiveFCQueue::FCQueue_base_elimination()
183 typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
184 typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >,
185 cds::intrusive::fcqueue::make_traits<
186 cds::intrusive::opt::disposer< disposer >
187 ,cds::opt::enable_elimination< true >
194 void TestIntrusiveFCQueue::FCQueue_base_elimination_mutex()
196 typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
197 typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >,
198 cds::intrusive::fcqueue::make_traits<
199 cds::intrusive::opt::disposer< disposer >
200 ,cds::opt::enable_elimination< true >
201 ,cds::opt::lock_type< std::mutex >
208 void TestIntrusiveFCQueue::FCQueue_base_seqcst()
210 typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
211 typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >,
212 cds::intrusive::fcqueue::make_traits<
213 cds::intrusive::opt::disposer< disposer >
214 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
221 void TestIntrusiveFCQueue::FCQueue_member()
223 typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
224 typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
226 typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
227 cds::intrusive::fcqueue::make_traits<
228 cds::intrusive::opt::disposer< disposer >
235 void TestIntrusiveFCQueue::FCQueue_member_stat()
237 typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
238 typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
240 typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
241 cds::intrusive::fcqueue::make_traits<
242 cds::intrusive::opt::disposer< disposer >
243 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
250 void TestIntrusiveFCQueue::FCQueue_member_elimination()
252 typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
253 typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
255 typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
256 cds::intrusive::fcqueue::make_traits<
257 cds::intrusive::opt::disposer< disposer >
258 ,cds::opt::enable_elimination< true >
265 void TestIntrusiveFCQueue::FCQueue_member_elimination_mutex()
267 typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
268 typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
270 typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
271 cds::intrusive::fcqueue::make_traits<
272 cds::intrusive::opt::disposer< disposer >
273 ,cds::opt::enable_elimination< true >
274 ,cds::opt::lock_type< std::mutex >
281 void TestIntrusiveFCQueue::FCQueue_member_seqcst()
283 typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
284 typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
286 typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
287 cds::intrusive::fcqueue::make_traits<
288 cds::intrusive::opt::disposer< disposer >
289 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
298 CPPUNIT_TEST_SUITE_REGISTRATION(queue::TestIntrusiveFCQueue);