1 // -----------------------------------------------------------
2 // Copyright (c) 2001 Jeremy Siek
3 // Copyright (c) 2003-2006 Gennaro Prota
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
9 // -----------------------------------------------------------
11 #include "bitset_test.hpp"
12 #include "boost/dynamic_bitset/dynamic_bitset.hpp"
13 #include "boost/config.hpp"
16 template <typename Block>
17 void run_test_cases( BOOST_EXPLICIT_TEMPLATE_TYPE(Block) )
19 typedef boost::dynamic_bitset<Block> bitset_type;
20 typedef bitset_test< bitset_type > Tests;
21 const int bits_per_block = bitset_type::bits_per_block;
23 std::string long_string = get_long_string();
25 //=====================================================================
28 boost::dynamic_bitset<Block> lhs, rhs;
29 Tests::and_assignment(lhs, rhs);
32 boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
33 Tests::and_assignment(lhs, rhs);
36 boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
37 Tests::and_assignment(lhs, rhs);
40 boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
41 Tests::and_assignment(lhs, rhs);
43 //=====================================================================
46 boost::dynamic_bitset<Block> lhs, rhs;
47 Tests::or_assignment(lhs, rhs);
50 boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
51 Tests::or_assignment(lhs, rhs);
54 boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
55 Tests::or_assignment(lhs, rhs);
58 boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
59 Tests::or_assignment(lhs, rhs);
61 //=====================================================================
64 boost::dynamic_bitset<Block> lhs, rhs;
65 Tests::xor_assignment(lhs, rhs);
68 boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
69 Tests::xor_assignment(lhs, rhs);
72 boost::dynamic_bitset<Block> lhs(std::string("0")), rhs(std::string("1"));
73 Tests::xor_assignment(lhs, rhs);
76 boost::dynamic_bitset<Block> lhs(long_string), rhs(long_string);
77 Tests::xor_assignment(lhs, rhs);
79 //=====================================================================
82 boost::dynamic_bitset<Block> lhs, rhs;
83 Tests::sub_assignment(lhs, rhs);
86 boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
87 Tests::sub_assignment(lhs, rhs);
90 boost::dynamic_bitset<Block> lhs(std::string("0")), rhs(std::string("1"));
91 Tests::sub_assignment(lhs, rhs);
94 boost::dynamic_bitset<Block> lhs(long_string), rhs(long_string);
95 Tests::sub_assignment(lhs, rhs);
97 //=====================================================================
102 boost::dynamic_bitset<Block> b;
103 Tests::shift_left_assignment(b, pos);
106 boost::dynamic_bitset<Block> b(std::string("1010"));
107 Tests::shift_left_assignment(b, pos);
110 boost::dynamic_bitset<Block> b(long_string);
111 Tests::shift_left_assignment(b, pos);
115 // test with both multiple and
116 // non multiple of bits_per_block
117 const int how_many = 10;
118 for (int i = 1; i <= how_many; ++i) {
119 std::size_t multiple = i * bits_per_block;
120 std::size_t non_multiple = multiple - 1;
121 boost::dynamic_bitset<Block> b(long_string);
123 Tests::shift_left_assignment(b, multiple);
124 Tests::shift_left_assignment(b, non_multiple);
127 { // case pos == size()/2
128 std::size_t pos = long_string.size() / 2;
129 boost::dynamic_bitset<Block> b(long_string);
130 Tests::shift_left_assignment(b, pos);
133 std::size_t pos = long_string.size();
134 boost::dynamic_bitset<Block> b(long_string);
135 Tests::shift_left_assignment(b, pos);
137 //=====================================================================
142 boost::dynamic_bitset<Block> b;
143 Tests::shift_right_assignment(b, pos);
146 boost::dynamic_bitset<Block> b(std::string("1010"));
147 Tests::shift_right_assignment(b, pos);
150 boost::dynamic_bitset<Block> b(long_string);
151 Tests::shift_right_assignment(b, pos);
155 // test with both multiple and
156 // non multiple of bits_per_block
157 const int how_many = 10;
158 for (int i = 1; i <= how_many; ++i) {
159 std::size_t multiple = i * bits_per_block;
160 std::size_t non_multiple = multiple - 1;
161 boost::dynamic_bitset<Block> b(long_string);
163 Tests::shift_right_assignment(b, multiple);
164 Tests::shift_right_assignment(b, non_multiple);
168 { // case pos == size()/2
169 std::size_t pos = long_string.size() / 2;
170 boost::dynamic_bitset<Block> b(long_string);
171 Tests::shift_right_assignment(b, pos);
174 std::size_t pos = long_string.size();
175 boost::dynamic_bitset<Block> b(long_string);
176 Tests::shift_right_assignment(b, pos);
178 //=====================================================================
181 boost::dynamic_bitset<Block> b;
185 boost::dynamic_bitset<Block> b(std::string("0"));
189 boost::dynamic_bitset<Block> b(long_string);
192 //=====================================================================
194 { // case pos >= b.size()
195 boost::dynamic_bitset<Block> b;
196 Tests::set_one(b, 0, true);
198 { // case pos < b.size()
199 boost::dynamic_bitset<Block> b(std::string("0"));
200 Tests::set_one(b, 0, true);
202 { // case pos == b.size() / 2
203 boost::dynamic_bitset<Block> b(long_string);
204 Tests::set_one(b, long_string.size()/2, true);
206 //=====================================================================
209 boost::dynamic_bitset<Block> b;
213 boost::dynamic_bitset<Block> b(std::string("0"));
217 boost::dynamic_bitset<Block> b(long_string);
220 //=====================================================================
222 { // case pos >= b.size()
223 boost::dynamic_bitset<Block> b;
224 Tests::reset_one(b, 0);
226 { // case pos < b.size()
227 boost::dynamic_bitset<Block> b(std::string("0"));
228 Tests::reset_one(b, 0);
230 { // case pos == b.size() / 2
231 boost::dynamic_bitset<Block> b(long_string);
232 Tests::reset_one(b, long_string.size()/2);
234 //=====================================================================
237 boost::dynamic_bitset<Block> b;
238 Tests::operator_flip(b);
241 boost::dynamic_bitset<Block> b(std::string("1"));
242 Tests::operator_flip(b);
245 boost::dynamic_bitset<Block> b(long_string);
246 Tests::operator_flip(b);
248 //=====================================================================
251 boost::dynamic_bitset<Block> b;
255 boost::dynamic_bitset<Block> b(std::string("1"));
259 boost::dynamic_bitset<Block> b(long_string);
262 //=====================================================================
264 { // case pos >= b.size()
265 boost::dynamic_bitset<Block> b;
266 Tests::flip_one(b, 0);
268 { // case pos < b.size()
269 boost::dynamic_bitset<Block> b(std::string("0"));
270 Tests::flip_one(b, 0);
272 { // case pos == b.size() / 2
273 boost::dynamic_bitset<Block> b(long_string);
274 Tests::flip_one(b, long_string.size()/2);
279 test_main(int, char*[])
281 run_test_cases<unsigned char>();
282 run_test_cases<unsigned short>();
283 run_test_cases<unsigned int>();
284 run_test_cases<unsigned long>();
285 # ifdef BOOST_HAS_LONG_LONG
286 run_test_cases< ::boost::ulong_long_type>();