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