3 #ifndef CDSTEST_HDR_INTRUSIVE_LAZY_H
4 #define CDSTEST_HDR_INTRUSIVE_LAZY_H
6 #include "cppunit/cppunit_proxy.h"
7 #include <cds/intrusive/details/lazy_list_base.h>
10 namespace ci = cds::intrusive;
11 namespace co = cds::opt;
15 int nEnsureExistsCall;
22 , nEnsureExistsCall(0)
33 stat& operator =(const stat& s)
35 memcpy( this, &s, sizeof(s));
40 template <typename GC>
41 struct base_int_item: public ci::lazy_list::node< GC >
51 base_int_item(int key, int val)
57 base_int_item(const base_int_item& v )
63 const int& key() const
72 template <typename GC>
73 struct member_int_item
78 ci::lazy_list::node< GC > hMember;
85 member_int_item(int key, int val)
91 member_int_item(const member_int_item& v )
97 const int& key() const
106 template <typename T>
109 bool operator ()(const T& v1, const T& v2 ) const
111 return v1.key() < v2.key();
114 template <typename Q>
115 bool operator ()(const T& v1, const Q& v2 ) const
117 return v1.key() < v2;
120 template <typename Q>
121 bool operator ()(const Q& v1, const T& v2 ) const
123 return v1 < v2.key();
127 template <typename T>
129 int operator ()(const T& v1, const T& v2 ) const
131 if ( v1.key() < v2.key() )
133 return v1.key() > v2.key() ? 1 : 0;
136 template <typename Q>
137 int operator ()(const T& v1, const Q& v2 ) const
141 return v1.key() > v2 ? 1 : 0;
144 template <typename Q>
145 int operator ()(const Q& v1, const T& v2 ) const
149 return v1 > v2.key() ? 1 : 0;
153 template <typename T>
155 bool operator()( T const& l, T const& r ) const
157 return l.key() == r.key();
160 template <typename Q>
161 bool operator()( Q const& l, T const& r ) const
166 template <typename Q>
167 bool operator()( T const& l, Q const& r ) const
173 struct faked_disposer
175 template <typename T>
176 void operator ()( T * p )
178 ++p->s.nDisposeCount;
182 struct ensure_functor
184 template <typename T>
185 void operator ()(bool bNew, T& item, T& /*val*/ )
188 ++item.s.nEnsureNewCall;
190 ++item.s.nEnsureExistsCall;
196 template <typename T, typename Q>
197 void operator ()( T& item, Q& /*val*/ )
203 class UnorderedIntrusiveLazyListHeaderTest: public CppUnitMini::TestCase
206 template <class UnordList>
209 typedef typename UnordList::value_type value_type;
211 value_type v1( 10, 50 );
212 value_type v2( 5, 25 );
213 value_type v3( 20, 100 );
216 CPPUNIT_ASSERT( l.empty() );
218 CPPUNIT_ASSERT( l.insert( v1 )); // true
219 CPPUNIT_ASSERT( l.find( v1.key() ) == &v1 );
221 CPPUNIT_ASSERT( v1.s.nFindCall == 0 );
222 CPPUNIT_ASSERT( l.find( v1.key(), find_functor() ));
223 CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
225 CPPUNIT_ASSERT( l.find( v3.key() ) == nullptr );
226 CPPUNIT_ASSERT( !l.empty() );
228 //CPPUNIT_ASSERT( !l.insert( v1 )) ; // assertion "is_empty" is raised
232 CPPUNIT_ASSERT( !l.insert( v )) ; // false
235 std::pair<bool, bool> ret = l.ensure( v2, ensure_functor() );
236 CPPUNIT_ASSERT( ret.first );
237 CPPUNIT_ASSERT( ret.second );
238 CPPUNIT_ASSERT( v2.s.nEnsureNewCall == 1 );
239 CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 0 );
241 //CPPUNIT_ASSERT( !l.insert( v2 )) ; // assertion "is_empty"
243 CPPUNIT_ASSERT( l.find( v1.key() ) == &v1 ) ; // true
245 CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
246 CPPUNIT_ASSERT( l.find( v1.key(), find_functor() ));
247 CPPUNIT_ASSERT( v1.s.nFindCall == 2 );
249 CPPUNIT_ASSERT( !l.find( v3.key() ));
253 ret = l.ensure( v, ensure_functor() );
255 CPPUNIT_ASSERT( ret.first );
256 CPPUNIT_ASSERT( !ret.second );
257 CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 1 );
258 CPPUNIT_ASSERT( v.s.nEnsureExistsCall == 0 && v.s.nEnsureNewCall == 0 );
261 CPPUNIT_ASSERT( !l.empty() );
263 CPPUNIT_ASSERT( l.insert( v3 )) ; // true
264 CPPUNIT_ASSERT( l.find( v3.key() ) == &v3 );
266 CPPUNIT_ASSERT( v3.s.nFindCall == 0 );
267 CPPUNIT_ASSERT( l.find( v3.key(), find_functor() ));
268 CPPUNIT_ASSERT( v3.s.nFindCall == 1 );
271 typename UnordList::iterator it = l.begin();
272 typename UnordList::const_iterator cit = l.cbegin();
273 CPPUNIT_ASSERT( it != l.end() );
274 CPPUNIT_ASSERT( it != l.cend() );
275 CPPUNIT_ASSERT( cit != l.end() );
276 CPPUNIT_ASSERT( cit != l.cend() );
277 CPPUNIT_ASSERT( cit == it );
279 CPPUNIT_ASSERT( it->nKey == v1.nKey );
280 CPPUNIT_ASSERT( it->nVal == v1.nVal );
281 CPPUNIT_ASSERT( ++it != l.end() );
282 CPPUNIT_ASSERT( it->nKey == v2.nKey );
283 CPPUNIT_ASSERT( it->nVal == v2.nVal );
284 CPPUNIT_ASSERT( it++ != l.end() );
285 CPPUNIT_ASSERT( it->nKey == v3.nKey );
286 CPPUNIT_ASSERT( it->nVal == v3.nVal );
287 CPPUNIT_ASSERT( it++ != l.end() );
288 CPPUNIT_ASSERT( it == l.end() );
292 UnordList const & lref = l;
293 typename UnordList::const_iterator it = lref.begin();
294 CPPUNIT_ASSERT( it != l.end() );
295 CPPUNIT_ASSERT( it->nKey == v1.nKey );
296 CPPUNIT_ASSERT( it->nVal == v1.nVal );
297 CPPUNIT_ASSERT( ++it != lref.end() );
298 CPPUNIT_ASSERT( it->nKey == v2.nKey );
299 CPPUNIT_ASSERT( it->nVal == v2.nVal );
300 CPPUNIT_ASSERT( it++ != l.end() );
301 CPPUNIT_ASSERT( it->nKey == v3.nKey );
302 CPPUNIT_ASSERT( it->nVal == v3.nVal );
303 CPPUNIT_ASSERT( it++ != lref.end() );
304 CPPUNIT_ASSERT( it == l.end() );
308 // Disposer called on list destruction
309 CPPUNIT_ASSERT( v1.s.nDisposeCount == 1 );
310 CPPUNIT_ASSERT( v2.s.nDisposeCount == 1 );
311 CPPUNIT_ASSERT( v3.s.nDisposeCount == 1 );
315 void nogc_base_cmp();
316 void nogc_base_less();
317 void nogc_base_equal_to();
318 void nogc_base_cmpmix();
319 void nogc_base_equal_to_mix();
321 void nogc_member_cmp();
322 void nogc_member_less();
323 void nogc_member_equal_to();
324 void nogc_member_cmpmix();
325 void nogc_member_equal_to_mix();
326 void nogc_member_ic();
328 CPPUNIT_TEST_SUITE(UnorderedIntrusiveLazyListHeaderTest)
330 CPPUNIT_TEST(nogc_base_cmp)
331 CPPUNIT_TEST(nogc_base_less)
332 CPPUNIT_TEST(nogc_base_equal_to)
333 CPPUNIT_TEST(nogc_base_cmpmix)
334 CPPUNIT_TEST(nogc_base_equal_to_mix)
335 CPPUNIT_TEST(nogc_base_ic)
336 CPPUNIT_TEST(nogc_member_cmp)
337 CPPUNIT_TEST(nogc_member_less)
338 CPPUNIT_TEST(nogc_member_equal_to)
339 CPPUNIT_TEST(nogc_member_cmpmix)
340 CPPUNIT_TEST(nogc_member_equal_to_mix)
341 CPPUNIT_TEST(nogc_member_ic)
343 CPPUNIT_TEST_SUITE_END()
345 } // namespace unordlist
347 #endif // #ifndef CDSTEST_HDR_INTRUSIVE_LAZY_H