From 0b97e18e23dcce050247395f3c2538410e592cd2 Mon Sep 17 00:00:00 2001 From: Wes McKinney Date: Thu, 5 Oct 2017 15:36:47 -0400 Subject: [PATCH] Add IsValid method to pair with IsNull Change-Id: Ic0a3d187c3dcde067ea951437757a009faa866e1 --- cpp/src/arrow/array-test.cc | 3 ++- cpp/src/arrow/array.h | 9 ++++++++- cpp/src/arrow/compare.cc | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/cpp/src/arrow/array-test.cc b/cpp/src/arrow/array-test.cc index ef10257b59c..c1a51521c30 100644 --- a/cpp/src/arrow/array-test.cc +++ b/cpp/src/arrow/array-test.cc @@ -142,7 +142,7 @@ TEST_F(TestArray, SliceRecomputeNullCount) { ASSERT_EQ(6, null_arr_sliced->null_count()); } -TEST_F(TestArray, TestIsNull) { +TEST_F(TestArray, TestIsNullIsValid) { // clang-format off vector null_bitmap = {1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, @@ -170,6 +170,7 @@ TEST_F(TestArray, TestIsNull) { for (size_t i = 0; i < null_bitmap.size(); ++i) { EXPECT_EQ(null_bitmap[i] != 0, !arr->IsNull(i)) << i; + EXPECT_EQ(null_bitmap[i] != 0, arr->IsValid(i)) << i; } } diff --git a/cpp/src/arrow/array.h b/cpp/src/arrow/array.h index f668b6de929..1b14e242834 100644 --- a/cpp/src/arrow/array.h +++ b/cpp/src/arrow/array.h @@ -169,12 +169,19 @@ class ARROW_EXPORT Array { public: virtual ~Array() = default; - /// Determine if a slot is null. For inner loops. Does *not* boundscheck + /// \brief Return true if value at index is null. Does not boundscheck bool IsNull(int64_t i) const { return null_bitmap_data_ != nullptr && BitUtil::BitNotSet(null_bitmap_data_, i + data_->offset); } + /// \brief Return true if value at index is valid (not null). Does not + /// boundscheck + bool IsValid(int64_t i) const { + return null_bitmap_data_ != nullptr && + BitUtil::GetBit(null_bitmap_data_, i + data_->offset); + } + /// Size in the number of elements this array contains. int64_t length() const { return data_->length; } diff --git a/cpp/src/arrow/compare.cc b/cpp/src/arrow/compare.cc index 984537fc94c..3d1f21cbc1b 100644 --- a/cpp/src/arrow/compare.cc +++ b/cpp/src/arrow/compare.cc @@ -351,7 +351,7 @@ class ArrayEqualsVisitor : public RangeEqualsVisitor { const uint8_t* right_data = right.values()->data(); for (int64_t i = 0; i < left.length(); ++i) { - if (!left.IsNull(i) && + if (left.IsValid(i) && BitUtil::GetBit(left_data, i + left.offset()) != BitUtil::GetBit(right_data, i + right.offset())) { result_ = false;