Add bits::Align functions for pointers
Supports alignment of pointers without forcing users to employ the
casts required to use the existing functions. Enables only for pointers
to 1 byte types (e.g. uint8_t/char) to avoid ambiguity about whether
alignment is measured in bytes or sizeof of the pointed-to type.
Updates code to use the new functions.
Change-Id: If196122876c7e753b3faaa116fdf1874d8cf1db9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2300342
Commit-Queue: Mike Wittman <[email protected]>
Reviewed-by: Lei Zhang <[email protected]>
Reviewed-by: Wan-Teh Chang <[email protected]>
Reviewed-by: vmpstr <[email protected]>
Auto-Submit: Mike Wittman <[email protected]>
Cr-Commit-Position: refs/heads/master@{#792136}
diff --git a/base/bits_unittest.cc b/base/bits_unittest.cc
index 249bbf7c..d716afbd 100644
--- a/base/bits_unittest.cc
+++ b/base/bits_unittest.cc
@@ -62,6 +62,27 @@
EXPECT_EQ(kSizeTMax / 2 + 1, Align(1, kSizeTMax / 2 + 1));
}
+TEST(BitsTest, AlignPointer) {
+ static constexpr uintptr_t kUintPtrTMax =
+ std::numeric_limits<uintptr_t>::max();
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(0),
+ Align(reinterpret_cast<uint8_t*>(0), 4));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(4),
+ Align(reinterpret_cast<uint8_t*>(1), 4));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(4096),
+ Align(reinterpret_cast<uint8_t*>(1), 4096));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(4096),
+ Align(reinterpret_cast<uint8_t*>(4096), 4096));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(4096),
+ Align(reinterpret_cast<uint8_t*>(4095), 4096));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(8192),
+ Align(reinterpret_cast<uint8_t*>(4097), 4096));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(kUintPtrTMax - 31),
+ Align(reinterpret_cast<uint8_t*>(kUintPtrTMax - 62), 32));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(kUintPtrTMax / 2 + 1),
+ Align(reinterpret_cast<uint8_t*>(1), kUintPtrTMax / 2 + 1));
+}
+
TEST(BitsTest, AlignDown) {
static constexpr size_t kSizeTMax = std::numeric_limits<size_t>::max();
EXPECT_EQ(0ul, AlignDown(0, 4));
@@ -75,6 +96,29 @@
EXPECT_EQ(0ul, AlignDown(1, kSizeTMax / 2 + 1));
}
+TEST(BitsTest, AlignDownPointer) {
+ static constexpr uintptr_t kUintPtrTMax =
+ std::numeric_limits<uintptr_t>::max();
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(0),
+ AlignDown(reinterpret_cast<uint8_t*>(0), 4));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(0),
+ AlignDown(reinterpret_cast<uint8_t*>(1), 4));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(0),
+ AlignDown(reinterpret_cast<uint8_t*>(1), 4096));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(4096),
+ AlignDown(reinterpret_cast<uint8_t*>(4096), 4096));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(0),
+ AlignDown(reinterpret_cast<uint8_t*>(4095), 4096));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(4096),
+ AlignDown(reinterpret_cast<uint8_t*>(4097), 4096));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(kUintPtrTMax - 63),
+ AlignDown(reinterpret_cast<uint8_t*>(kUintPtrTMax - 62), 32));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(kUintPtrTMax - 31),
+ AlignDown(reinterpret_cast<uint8_t*>(kUintPtrTMax), 32));
+ EXPECT_EQ(reinterpret_cast<uint8_t*>(0),
+ AlignDown(reinterpret_cast<uint8_t*>(1), kUintPtrTMax / 2 + 1));
+}
+
TEST(BitsTest, CountLeadingZeroBits8) {
EXPECT_EQ(8u, CountLeadingZeroBits(uint8_t{0}));
EXPECT_EQ(7u, CountLeadingZeroBits(uint8_t{1}));