BasketQueue refactoring (issues #1, #2, #3)
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_optimisticqueue_ptb.cpp
1 //$$CDS-header$$
2
3 #include "hdr_intrusive_msqueue.h"
4 #include <cds/intrusive/optimistic_queue.h>
5 #include <cds/gc/ptb.h>
6
7 namespace queue {
8
9 #define TEST(X)     void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
10
11     namespace {
12         template <typename GC>
13         struct base_hook_item: public ci::optimistic_queue::node< GC >
14         {
15             int nVal;
16             int nDisposeCount;
17
18             base_hook_item()
19                 : nDisposeCount(0)
20             {}
21         };
22
23         template <typename GC>
24         struct member_hook_item
25         {
26             int nVal;
27             int nDisposeCount;
28             ci::optimistic_queue::node< GC > hMember;
29
30             member_hook_item()
31                 : nDisposeCount(0)
32             {}
33         };
34
35         // PTB base hook
36         typedef ci::OptimisticQueue< cds::gc::PTB,
37             base_hook_item<cds::gc::PTB>
38             ,ci::opt::hook<
39                 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
40             >
41             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
42         > OptimisticQueue_PTB_base;
43
44         // PTB member hook
45         typedef ci::OptimisticQueue< cds::gc::PTB,
46             member_hook_item<cds::gc::PTB>
47             ,ci::opt::hook<
48                 ci::optimistic_queue::member_hook<
49                     offsetof(member_hook_item<cds::gc::PTB>, hMember),
50                     ci::opt::gc<cds::gc::PTB>
51                 >
52             >
53             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
54         > OptimisticQueue_PTB_member;
55
56         /// PTB base hook + item counter
57         typedef ci::OptimisticQueue< cds::gc::PTB,
58             base_hook_item<cds::gc::PTB>
59             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
60             ,ci::opt::hook<
61                 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
62             >
63             ,co::item_counter< cds::atomicity::item_counter >
64         > OptimisticQueue_PTB_base_ic;
65
66         // PTB member hook + item counter
67         typedef ci::OptimisticQueue< cds::gc::PTB,
68             member_hook_item<cds::gc::PTB>
69             ,ci::opt::hook<
70                 ci::optimistic_queue::member_hook<
71                     offsetof(member_hook_item<cds::gc::PTB>, hMember),
72                     ci::opt::gc<cds::gc::PTB>
73                 >
74             >
75             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
76             ,co::item_counter< cds::atomicity::item_counter >
77        > OptimisticQueue_PTB_member_ic;
78
79         // PTB base hook + stat
80         typedef ci::OptimisticQueue< cds::gc::PTB,
81             base_hook_item<cds::gc::PTB>
82             ,ci::opt::hook<
83                 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
84             >
85             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
86             ,co::stat< ci::queue_stat<> >
87         > OptimisticQueue_PTB_base_stat;
88
89         // PTB member hook + stat
90         typedef ci::OptimisticQueue< cds::gc::PTB,
91             member_hook_item<cds::gc::PTB>
92             ,ci::opt::hook<
93                 ci::optimistic_queue::member_hook<
94                     offsetof(member_hook_item<cds::gc::PTB>, hMember),
95                     ci::opt::gc<cds::gc::PTB>
96                 >
97             >
98             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
99             ,co::stat< ci::queue_stat<> >
100         > OptimisticQueue_PTB_member_stat;
101
102         // PTB base hook + alignment
103         typedef ci::OptimisticQueue< cds::gc::PTB,
104             base_hook_item<cds::gc::PTB>
105             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
106             ,ci::opt::hook<
107                 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
108             >
109             ,co::alignment< 32 >
110         > OptimisticQueue_PTB_base_align;
111
112         // PTB member hook + alignment
113         typedef ci::OptimisticQueue< cds::gc::PTB,
114             member_hook_item<cds::gc::PTB>
115             ,ci::opt::hook<
116                 ci::optimistic_queue::member_hook<
117                     offsetof(member_hook_item<cds::gc::PTB>, hMember),
118                     ci::opt::gc<cds::gc::PTB>
119                 >
120             >
121             ,co::alignment< 32 >
122             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
123         > OptimisticQueue_PTB_member_align;
124
125         // PTB base hook + no alignment
126         typedef ci::OptimisticQueue< cds::gc::PTB,
127             base_hook_item<cds::gc::PTB>
128             ,ci::opt::hook<
129                 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
130             >
131             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
132             ,co::alignment< co::no_special_alignment >
133         > OptimisticQueue_PTB_base_noalign;
134
135         // PTB member hook + no alignment
136         typedef ci::OptimisticQueue< cds::gc::PTB,
137             member_hook_item<cds::gc::PTB>
138             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
139             ,ci::opt::hook<
140                 ci::optimistic_queue::member_hook<
141                     offsetof(member_hook_item<cds::gc::PTB>, hMember),
142                     ci::opt::gc<cds::gc::PTB>
143                 >
144             >
145             ,co::alignment< co::no_special_alignment >
146         > OptimisticQueue_PTB_member_noalign;
147
148
149         // PTB base hook + cache alignment
150         typedef ci::OptimisticQueue< cds::gc::PTB,
151             base_hook_item<cds::gc::PTB>
152             ,ci::opt::hook<
153                 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
154             >
155             ,co::alignment< co::cache_line_alignment >
156             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
157         > OptimisticQueue_PTB_base_cachealign;
158
159         // PTB member hook + cache alignment
160         typedef ci::OptimisticQueue< cds::gc::PTB,
161             member_hook_item<cds::gc::PTB>
162             ,ci::opt::hook<
163                 ci::optimistic_queue::member_hook<
164                     offsetof(member_hook_item<cds::gc::PTB>, hMember),
165                     ci::opt::gc<cds::gc::PTB>
166                 >
167             >
168             ,co::alignment< co::cache_line_alignment >
169             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
170         > OptimisticQueue_PTB_member_cachealign;
171
172     }   // namespace
173
174     TEST(OptimisticQueue_PTB_base)
175     TEST(OptimisticQueue_PTB_member)
176     TEST(OptimisticQueue_PTB_base_ic)
177     TEST(OptimisticQueue_PTB_member_ic)
178     TEST(OptimisticQueue_PTB_base_stat)
179     TEST(OptimisticQueue_PTB_member_stat)
180     TEST(OptimisticQueue_PTB_base_align)
181     TEST(OptimisticQueue_PTB_member_align)
182     TEST(OptimisticQueue_PTB_base_noalign)
183     TEST(OptimisticQueue_PTB_member_noalign)
184     TEST(OptimisticQueue_PTB_base_cachealign)
185     TEST(OptimisticQueue_PTB_member_cachealign)
186
187 } // namespace queue