Move libcds 1.6.0 from SVN
[libcds.git] / tests / test-hdr / misc / bitop_st.cpp
1 //$$CDS-header$$
2
3 #include "cppunit/cppunit_proxy.h"
4
5 #include <cds/int_algo.h>
6 #include <cds/os/timer.h>
7
8 class bitop_ST : public CppUnitMini::TestCase
9 {
10 protected:
11     void bitop32()
12     {
13         cds::atomic32u_t    n;
14         n = 0;
15         CPPUNIT_ASSERT_EX( cds::bitop::MSB(n) == 0, "n=" << n );
16         CPPUNIT_ASSERT_EX( cds::bitop::LSB(n) == 0, "n=" << n );
17         CPPUNIT_ASSERT_EX( cds::bitop::SBC(n) == 0, "n=" << n );
18         CPPUNIT_ASSERT_EX( cds::bitop::ZBC(n) == sizeof(n) * 8, "n=" << n );
19
20         int nBit = 1;
21         for ( n = 1; n != 0; n *= 2 ) {
22             CPPUNIT_ASSERT_EX( cds::bitop::MSB(n) == nBit, "n=" << n );
23             CPPUNIT_ASSERT_EX( cds::bitop::LSB(n) == nBit, "n=" << n );
24             CPPUNIT_ASSERT_EX( cds::bitop::MSBnz(n) == nBit - 1, "n=" << n );
25             CPPUNIT_ASSERT_EX( cds::bitop::LSBnz(n) == nBit - 1, "n=" << n );
26             CPPUNIT_ASSERT_EX( cds::bitop::SBC(n) == 1, "n=" << n );
27             CPPUNIT_ASSERT_EX( cds::bitop::ZBC(n) == sizeof(n) * 8 - 1, "n=" << n );
28
29             ++nBit;
30         }
31     }
32
33     void bitop64()
34     {
35         cds::atomic64u_t    n;
36         n = 0;
37         CPPUNIT_ASSERT_EX( cds::bitop::MSB(n) == 0, "n=" << n );
38         CPPUNIT_ASSERT_EX( cds::bitop::LSB(n) == 0, "n=" << n );
39         CPPUNIT_ASSERT_EX( cds::bitop::SBC(n) == 0, "n=" << n );
40         CPPUNIT_ASSERT_EX( cds::bitop::ZBC(n) == sizeof(n) * 8, "n=" << n );
41
42         int nBit = 1;
43         for ( n = 1; n != 0; n *= 2 ) {
44             CPPUNIT_ASSERT_EX( cds::bitop::MSB(n) == nBit, "n=" << n );
45             CPPUNIT_ASSERT_EX( cds::bitop::LSB(n) == nBit, "n=" << n );
46             CPPUNIT_ASSERT_EX( cds::bitop::MSBnz(n) == nBit - 1, "n=" << n );
47             CPPUNIT_ASSERT_EX( cds::bitop::LSBnz(n) == nBit - 1, "n=" << n );
48             CPPUNIT_ASSERT_EX( cds::bitop::SBC(n) == 1, "n=" << n );
49             CPPUNIT_ASSERT_EX( cds::bitop::ZBC(n) == sizeof(n) * 8 - 1, "n=" << n );
50
51             ++nBit;
52         }
53     }
54
55     void floor_ceil_pow2()
56     {
57         CPPUNIT_CHECK_EX( cds::beans::floor2(0) == 1, "floor2(0) = " << cds::beans::floor2(0) << ", expected 1" );
58         CPPUNIT_CHECK_EX( cds::beans::floor2(1) == 1, "floor2(1) = " << cds::beans::floor2(1) << ", expected 1" );
59         CPPUNIT_CHECK_EX( cds::beans::floor2(2) == 2, "floor2(2) = " << cds::beans::floor2(2) << ", expected 2" );
60         CPPUNIT_CHECK_EX( cds::beans::floor2(3) == 2, "floor2(3) = " << cds::beans::floor2(3) << ", expected 2" );
61         CPPUNIT_CHECK_EX( cds::beans::floor2(4) == 4, "floor2(4) = " << cds::beans::floor2(4) << ", expected 4" );
62         CPPUNIT_CHECK_EX( cds::beans::floor2(5) == 4, "floor2(5) = " << cds::beans::floor2(5) << ", expected 4" );
63         CPPUNIT_CHECK_EX( cds::beans::floor2(7) == 4, "floor2(7) = " << cds::beans::floor2(7) << ", expected 4" );
64         CPPUNIT_CHECK_EX( cds::beans::floor2(8) == 8, "floor2(8) = " << cds::beans::floor2(8) << ", expected 8" );
65         CPPUNIT_CHECK_EX( cds::beans::floor2(9) == 8, "floor2(9) = " << cds::beans::floor2(9) << ", expected 8" );
66
67         CPPUNIT_CHECK_EX( cds::beans::ceil2(0) == 1, "ceil2(0) = " << cds::beans::ceil2(0) << ", expected 1" );
68         CPPUNIT_CHECK_EX( cds::beans::ceil2(1) == 1, "ceil2(1) = " << cds::beans::ceil2(1) << ", expected 1" );
69         CPPUNIT_CHECK_EX( cds::beans::ceil2(2) == 2, "ceil2(2) = " << cds::beans::ceil2(2) << ", expected 2" );
70         CPPUNIT_CHECK_EX( cds::beans::ceil2(3) == 4, "ceil2(3) = " << cds::beans::ceil2(3) << ", expected 4" );
71         CPPUNIT_CHECK_EX( cds::beans::ceil2(4) == 4, "ceil2(4) = " << cds::beans::ceil2(4) << ", expected 4" );
72         CPPUNIT_CHECK_EX( cds::beans::ceil2(5) == 8, "ceil2(5) = " << cds::beans::ceil2(5) << ", expected 8" );
73         CPPUNIT_CHECK_EX( cds::beans::ceil2(7) == 8, "ceil2(7) = " << cds::beans::ceil2(7) << ", expected 8" );
74         CPPUNIT_CHECK_EX( cds::beans::ceil2(8) == 8, "ceil2(8) = " << cds::beans::ceil2(8) << ", expected 8" );
75         CPPUNIT_CHECK_EX( cds::beans::ceil2(9) == 16, "ceil2(9) = " << cds::beans::ceil2(16) << ", expected 16" );
76     }
77
78     CPPUNIT_TEST_SUITE(bitop_ST);
79         CPPUNIT_TEST(bitop32)
80         CPPUNIT_TEST(bitop64)
81         CPPUNIT_TEST(floor_ceil_pow2)
82     CPPUNIT_TEST_SUITE_END();
83 };
84
85 CPPUNIT_TEST_SUITE_REGISTRATION(bitop_ST);