Move libcds 1.6.0 from SVN
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_msqueue_ptb.cpp
1 //$$CDS-header$$
2
3 #include "hdr_intrusive_msqueue.h"
4 #include "hdr_intrusive_singlelink_node.h"
5
6 #include <cds/intrusive/msqueue.h>
7 #include <cds/gc/ptb.h>
8
9 namespace queue {
10
11 #define TEST(X)     void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
12
13     namespace {
14
15         // PTB base hook
16         typedef ci::MSQueue< cds::gc::PTB,
17             base_hook_item<cds::gc::PTB>
18             ,ci::opt::hook<
19                 ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
20             >
21             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
22         > MSQueue_PTB_base;
23
24         // PTB member hook
25         typedef ci::MSQueue< cds::gc::PTB,
26             member_hook_item<cds::gc::PTB>
27             ,ci::opt::hook<
28                 ci::single_link::member_hook<
29                     offsetof(member_hook_item<cds::gc::PTB>, hMember),
30                     ci::opt::gc<cds::gc::PTB>
31                 >
32             >
33             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
34         > MSQueue_PTB_member;
35
36         /// PTB base hook + item counter
37         typedef ci::MSQueue< cds::gc::PTB,
38             base_hook_item<cds::gc::PTB>
39             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
40             ,ci::opt::hook<
41                 ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
42             >
43             ,co::item_counter< cds::atomicity::item_counter >
44         > MSQueue_PTB_base_ic;
45
46         // PTB member hook + item counter
47         typedef ci::MSQueue< cds::gc::PTB,
48             member_hook_item<cds::gc::PTB>
49             ,ci::opt::hook<
50                 ci::single_link::member_hook<
51                     offsetof(member_hook_item<cds::gc::PTB>, hMember),
52                     ci::opt::gc<cds::gc::PTB>
53                 >
54             >
55             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
56             ,co::item_counter< cds::atomicity::item_counter >
57        > MSQueue_PTB_member_ic;
58
59         // PTB base hook + stat
60         typedef ci::MSQueue< cds::gc::PTB,
61             base_hook_item<cds::gc::PTB>
62             ,ci::opt::hook<
63                 ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
64             >
65             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
66             ,co::stat< ci::queue_stat<> >
67         > MSQueue_PTB_base_stat;
68
69         // PTB member hook + stat
70         typedef ci::MSQueue< cds::gc::PTB,
71             member_hook_item<cds::gc::PTB>
72             ,ci::opt::hook<
73                 ci::single_link::member_hook<
74                     offsetof(member_hook_item<cds::gc::PTB>, hMember),
75                     ci::opt::gc<cds::gc::PTB>
76                 >
77             >
78             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
79             ,co::stat< ci::queue_stat<> >
80         > MSQueue_PTB_member_stat;
81
82         // PTB base hook + alignment
83         typedef ci::MSQueue< cds::gc::PTB,
84             base_hook_item<cds::gc::PTB>
85             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
86             ,ci::opt::hook<
87                 ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
88             >
89             ,co::alignment< 32 >
90         > MSQueue_PTB_base_align;
91
92         // PTB member hook + alignment
93         typedef ci::MSQueue< cds::gc::PTB,
94             member_hook_item<cds::gc::PTB>
95             ,ci::opt::hook<
96                 ci::single_link::member_hook<
97                     offsetof(member_hook_item<cds::gc::PTB>, hMember),
98                     ci::opt::gc<cds::gc::PTB>
99                 >
100             >
101             ,co::alignment< 32 >
102             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
103         > MSQueue_PTB_member_align;
104
105         // PTB base hook + no alignment
106         typedef ci::MSQueue< cds::gc::PTB,
107             base_hook_item<cds::gc::PTB>
108             ,ci::opt::hook<
109                 ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
110             >
111             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
112             ,co::alignment< co::no_special_alignment >
113         > MSQueue_PTB_base_noalign;
114
115         // PTB member hook + no alignment
116         typedef ci::MSQueue< cds::gc::PTB,
117             member_hook_item<cds::gc::PTB>
118             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
119             ,ci::opt::hook<
120                 ci::single_link::member_hook<
121                     offsetof(member_hook_item<cds::gc::PTB>, hMember),
122                     ci::opt::gc<cds::gc::PTB>
123                 >
124             >
125             ,co::alignment< co::no_special_alignment >
126         > MSQueue_PTB_member_noalign;
127
128
129         // PTB base hook + cache alignment
130         typedef ci::MSQueue< cds::gc::PTB,
131             base_hook_item<cds::gc::PTB>
132             ,ci::opt::hook<
133                 ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
134             >
135             ,co::alignment< co::cache_line_alignment >
136             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
137         > MSQueue_PTB_base_cachealign;
138
139         // PTB member hook + cache alignment
140         typedef ci::MSQueue< cds::gc::PTB,
141             member_hook_item<cds::gc::PTB>
142             ,ci::opt::hook<
143                 ci::single_link::member_hook<
144                     offsetof(member_hook_item<cds::gc::PTB>, hMember),
145                     ci::opt::gc<cds::gc::PTB>
146                 >
147             >
148             ,co::alignment< co::cache_line_alignment >
149             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
150         > MSQueue_PTB_member_cachealign;
151
152     }   // namespace
153
154     TEST(MSQueue_PTB_base)
155     TEST(MSQueue_PTB_member)
156     TEST(MSQueue_PTB_base_ic)
157     TEST(MSQueue_PTB_member_ic)
158     TEST(MSQueue_PTB_base_stat)
159     TEST(MSQueue_PTB_member_stat)
160     TEST(MSQueue_PTB_base_align)
161     TEST(MSQueue_PTB_member_align)
162     TEST(MSQueue_PTB_base_noalign)
163     TEST(MSQueue_PTB_member_noalign)
164     TEST(MSQueue_PTB_base_cachealign)
165     TEST(MSQueue_PTB_member_cachealign)
166
167 } // namespace queue