TreiberStack refactoring (issues #1, #2, #3 done)
[libcds.git] / tests / test-hdr / stack / hdr_intrusive_elimination_stack_dhp.cpp
1 //$$CDS-header$$
2
3 #include "hdr_intrusive_treiber_stack.h"
4 #include <cds/gc/dhp.h>
5 #include <cds/intrusive/treiber_stack.h>
6
7 namespace stack {
8
9 #define TEST(X)     void TestIntrusiveStack::X() { test<defs::X>(); }
10 #define TEST_DYN(X) void TestIntrusiveStack::X() { test_elimination<defs::X>(); }
11
12     namespace defs {
13         // DHP GC + base hook
14         typedef cds::intrusive::TreiberStack< cds::gc::DHP,
15             TestIntrusiveStack::base_hook_item<cds::gc::DHP>
16             , typename ci::treiber_stack::make_traits<
17                 cds::opt::enable_elimination<true>
18                 ,ci::opt::hook<
19                     ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
20                 >
21             >::type
22         > Elimination_DHP_base;
23
24         typedef cds::intrusive::TreiberStack< cds::gc::DHP,
25             TestIntrusiveStack::base_hook_item<cds::gc::DHP>
26             , typename ci::treiber_stack::make_traits<
27                 ci::opt::hook<
28                     ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
29                 >
30                 ,cds::opt::enable_elimination<true>
31                 ,ci::opt::buffer< ci::opt::v::dynamic_buffer<void *> >
32             >::type
33         > Elimination_DHP_base_dyn;
34
35         typedef cds::intrusive::TreiberStack< cds::gc::DHP,
36             TestIntrusiveStack::base_hook_item<cds::gc::DHP>
37             , typename ci::treiber_stack::make_traits<
38                 ci::opt::hook<
39                     ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
40                 >
41                 ,cds::opt::enable_elimination<true>
42                 ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
43             >::type
44         > Elimination_DHP_base_relaxed;
45
46         // DHP GC + base hook + disposer
47         typedef cds::intrusive::TreiberStack< cds::gc::DHP,
48             TestIntrusiveStack::base_hook_item<cds::gc::DHP>
49             , typename ci::treiber_stack::make_traits<
50                 ci::opt::hook<
51                     ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
52                 >
53                 ,cds::opt::enable_elimination<true>
54                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
55             >::type
56         > Elimination_DHP_base_disposer;
57
58         typedef cds::intrusive::TreiberStack< cds::gc::DHP,
59             TestIntrusiveStack::base_hook_item<cds::gc::DHP>
60             , typename ci::treiber_stack::make_traits<
61                 ci::opt::hook<
62                     ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::DHP> >
63                 >
64                 ,cds::opt::enable_elimination<true>
65                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
66                 ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
67             >::type
68         > Elimination_DHP_base_disposer_relaxed;
69
70         // DHP GC + member hook
71         typedef cds::intrusive::TreiberStack< cds::gc::DHP,
72             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
73             , typename ci::treiber_stack::make_traits<
74                 ci::opt::hook<
75                     ci::treiber_stack::member_hook<
76                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
77                         ci::opt::gc<cds::gc::DHP>
78                     >
79                 >
80                 ,cds::opt::enable_elimination<true>
81             >::type
82         > Elimination_DHP_member;
83
84         typedef cds::intrusive::TreiberStack< cds::gc::DHP,
85             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
86             , typename ci::treiber_stack::make_traits<
87                 ci::opt::hook<
88                     ci::treiber_stack::member_hook<
89                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
90                         ci::opt::gc<cds::gc::DHP>
91                     >
92                 >
93                 ,cds::opt::enable_elimination<true>
94                 ,ci::opt::buffer< ci::opt::v::dynamic_buffer<void *> >
95             >::type
96         > Elimination_DHP_member_dyn;
97
98         typedef cds::intrusive::TreiberStack< cds::gc::DHP,
99             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
100             , typename ci::treiber_stack::make_traits<
101                 ci::opt::hook<
102                     ci::treiber_stack::member_hook<
103                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
104                         ci::opt::gc<cds::gc::DHP>
105                     >
106                 >
107                 ,cds::opt::enable_elimination<true>
108                 ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
109             >::type
110         > Elimination_DHP_member_relaxed;
111
112         // DHP GC + member hook + disposer
113         typedef cds::intrusive::TreiberStack< cds::gc::DHP,
114             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
115             , typename ci::treiber_stack::make_traits<
116                 ci::opt::hook<
117                     ci::treiber_stack::member_hook<
118                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
119                         ci::opt::gc<cds::gc::DHP>
120                     >
121                 >
122                 ,cds::opt::enable_elimination<true>
123                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
124             >::type
125         > Elimination_DHP_member_disposer;
126
127         typedef cds::intrusive::TreiberStack< cds::gc::DHP,
128             TestIntrusiveStack::member_hook_item<cds::gc::DHP>
129             , typename ci::treiber_stack::make_traits<
130                 ci::opt::hook<
131                     ci::treiber_stack::member_hook<
132                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::DHP>, hMember),
133                         ci::opt::gc<cds::gc::DHP>
134                     >
135                 >
136                 ,cds::opt::enable_elimination<true>
137                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
138                 ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
139             >::type
140         > Elimination_DHP_member_disposer_relaxed;
141     }
142
143     TEST(Elimination_DHP_base)
144     TEST_DYN(Elimination_DHP_base_dyn)
145     TEST(Elimination_DHP_base_disposer)
146     TEST(Elimination_DHP_member)
147     TEST_DYN(Elimination_DHP_member_dyn)
148     TEST(Elimination_DHP_member_disposer)
149
150     TEST(Elimination_DHP_base_relaxed)
151     TEST(Elimination_DHP_base_disposer_relaxed)
152     TEST(Elimination_DHP_member_relaxed)
153     TEST(Elimination_DHP_member_disposer_relaxed)
154
155 } // namespace stack
156