@@ -60,46 +60,11 @@ Result<T> ReadLittleEndian(ByteArrayInputStream* input_stream) {
6060
6161} // namespace
6262
63- class OptimizedRoaringBitmap64 ::Impl {
64- public:
65- std::vector<roaring::Roaring> bitmaps;
66- };
67-
68- OptimizedRoaringBitmap64::OptimizedRoaringBitmap64 () : impl_(std::make_unique<Impl>()) {}
69-
70- OptimizedRoaringBitmap64::~OptimizedRoaringBitmap64 () = default ;
71-
72- OptimizedRoaringBitmap64::OptimizedRoaringBitmap64 (const OptimizedRoaringBitmap64& other)
73- : impl_(std::make_unique<Impl>(*other.impl_)) {}
74-
75- OptimizedRoaringBitmap64& OptimizedRoaringBitmap64::operator =(
76- const OptimizedRoaringBitmap64& other) {
77- if (this != &other) {
78- if (impl_ == nullptr ) {
79- impl_ = std::make_unique<Impl>(*other.impl_ );
80- } else {
81- *impl_ = *other.impl_ ;
82- }
83- }
84- return *this ;
85- }
86-
87- OptimizedRoaringBitmap64::OptimizedRoaringBitmap64 (OptimizedRoaringBitmap64&& other) noexcept
88- : impl_(std::move(other.impl_)) {}
89-
90- OptimizedRoaringBitmap64& OptimizedRoaringBitmap64::operator =(
91- OptimizedRoaringBitmap64&& other) noexcept {
92- if (this != &other) {
93- impl_ = std::move (other.impl_ );
94- }
95- return *this ;
96- }
97-
9863OptimizedRoaringBitmap64 OptimizedRoaringBitmap64::FromRoaringBitmap32 (
9964 const RoaringBitmap32& bitmap) {
10065 OptimizedRoaringBitmap64 result;
10166 const auto * roaring_bitmap = static_cast <const roaring::Roaring*>(bitmap.roaring_bitmap_ );
102- result.impl_ -> bitmaps .push_back (*roaring_bitmap);
67+ result.bitmaps_ .push_back (*roaring_bitmap);
10368 return result;
10469}
10570
@@ -108,7 +73,7 @@ Status OptimizedRoaringBitmap64::Add(int64_t position) {
10873 const auto key = static_cast <int32_t >(position >> 32 );
10974 const auto position32 = static_cast <uint32_t >(position);
11075 AllocateBitmapsIfNeeded (static_cast <size_t >(key) + 1 );
111- impl_-> bitmaps [key].add (position32);
76+ bitmaps_ [key].add (position32);
11277 return Status::OK ();
11378}
11479
@@ -121,9 +86,9 @@ Status OptimizedRoaringBitmap64::AddRange(int64_t start, int64_t end) {
12186
12287OptimizedRoaringBitmap64& OptimizedRoaringBitmap64::operator |=(
12388 const OptimizedRoaringBitmap64& other) {
124- AllocateBitmapsIfNeeded (other.impl_ -> bitmaps .size ());
125- for (size_t key = 0 ; key < other.impl_ -> bitmaps .size (); ++key) {
126- impl_-> bitmaps [key] |= other.impl_ -> bitmaps [key];
89+ AllocateBitmapsIfNeeded (other.bitmaps_ .size ());
90+ for (size_t key = 0 ; key < other.bitmaps_ .size (); ++key) {
91+ bitmaps_ [key] |= other.bitmaps_ [key];
12792 }
12893 return *this ;
12994}
@@ -132,8 +97,7 @@ Result<bool> OptimizedRoaringBitmap64::Contains(int64_t position) const {
13297 PAIMON_RETURN_NOT_OK (CheckPosition (position));
13398 const auto key = static_cast <int32_t >(position >> 32 );
13499 const auto position32 = static_cast <uint32_t >(position);
135- return static_cast <size_t >(key) < impl_->bitmaps .size () &&
136- impl_->bitmaps [key].contains (position32);
100+ return static_cast <size_t >(key) < bitmaps_.size () && bitmaps_[key].contains (position32);
137101}
138102
139103bool OptimizedRoaringBitmap64::IsEmpty () const {
@@ -142,36 +106,36 @@ bool OptimizedRoaringBitmap64::IsEmpty() const {
142106
143107int64_t OptimizedRoaringBitmap64::Cardinality () const {
144108 int64_t cardinality = 0 ;
145- for (const roaring::Roaring& bitmap : impl_-> bitmaps ) {
109+ for (const roaring::Roaring& bitmap : bitmaps_ ) {
146110 cardinality += static_cast <int64_t >(bitmap.cardinality ());
147111 }
148112 return cardinality;
149113}
150114
151115bool OptimizedRoaringBitmap64::RunLengthEncode () {
152116 bool changed = false ;
153- for (roaring::Roaring& bitmap : impl_-> bitmaps ) {
117+ for (roaring::Roaring& bitmap : bitmaps_ ) {
154118 changed |= bitmap.runOptimize ();
155119 }
156120 return changed;
157121}
158122
159123void OptimizedRoaringBitmap64::ForEach (const std::function<void (int64_t )>& consumer) const {
160- for (size_t key = 0 ; key < impl_-> bitmaps .size (); ++key) {
161- for (uint32_t position32 : impl_-> bitmaps [key]) {
124+ for (size_t key = 0 ; key < bitmaps_ .size (); ++key) {
125+ for (uint32_t position32 : bitmaps_ [key]) {
162126 const uint64_t position = (static_cast <uint64_t >(key) << 32 ) | position32;
163127 consumer (static_cast <int64_t >(position));
164128 }
165129 }
166130}
167131
168132size_t OptimizedRoaringBitmap64::GetAllocatedBitmapCount () const {
169- return impl_-> bitmaps .size ();
133+ return bitmaps_ .size ();
170134}
171135
172136size_t OptimizedRoaringBitmap64::GetSizeInBytes () const {
173137 size_t size = kBitmapCountSizeBytes ;
174- for (const roaring::Roaring& bitmap : impl_-> bitmaps ) {
138+ for (const roaring::Roaring& bitmap : bitmaps_ ) {
175139 size += kBitmapKeySizeBytes + bitmap.getSizeInBytes ();
176140 }
177141 return size;
@@ -183,10 +147,10 @@ PAIMON_UNIQUE_PTR<Bytes> OptimizedRoaringBitmap64::Serialize(MemoryPool* pool) c
183147 }
184148 PAIMON_UNIQUE_PTR <Bytes> bytes = Bytes::AllocateBytes (GetSizeInBytes (), pool);
185149 char * output = bytes->data ();
186- WriteLittleEndian (static_cast <int64_t >(impl_-> bitmaps .size ()), &output);
187- for (size_t key = 0 ; key < impl_-> bitmaps .size (); ++key) {
150+ WriteLittleEndian (static_cast <int64_t >(bitmaps_ .size ()), &output);
151+ for (size_t key = 0 ; key < bitmaps_ .size (); ++key) {
188152 WriteLittleEndian (static_cast <int32_t >(key), &output);
189- output += impl_-> bitmaps [key].write (output);
153+ output += bitmaps_ [key].write (output);
190154 }
191155 return bytes;
192156}
@@ -197,9 +161,10 @@ Status OptimizedRoaringBitmap64::Deserialize(ByteArrayInputStream* input_stream)
197161 }
198162
199163 PAIMON_ASSIGN_OR_RAISE (int64_t bitmap_count, ReadLittleEndian<int64_t >(input_stream));
200- if (bitmap_count < 0 || bitmap_count > std::numeric_limits< int32_t >:: max () ) {
164+ if (bitmap_count < 0 ) {
201165 return Status::Invalid (fmt::format (" Invalid bitmap count: {}" , bitmap_count));
202166 }
167+ PAIMON_RETURN_NOT_OK (ValidateValueInRange<int32_t >(bitmap_count, " bitmap count" ));
203168
204169 std::vector<roaring::Roaring> bitmaps;
205170 bitmaps.reserve (static_cast <size_t >(bitmap_count));
@@ -232,7 +197,7 @@ Status OptimizedRoaringBitmap64::Deserialize(ByteArrayInputStream* input_stream)
232197 last_key = key;
233198 }
234199
235- impl_-> bitmaps = std::move (bitmaps);
200+ bitmaps_ = std::move (bitmaps);
236201 return Status::OK ();
237202}
238203
@@ -248,7 +213,7 @@ bool OptimizedRoaringBitmap64::operator==(const OptimizedRoaringBitmap64& other)
248213 if (this == &other) {
249214 return true ;
250215 }
251- return impl_-> bitmaps == other.impl_ -> bitmaps ;
216+ return bitmaps_ == other.bitmaps_ ;
252217}
253218
254219Status OptimizedRoaringBitmap64::CheckPosition (int64_t position) {
@@ -261,8 +226,8 @@ Status OptimizedRoaringBitmap64::CheckPosition(int64_t position) {
261226}
262227
263228void OptimizedRoaringBitmap64::AllocateBitmapsIfNeeded (size_t required_length) {
264- if (impl_-> bitmaps .size () < required_length) {
265- impl_-> bitmaps .resize (required_length);
229+ if (bitmaps_ .size () < required_length) {
230+ bitmaps_ .resize (required_length);
266231 }
267232}
268233
0 commit comments