Move libcds 1.6.0 from SVN
[libcds.git] / tests / test-hdr / deque / hdr_fcdeque.cpp
1 //$$CDS-header$$
2
3 #include "cppunit/cppunit_proxy.h"
4 #include "cppunit/test_beans.h"
5 #include <cds/container/fcdeque.h>
6 #include <boost/container/deque.hpp>
7
8 namespace deque {
9
10     class HdrFCDeque: public CppUnitMini::TestCase
11     {
12         template <class Deque>
13         void test_with( Deque& dq )
14         {
15             size_t const c_nSize = 100;
16
17             // push_front/pop_front
18             for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
19                 CPPUNIT_CHECK( dq.push_front( i ) );
20             CPPUNIT_CHECK( dq.size() == c_nSize );
21
22             size_t nCount = 0;
23             int val;
24             while ( !dq.empty() ) {
25                 CPPUNIT_CHECK( dq.pop_front( val ) );
26                 ++nCount;
27                 CPPUNIT_CHECK( static_cast<int>(c_nSize - nCount) == val );
28             }
29             CPPUNIT_CHECK( nCount == c_nSize );
30
31             // push_back/pop_back
32             for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
33                 CPPUNIT_CHECK( dq.push_back( i ) );
34             CPPUNIT_CHECK( dq.size() == c_nSize );
35
36             nCount = 0;
37             while ( !dq.empty() ) {
38                 CPPUNIT_CHECK( dq.pop_back( val ) );
39                 ++nCount;
40                 CPPUNIT_CHECK( static_cast<int>(c_nSize - nCount) == val );
41             }
42             CPPUNIT_CHECK( nCount == c_nSize );
43
44             // push_back/pop_front
45             for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
46                 CPPUNIT_CHECK( dq.push_back( i ) );
47             CPPUNIT_CHECK( dq.size() == c_nSize );
48
49             nCount = 0;
50             while ( !dq.empty() ) {
51                 CPPUNIT_CHECK( dq.pop_front( val ) );
52                 CPPUNIT_CHECK( static_cast<int>( nCount ) == val );
53                 ++nCount;
54             }
55             CPPUNIT_CHECK( nCount == c_nSize );
56
57             // push_front/pop_back
58             for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
59                 CPPUNIT_CHECK( dq.push_front( i ) );
60             CPPUNIT_CHECK( dq.size() == c_nSize );
61
62             nCount = 0;
63             while ( !dq.empty() ) {
64                 CPPUNIT_CHECK( dq.pop_back( val ) );
65                 CPPUNIT_CHECK( static_cast<int>( nCount ) == val );
66                 ++nCount;
67             }
68             CPPUNIT_CHECK( nCount == c_nSize );
69
70             // clear
71             for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
72                 CPPUNIT_CHECK( dq.push_front( i ) );
73             CPPUNIT_CHECK( dq.size() == c_nSize );
74
75             CPPUNIT_CHECK( !dq.empty() );
76             dq.clear();
77             CPPUNIT_CHECK( dq.empty() );
78         }
79
80         template <class Deque>
81         void test()
82         {
83             Deque dq;
84             test_with( dq );
85         }
86
87         void fcDeque()
88         {
89             typedef cds::container::FCDeque<int> deque_type;
90             test<deque_type>();
91         }
92
93         void fcDeque_elimination()
94         {
95             typedef cds::container::FCDeque<int, std::deque<int>,
96                 cds::container::fcdeque::make_traits<
97                     cds::opt::enable_elimination< true >
98                 >::type
99             > deque_type;
100             test<deque_type>();
101         }
102
103         void fcDeque_stat()
104         {
105             typedef cds::container::FCDeque<int, std::deque<int>,
106                 cds::container::fcdeque::make_traits<
107                     cds::opt::stat< cds::container::fcdeque::stat<> >
108                 >::type
109             > deque_type;
110             test<deque_type>();
111         }
112
113         void fcDeque_mutex()
114         {
115             typedef cds::container::FCDeque<int, std::deque<int>,
116                 cds::container::fcdeque::make_traits<
117                     cds::opt::enable_elimination< true >
118                     ,cds::opt::lock_type< cds_std::mutex >
119                 >::type
120             > deque_type;
121             test<deque_type>();
122         }
123
124         void fcDeque_boost()
125         {
126             typedef cds::container::FCDeque<int, boost::container::deque<int> > deque_type;
127             test<deque_type>();
128         }
129
130         void fcDeque_boost_elimination()
131         {
132             typedef cds::container::FCDeque<int, boost::container::deque<int>,
133                 cds::container::fcdeque::make_traits<
134                     cds::opt::enable_elimination< true >
135                 >::type
136             > deque_type;
137             test<deque_type>();
138         }
139
140         void fcDeque_boost_stat()
141         {
142             typedef cds::container::FCDeque<int, boost::container::deque<int>,
143                 cds::container::fcdeque::make_traits<
144                     cds::opt::stat< cds::container::fcdeque::stat<> >
145                 >::type
146             > deque_type;
147             test<deque_type>();
148         }
149
150         void fcDeque_boost_mutex()
151         {
152             typedef cds::container::FCDeque<int, boost::container::deque<int>,
153                 cds::container::fcdeque::make_traits<
154                     cds::opt::enable_elimination< true >
155                     ,cds::opt::lock_type< cds_std::mutex >
156                 >::type
157             > deque_type;
158             test<deque_type>();
159         }
160
161         CPPUNIT_TEST_SUITE(HdrFCDeque)
162             CPPUNIT_TEST(fcDeque)
163             CPPUNIT_TEST(fcDeque_elimination)
164             CPPUNIT_TEST(fcDeque_stat)
165             CPPUNIT_TEST(fcDeque_mutex)
166             CPPUNIT_TEST(fcDeque_boost)
167             CPPUNIT_TEST(fcDeque_boost_elimination)
168             CPPUNIT_TEST(fcDeque_boost_stat)
169             CPPUNIT_TEST(fcDeque_boost_mutex)
170         CPPUNIT_TEST_SUITE_END()
171     };
172
173 } // namespace deque
174
175 CPPUNIT_TEST_SUITE_REGISTRATION(deque::HdrFCDeque);