Impala
Impalaistheopensource,nativeanalyticdatabaseforApacheHadoop.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
bit-util-test.cc
Go to the documentation of this file.
1 // Copyright 2012 Cloudera Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <iostream>
18 #include <limits.h>
19 
20 #include <boost/utility.hpp>
21 #include <gtest/gtest.h>
22 #include "util/bit-util.h"
23 #include "util/cpu-info.h"
24 
25 #include "common/names.h"
26 
27 namespace impala {
28 
29 TEST(BitUtil, Ceil) {
30  EXPECT_EQ(BitUtil::Ceil(0, 1), 0);
31  EXPECT_EQ(BitUtil::Ceil(1, 1), 1);
32  EXPECT_EQ(BitUtil::Ceil(1, 2), 1);
33  EXPECT_EQ(BitUtil::Ceil(1, 8), 1);
34  EXPECT_EQ(BitUtil::Ceil(7, 8), 1);
35  EXPECT_EQ(BitUtil::Ceil(8, 8), 1);
36  EXPECT_EQ(BitUtil::Ceil(9, 8), 2);
37 }
38 
39 TEST(BitUtil, Popcount) {
40  EXPECT_EQ(BitUtil::Popcount(BOOST_BINARY(0 1 0 1 0 1 0 1)), 4);
41  EXPECT_EQ(BitUtil::PopcountNoHw(BOOST_BINARY(0 1 0 1 0 1 0 1)), 4);
42  EXPECT_EQ(BitUtil::Popcount(BOOST_BINARY(1 1 1 1 0 1 0 1)), 6);
43  EXPECT_EQ(BitUtil::PopcountNoHw(BOOST_BINARY(1 1 1 1 0 1 0 1)), 6);
44  EXPECT_EQ(BitUtil::Popcount(BOOST_BINARY(1 1 1 1 1 1 1 1)), 8);
45  EXPECT_EQ(BitUtil::PopcountNoHw(BOOST_BINARY(1 1 1 1 1 1 1 1)), 8);
46  EXPECT_EQ(BitUtil::Popcount(0), 0);
47  EXPECT_EQ(BitUtil::PopcountNoHw(0), 0);
48 }
49 
50 TEST(BitUtil, TrailingBits) {
51  EXPECT_EQ(BitUtil::TrailingBits(BOOST_BINARY(1 1 1 1 1 1 1 1), 0), 0);
52  EXPECT_EQ(BitUtil::TrailingBits(BOOST_BINARY(1 1 1 1 1 1 1 1), 1), 1);
53  EXPECT_EQ(BitUtil::TrailingBits(BOOST_BINARY(1 1 1 1 1 1 1 1), 64),
54  BOOST_BINARY(1 1 1 1 1 1 1 1));
55  EXPECT_EQ(BitUtil::TrailingBits(BOOST_BINARY(1 1 1 1 1 1 1 1), 100),
56  BOOST_BINARY(1 1 1 1 1 1 1 1));
57  EXPECT_EQ(BitUtil::TrailingBits(0, 1), 0);
58  EXPECT_EQ(BitUtil::TrailingBits(0, 64), 0);
59  EXPECT_EQ(BitUtil::TrailingBits(1LL << 63, 0), 0);
60  EXPECT_EQ(BitUtil::TrailingBits(1LL << 63, 63), 0);
61  EXPECT_EQ(BitUtil::TrailingBits(1LL << 63, 64), 1LL << 63);
62 }
63 
64 TEST(BitUtil, ByteSwap) {
65  EXPECT_EQ(BitUtil::ByteSwap(static_cast<uint32_t>(0)), 0);
66  EXPECT_EQ(BitUtil::ByteSwap(static_cast<uint32_t>(0x11223344)), 0x44332211);
67 
68  EXPECT_EQ(BitUtil::ByteSwap(static_cast<int32_t>(0)), 0);
69  EXPECT_EQ(BitUtil::ByteSwap(static_cast<int32_t>(0x11223344)), 0x44332211);
70 
71  EXPECT_EQ(BitUtil::ByteSwap(static_cast<uint64_t>(0)), 0);
72  EXPECT_EQ(BitUtil::ByteSwap(
73  static_cast<uint64_t>(0x1122334455667788)), 0x8877665544332211);
74 
75  EXPECT_EQ(BitUtil::ByteSwap(static_cast<int64_t>(0)), 0);
76  EXPECT_EQ(BitUtil::ByteSwap(
77  static_cast<int64_t>(0x1122334455667788)), 0x8877665544332211);
78 
79  EXPECT_EQ(BitUtil::ByteSwap(static_cast<int16_t>(0)), 0);
80  EXPECT_EQ(BitUtil::ByteSwap(static_cast<int16_t>(0x1122)), 0x2211);
81 
82  EXPECT_EQ(BitUtil::ByteSwap(static_cast<uint16_t>(0)), 0);
83  EXPECT_EQ(BitUtil::ByteSwap(static_cast<uint16_t>(0x1122)), 0x2211);
84 }
85 
86 TEST(BitUtil, Log2) {
87  EXPECT_EQ(BitUtil::Log2(1), 0);
88  EXPECT_EQ(BitUtil::Log2(2), 1);
89  EXPECT_EQ(BitUtil::Log2(3), 2);
90  EXPECT_EQ(BitUtil::Log2(4), 2);
91  EXPECT_EQ(BitUtil::Log2(5), 3);
92  EXPECT_EQ(BitUtil::Log2(INT_MAX), 31);
93  EXPECT_EQ(BitUtil::Log2(UINT_MAX), 32);
94  EXPECT_EQ(BitUtil::Log2(ULLONG_MAX), 64);
95 }
96 
97 TEST(BitUtil, RoundUpToPowerOf2) {
98  EXPECT_EQ(BitUtil::RoundUpToPowerOf2(7, 8), 8);
99  EXPECT_EQ(BitUtil::RoundUpToPowerOf2(8, 8), 8);
100  EXPECT_EQ(BitUtil::RoundUpToPowerOf2(9, 8), 16);
101 }
102 
103 TEST(BitUtil, RoundDownToPowerOf2) {
104  EXPECT_EQ(BitUtil::RoundDownToPowerOf2(7, 8), 0);
105  EXPECT_EQ(BitUtil::RoundDownToPowerOf2(8, 8), 8);
106  EXPECT_EQ(BitUtil::RoundDownToPowerOf2(9, 8), 8);
107 }
108 
109 TEST(BitUtil, RoundUpDown) {
110  EXPECT_EQ(BitUtil::RoundUpNumBytes(7), 1);
111  EXPECT_EQ(BitUtil::RoundUpNumBytes(8), 1);
112  EXPECT_EQ(BitUtil::RoundUpNumBytes(9), 2);
113  EXPECT_EQ(BitUtil::RoundDownNumBytes(7), 0);
114  EXPECT_EQ(BitUtil::RoundDownNumBytes(8), 1);
115  EXPECT_EQ(BitUtil::RoundDownNumBytes(9), 1);
116 
117  EXPECT_EQ(BitUtil::RoundUpNumi32(31), 1);
118  EXPECT_EQ(BitUtil::RoundUpNumi32(32), 1);
119  EXPECT_EQ(BitUtil::RoundUpNumi32(33), 2);
120  EXPECT_EQ(BitUtil::RoundDownNumi32(31), 0);
121  EXPECT_EQ(BitUtil::RoundDownNumi32(32), 1);
122  EXPECT_EQ(BitUtil::RoundDownNumi32(33), 1);
123 
124  EXPECT_EQ(BitUtil::RoundUpNumi64(63), 1);
125  EXPECT_EQ(BitUtil::RoundUpNumi64(64), 1);
126  EXPECT_EQ(BitUtil::RoundUpNumi64(65), 2);
127  EXPECT_EQ(BitUtil::RoundDownNumi64(63), 0);
128  EXPECT_EQ(BitUtil::RoundDownNumi64(64), 1);
129  EXPECT_EQ(BitUtil::RoundDownNumi64(65), 1);
130 }
131 
132 }
133 
134 int main(int argc, char **argv) {
135  ::testing::InitGoogleTest(&argc, argv);
137  return RUN_ALL_TESTS();
138 }
static uint32_t RoundDownNumi64(uint32_t bits)
Returns the rounded down to 64 multiple.
Definition: bit-util.h:102
TEST(AtomicTest, Basic)
Definition: atomic-test.cc:28
static int64_t ByteSwap(int64_t value)
Swaps the byte order (i.e. endianess)
Definition: bit-util.h:149
int main(int argc, char **argv)
static uint32_t RoundUpNumi32(uint32_t bits)
Returns the rounded up to 32 multiple. Used for conversions of bits to i32.
Definition: bit-util.h:87
static uint64_t TrailingBits(uint64_t v, int num_bits)
Returns the 'num_bits' least-significant bits of 'v'.
Definition: bit-util.h:125
static uint32_t RoundDownNumi32(uint32_t bits)
Returns the rounded up 32 multiple.
Definition: bit-util.h:92
static int PopcountNoHw(uint64_t x)
Definition: bit-util.h:109
static uint32_t RoundUpNumBytes(uint32_t bits)
Definition: bit-util.h:77
static int RoundDownToPowerOf2(int value, int factor)
Definition: bit-util.h:69
static int Ceil(int value, int divisor)
Returns the ceil of value/divisor.
Definition: bit-util.h:32
static void Init()
Initialize CpuInfo.
Definition: cpu-info.cc:75
static uint32_t RoundUpNumi64(uint32_t bits)
Returns the rounded up to 64 multiple. Used for conversions of bits to i64.
Definition: bit-util.h:97
static uint32_t RoundDownNumBytes(uint32_t bits)
Returns the rounded down number of bytes that fit the number of bits.
Definition: bit-util.h:82
static int Popcount(uint64_t x)
Returns the number of set bits in x.
Definition: bit-util.h:116
static int RoundUpToPowerOf2(int value, int factor)
Definition: bit-util.h:64
static int Log2(uint64_t x)
Definition: bit-util.h:135