fixed adding file problem
[c11concurrency-benchmarks.git] / gdax-orderbook-hpp / demo / dependencies / libcds-2.3.2 / test / unit / stack / test_intrusive_treiber_stack.h
1 /*
2     This file is a part of libcds - Concurrent Data Structures library
3
4     (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017
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 #ifndef CDSUNIT_STACK_INTRUSIVE_TREIBER_STACK_H
32 #define CDSUNIT_STACK_INTRUSIVE_TREIBER_STACK_H
33
34 #include <cds_test/ext_gtest.h>
35 #include <cds/intrusive/details/single_link_struct.h>
36
37 namespace cds_test {
38
39     class IntrusiveTreiberStack : public ::testing::Test
40     {
41     protected:
42         template <typename GC>
43         struct base_hook_item : public cds::intrusive::single_link::node< GC >
44         {
45             int nVal;
46             int nDisposeCount;
47
48             base_hook_item()
49                 : nDisposeCount( 0 )
50             {}
51         };
52
53         template <typename GC>
54         struct member_hook_item
55         {
56             int nVal;
57             int nDisposeCount;
58             cds::intrusive::single_link::node< GC > hMember;
59
60             member_hook_item()
61                 : nDisposeCount( 0 )
62             {}
63         };
64
65         struct mock_disposer
66         {
67             template <typename T>
68             void operator ()( T * p )
69             {
70                 ++p->nDisposeCount;
71             }
72         };
73
74         template <typename Stack>
75         void test( Stack& stack )
76         {
77             typedef typename Stack::value_type  value_type;
78
79             ASSERT_TRUE( stack.empty());
80
81             value_type v1, v2, v3;
82             v1.nVal = 1;
83             v2.nVal = 2;
84             v3.nVal = 3;
85             ASSERT_TRUE( stack.push( v1 ));
86             ASSERT_TRUE( !stack.empty());
87             ASSERT_TRUE( stack.push( v2 ));
88             ASSERT_TRUE( !stack.empty());
89             ASSERT_TRUE( stack.push( v3 ));
90             ASSERT_TRUE( !stack.empty());
91
92             value_type * pv;
93             pv = stack.pop();
94             ASSERT_NE( pv, nullptr );
95             ASSERT_EQ( pv, &v3 );
96             ASSERT_EQ( pv->nVal, 3 );
97             ASSERT_TRUE( !stack.empty());
98             pv = stack.pop();
99             ASSERT_NE( pv, nullptr );
100             ASSERT_EQ( pv, &v2 );
101             ASSERT_EQ( pv->nVal, 2 );
102             ASSERT_TRUE( !stack.empty());
103             pv = stack.pop();
104             ASSERT_NE( pv, nullptr );
105             ASSERT_EQ( pv, &v1 );
106             ASSERT_EQ( pv->nVal, 1 );
107             ASSERT_TRUE( stack.empty());
108             pv = stack.pop();
109             ASSERT_EQ( pv, nullptr );
110             ASSERT_TRUE( stack.empty());
111
112             ASSERT_EQ( v1.nDisposeCount, 0 );
113             ASSERT_EQ( v2.nDisposeCount, 0 );
114             ASSERT_EQ( v3.nDisposeCount, 0 );
115
116             stack.push( v1 );
117             stack.push( v2 );
118             stack.push( v3 );
119
120             stack.clear();
121             ASSERT_TRUE( stack.empty());
122
123             Stack::gc::scan();
124             if ( !std::is_same<typename Stack::disposer, cds::intrusive::opt::v::empty_disposer>::value ) {
125                 ASSERT_EQ( v1.nDisposeCount, 1 );
126                 ASSERT_EQ( v2.nDisposeCount, 1 );
127                 ASSERT_EQ( v3.nDisposeCount, 1 );
128             }
129         }
130     };
131
132 } // namespace cds_test
133
134 #endif // CDSUNIT_STACK_INTRUSIVE_TREIBER_STACK_H