@@ -41,12 +41,12 @@ constexpr size_t kBitmapKeySizeBytes = 4;
4141int32_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.
4848int64_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
5252void WriteLE64 (char * buf, int64_t value) {
@@ -95,6 +95,20 @@ RoaringPositionBitmap::RoaringPositionBitmap() : impl_(std::make_unique<Impl>())
9595
9696RoaringPositionBitmap::~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+
98112RoaringPositionBitmap::RoaringPositionBitmap (RoaringPositionBitmap&&) noexcept = default ;
99113
100114RoaringPositionBitmap& 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
170186Result<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 }
0 commit comments