blob: 0832fcf9732b391450094c087bac827cad6e593c [file] [log] [blame]
// { dg-do compile { target c++23 } }
#include <bitset>
#include <testsuite_hooks.h>
constexpr bool
test_counting()
{
auto check = []<std::size_t N>(const std::bitset<N>& bs) {
VERIFY( bs.size() == N );
unsigned count = 0;
for (unsigned n = 0; n < N; ++n)
if (bs.test(n))
++count;
VERIFY( count == bs.count() );
VERIFY( bs.all() == (bs.count() == bs.size()) );
VERIFY( bs.any() == (bs.count() != 0) );
VERIFY( bs.none() == (bs.count() == 0) );
return true;
};
std::bitset<0> z0;
VERIFY( z0.count() == 0 );
VERIFY( check(z0) );
z0.set();
VERIFY( z0.count() == 0 );
VERIFY( check(z0) );
std::bitset<7> z7;
VERIFY( z7.count() == 0 );
VERIFY( check(z7) );
z7.set();
VERIFY( z7.count() == 7 );
VERIFY( check(z7) );
z7.flip(1);
VERIFY( z7.count() == 6 );
VERIFY( check(z7) );
std::bitset<31> z31;
VERIFY( z31.count() == 0 );
VERIFY( check(z31) );
z31.set();
VERIFY( z31.count() == 31 );
VERIFY( check(z31) );
z31.flip(1);
VERIFY( z31.count() == 30 );
VERIFY( check(z31) );
std::bitset<32> z32;
VERIFY( z32.count() == 0 );
VERIFY( check(z32) );
z32.set();
VERIFY( z32.count() == 32 );
VERIFY( check(z32) );
z32.flip(1);
VERIFY( z32.count() == 31 );
VERIFY( check(z32) );
std::bitset<63> z63;
VERIFY( z63.count() == 0 );
VERIFY( check(z63) );
z63.set();
VERIFY( z63.count() == 63 );
VERIFY( check(z63) );
z63.flip(1);
VERIFY( z63.count() == 62 );
VERIFY( check(z63) );
std::bitset<64> z64;
VERIFY( z64.count() == 0 );
VERIFY( check(z64) );
z64.set();
VERIFY( z64.count() == 64 );
VERIFY( check(z64) );
z64.flip(1);
VERIFY( z64.count() == 63 );
VERIFY( check(z64) );
std::bitset<1000> z1k;
VERIFY( z1k.count() == 0 );
VERIFY( check(z1k) );
z1k.set();
VERIFY( z1k.count() == 1000 );
VERIFY( check(z1k) );
z1k.flip(1);
VERIFY( z1k.count() == 999 );
VERIFY( check(z1k) );
return true;
}
static_assert( test_counting() );