mirror of
https://github.com/boostorg/dynamic_bitset.git
synced 2026-01-19 04:12:09 +00:00
This commit: - Sorts the #include directives: The #includes of the ""-form come first, those of the <>-form come later (this helps checking if any include file is not self-sufficient); in each of the two groups, the names of the headers or source files are sorted alphabetically (this eases searching for a specific #include and avoids duplicates). - Uses the ""-form when including Boost files; using the <>-form is a relic of the past. This was even discussed on the developers list many years ago and led to core issue 370. Note that some parts of DynamicBitset were already using the ""-form and that has never caused any problem, AFAIK. - Removes some comments attached to the directives themselves which seemed pretty useless and prone to get out of sync.
384 lines
12 KiB
C++
384 lines
12 KiB
C++
// -----------------------------------------------------------
|
|
// Copyright (c) 2001 Jeremy Siek
|
|
// Copyright (c) 2003-2006, 2025 Gennaro Prota
|
|
// Copyright (c) 2014 Ahmed Charles
|
|
// Copyright (c) 2018 Evgeny Shulgin
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0.
|
|
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
// -----------------------------------------------------------
|
|
|
|
#include "bitset_test.hpp"
|
|
#include "boost/config.hpp"
|
|
#include "boost/dynamic_bitset/dynamic_bitset.hpp"
|
|
|
|
|
|
template <typename Block>
|
|
void run_test_cases( BOOST_EXPLICIT_TEMPLATE_TYPE(Block) )
|
|
{
|
|
typedef boost::dynamic_bitset<Block> bitset_type;
|
|
typedef bitset_test< bitset_type > Tests;
|
|
const int bits_per_block = bitset_type::bits_per_block;
|
|
|
|
std::string long_string = get_long_string();
|
|
|
|
//=====================================================================
|
|
// Test operator&=
|
|
{
|
|
boost::dynamic_bitset<Block> lhs, rhs;
|
|
Tests::and_assignment(lhs, rhs);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
|
|
Tests::and_assignment(lhs, rhs);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
|
|
Tests::and_assignment(lhs, rhs);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
|
|
Tests::and_assignment(lhs, rhs);
|
|
}
|
|
//=====================================================================
|
|
// Test operator |=
|
|
{
|
|
boost::dynamic_bitset<Block> lhs, rhs;
|
|
Tests::or_assignment(lhs, rhs);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
|
|
Tests::or_assignment(lhs, rhs);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> lhs(long_string.size(), 0), rhs(long_string);
|
|
Tests::or_assignment(lhs, rhs);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> lhs(long_string.size(), 1), rhs(long_string);
|
|
Tests::or_assignment(lhs, rhs);
|
|
}
|
|
//=====================================================================
|
|
// Test operator^=
|
|
{
|
|
boost::dynamic_bitset<Block> lhs, rhs;
|
|
Tests::xor_assignment(lhs, rhs);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
|
|
Tests::xor_assignment(lhs, rhs);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> lhs(std::string("0")), rhs(std::string("1"));
|
|
Tests::xor_assignment(lhs, rhs);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> lhs(long_string), rhs(long_string);
|
|
Tests::xor_assignment(lhs, rhs);
|
|
}
|
|
//=====================================================================
|
|
// Test operator-=
|
|
{
|
|
boost::dynamic_bitset<Block> lhs, rhs;
|
|
Tests::sub_assignment(lhs, rhs);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> lhs(std::string("1")), rhs(std::string("0"));
|
|
Tests::sub_assignment(lhs, rhs);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> lhs(std::string("0")), rhs(std::string("1"));
|
|
Tests::sub_assignment(lhs, rhs);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> lhs(long_string), rhs(long_string);
|
|
Tests::sub_assignment(lhs, rhs);
|
|
}
|
|
//=====================================================================
|
|
// Test operator<<=
|
|
{ // case pos == 0
|
|
std::size_t pos = 0;
|
|
{
|
|
boost::dynamic_bitset<Block> b;
|
|
Tests::shift_left_assignment(b, pos);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> b(std::string("1010"));
|
|
Tests::shift_left_assignment(b, pos);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::shift_left_assignment(b, pos);
|
|
}
|
|
}
|
|
{
|
|
// test with both multiple and
|
|
// non multiple of bits_per_block
|
|
const int how_many = 10;
|
|
for (int i = 1; i <= how_many; ++i) {
|
|
std::size_t multiple = i * bits_per_block;
|
|
std::size_t non_multiple = multiple - 1;
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
|
|
Tests::shift_left_assignment(b, multiple);
|
|
Tests::shift_left_assignment(b, non_multiple);
|
|
}
|
|
}
|
|
{ // case pos == size()/2
|
|
std::size_t pos = long_string.size() / 2;
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::shift_left_assignment(b, pos);
|
|
}
|
|
{ // case pos >= n
|
|
std::size_t pos = long_string.size();
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::shift_left_assignment(b, pos);
|
|
}
|
|
//=====================================================================
|
|
// Test operator>>=
|
|
{ // case pos == 0
|
|
std::size_t pos = 0;
|
|
{
|
|
boost::dynamic_bitset<Block> b;
|
|
Tests::shift_right_assignment(b, pos);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> b(std::string("1010"));
|
|
Tests::shift_right_assignment(b, pos);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::shift_right_assignment(b, pos);
|
|
}
|
|
}
|
|
{
|
|
// test with both multiple and
|
|
// non multiple of bits_per_block
|
|
const int how_many = 10;
|
|
for (int i = 1; i <= how_many; ++i) {
|
|
std::size_t multiple = i * bits_per_block;
|
|
std::size_t non_multiple = multiple - 1;
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
|
|
Tests::shift_right_assignment(b, multiple);
|
|
Tests::shift_right_assignment(b, non_multiple);
|
|
}
|
|
|
|
}
|
|
{ // case pos == size()/2
|
|
std::size_t pos = long_string.size() / 2;
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::shift_right_assignment(b, pos);
|
|
}
|
|
{ // case pos >= n
|
|
std::size_t pos = long_string.size();
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::shift_right_assignment(b, pos);
|
|
}
|
|
//=====================================================================
|
|
// test b.set()
|
|
{
|
|
boost::dynamic_bitset<Block> b;
|
|
Tests::set_all(b);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> b(std::string("0"));
|
|
Tests::set_all(b);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::set_all(b);
|
|
}
|
|
//=====================================================================
|
|
// Test b.set(pos)
|
|
{ // case pos >= b.size()
|
|
boost::dynamic_bitset<Block> b;
|
|
Tests::set_one(b, 0, true);
|
|
Tests::set_one(b, 0, false);
|
|
}
|
|
{ // case pos < b.size()
|
|
boost::dynamic_bitset<Block> b(std::string("0"));
|
|
Tests::set_one(b, 0, true);
|
|
Tests::set_one(b, 0, false);
|
|
}
|
|
{ // case pos == b.size() / 2
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::set_one(b, long_string.size()/2, true);
|
|
Tests::set_one(b, long_string.size()/2, false);
|
|
}
|
|
//=====================================================================
|
|
// Test b.set(pos, len)
|
|
{ // case size is 1
|
|
boost::dynamic_bitset<Block> b(std::string("0"));
|
|
Tests::set_segment(b, 0, 1, true);
|
|
Tests::set_segment(b, 0, 1, false);
|
|
}
|
|
{ // case fill the whole set
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::set_segment(b, 0, b.size(), true);
|
|
Tests::set_segment(b, 0, b.size(), false);
|
|
}
|
|
{ // case pos = size / 4, len = size / 2
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::set_segment(b, b.size() / 4, b.size() / 2, true);
|
|
Tests::set_segment(b, b.size() / 4, b.size() / 2, false);
|
|
}
|
|
{ // case pos = block_size / 2, len = size - block_size
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::set_segment(b, boost::dynamic_bitset<Block>::bits_per_block / 2,
|
|
b.size() - boost::dynamic_bitset<Block>::bits_per_block, true);
|
|
Tests::set_segment(b, boost::dynamic_bitset<Block>::bits_per_block / 2,
|
|
b.size() - boost::dynamic_bitset<Block>::bits_per_block, false);
|
|
}
|
|
{ // case pos = 1, len = size - 2
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::set_segment(b, 1, b.size() - 2, true);
|
|
Tests::set_segment(b, 1, b.size() - 2, false);
|
|
}
|
|
{ // case pos = 3, len = 7
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::set_segment(b, 3, 7, true);
|
|
Tests::set_segment(b, 3, 7, false);
|
|
}
|
|
//=====================================================================
|
|
// Test b.reset()
|
|
{
|
|
boost::dynamic_bitset<Block> b;
|
|
Tests::reset_all(b);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> b(std::string("0"));
|
|
Tests::reset_all(b);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::reset_all(b);
|
|
}
|
|
//=====================================================================
|
|
// Test b.reset(pos)
|
|
{ // case pos >= b.size()
|
|
boost::dynamic_bitset<Block> b;
|
|
Tests::reset_one(b, 0);
|
|
}
|
|
{ // case pos < b.size()
|
|
boost::dynamic_bitset<Block> b(std::string("0"));
|
|
Tests::reset_one(b, 0);
|
|
}
|
|
{ // case pos == b.size() / 2
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::reset_one(b, long_string.size()/2);
|
|
}
|
|
//=====================================================================
|
|
// Test b.reset(pos, len)
|
|
{ // case size is 1
|
|
boost::dynamic_bitset<Block> b(std::string("0"));
|
|
Tests::reset_segment(b, 0, 1);
|
|
}
|
|
{ // case fill the whole set
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::reset_segment(b, 0, b.size());
|
|
}
|
|
{ // case pos = size / 4, len = size / 2
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::reset_segment(b, b.size() / 4, b.size() / 2);
|
|
}
|
|
{ // case pos = block_size / 2, len = size - block_size
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::reset_segment(b, boost::dynamic_bitset<Block>::bits_per_block / 2,
|
|
b.size() - boost::dynamic_bitset<Block>::bits_per_block);
|
|
}
|
|
{ // case pos = 1, len = size - 2
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::reset_segment(b, 1, b.size() - 2);
|
|
}
|
|
{ // case pos = 3, len = 7
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::reset_segment(b, 3, 7);
|
|
}
|
|
//=====================================================================
|
|
// Test ~b
|
|
{
|
|
boost::dynamic_bitset<Block> b;
|
|
Tests::operator_flip(b);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> b(std::string("1"));
|
|
Tests::operator_flip(b);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::operator_flip(b);
|
|
}
|
|
//=====================================================================
|
|
// Test b.flip()
|
|
{
|
|
boost::dynamic_bitset<Block> b;
|
|
Tests::flip_all(b);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> b(std::string("1"));
|
|
Tests::flip_all(b);
|
|
}
|
|
{
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::flip_all(b);
|
|
}
|
|
//=====================================================================
|
|
// Test b.flip(pos)
|
|
{ // case pos >= b.size()
|
|
boost::dynamic_bitset<Block> b;
|
|
Tests::flip_one(b, 0);
|
|
}
|
|
{ // case pos < b.size()
|
|
boost::dynamic_bitset<Block> b(std::string("0"));
|
|
Tests::flip_one(b, 0);
|
|
}
|
|
{ // case pos == b.size() / 2
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::flip_one(b, long_string.size()/2);
|
|
}
|
|
//=====================================================================
|
|
// Test b.flip(pos, len)
|
|
{ // case size is 1
|
|
boost::dynamic_bitset<Block> b(std::string("0"));
|
|
Tests::flip_segment(b, 0, 1);
|
|
}
|
|
{ // case fill the whole set
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::flip_segment(b, 0, b.size());
|
|
}
|
|
{ // case pos = size / 4, len = size / 2
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::flip_segment(b, b.size() / 4, b.size() / 2);
|
|
}
|
|
{ // case pos = block_size / 2, len = size - block_size
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::flip_segment(b, boost::dynamic_bitset<Block>::bits_per_block / 2,
|
|
b.size() - boost::dynamic_bitset<Block>::bits_per_block);
|
|
}
|
|
{ // case pos = 1, len = size - 2
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::flip_segment(b, 1, b.size() - 2);
|
|
}
|
|
{ // case pos = 3, len = 7
|
|
boost::dynamic_bitset<Block> b(long_string);
|
|
Tests::flip_segment(b, 3, 7);
|
|
}
|
|
}
|
|
|
|
int
|
|
main()
|
|
{
|
|
run_test_cases<unsigned char>();
|
|
run_test_cases<unsigned short>();
|
|
run_test_cases<unsigned int>();
|
|
run_test_cases<unsigned long>();
|
|
# ifdef BOOST_HAS_LONG_LONG
|
|
run_test_cases< ::boost::ulong_long_type>();
|
|
# endif
|
|
|
|
return boost::report_errors();
|
|
}
|