1 #include "test_intrusive_msqueue.h"
6 #include <cds/intrusive/msqueue.h>
9 namespace ci = cds::intrusive;
10 typedef cds::gc::HP gc_type;
12 typedef cds_test::intrusive_msqueue base_class;
13 typedef typename base_class::base_hook_item< ci::msqueue::node<gc_type>> base_item_type;
14 typedef typename base_class::member_hook_item< ci::msqueue::node<gc_type>> member_item_type;
16 typedef cds_test::intrusive_msqueue::mock_disposer mock_disposer;
18 template <typename Queue, typename Data>
19 void test( Queue& q, Data& arr )
21 typedef typename Queue::value_type value_type;
22 size_t nSize = arr.size();
25 for ( size_t i = 0; i < nSize; ++i )
26 arr[i].nVal = static_cast<int>(i);
29 assert(q.size() == 0);
31 // pop from empty queue
33 assert( pv == nullptr );
35 assert(q.size() == 0);
38 assert( pv == nullptr );
40 assert(q.size() == 0);
43 for ( size_t i = 0; i < nSize; ++i ) {
49 assert(q.size() == i+1);
52 for ( size_t i = 0; i < nSize; ++i ) {
54 assert( q.size() == nSize - i );
59 assert( pv != nullptr );
60 assert( pv->nVal == i);
63 assert( q.size() == 0 );
66 --nSize; // last element of array is in queue yet as a dummy item
67 for ( size_t i = 0; i < nSize; ++i ) {
68 assert( arr[i].nDisposeCount == 1 );
70 assert( arr[nSize].nDisposeCount == 0 );
73 for ( size_t i = 0; i < nSize; ++i )
77 assert( q.size() == nSize );
81 assert( q.size() == 0 );
84 for ( size_t i = 0; i < nSize - 1; ++i ) {
85 printf("nDisCount (2): %d, (i) %lu\n", arr[i].nDisposeCount, i );
87 printf("nDisCount: (1) %d\n", arr[nSize - 1].nDisposeCount ); // this element is in the queue yet
88 assert( arr[nSize].nDisposeCount == 1 );
95 typedef ci::MSQueue< gc_type, base_item_type > queue_type;
96 cds::gc::hp::GarbageCollector::Construct( queue_type::c_nHazardPtrCount, 1, 16 );
97 cds::threading::Manager::attachThread();
100 typedef cds::intrusive::MSQueue< gc_type, base_item_type,
101 typename ci::msqueue::make_traits<
102 ci::opt::disposer< mock_disposer >
103 , cds::opt::item_counter< cds::atomicity::item_counter >
104 , ci::opt::hook< ci::msqueue::base_hook< ci::opt::gc<gc_type>>>
108 std::vector<base_item_type> arr;
110 printf("test start\n");
115 printf("test end\n");
118 // check_array( arr );