Issue #48: added std::move for pop() function of stack/queue/pqueue
[libcds.git] / tests / test-hdr / stack / hdr_intrusive_treiber_stack_hp.cpp
1 /*
2     This file is a part of libcds - Concurrent Data Structures library
3
4     (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
5
6     Source code repo: http://github.com/khizmax/libcds/
7     Download: http://sourceforge.net/projects/libcds/files/
8     
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions are met:
11
12     * Redistributions of source code must retain the above copyright notice, this
13       list of conditions and the following disclaimer.
14
15     * Redistributions in binary form must reproduce the above copyright notice,
16       this list of conditions and the following disclaimer in the documentation
17       and/or other materials provided with the distribution.
18
19     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.     
29 */
30
31 #include "hdr_intrusive_treiber_stack.h"
32 #include <cds/gc/hp.h>
33 #include <cds/intrusive/treiber_stack.h>
34
35 namespace stack {
36
37 #define TEST(X)     void TestIntrusiveStack::X() { test<defs::X>(); }
38
39     namespace defs { namespace {
40         typedef cds::intrusive::TreiberStack< cds::gc::HP,
41             TestIntrusiveStack::base_hook_item<cds::gc::HP>
42         > Treiber_HP_default;
43
44         typedef cds::intrusive::TreiberStack< cds::gc::HP,
45             TestIntrusiveStack::base_hook_item<cds::gc::HP>
46             , typename ci::treiber_stack::make_traits<
47                 ci::opt::memory_model< ci::opt::v::relaxed_ordering >
48             >::type
49         > Treiber_HP_default_relaxed;
50
51         // HZP GC + base hook
52         typedef cds::intrusive::TreiberStack< cds::gc::HP,
53             TestIntrusiveStack::base_hook_item<cds::gc::HP>
54             , typename ci::treiber_stack::make_traits<
55                 ci::opt::hook<
56                     ci::treiber_stack::base_hook<
57                         ci::opt::gc<cds::gc::HP>
58                     >
59                 >
60             >::type
61         > Treiber_HP_base;
62
63         struct traits_Treiber_HP_base_relaxed
64             : ci::treiber_stack::make_traits <
65                 ci::opt::hook<
66                     ci::treiber_stack::base_hook<
67                         ci::opt::gc<cds::gc::HP>
68                     >
69                 >
70                 ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
71             > ::type
72         {};
73         typedef cds::intrusive::TreiberStack< cds::gc::HP,
74             TestIntrusiveStack::base_hook_item<cds::gc::HP>,
75             traits_Treiber_HP_base_relaxed
76         > Treiber_HP_base_relaxed;
77
78         // HZP GC + base hook + disposer
79         struct traits_Treiber_HP_base_disposer
80             : ci::treiber_stack::make_traits <
81                 ci::opt::hook<
82                     ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::HP> >
83                 >
84                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
85             >::type
86         {};
87         typedef cds::intrusive::TreiberStack< cds::gc::HP,
88             TestIntrusiveStack::base_hook_item<cds::gc::HP>,
89             traits_Treiber_HP_base_disposer
90         > Treiber_HP_base_disposer;
91
92         typedef cds::intrusive::TreiberStack< cds::gc::HP,
93             TestIntrusiveStack::base_hook_item<cds::gc::HP>
94             ,typename ci::treiber_stack::make_traits <
95                 ci::opt::hook<
96                     ci::treiber_stack::base_hook< ci::opt::gc<cds::gc::HP> >
97                 >
98                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
99                 ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
100             >::type
101         > Treiber_HP_base_disposer_relaxed;
102
103         // HZP GC + member hook
104         struct traits_Treiber_HP_member
105             : ci::treiber_stack::make_traits <
106                 ci::opt::hook<
107                     ci::treiber_stack::member_hook<
108                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
109                         ci::opt::gc<cds::gc::HP>
110                     >
111                 >
112             > ::type
113         {};
114         typedef cds::intrusive::TreiberStack< cds::gc::HP,
115             TestIntrusiveStack::member_hook_item<cds::gc::HP>,
116             traits_Treiber_HP_member
117         > Treiber_HP_member;
118
119         struct traits_Treiber_HP_member_relaxed
120             : ci::treiber_stack::make_traits <
121                 ci::opt::hook<
122                     ci::treiber_stack::member_hook<
123                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
124                         ci::opt::gc<cds::gc::HP>
125                     >
126                 >
127                 ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
128             >::type
129         {};
130         typedef cds::intrusive::TreiberStack< cds::gc::HP,
131             TestIntrusiveStack::member_hook_item<cds::gc::HP>,
132             traits_Treiber_HP_member_relaxed
133         > Treiber_HP_member_relaxed;
134
135         // HZP GC + member hook + disposer
136         struct traits_Treiber_HP_member_disposer
137             : ci::treiber_stack::make_traits <
138                 ci::opt::hook<
139                     ci::treiber_stack::member_hook<
140                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
141                         ci::opt::gc<cds::gc::HP>
142                     >
143                 >
144                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
145             >::type
146         {};
147         typedef cds::intrusive::TreiberStack< cds::gc::HP,
148             TestIntrusiveStack::member_hook_item<cds::gc::HP>,
149             traits_Treiber_HP_member_disposer
150         > Treiber_HP_member_disposer;
151
152         struct traits_Treiber_HP_member_disposer_relaxed
153             : ci::treiber_stack::make_traits <
154                 ci::opt::hook<
155                     ci::treiber_stack::member_hook<
156                         offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
157                         ci::opt::gc<cds::gc::HP>
158                     >
159                 >
160                 ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
161                 ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
162             >::type
163         {};
164         typedef cds::intrusive::TreiberStack< cds::gc::HP,
165             TestIntrusiveStack::member_hook_item<cds::gc::HP>,
166             traits_Treiber_HP_member_disposer_relaxed
167         > Treiber_HP_member_disposer_relaxed;
168     }}
169
170     TEST(Treiber_HP_default)
171     TEST(Treiber_HP_base)
172     TEST(Treiber_HP_base_disposer)
173     TEST(Treiber_HP_member)
174     TEST(Treiber_HP_member_disposer)
175
176     TEST(Treiber_HP_default_relaxed)
177     TEST(Treiber_HP_base_relaxed)
178     TEST(Treiber_HP_base_disposer_relaxed)
179     TEST(Treiber_HP_member_relaxed)
180     TEST(Treiber_HP_member_disposer_relaxed)
181
182 } // namespace stack
183
184 CPPUNIT_TEST_SUITE_REGISTRATION(stack::TestIntrusiveStack);