2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
6 Source code repo: http://github.com/khizmax/libcds/
7 Download: http://sourceforge.net/projects/libcds/files/
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are met:
12 * Redistributions of source code must retain the above copyright notice, this
13 list of conditions and the following disclaimer.
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.
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.
31 #include "cppunit/cppunit_proxy.h"
32 #include "cppunit/test_beans.h"
33 #include <cds/container/fcdeque.h>
34 #include <boost/container/deque.hpp>
38 class HdrFCDeque: public CppUnitMini::TestCase
40 template <class Deque>
41 void test_with( Deque& dq )
43 size_t const c_nSize = 100;
45 // push_front/pop_front
46 for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
47 CPPUNIT_CHECK( dq.push_front( i ) );
48 CPPUNIT_CHECK( dq.size() == c_nSize );
52 while ( !dq.empty() ) {
53 CPPUNIT_CHECK( dq.pop_front( val ) );
55 CPPUNIT_CHECK( static_cast<int>(c_nSize - nCount) == val );
57 CPPUNIT_CHECK( nCount == c_nSize );
60 for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
61 CPPUNIT_CHECK( dq.push_back( i ) );
62 CPPUNIT_CHECK( dq.size() == c_nSize );
65 while ( !dq.empty() ) {
66 CPPUNIT_CHECK( dq.pop_back( val ) );
68 CPPUNIT_CHECK( static_cast<int>(c_nSize - nCount) == val );
70 CPPUNIT_CHECK( nCount == c_nSize );
72 // push_back/pop_front
73 for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
74 CPPUNIT_CHECK( dq.push_back( i ) );
75 CPPUNIT_CHECK( dq.size() == c_nSize );
78 while ( !dq.empty() ) {
79 CPPUNIT_CHECK( dq.pop_front( val ) );
80 CPPUNIT_CHECK( static_cast<int>( nCount ) == val );
83 CPPUNIT_CHECK( nCount == c_nSize );
85 // push_front/pop_back
86 for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
87 CPPUNIT_CHECK( dq.push_front( i ) );
88 CPPUNIT_CHECK( dq.size() == c_nSize );
91 while ( !dq.empty() ) {
92 CPPUNIT_CHECK( dq.pop_back( val ) );
93 CPPUNIT_CHECK( static_cast<int>( nCount ) == val );
96 CPPUNIT_CHECK( nCount == c_nSize );
99 for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
100 CPPUNIT_CHECK( dq.push_front( i ) );
101 CPPUNIT_CHECK( dq.size() == c_nSize );
103 CPPUNIT_CHECK( !dq.empty() );
105 CPPUNIT_CHECK( dq.empty() );
108 template <class Deque>
117 typedef cds::container::FCDeque<int> deque_type;
121 void fcDeque_elimination()
123 typedef cds::container::FCDeque<int, std::deque<int>,
124 cds::container::fcdeque::make_traits<
125 cds::opt::enable_elimination< true >
133 typedef cds::container::FCDeque<int, std::deque<int>,
134 cds::container::fcdeque::make_traits<
135 cds::opt::stat< cds::container::fcdeque::stat<> >
143 struct deque_traits : public
144 cds::container::fcdeque::make_traits<
145 cds::opt::enable_elimination< true >
148 typedef std::mutex lock_type;
150 typedef cds::container::FCDeque<int, std::deque<int>, deque_traits > deque_type;
156 typedef cds::container::FCDeque<int, boost::container::deque<int> > deque_type;
160 void fcDeque_boost_elimination()
162 typedef cds::container::FCDeque<int, boost::container::deque<int>,
163 cds::container::fcdeque::make_traits<
164 cds::opt::enable_elimination< true >
170 void fcDeque_boost_stat()
172 typedef cds::container::FCDeque<int, boost::container::deque<int>,
173 cds::container::fcdeque::make_traits<
174 cds::opt::stat< cds::container::fcdeque::stat<> >
180 void fcDeque_boost_mutex()
182 typedef cds::container::FCDeque<int, boost::container::deque<int>,
183 cds::container::fcdeque::make_traits<
184 cds::opt::enable_elimination< true >
185 ,cds::opt::lock_type< std::mutex >
191 CPPUNIT_TEST_SUITE(HdrFCDeque)
192 CPPUNIT_TEST(fcDeque)
193 CPPUNIT_TEST(fcDeque_elimination)
194 CPPUNIT_TEST(fcDeque_stat)
195 CPPUNIT_TEST(fcDeque_mutex)
196 CPPUNIT_TEST(fcDeque_boost)
197 CPPUNIT_TEST(fcDeque_boost_elimination)
198 CPPUNIT_TEST(fcDeque_boost_stat)
199 CPPUNIT_TEST(fcDeque_boost_mutex)
200 CPPUNIT_TEST_SUITE_END()
205 CPPUNIT_TEST_SUITE_REGISTRATION(deque::HdrFCDeque);