| #include "upb/base/internal/log2.h" | |
| #include <climits> | |
| #include <cstddef> | |
| #include <cstdint> | |
| #include <gtest/gtest.h> | |
| namespace { | |
| TEST(Log2Test, Log2Ceiling) { | |
| EXPECT_EQ(upb_Log2Ceiling(0), 0); | |
| EXPECT_EQ(upb_Log2Ceiling(1), 0); | |
| EXPECT_EQ(upb_Log2Ceiling(2), 1); | |
| EXPECT_EQ(upb_Log2Ceiling(3), 2); | |
| EXPECT_EQ(upb_Log2Ceiling(4), 2); | |
| EXPECT_EQ(upb_Log2Ceiling(5), 3); | |
| EXPECT_EQ(upb_Log2Ceiling(6), 3); | |
| EXPECT_EQ(upb_Log2Ceiling(7), 3); | |
| EXPECT_EQ(upb_Log2Ceiling(8), 3); | |
| EXPECT_EQ(upb_Log2Ceiling(SIZE_MAX), sizeof(size_t) * CHAR_BIT); | |
| #if SIZE_MAX > 0xffffffffU | |
| size_t x = ((size_t)1 << 32) + 1; | |
| EXPECT_EQ(upb_Log2Ceiling(x), 33); | |
| size_t y = ((size_t)1 << 35) + 1; | |
| EXPECT_EQ(upb_Log2Ceiling(y), 36); | |
| #endif | |
| } | |
| TEST(Log2Test, RoundUpToPowerOfTwo) { | |
| EXPECT_EQ(upb_RoundUpToPowerOfTwo(0), 1); | |
| EXPECT_EQ(upb_RoundUpToPowerOfTwo(1), 1); | |
| EXPECT_EQ(upb_RoundUpToPowerOfTwo(2), 2); | |
| EXPECT_EQ(upb_RoundUpToPowerOfTwo(3), 4); | |
| EXPECT_EQ(upb_RoundUpToPowerOfTwo(4), 4); | |
| EXPECT_EQ(upb_RoundUpToPowerOfTwo(5), 8); | |
| } | |
| TEST(Log2Test, ShlOverflow) { | |
| size_t a = 1; | |
| EXPECT_FALSE(upb_ShlOverflow(&a, 0)); | |
| EXPECT_EQ(a, 1); | |
| EXPECT_FALSE(upb_ShlOverflow(&a, 1)); | |
| EXPECT_EQ(a, 2); | |
| EXPECT_FALSE(upb_ShlOverflow(&a, 2)); | |
| EXPECT_EQ(a, 8); | |
| a = SIZE_MAX / 2; | |
| EXPECT_FALSE(upb_ShlOverflow(&a, 1)); | |
| EXPECT_EQ(a, SIZE_MAX - 1); | |
| a = (SIZE_MAX / 2) + 1; | |
| EXPECT_TRUE(upb_ShlOverflow(&a, 1)); | |
| } | |
| } // namespace |