MSQueue, MoirQueue refactoring (not completed)
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_msqueue_dhp.cpp
1 //$$CDS-header$$
2
3 #include "hdr_intrusive_msqueue.h"
4 #include <cds/intrusive/msqueue.h>
5 #include <cds/gc/dhp.h>
6
7 namespace queue {
8
9 #define TEST(X)     void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
10
11     namespace {
12         typedef IntrusiveQueueHeaderTest::base_hook_item< ci::msqueue::node<cds::gc::DHP > > base_item_type;
13         typedef IntrusiveQueueHeaderTest::member_hook_item< ci::msqueue::node<cds::gc::DHP > > member_item_type;
14
15         // DHP base hook
16         typedef ci::MSQueue< cds::gc::DHP, base_item_type,
17             typename ci::msqueue::make_traits<
18             ci::opt::hook<
19             ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> >
20             >
21             , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
22             >::type
23         > MSQueue_DHP_base;
24
25         // DHP member hook
26         typedef ci::MSQueue< cds::gc::DHP, member_item_type,
27             typename ci::msqueue::make_traits<
28             ci::opt::hook<
29             ci::msqueue::member_hook<
30             offsetof( member_item_type, hMember ),
31             ci::opt::gc<cds::gc::DHP>
32             >
33             >
34             , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
35             >::type
36         > MSQueue_DHP_member;
37
38         /// DHP base hook + item counter
39         typedef ci::MSQueue< cds::gc::DHP, base_item_type,
40             typename ci::msqueue::make_traits<
41             ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
42             , ci::opt::hook<
43             ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> >
44             >
45             , co::item_counter< cds::atomicity::item_counter >
46             , co::memory_model< co::v::relaxed_ordering >
47             >::type
48         > MSQueue_DHP_base_ic;
49
50         // DHP member hook + item counter
51         typedef ci::MSQueue< cds::gc::DHP, member_item_type,
52             typename ci::msqueue::make_traits<
53             ci::opt::hook<
54             ci::msqueue::member_hook<
55             offsetof( member_item_type, hMember ),
56             ci::opt::gc<cds::gc::DHP>
57             >
58             >
59             , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
60             , co::item_counter< cds::atomicity::item_counter >
61             >::type
62         > MSQueue_DHP_member_ic;
63
64         // DHP base hook + stat
65         typedef ci::MSQueue< cds::gc::DHP, base_item_type,
66             typename ci::msqueue::make_traits<
67             ci::opt::hook<
68             ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> >
69             >
70             , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
71             , co::stat< ci::msqueue::stat<> >
72             >::type
73         > MSQueue_DHP_base_stat;
74
75         // DHP member hook + stat
76         typedef ci::MSQueue< cds::gc::DHP, member_item_type,
77             typename ci::msqueue::make_traits<
78             ci::opt::hook<
79             ci::msqueue::member_hook<
80             offsetof( member_item_type, hMember ),
81             ci::opt::gc<cds::gc::DHP>
82             >
83             >
84             , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
85             , co::stat< ci::msqueue::stat<> >
86             >::type
87         > MSQueue_DHP_member_stat;
88
89         // DHP base hook + alignment
90         typedef ci::MSQueue< cds::gc::DHP, base_item_type,
91             typename ci::msqueue::make_traits<
92             ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
93             , ci::opt::hook<
94             ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> >
95             >
96             , co::alignment< 32 >
97             >::type
98         > MSQueue_DHP_base_align;
99
100         // DHP member hook + alignment
101         typedef ci::MSQueue< cds::gc::DHP, member_item_type,
102             typename ci::msqueue::make_traits<
103             ci::opt::hook<
104             ci::msqueue::member_hook<
105             offsetof( member_item_type, hMember ),
106             ci::opt::gc<cds::gc::DHP>
107             >
108             >
109             , co::alignment< 32 >
110             , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
111             >::type
112         > MSQueue_DHP_member_align;
113
114         // DHP base hook + no alignment
115         struct traits_MSQueue_DHP_base_noalign : public ci::msqueue::traits {
116             typedef ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> > hook;
117             typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
118             enum { alignment = co::no_special_alignment };
119         };
120         typedef ci::MSQueue< cds::gc::DHP, base_item_type, traits_MSQueue_DHP_base_noalign > MSQueue_DHP_base_noalign;
121
122         // DHP member hook + no alignment
123         struct traits_MSQueue_DHP_member_noalign : public ci::msqueue::traits {
124             typedef ci::msqueue::member_hook <
125                 offsetof( member_item_type, hMember ),
126                 ci::opt::gc < cds::gc::DHP >
127             > hook;
128             typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
129             enum { alignment = co::no_special_alignment };
130         };
131         typedef ci::MSQueue< cds::gc::DHP, member_item_type, traits_MSQueue_DHP_member_noalign > MSQueue_DHP_member_noalign;
132
133
134         // DHP base hook + cache alignment
135         struct traits_MSQueue_DHP_base_cachealign : public traits_MSQueue_DHP_base_noalign
136         {
137             enum { alignment = co::cache_line_alignment };
138         };
139         typedef ci::MSQueue< cds::gc::DHP, base_item_type, traits_MSQueue_DHP_base_cachealign > MSQueue_DHP_base_cachealign;
140
141         // DHP member hook + cache alignment
142         struct traits_MSQueue_DHP_member_cachealign : public traits_MSQueue_DHP_member_noalign
143         {
144             enum { alignment = co::cache_line_alignment };
145         };
146         typedef ci::MSQueue< cds::gc::DHP, member_item_type, traits_MSQueue_DHP_member_cachealign > MSQueue_DHP_member_cachealign;
147     }   // namespace
148
149     TEST(MSQueue_DHP_base)
150     TEST(MSQueue_DHP_member)
151     TEST(MSQueue_DHP_base_ic)
152     TEST(MSQueue_DHP_member_ic)
153     TEST(MSQueue_DHP_base_stat)
154     TEST(MSQueue_DHP_member_stat)
155     TEST(MSQueue_DHP_base_align)
156     TEST(MSQueue_DHP_member_align)
157     TEST(MSQueue_DHP_base_noalign)
158     TEST(MSQueue_DHP_member_noalign)
159     TEST(MSQueue_DHP_base_cachealign)
160     TEST(MSQueue_DHP_member_cachealign)
161
162 } // namespace queue