void bitop64() { cds::atomic64u_t n ; n = 0 ; CPPUNIT_ASSERT_EX( cds::bitop::MSB(n) == 0, "n=" << n ) ; CPPUNIT_ASSERT_EX( cds::bitop::LSB(n) == 0, "n=" << n ) ; CPPUNIT_ASSERT_EX( cds::bitop::SBC(n) == 0, "n=" << n ) ; CPPUNIT_ASSERT_EX( cds::bitop::ZBC(n) == sizeof(n) * 8, "n=" << n ) ; size_t nBit = 1 ; for ( n = 1; n != 0; n *= 2 ) { CPPUNIT_ASSERT_EX( cds::bitop::MSB(n) == nBit, "n=" << n ) ; CPPUNIT_ASSERT_EX( cds::bitop::LSB(n) == nBit, "n=" << n ) ; CPPUNIT_ASSERT_EX( cds::bitop::MSBnz(n) == nBit - 1, "n=" << n ) ; CPPUNIT_ASSERT_EX( cds::bitop::LSBnz(n) == nBit - 1, "n=" << n ) ; CPPUNIT_ASSERT_EX( cds::bitop::SBC(n) == 1, "n=" << n ) ; CPPUNIT_ASSERT_EX( cds::bitop::ZBC(n) == sizeof(n) * 8 - 1, "n=" << n ) ; ++nBit ; } }
void cut_uint_le() { CPPUNIT_MSG("little-endian byte order"); typedef cds::algo::split_bitstring< size_t > split_bitstring; size_t src = sizeof(src) == 8 ? 0xFEDCBA9876543210 : 0x76543210; split_bitstring splitter(src); size_t res; // Trivial case CPPUNIT_ASSERT( !splitter.eos() ); CPPUNIT_ASSERT( splitter ); res = splitter.cut(sizeof(src) * 8); CPPUNIT_ASSERT_EX( res == src, "src=" << src << ", result=" << res ); CPPUNIT_ASSERT( splitter.eos() ); CPPUNIT_ASSERT( !splitter ); CPPUNIT_ASSERT(splitter.safe_cut(sizeof(src) * 8) == 0 ); CPPUNIT_ASSERT( splitter.eos() ); CPPUNIT_ASSERT( !splitter ); splitter.reset(); CPPUNIT_ASSERT( !splitter.eos() ); CPPUNIT_ASSERT( splitter ); res = splitter.cut(sizeof(src) * 8); CPPUNIT_ASSERT_EX( res == src, "src=" << src << ", result=" << res ); CPPUNIT_ASSERT( splitter.eos() ); CPPUNIT_ASSERT( !splitter ); CPPUNIT_ASSERT(splitter.safe_cut(sizeof(src) * 8) == 0 ); CPPUNIT_ASSERT( splitter.eos() ); CPPUNIT_ASSERT( !splitter ); // Cut each hex digit splitter.reset(); for ( size_t i = 0; i < sizeof(size_t) * 2; ++i ) { CPPUNIT_ASSERT( !splitter.eos() ); CPPUNIT_ASSERT( splitter ); CPPUNIT_ASSERT( splitter.cut( 4 ) == i ); } CPPUNIT_ASSERT( splitter.eos() ); CPPUNIT_ASSERT( !splitter ); // by one bit { splitter.reset(); res = 0; for ( size_t i = 0; i < sizeof(size_t) * 8; ++i ) { CPPUNIT_ASSERT( !splitter.eos() ); CPPUNIT_ASSERT( splitter ); res = res + (splitter.cut( 1 ) << i); } CPPUNIT_ASSERT( splitter.eos() ); CPPUNIT_ASSERT( !splitter ); CPPUNIT_ASSERT( res == src ); } // random cut { for ( size_t k = 0; k < 100; ++k ) { splitter.reset(); res = 0; size_t shift = 0; while ( splitter ) { CPPUNIT_ASSERT( !splitter.eos() ); CPPUNIT_ASSERT( splitter ); int bits = rand() % 16; res = res + ( splitter.safe_cut( bits ) << shift ); shift += bits; } CPPUNIT_ASSERT( splitter.eos() ); CPPUNIT_ASSERT( !splitter ); CPPUNIT_ASSERT( res == src ); } } }