Move libcds 1.6.0 from SVN
[libcds.git] / tests / test-hdr / stack / hdr_intrusive_elimination_stack_ptb.cpp
1 //$$CDS-header$$
2
3 #include "hdr_intrusive_treiber_stack.h"
4 #include <cds/gc/ptb.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         // PTB GC + base hook
14         typedef cds::intrusive::TreiberStack< cds::gc::PTB,
15             TestIntrusiveStack::base_hook_item<cds::gc::PTB>
16             ,cds::opt::enable_elimination<true>
17             ,ci::opt::hook<
18                 ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
19             >
20         > Elimination_PTB_base;
21
22         typedef cds::intrusive::TreiberStack< cds::gc::PTB,
23             TestIntrusiveStack::base_hook_item<cds::gc::PTB>
24             ,ci::opt::hook<
25                 ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
26             >
27             ,cds::opt::enable_elimination<true>
28             ,ci::opt::buffer< ci::opt::v::dynamic_buffer<void *> >
29         > Elimination_PTB_base_dyn;
30
31         typedef cds::intrusive::TreiberStack< cds::gc::PTB,
32             TestIntrusiveStack::base_hook_item<cds::gc::PTB>
33             ,ci::opt::hook<
34                 ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
35             >
36             ,cds::opt::enable_elimination<true>
37             ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
38         > Elimination_PTB_base_relaxed;
39
40         // PTB GC + base hook + disposer
41         typedef cds::intrusive::TreiberStack< cds::gc::PTB,
42             TestIntrusiveStack::base_hook_item<cds::gc::PTB>
43             ,ci::opt::hook<
44                 ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
45             >
46             ,cds::opt::enable_elimination<true>
47             ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
48         > Elimination_PTB_base_disposer;
49
50         typedef cds::intrusive::TreiberStack< cds::gc::PTB,
51             TestIntrusiveStack::base_hook_item<cds::gc::PTB>
52             ,ci::opt::hook<
53                 ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
54             >
55             ,cds::opt::enable_elimination<true>
56             ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
57             ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
58         > Elimination_PTB_base_disposer_relaxed;
59
60         // PTB GC + member hook
61         typedef cds::intrusive::TreiberStack< cds::gc::PTB,
62             TestIntrusiveStack::member_hook_item<cds::gc::PTB>
63             ,ci::opt::hook<
64                 ci::single_link::member_hook<
65                     offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
66                     ci::opt::gc<cds::gc::PTB>
67                 >
68             >
69             ,cds::opt::enable_elimination<true>
70         > Elimination_PTB_member;
71
72         typedef cds::intrusive::TreiberStack< cds::gc::PTB,
73             TestIntrusiveStack::member_hook_item<cds::gc::PTB>
74             ,ci::opt::hook<
75                 ci::single_link::member_hook<
76                     offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
77                     ci::opt::gc<cds::gc::PTB>
78                 >
79             >
80             ,cds::opt::enable_elimination<true>
81             ,ci::opt::buffer< ci::opt::v::dynamic_buffer<void *> >
82         > Elimination_PTB_member_dyn;
83
84         typedef cds::intrusive::TreiberStack< cds::gc::PTB,
85             TestIntrusiveStack::member_hook_item<cds::gc::PTB>
86             ,ci::opt::hook<
87                 ci::single_link::member_hook<
88                     offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
89                     ci::opt::gc<cds::gc::PTB>
90                 >
91             >
92             ,cds::opt::enable_elimination<true>
93             ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
94         > Elimination_PTB_member_relaxed;
95
96         // PTB GC + member hook + disposer
97         typedef cds::intrusive::TreiberStack< cds::gc::PTB,
98             TestIntrusiveStack::member_hook_item<cds::gc::PTB>
99             ,ci::opt::hook<
100                 ci::single_link::member_hook<
101                     offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
102                     ci::opt::gc<cds::gc::PTB>
103                 >
104             >
105             ,cds::opt::enable_elimination<true>
106             ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
107         > Elimination_PTB_member_disposer;
108
109         typedef cds::intrusive::TreiberStack< cds::gc::PTB,
110             TestIntrusiveStack::member_hook_item<cds::gc::PTB>
111             ,ci::opt::hook<
112                 ci::single_link::member_hook<
113                     offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
114                     ci::opt::gc<cds::gc::PTB>
115                 >
116             >
117             ,cds::opt::enable_elimination<true>
118             ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
119             ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
120         > Elimination_PTB_member_disposer_relaxed;
121     }
122
123     TEST(Elimination_PTB_base)
124     TEST_DYN(Elimination_PTB_base_dyn)
125     TEST(Elimination_PTB_base_disposer)
126     TEST(Elimination_PTB_member)
127     TEST_DYN(Elimination_PTB_member_dyn)
128     TEST(Elimination_PTB_member_disposer)
129
130     TEST(Elimination_PTB_base_relaxed)
131     TEST(Elimination_PTB_base_disposer_relaxed)
132     TEST(Elimination_PTB_member_relaxed)
133     TEST(Elimination_PTB_member_disposer_relaxed)
134
135 } // namespace stack
136