Skip to content

Commit c3d16d8

Browse files
committed
address comments and polish test
1 parent da281d5 commit c3d16d8

File tree

5 files changed

+314
-223
lines changed

5 files changed

+314
-223
lines changed

src/iceberg/deletes/roaring_position_bitmap.cc

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ constexpr size_t kBitmapKeySizeBytes = 4;
4141
int32_t Key(int64_t pos) { return static_cast<int32_t>(pos >> 32); }
4242

4343
// Extracts low 32 bits from a 64-bit position.
44-
uint32_t Pos32Bits(int64_t pos) { return static_cast<uint32_t>(pos); }
44+
uint32_t Pos32Bits(int64_t pos) { return static_cast<uint32_t>(0xFFFFFFFF & pos); }
4545

4646
// Combines key (high 32 bits) and pos32 (low 32 bits) into a 64-bit
4747
// position. The low 32 bits are zero-extended to avoid sign extension.
4848
int64_t ToPosition(int32_t key, uint32_t pos32) {
49-
return (static_cast<int64_t>(key) << 32) | static_cast<int64_t>(pos32);
49+
return (int64_t{key} << 32) | int64_t{pos32};
5050
}
5151

5252
void WriteLE64(char* buf, int64_t value) {
@@ -95,6 +95,20 @@ RoaringPositionBitmap::RoaringPositionBitmap() : impl_(std::make_unique<Impl>())
9595

9696
RoaringPositionBitmap::~RoaringPositionBitmap() = default;
9797

98+
RoaringPositionBitmap::RoaringPositionBitmap(const RoaringPositionBitmap& other)
99+
: impl_(other.impl_ != nullptr ? std::make_unique<Impl>(*other.impl_)
100+
: std::make_unique<Impl>()) {}
101+
102+
RoaringPositionBitmap& RoaringPositionBitmap::operator=(
103+
const RoaringPositionBitmap& other) {
104+
if (this == &other) {
105+
return *this;
106+
}
107+
impl_ = other.impl_ != nullptr ? std::make_unique<Impl>(*other.impl_)
108+
: std::make_unique<Impl>();
109+
return *this;
110+
}
111+
98112
RoaringPositionBitmap::RoaringPositionBitmap(RoaringPositionBitmap&&) noexcept = default;
99113

100114
RoaringPositionBitmap& RoaringPositionBitmap::operator=(
@@ -167,6 +181,8 @@ size_t RoaringPositionBitmap::SerializedSizeInBytes() const {
167181
return size;
168182
}
169183

184+
// Serializes using the portable format (little-endian).
185+
// See https://iceberg.apache.org/puffin-spec/#deletion-vector-v1-blob-type
170186
Result<std::string> RoaringPositionBitmap::Serialize() const {
171187
size_t size = SerializedSizeInBytes();
172188
std::string result(size, '\0');
@@ -243,7 +259,7 @@ Result<RoaringPositionBitmap> RoaringPositionBitmap::Deserialize(std::string_vie
243259
buf += bitmap_size;
244260
remaining -= bitmap_size;
245261

246-
impl->bitmaps.push_back(std::move(bitmap));
262+
impl->bitmaps.emplace_back(std::move(bitmap));
247263
last_key = key;
248264
--remaining_count;
249265
}

src/iceberg/deletes/roaring_position_bitmap.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ namespace iceberg {
4646
/// this class.
4747
class ICEBERG_EXPORT RoaringPositionBitmap {
4848
public:
49-
/// \brief Maximum supported position.
49+
/// \brief Maximum supported position (aligned with the Java implementation).
5050
static constexpr int64_t kMaxPosition = 0x7FFFFFFE80000000LL;
5151

5252
RoaringPositionBitmap();
@@ -55,8 +55,8 @@ class ICEBERG_EXPORT RoaringPositionBitmap {
5555
RoaringPositionBitmap(RoaringPositionBitmap&& other) noexcept;
5656
RoaringPositionBitmap& operator=(RoaringPositionBitmap&& other) noexcept;
5757

58-
RoaringPositionBitmap(const RoaringPositionBitmap&) = delete;
59-
RoaringPositionBitmap& operator=(const RoaringPositionBitmap&) = delete;
58+
RoaringPositionBitmap(const RoaringPositionBitmap& other);
59+
RoaringPositionBitmap& operator=(const RoaringPositionBitmap& other);
6060

6161
/// \brief Sets a position in the bitmap.
6262
/// \param pos the position (must be >= 0 and <= kMaxPosition)

src/iceberg/test/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ add_iceberg_test(util_test
115115
endian_test.cc
116116
formatter_test.cc
117117
location_util_test.cc
118+
roaring_position_bitmap_test.cc
118119
string_util_test.cc
119120
transform_util_test.cc
120121
truncate_util_test.cc
@@ -124,8 +125,6 @@ add_iceberg_test(util_test
124125

125126
add_iceberg_test(roaring_test SOURCES roaring_test.cc)
126127

127-
add_iceberg_test(roaring_position_bitmap_test SOURCES roaring_position_bitmap_test.cc)
128-
129128
if(ICEBERG_BUILD_BUNDLE)
130129
add_iceberg_test(avro_test
131130
USE_BUNDLE

src/iceberg/test/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ iceberg_tests = {
9090
'endian_test.cc',
9191
'formatter_test.cc',
9292
'location_util_test.cc',
93+
'roaring_position_bitmap_test.cc',
9394
'string_util_test.cc',
9495
'transform_util_test.cc',
9596
'truncate_util_test.cc',

0 commit comments

Comments
 (0)