blob: 47fcda6402449ec1d453d5a109b3c91d8e5e1cca [file]
#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