mirror of
https://github.com/boostorg/dynamic_bitset.git
synced 2026-01-19 04:12:09 +00:00
379 lines
13 KiB
C++
379 lines
13 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();
|
|
}
|