3 #include "cppunit/cppunit_proxy.h"
4 #include <cds/intrusive/lazy_list_base.h>
7 namespace ci = cds::intrusive;
8 namespace co = cds::opt;
10 class IntrusiveLazyListHeaderTest: public CppUnitMini::TestCase
16 int nEnsureExistsCall;
23 , nEnsureExistsCall(0)
34 stat& operator =(const stat& s)
36 memcpy( this, &s, sizeof(s));
41 template <typename GC>
42 struct base_int_item: public ci::lazy_list::node< GC >
52 base_int_item(int key, int val)
58 base_int_item(const base_int_item& v )
64 const int& key() const
70 template <typename GC>
71 struct member_int_item
76 ci::lazy_list::node< GC > hMember;
83 member_int_item(int key, int val)
89 member_int_item(const member_int_item& v )
95 const int& key() const
101 template <typename T>
104 bool operator ()(const T& v1, const T& v2 ) const
106 return v1.key() < v2.key();
109 template <typename Q>
110 bool operator ()(const T& v1, const Q& v2 ) const
112 return v1.key() < v2;
115 template <typename Q>
116 bool operator ()(const Q& v1, const T& v2 ) const
118 return v1 < v2.key();
122 template <typename T>
124 int operator ()(const T& v1, const T& v2 ) const
126 if ( v1.key() < v2.key() )
128 return v1.key() > v2.key() ? 1 : 0;
131 template <typename Q>
132 int operator ()(const T& v1, const Q& v2 ) const
136 return v1.key() > v2 ? 1 : 0;
139 template <typename Q>
140 int operator ()(const Q& v1, const T& v2 ) const
144 return v1 > v2.key() ? 1 : 0;
157 template <typename T, typename Q>
158 bool operator()( T const& i1, Q const& i2) const
160 return i1.nKey < i2.nKey;
164 struct faked_disposer
166 template <typename T>
167 void operator ()( T * p )
169 ++p->s.nDisposeCount;
173 struct ensure_functor
175 template <typename T>
176 void operator ()(bool bNew, T& item, T& val )
179 ++item.s.nEnsureNewCall;
181 ++item.s.nEnsureExistsCall;
187 template <typename T, typename Q>
188 void operator ()( T& item, Q& val )
196 template <typename T>
197 void operator()( T const& item )
203 template <class OrdList>
204 void test_int_common()
206 typedef typename OrdList::value_type value_type;
208 value_type v1( 10, 50 );
209 value_type v2( 5, 25 );
210 value_type v3( 20, 100 );
213 CPPUNIT_ASSERT( l.empty() );
215 CPPUNIT_ASSERT( l.insert( v1 )) ; // true
216 CPPUNIT_ASSERT( l.find( v1.key() ));
218 CPPUNIT_ASSERT( v1.s.nFindCall == 0 );
219 CPPUNIT_ASSERT( l.find( v1.key(), find_functor() ));
220 CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
222 CPPUNIT_ASSERT( !l.find_with( v2.key(), less<value_type>() ));
223 CPPUNIT_ASSERT( !l.find( v3.key(), find_functor() ));
224 CPPUNIT_ASSERT( !l.empty() );
226 //CPPUNIT_ASSERT( !l.insert( v1 )) ; // assertion "is_empty" is raised
230 CPPUNIT_ASSERT( !l.insert( v )) ; // false
233 std::pair<bool, bool> ret = l.ensure( v2, ensure_functor() );
234 CPPUNIT_ASSERT( ret.first );
235 CPPUNIT_ASSERT( ret.second );
236 CPPUNIT_ASSERT( v2.s.nEnsureNewCall == 1 );
237 CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 0 );
239 //CPPUNIT_ASSERT( !l.insert( v2 )) ; // assertion "is_empty"
241 CPPUNIT_ASSERT( l.find( v1.key() )) ; // true
243 CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
244 CPPUNIT_ASSERT( l.find( v1.key(), find_functor() ));
245 CPPUNIT_ASSERT( v1.s.nFindCall == 2 );
247 CPPUNIT_ASSERT( l.find( v2.key() ));
249 CPPUNIT_ASSERT( v2.s.nFindCall == 0 );
250 CPPUNIT_ASSERT( l.find_with( v2.key(), less<value_type>(), find_functor() ));
251 CPPUNIT_ASSERT( v2.s.nFindCall == 1 );
253 CPPUNIT_ASSERT( !l.find( v3.key() ));
256 CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 0 );
257 CPPUNIT_ASSERT( v2.s.nEnsureNewCall == 1 );
260 ret = l.ensure( v, ensure_functor() );
262 CPPUNIT_ASSERT( ret.first );
263 CPPUNIT_ASSERT( !ret.second );
264 CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 1 );
265 CPPUNIT_ASSERT( v2.s.nEnsureNewCall == 1 );
266 CPPUNIT_ASSERT( v.s.nEnsureExistsCall == 0 );
267 CPPUNIT_ASSERT( v.s.nEnsureNewCall == 0 );
270 CPPUNIT_ASSERT( !l.empty() );
272 CPPUNIT_ASSERT( l.insert( v3 )) ; // true
273 CPPUNIT_ASSERT( l.find( v3.key() ));
275 CPPUNIT_ASSERT( v3.s.nFindCall == 0 );
276 CPPUNIT_ASSERT( l.find( v3.key(), find_functor() ));
277 CPPUNIT_ASSERT( v3.s.nFindCall == 1 );
279 CPPUNIT_ASSERT( l.unlink( v2 ) );
280 CPPUNIT_ASSERT( l.find( v1.key() )) ; // true
281 CPPUNIT_ASSERT( !l.find( v2.key() )) ; // true
282 CPPUNIT_ASSERT( l.find( v3.key() )) ; // true
283 CPPUNIT_ASSERT( !l.empty() );
284 CPPUNIT_ASSERT( !l.unlink( v2 ) );
287 // v1 key is in the list but v NODE is not in the list
289 CPPUNIT_ASSERT( !l.unlink( v ) );
292 CPPUNIT_ASSERT( l.unlink( v1 ) );
293 CPPUNIT_ASSERT( !l.unlink( v1 ) );
294 CPPUNIT_ASSERT( !l.find( v1.key() ));
295 CPPUNIT_ASSERT( !l.find( v2.key() ));
296 CPPUNIT_ASSERT( l.find( v3.key() ));
297 CPPUNIT_ASSERT( !l.empty() );
298 CPPUNIT_ASSERT( !l.unlink( v1 ) );
299 CPPUNIT_ASSERT( !l.unlink( v2 ) );
301 CPPUNIT_ASSERT( l.unlink( v3 ) );
302 CPPUNIT_ASSERT( !l.find( v1.key() ));
303 CPPUNIT_ASSERT( !l.find_with( v2.key(), less<value_type>() ));
304 CPPUNIT_ASSERT( !l.find( v3.key() ));
305 CPPUNIT_ASSERT( l.empty() );
306 CPPUNIT_ASSERT( !l.unlink( v1 ) );
307 CPPUNIT_ASSERT( !l.unlink( v2 ) );
308 CPPUNIT_ASSERT( !l.unlink( v3 ) );
310 // Apply retired pointer to clean links
311 OrdList::gc::force_dispose();
314 ret = l.ensure( v3, ensure_functor() );
315 CPPUNIT_ASSERT( ret.first );
316 CPPUNIT_ASSERT( ret.second );
317 CPPUNIT_ASSERT( v3.s.nEnsureNewCall == s.nEnsureNewCall + 1);
318 CPPUNIT_ASSERT( v3.s.nEnsureExistsCall == s.nEnsureExistsCall );
319 CPPUNIT_ASSERT( !l.empty() );
322 ret = l.ensure( v2, ensure_functor() );
323 CPPUNIT_ASSERT( ret.first );
324 CPPUNIT_ASSERT( ret.second );
325 CPPUNIT_ASSERT( v2.s.nEnsureNewCall == s.nEnsureNewCall + 1);
326 CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == s.nEnsureExistsCall );
327 CPPUNIT_ASSERT( !l.empty() );
330 ret = l.ensure( v1, ensure_functor() );
331 CPPUNIT_ASSERT( ret.first );
332 CPPUNIT_ASSERT( ret.second );
333 CPPUNIT_ASSERT( v1.s.nEnsureNewCall == s.nEnsureNewCall + 1);
334 CPPUNIT_ASSERT( v1.s.nEnsureExistsCall == s.nEnsureExistsCall );
335 CPPUNIT_ASSERT( !l.empty() );
338 CPPUNIT_ASSERT( l.erase( v1.key()) );
339 //CPPUNIT_ASSERT( v1.s.nDisposeCount == 0 );
340 CPPUNIT_ASSERT( !l.empty() );
342 CPPUNIT_ASSERT( v2.s.nEraseCall == 0 );
343 CPPUNIT_ASSERT( l.erase_with( v2.key(), less<value_type>(), erase_functor()) );
344 CPPUNIT_ASSERT( v2.s.nEraseCall == 1 );
345 CPPUNIT_ASSERT( !l.erase_with( v2.key(), less<value_type>()));
346 CPPUNIT_ASSERT( v2.s.nEraseCall == 1 );
347 //CPPUNIT_ASSERT( v2.s.nDisposeCount == 0 );
348 CPPUNIT_ASSERT( !l.empty() );
350 CPPUNIT_ASSERT( !l.erase( v2 ));
351 CPPUNIT_ASSERT( !l.erase( v1 ));
352 //CPPUNIT_ASSERT( v2.s.nDisposeCount == 0 );
353 CPPUNIT_ASSERT( !l.empty() );
355 CPPUNIT_ASSERT( v3.s.nEraseCall == 0 );
356 CPPUNIT_ASSERT( l.erase( v3, erase_functor() ));
357 CPPUNIT_ASSERT( v3.s.nEraseCall == 1 );
358 //CPPUNIT_ASSERT( v3.s.nDisposeCount == 0 );
359 CPPUNIT_ASSERT( l.empty() );
361 // Apply retired pointer to clean links
362 OrdList::gc::force_dispose();
365 CPPUNIT_ASSERT( l.insert( v1 ));
366 CPPUNIT_ASSERT( l.insert( v3 ));
367 CPPUNIT_ASSERT( !l.empty() );
368 CPPUNIT_ASSERT( !l.unlink( v2 ));
369 CPPUNIT_ASSERT( l.unlink( v1 ));
370 CPPUNIT_ASSERT( !l.unlink( v1 ));
371 CPPUNIT_ASSERT( l.unlink( v3 ));
372 CPPUNIT_ASSERT( !l.unlink( v3 ));
373 CPPUNIT_ASSERT( l.empty() );
375 // Apply retired pointer
376 OrdList::gc::force_dispose();
377 CPPUNIT_ASSERT( v1.s.nDisposeCount == 3 );
378 CPPUNIT_ASSERT( v2.s.nDisposeCount == 2 );
379 CPPUNIT_ASSERT( v3.s.nDisposeCount == 3 );
381 // Destructor test (call disposer)
382 CPPUNIT_ASSERT( l.insert( v1 ));
383 CPPUNIT_ASSERT( l.insert( v3 ));
384 CPPUNIT_ASSERT( l.insert( v2 ));
388 typename OrdList::iterator it = l.begin();
389 CPPUNIT_ASSERT( it != l.end() );
390 CPPUNIT_ASSERT( it->nKey == v2.nKey );
391 CPPUNIT_ASSERT( it->nVal == v2.nVal );
392 CPPUNIT_ASSERT( ++it != l.end() );
393 CPPUNIT_ASSERT( it->nKey == v1.nKey );
394 CPPUNIT_ASSERT( it->nVal == v1.nVal );
395 CPPUNIT_ASSERT( ++it != l.end() );
396 CPPUNIT_ASSERT( it->nKey == v3.nKey );
397 CPPUNIT_ASSERT( it->nVal == v3.nVal );
398 CPPUNIT_ASSERT( ++it == l.end() );
402 OrdList const & lref = l;
403 typename OrdList::const_iterator it = lref.begin();
404 CPPUNIT_ASSERT( it != l.end() );
405 CPPUNIT_ASSERT( it->nKey == v2.nKey );
406 CPPUNIT_ASSERT( it->nVal == v2.nVal );
407 CPPUNIT_ASSERT( ++it != lref.end() );
408 CPPUNIT_ASSERT( it->nKey == v1.nKey );
409 CPPUNIT_ASSERT( it->nVal == v1.nVal );
410 CPPUNIT_ASSERT( ++it != l.end() );
411 CPPUNIT_ASSERT( it->nKey == v3.nKey );
412 CPPUNIT_ASSERT( it->nVal == v3.nVal );
413 CPPUNIT_ASSERT( ++it == l.end() );
417 // Apply retired pointer
418 OrdList::gc::force_dispose();
420 CPPUNIT_ASSERT( v1.s.nDisposeCount == 4 );
421 CPPUNIT_ASSERT( v2.s.nDisposeCount == 3 );
422 CPPUNIT_ASSERT( v3.s.nDisposeCount == 4 );
425 template <class OrdList>
428 test_int_common<OrdList>();
431 typename OrdList::guarded_ptr gp;
433 static int const nLimit = 20;
434 typename OrdList::value_type arrItem[nLimit];
439 for (int i = 0; i < nLimit; ++i)
441 std::random_shuffle( a, a + nLimit );
443 for (int i = 0; i < nLimit; ++i) {
444 arrItem[i].nKey = a[i];
445 arrItem[i].nVal = a[i] * 2;
449 for ( int i = 0; i < nLimit; ++i )
450 CPPUNIT_ASSERT( l.insert( arrItem[i] ) );
452 for ( int i=0; i < nLimit; ++i ) {
453 CPPUNIT_ASSERT( l.get( gp, arrItem[i].nKey ));
454 CPPUNIT_ASSERT( !gp.empty());
455 CPPUNIT_ASSERT( gp->nKey == arrItem[i].nKey );
456 CPPUNIT_ASSERT( gp->nVal == arrItem[i].nVal );
459 CPPUNIT_ASSERT( l.extract( gp, arrItem[i].nKey ));
460 CPPUNIT_ASSERT( !gp.empty());
461 CPPUNIT_ASSERT( gp->nKey == arrItem[i].nKey );
462 CPPUNIT_ASSERT( gp->nVal == arrItem[i].nVal );
465 CPPUNIT_ASSERT( !l.get( gp, arrItem[i].nKey ));
466 CPPUNIT_ASSERT( gp.empty());
467 CPPUNIT_ASSERT( !l.extract( gp, arrItem[i].nKey ));
468 CPPUNIT_ASSERT( gp.empty());
470 CPPUNIT_ASSERT( l.empty() );
471 CPPUNIT_ASSERT( !l.get( gp, nLimit/2 ));
472 CPPUNIT_ASSERT( gp.empty());
473 CPPUNIT_ASSERT( !l.extract( gp, nLimit/2 ));
474 CPPUNIT_ASSERT( gp.empty());
476 // Apply retired pointer
477 OrdList::gc::force_dispose();
479 // extract_with/get_with
480 for ( int i = 0; i < nLimit; ++i )
481 CPPUNIT_ASSERT( l.insert( arrItem[i] ) );
483 for ( int i=0; i < nLimit; ++i ) {
484 other_item itm( arrItem[i].nKey );
485 CPPUNIT_ASSERT( l.get_with( gp, itm, other_less() ));
486 CPPUNIT_ASSERT( !gp.empty());
487 CPPUNIT_ASSERT( gp->nKey == arrItem[i].nKey );
488 CPPUNIT_ASSERT( gp->nVal == arrItem[i].nVal );
491 CPPUNIT_ASSERT( l.extract_with( gp, itm, other_less() ));
492 CPPUNIT_ASSERT( !gp.empty());
493 CPPUNIT_ASSERT( gp->nKey == arrItem[i].nKey );
494 CPPUNIT_ASSERT( gp->nVal == arrItem[i].nVal );
497 CPPUNIT_ASSERT( !l.get_with( gp, itm, other_less() ));
498 CPPUNIT_ASSERT( gp.empty());
499 CPPUNIT_ASSERT( !l.extract_with( gp, itm, other_less() ));
500 CPPUNIT_ASSERT( gp.empty());
502 CPPUNIT_ASSERT( l.empty() );
503 CPPUNIT_ASSERT( !l.get_with( gp, other_item(nLimit/2), other_less() ));
504 CPPUNIT_ASSERT( gp.empty());
505 CPPUNIT_ASSERT( !l.extract_with( gp, other_item(nLimit/2), other_less() ));
506 CPPUNIT_ASSERT( gp.empty());
508 // Apply retired pointer
509 OrdList::gc::force_dispose();
511 for ( int i=0; i < nLimit; i++ ) {
512 CPPUNIT_ASSERT( arrItem[i].s.nDisposeCount == 2 );
517 template <class OrdList>
520 test_int_common<OrdList>();
523 static int const nLimit = 20;
524 typename OrdList::value_type arrItem[nLimit];
526 typedef typename OrdList::rcu_lock rcu_lock;
527 typedef typename OrdList::value_type value_type;
528 typedef typename OrdList::gc rcu_type;
532 for (int i = 0; i < nLimit; ++i)
534 std::random_shuffle( a, a + nLimit );
536 for (int i = 0; i < nLimit; ++i) {
537 arrItem[i].nKey = a[i];
538 arrItem[i].nVal = a[i] * 2;
541 typename OrdList::exempt_ptr ep;
544 for ( int i = 0; i < nLimit; ++i )
545 CPPUNIT_ASSERT( l.insert( arrItem[i] ) );
547 for ( int i = 0; i < nLimit; ++i ) {
550 value_type * pGet = l.get( a[i] );
551 CPPUNIT_ASSERT( pGet != NULL );
552 CPPUNIT_CHECK( pGet->nKey == a[i] );
553 CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
555 CPPUNIT_ASSERT( l.extract( ep, a[i] ));
556 CPPUNIT_ASSERT( !ep.empty() );
557 CPPUNIT_CHECK( ep->nKey == a[i] );
558 CPPUNIT_CHECK( (*ep).nVal == a[i] * 2 );
563 CPPUNIT_CHECK( l.get( a[i]) == NULL );
564 CPPUNIT_CHECK( !l.extract( ep, a[i] ) );
565 CPPUNIT_CHECK( ep.empty() );
568 CPPUNIT_ASSERT( l.empty() );
572 CPPUNIT_CHECK( l.get( a[0] ) == NULL );
573 CPPUNIT_CHECK( !l.extract( ep, a[0] ));
574 CPPUNIT_CHECK( ep.empty() );
576 // Apply retired pointer
577 OrdList::gc::force_dispose();
579 // extract_with/get_with
580 for ( int i = 0; i < nLimit; ++i ) {
581 CPPUNIT_ASSERT( l.insert( arrItem[i] ) );
584 for ( int i = 0; i < nLimit; ++i ) {
585 other_item itm( a[i] );
588 value_type * pGet = l.get_with( itm, other_less() );
589 CPPUNIT_ASSERT( pGet != NULL );
590 CPPUNIT_CHECK( pGet->nKey == a[i] );
591 CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
593 CPPUNIT_ASSERT( l.extract_with( ep, itm, other_less() ) );
594 CPPUNIT_ASSERT( !ep.empty() );
595 CPPUNIT_CHECK( ep->nKey == a[i] );
596 CPPUNIT_CHECK( ep->nVal == a[i] * 2 );
601 CPPUNIT_CHECK( l.get_with( itm, other_less()) == NULL );
602 CPPUNIT_CHECK( !l.extract_with( ep, itm, other_less() ));
603 CPPUNIT_CHECK( ep.empty() );
606 CPPUNIT_ASSERT( l.empty() );
610 CPPUNIT_CHECK( l.get_with( other_item(0), other_less() ) == NULL );
611 CPPUNIT_CHECK( !l.extract_with( ep, other_item(0), other_less() ));
612 CPPUNIT_CHECK( ep.empty() );
614 // Apply retired pointer
615 OrdList::gc::force_dispose();
619 template <class OrdList>
622 typedef typename OrdList::value_type value_type;
624 value_type v1( 10, 50 );
625 value_type v2( 5, 25 );
626 value_type v3( 20, 100 );
629 CPPUNIT_ASSERT( l.empty() );
631 CPPUNIT_ASSERT( l.insert( v1 )) ; // true
632 CPPUNIT_ASSERT( l.find( v1.key() ) == &v1 );
634 CPPUNIT_ASSERT( v1.s.nFindCall == 0 );
635 CPPUNIT_ASSERT( l.find( v1.key(), find_functor() ));
636 CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
638 CPPUNIT_ASSERT( l.find_with( v2.key(), less<value_type>() ) == NULL );
639 CPPUNIT_ASSERT( l.find( v3.key() ) == NULL );
640 CPPUNIT_ASSERT( !l.empty() );
642 //CPPUNIT_ASSERT( !l.insert( v1 )) ; // assertion "is_empty" is raised
646 CPPUNIT_ASSERT( !l.insert( v )) ; // false
649 std::pair<bool, bool> ret = l.ensure( v2, ensure_functor() );
650 CPPUNIT_ASSERT( ret.first );
651 CPPUNIT_ASSERT( ret.second );
652 CPPUNIT_ASSERT( v2.s.nEnsureNewCall == 1 );
653 CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 0 );
655 //CPPUNIT_ASSERT( !l.insert( v2 )) ; // assertion "is_empty"
657 CPPUNIT_ASSERT( l.find( v1.key() ) == &v1 ) ; // true
659 CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
660 CPPUNIT_ASSERT( l.find( v1.key(), find_functor() ));
661 CPPUNIT_ASSERT( v1.s.nFindCall == 2 );
663 CPPUNIT_ASSERT( l.find_with( v2.key(), less<value_type>() ) == &v2 );
665 CPPUNIT_ASSERT( v2.s.nFindCall == 0 );
666 CPPUNIT_ASSERT( l.find_with( v2.key(), less<value_type>(), find_functor() ));
667 CPPUNIT_ASSERT( v2.s.nFindCall == 1 );
669 CPPUNIT_ASSERT( !l.find( v3.key() ));
673 ret = l.ensure( v, ensure_functor() );
675 CPPUNIT_ASSERT( ret.first );
676 CPPUNIT_ASSERT( !ret.second );
677 CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 1 );
678 CPPUNIT_ASSERT( v.s.nEnsureExistsCall == 0 && v.s.nEnsureNewCall == 0 );
681 CPPUNIT_ASSERT( !l.empty() );
683 CPPUNIT_ASSERT( l.insert( v3 )) ; // true
684 CPPUNIT_ASSERT( l.find( v3.key() ) == &v3 );
686 CPPUNIT_ASSERT( v3.s.nFindCall == 0 );
687 CPPUNIT_ASSERT( l.find( v3.key(), find_functor() ));
688 CPPUNIT_ASSERT( v3.s.nFindCall == 1 );
691 typename OrdList::iterator it = l.begin();
692 CPPUNIT_ASSERT( it != l.end() );
693 CPPUNIT_ASSERT( it->nKey == v2.nKey );
694 CPPUNIT_ASSERT( it->nVal == v2.nVal );
695 CPPUNIT_ASSERT( ++it != l.end() );
696 CPPUNIT_ASSERT( it->nKey == v1.nKey );
697 CPPUNIT_ASSERT( it->nVal == v1.nVal );
698 CPPUNIT_ASSERT( it++ != l.end() );
699 CPPUNIT_ASSERT( it->nKey == v3.nKey );
700 CPPUNIT_ASSERT( it->nVal == v3.nVal );
701 CPPUNIT_ASSERT( it++ != l.end() );
702 CPPUNIT_ASSERT( it == l.end() );
706 OrdList const & lref = l;
707 typename OrdList::const_iterator it = lref.begin();
708 CPPUNIT_ASSERT( it != l.end() );
709 CPPUNIT_ASSERT( it->nKey == v2.nKey );
710 CPPUNIT_ASSERT( it->nVal == v2.nVal );
711 CPPUNIT_ASSERT( ++it != lref.end() );
712 CPPUNIT_ASSERT( it->nKey == v1.nKey );
713 CPPUNIT_ASSERT( it->nVal == v1.nVal );
714 CPPUNIT_ASSERT( it++ != l.end() );
715 CPPUNIT_ASSERT( it->nKey == v3.nKey );
716 CPPUNIT_ASSERT( it->nVal == v3.nVal );
717 CPPUNIT_ASSERT( it++ != lref.end() );
718 CPPUNIT_ASSERT( it == l.end() );
722 // Disposer called on list destruction
723 CPPUNIT_ASSERT( v1.s.nDisposeCount == 1 );
724 CPPUNIT_ASSERT( v2.s.nDisposeCount == 1 );
725 CPPUNIT_ASSERT( v3.s.nDisposeCount == 1 );
731 void HP_base_cmpmix();
733 void HP_member_cmp();
734 void HP_member_less();
735 void HP_member_cmpmix();
739 void PTB_base_less();
740 void PTB_base_cmpmix();
742 void PTB_member_cmp();
743 void PTB_member_less();
744 void PTB_member_cmpmix();
745 void PTB_member_ic();
748 void HRC_base_less();
749 void HRC_base_cmpmix();
752 void RCU_GPI_base_cmp();
753 void RCU_GPI_base_less();
754 void RCU_GPI_base_cmpmix();
755 void RCU_GPI_base_ic();
756 void RCU_GPI_member_cmp();
757 void RCU_GPI_member_less();
758 void RCU_GPI_member_cmpmix();
759 void RCU_GPI_member_ic();
761 void RCU_GPB_base_cmp();
762 void RCU_GPB_base_less();
763 void RCU_GPB_base_cmpmix();
764 void RCU_GPB_base_ic();
765 void RCU_GPB_member_cmp();
766 void RCU_GPB_member_less();
767 void RCU_GPB_member_cmpmix();
768 void RCU_GPB_member_ic();
770 void RCU_GPT_base_cmp();
771 void RCU_GPT_base_less();
772 void RCU_GPT_base_cmpmix();
773 void RCU_GPT_base_ic();
774 void RCU_GPT_member_cmp();
775 void RCU_GPT_member_less();
776 void RCU_GPT_member_cmpmix();
777 void RCU_GPT_member_ic();
779 void RCU_SHB_base_cmp();
780 void RCU_SHB_base_less();
781 void RCU_SHB_base_cmpmix();
782 void RCU_SHB_base_ic();
783 void RCU_SHB_member_cmp();
784 void RCU_SHB_member_less();
785 void RCU_SHB_member_cmpmix();
786 void RCU_SHB_member_ic();
788 void RCU_SHT_base_cmp();
789 void RCU_SHT_base_less();
790 void RCU_SHT_base_cmpmix();
791 void RCU_SHT_base_ic();
792 void RCU_SHT_member_cmp();
793 void RCU_SHT_member_less();
794 void RCU_SHT_member_cmpmix();
795 void RCU_SHT_member_ic();
797 void nogc_base_cmp();
798 void nogc_base_less();
799 void nogc_base_cmpmix();
801 void nogc_member_cmp();
802 void nogc_member_less();
803 void nogc_member_cmpmix();
804 void nogc_member_ic();
807 CPPUNIT_TEST_SUITE(IntrusiveLazyListHeaderTest)
808 CPPUNIT_TEST(HP_base_cmp)
809 CPPUNIT_TEST(HP_base_less)
810 CPPUNIT_TEST(HP_base_cmpmix)
811 CPPUNIT_TEST(HP_base_ic)
812 CPPUNIT_TEST(HP_member_cmp)
813 CPPUNIT_TEST(HP_member_less)
814 CPPUNIT_TEST(HP_member_cmpmix)
815 CPPUNIT_TEST(HP_member_ic)
817 CPPUNIT_TEST(PTB_base_cmp)
818 CPPUNIT_TEST(PTB_base_less)
819 CPPUNIT_TEST(PTB_base_cmpmix)
820 CPPUNIT_TEST(PTB_base_ic)
821 CPPUNIT_TEST(PTB_member_cmp)
822 CPPUNIT_TEST(PTB_member_less)
823 CPPUNIT_TEST(PTB_member_cmpmix)
824 CPPUNIT_TEST(PTB_member_ic)
826 CPPUNIT_TEST(HRC_base_cmp)
827 CPPUNIT_TEST(HRC_base_less)
828 CPPUNIT_TEST(HRC_base_cmpmix)
829 CPPUNIT_TEST(HRC_base_ic)
831 CPPUNIT_TEST(RCU_GPI_base_cmp)
832 CPPUNIT_TEST(RCU_GPI_base_less)
833 CPPUNIT_TEST(RCU_GPI_base_cmpmix)
834 CPPUNIT_TEST(RCU_GPI_base_ic)
835 CPPUNIT_TEST(RCU_GPI_member_cmp)
836 CPPUNIT_TEST(RCU_GPI_member_less)
837 CPPUNIT_TEST(RCU_GPI_member_cmpmix)
838 CPPUNIT_TEST(RCU_GPI_member_ic)
840 CPPUNIT_TEST(RCU_GPB_base_cmp)
841 CPPUNIT_TEST(RCU_GPB_base_less)
842 CPPUNIT_TEST(RCU_GPB_base_cmpmix)
843 CPPUNIT_TEST(RCU_GPB_base_ic)
844 CPPUNIT_TEST(RCU_GPB_member_cmp)
845 CPPUNIT_TEST(RCU_GPB_member_less)
846 CPPUNIT_TEST(RCU_GPB_member_cmpmix)
847 CPPUNIT_TEST(RCU_GPB_member_ic)
849 CPPUNIT_TEST(RCU_GPT_base_cmp)
850 CPPUNIT_TEST(RCU_GPT_base_less)
851 CPPUNIT_TEST(RCU_GPT_base_cmpmix)
852 CPPUNIT_TEST(RCU_GPT_base_ic)
853 CPPUNIT_TEST(RCU_GPT_member_cmp)
854 CPPUNIT_TEST(RCU_GPT_member_less)
855 CPPUNIT_TEST(RCU_GPT_member_cmpmix)
856 CPPUNIT_TEST(RCU_GPT_member_ic)
858 CPPUNIT_TEST(RCU_SHB_base_cmp)
859 CPPUNIT_TEST(RCU_SHB_base_less)
860 CPPUNIT_TEST(RCU_SHB_base_cmpmix)
861 CPPUNIT_TEST(RCU_SHB_base_ic)
862 CPPUNIT_TEST(RCU_SHB_member_cmp)
863 CPPUNIT_TEST(RCU_SHB_member_less)
864 CPPUNIT_TEST(RCU_SHB_member_cmpmix)
865 CPPUNIT_TEST(RCU_SHB_member_ic)
867 CPPUNIT_TEST(RCU_SHT_base_cmp)
868 CPPUNIT_TEST(RCU_SHT_base_less)
869 CPPUNIT_TEST(RCU_SHT_base_cmpmix)
870 CPPUNIT_TEST(RCU_SHT_base_ic)
871 CPPUNIT_TEST(RCU_SHT_member_cmp)
872 CPPUNIT_TEST(RCU_SHT_member_less)
873 CPPUNIT_TEST(RCU_SHT_member_cmpmix)
874 CPPUNIT_TEST(RCU_SHT_member_ic)
876 CPPUNIT_TEST(nogc_base_cmp)
877 CPPUNIT_TEST(nogc_base_less)
878 CPPUNIT_TEST(nogc_base_cmpmix)
879 CPPUNIT_TEST(nogc_base_ic)
880 CPPUNIT_TEST(nogc_member_cmp)
881 CPPUNIT_TEST(nogc_member_less)
882 CPPUNIT_TEST(nogc_member_cmpmix)
883 CPPUNIT_TEST(nogc_member_ic)
885 CPPUNIT_TEST_SUITE_END()
887 } // namespace ordlist