blob: 3aadf3664780854735cd9ea7891d63e5c309cd34 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _MSC_VER
# define BOOST_TEST_DYN_LINK
#endif
#include <boost/test/unit_test.hpp>
#include <ignite/common/bits.h>
using namespace ignite;
using namespace ignite::common::bits;
BOOST_AUTO_TEST_SUITE(BitsTestSuite)
BOOST_AUTO_TEST_CASE(TestNumberOfLeadingZeroes)
{
BOOST_CHECK_EQUAL(32, NumberOfLeadingZerosI32(0));
BOOST_CHECK_EQUAL(31, NumberOfLeadingZerosI32(1));
BOOST_CHECK_EQUAL(30, NumberOfLeadingZerosI32(2));
BOOST_CHECK_EQUAL(30, NumberOfLeadingZerosI32(3));
BOOST_CHECK_EQUAL(29, NumberOfLeadingZerosI32(4));
BOOST_CHECK_EQUAL(29, NumberOfLeadingZerosI32(5));
BOOST_CHECK_EQUAL(29, NumberOfLeadingZerosI32(7));
BOOST_CHECK_EQUAL(28, NumberOfLeadingZerosI32(8));
BOOST_CHECK_EQUAL(28, NumberOfLeadingZerosI32(12));
BOOST_CHECK_EQUAL(28, NumberOfLeadingZerosI32(15));
BOOST_CHECK_EQUAL(0, NumberOfLeadingZerosI32(0xFFFFFFFF));
BOOST_CHECK_EQUAL(0, NumberOfLeadingZerosI32(0x80000000));
BOOST_CHECK_EQUAL(1, NumberOfLeadingZerosI32(0x7FFFFFFF));
BOOST_CHECK_EQUAL(1, NumberOfLeadingZerosI32(0x40000000));
BOOST_CHECK_EQUAL(8, NumberOfLeadingZerosI32(0x00FFFFFF));
BOOST_CHECK_EQUAL(8, NumberOfLeadingZerosI32(0x00F00000));
BOOST_CHECK_EQUAL(8, NumberOfLeadingZerosI32(0x00800000));
BOOST_CHECK_EQUAL(9, NumberOfLeadingZerosI32(0x00700000));
BOOST_CHECK_EQUAL(9, NumberOfLeadingZerosI32(0x00400000));
BOOST_CHECK_EQUAL(9, NumberOfLeadingZerosI32(0x006C0395));
}
BOOST_AUTO_TEST_CASE(TestNumberOfTrailingZeroes)
{
BOOST_CHECK_EQUAL(0, NumberOfTrailingZerosI32(1));
BOOST_CHECK_EQUAL(0, NumberOfTrailingZerosI32(3));
BOOST_CHECK_EQUAL(0, NumberOfTrailingZerosI32(5));
BOOST_CHECK_EQUAL(0, NumberOfTrailingZerosI32(7));
BOOST_CHECK_EQUAL(0, NumberOfTrailingZerosI32(15));
BOOST_CHECK_EQUAL(0, NumberOfTrailingZerosI32(0xFFFFFFFF));
BOOST_CHECK_EQUAL(0, NumberOfTrailingZerosI32(0x7FFFFFFF));
BOOST_CHECK_EQUAL(0, NumberOfTrailingZerosI32(0x00FFFFFF));
BOOST_CHECK_EQUAL(0, NumberOfTrailingZerosI32(0x006C0395));
BOOST_CHECK_EQUAL(1, NumberOfTrailingZerosI32(2));
BOOST_CHECK_EQUAL(2, NumberOfTrailingZerosI32(4));
BOOST_CHECK_EQUAL(2, NumberOfTrailingZerosI32(12));
BOOST_CHECK_EQUAL(3, NumberOfTrailingZerosI32(8));
BOOST_CHECK_EQUAL(20, NumberOfTrailingZerosI32(0xFFF00000));
BOOST_CHECK_EQUAL(20, NumberOfTrailingZerosI32(0x00F00000));
BOOST_CHECK_EQUAL(20, NumberOfTrailingZerosI32(0x00700000));
BOOST_CHECK_EQUAL(20, NumberOfTrailingZerosI32(0x80700000));
BOOST_CHECK_EQUAL(22, NumberOfTrailingZerosI32(0x00400000));
BOOST_CHECK_EQUAL(22, NumberOfTrailingZerosI32(0x80400000));
BOOST_CHECK_EQUAL(22, NumberOfTrailingZerosI32(0x10400000));
BOOST_CHECK_EQUAL(23, NumberOfTrailingZerosI32(0x00800000));
BOOST_CHECK_EQUAL(23, NumberOfTrailingZerosI32(0x80800000));
BOOST_CHECK_EQUAL(23, NumberOfTrailingZerosI32(0xFF800000));
BOOST_CHECK_EQUAL(30, NumberOfTrailingZerosI32(0x40000000));
BOOST_CHECK_EQUAL(30, NumberOfTrailingZerosI32(0xC0000000));
BOOST_CHECK_EQUAL(31, NumberOfTrailingZerosI32(0x80000000));
BOOST_CHECK_EQUAL(32, NumberOfTrailingZerosI32(0));
}
BOOST_AUTO_TEST_CASE(TestBitCount)
{
BOOST_CHECK_EQUAL(0, BitCountI32(0));
for (int j = 0; j < 32; ++j)
{
const int32_t testNum = 0xFFFFFFFFUL >> (31 - j);
for (int i = 0; i < (32 - j); ++i)
BOOST_CHECK_EQUAL(j + 1, BitCountI32(testNum));
}
for (int j = 0; j < 32; j += 2)
{
const int32_t testNum = 0xAAAAAAAAUL >> (31 - j);
for (int i = 0; i < (32 - j); ++i)
BOOST_CHECK_EQUAL((j / 2) + 1, BitCountI32(testNum));
}
}
BOOST_AUTO_TEST_SUITE_END()