From 7b300602b0c6fd5bebb275a19fa7a94554872193 Mon Sep 17 00:00:00 2001 From: shockp Date: Thu, 23 Apr 2026 11:25:07 +0200 Subject: [PATCH 1/4] GH-45819: [C++] Implement OptionalBitmapAnd utility Centralizes the logic for conjoining optional null bitmaps. Optimizes memory allocations by returning nullptr or falling back to CopyBitmap when one or both of the input buffers are missing. --- cpp/src/arrow/util/bitmap_ops.cc | 20 ++++++++++++++++++++ cpp/src/arrow/util/bitmap_ops.h | 23 +++++++++++++++++++++++ testing | 2 +- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/cpp/src/arrow/util/bitmap_ops.cc b/cpp/src/arrow/util/bitmap_ops.cc index cc24146ae94e..da693750f626 100644 --- a/cpp/src/arrow/util/bitmap_ops.cc +++ b/cpp/src/arrow/util/bitmap_ops.cc @@ -31,6 +31,7 @@ #include "arrow/util/bitmap_reader.h" #include "arrow/util/bitmap_writer.h" #include "arrow/util/logging_internal.h" +#include "bitmap_ops.h" namespace arrow { namespace internal { @@ -329,6 +330,25 @@ bool OptionalBitmapEquals(const std::shared_ptr& left, int64_t left_offs right ? right->data() : nullptr, right_offset, length); } +Result> OptionalBitmapAnd(MemoryPool* pool, + const std::shared_ptr& left, + int64_t left_offset, + const std::shared_ptr& right, + int64_t right_offset, int64_t length, + int64_t out_offset) { + if (left == nullptr && right == nullptr) { + return nullptr; + } + if (left == nullptr) { + return CopyBitmap(pool, right->data(), right_offset, length, out_offset); + } + if (right == nullptr) { + return CopyBitmap(pool, left->data(), left_offset, length, out_offset); + } + return BitmapAnd(pool, left->data(), left_offset, right->data(), right_offset, length, + out_offset); +} + namespace { template