Added wait strategies to flat combining technique
[libcds.git] / test / unit / deque / fcdeque.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 <gtest/gtest.h>
32 #include <cds/container/fcdeque.h>
33 #include <boost/container/deque.hpp>
34
35 namespace {
36
37     class FCDeque: public ::testing::Test
38     {
39     protected:
40         template <class Deque>
41         void test( Deque& dq )
42         {
43             size_t const c_nSize = 100;
44
45             // push_front/pop_front
46             for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
47                 EXPECT_TRUE( dq.push_front( i ) );
48             EXPECT_EQ( dq.size(), c_nSize );
49
50             size_t nCount = 0;
51             int val;
52             while ( !dq.empty() ) {
53                 EXPECT_TRUE( dq.pop_front( val ) );
54                 ++nCount;
55                 EXPECT_EQ( static_cast<int>(c_nSize - nCount), val );
56             }
57             EXPECT_EQ( nCount, c_nSize );
58
59             // push_back/pop_back
60             for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
61                 EXPECT_TRUE( dq.push_back( i ) );
62             EXPECT_EQ( dq.size(), c_nSize );
63
64             nCount = 0;
65             while ( !dq.empty() ) {
66                 EXPECT_TRUE( dq.pop_back( val ) );
67                 ++nCount;
68                 EXPECT_EQ( static_cast<int>(c_nSize - nCount), val );
69             }
70             EXPECT_EQ( nCount, c_nSize );
71
72             // push_back/pop_front
73             for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
74                 EXPECT_TRUE( dq.push_back( i ) );
75             EXPECT_EQ( dq.size(), c_nSize );
76
77             nCount = 0;
78             while ( !dq.empty() ) {
79                 EXPECT_TRUE( dq.pop_front( val ) );
80                 EXPECT_EQ( static_cast<int>( nCount ), val );
81                 ++nCount;
82             }
83             EXPECT_EQ( nCount, c_nSize );
84
85             // push_front/pop_back
86             for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
87                 EXPECT_TRUE( dq.push_front( i ) );
88             EXPECT_EQ( dq.size(), c_nSize );
89
90             nCount = 0;
91             while ( !dq.empty() ) {
92                 EXPECT_TRUE( dq.pop_back( val ) );
93                 EXPECT_EQ( static_cast<int>( nCount ), val );
94                 ++nCount;
95             }
96             EXPECT_EQ( nCount, c_nSize );
97
98             // clear
99             for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
100                 EXPECT_TRUE( dq.push_front( i ) );
101             EXPECT_EQ( dq.size(), c_nSize );
102
103             EXPECT_FALSE( dq.empty() );
104             dq.clear();
105             EXPECT_TRUE( dq.empty() );
106         }
107     };
108
109     TEST_F( FCDeque, std )
110     {
111         typedef cds::container::FCDeque<int> deque_type;
112
113         deque_type dq;
114         test( dq );
115     }
116
117     TEST_F( FCDeque, std_elimination )
118     {
119         typedef cds::container::FCDeque<int, std::deque<int>,
120             cds::container::fcdeque::make_traits<
121                 cds::opt::enable_elimination< true >
122             >::type
123         > deque_type;
124
125         deque_type dq;
126         test( dq );
127     }
128
129     TEST_F( FCDeque, std_statistics )
130     {
131         typedef cds::container::FCDeque<int, std::deque<int>,
132             cds::container::fcdeque::make_traits<
133                 cds::opt::stat< cds::container::fcdeque::stat<> >
134             >::type
135         > deque_type;
136
137         deque_type dq;
138         test( dq );
139     }
140
141     TEST_F( FCDeque, std_mutex )
142     {
143         struct deque_traits : public
144             cds::container::fcdeque::make_traits<
145                 cds::opt::enable_elimination< true >
146             >::type
147         {
148             typedef std::mutex lock_type;
149         };
150         typedef cds::container::FCDeque<int, std::deque<int>, deque_traits > deque_type;
151
152         deque_type dq;
153         test( dq );
154     }
155
156     TEST_F( FCDeque, boost )
157     {
158         typedef cds::container::FCDeque<int, boost::container::deque<int> > deque_type;
159
160         deque_type dq;
161         test( dq );
162     }
163
164     TEST_F( FCDeque, boost_elimination )
165     {
166         typedef cds::container::FCDeque<int, boost::container::deque<int>,
167             cds::container::fcdeque::make_traits<
168                 cds::opt::enable_elimination< true >
169             >::type
170         > deque_type;
171
172         deque_type dq;
173         test( dq );
174     }
175
176     TEST_F( FCDeque, boost_statistics )
177     {
178         typedef cds::container::FCDeque<int, boost::container::deque<int>,
179             cds::container::fcdeque::make_traits<
180                 cds::opt::stat< cds::container::fcdeque::stat<> >
181             >::type
182         > deque_type;
183
184         deque_type dq;
185         test( dq );
186     }
187
188     TEST_F( FCDeque, boost_mutex )
189     {
190         typedef cds::container::FCDeque<int, boost::container::deque<int>,
191             cds::container::fcdeque::make_traits<
192                 cds::opt::enable_elimination< true >
193                 ,cds::opt::lock_type< std::mutex >
194             >::type
195         > deque_type;
196
197         deque_type dq;
198         test( dq );
199     }
200
201 } // namespace