diff --git a/cpp/src/arrow/types/primitive.cc b/cpp/src/arrow/types/primitive.cc index 611457dbf63f1..66a60fa43fb10 100644 --- a/cpp/src/arrow/types/primitive.cc +++ b/cpp/src/arrow/types/primitive.cc @@ -121,13 +121,13 @@ Status PrimitiveBuilder::Reserve(int32_t elements) { return Status::OK(); } -template -std::shared_ptr NumericBuilder::Finish() { - return PrimitiveBuilder::Finish(); -} +// template +// std::shared_ptr NumericBuilder::Finish() { +// return PrimitiveBuilder::Finish(); +// } template -Status NumericBuilder::Append(const value_type* values, int32_t length, +Status PrimitiveBuilder::Append(const value_type* values, int32_t length, const uint8_t* valid_bytes) { RETURN_NOT_OK(PrimitiveBuilder::Reserve(length)); @@ -170,16 +170,41 @@ std::shared_ptr PrimitiveBuilder::Finish() { return result; } -template class NumericBuilder; -template class NumericBuilder; -template class NumericBuilder; -template class NumericBuilder; -template class NumericBuilder; -template class NumericBuilder; -template class NumericBuilder; -template class NumericBuilder; -template class NumericBuilder; -template class NumericBuilder; +template <> +Status PrimitiveBuilder::Append(const uint8_t* values, int32_t length, + const uint8_t* valid_bytes) { + RETURN_NOT_OK(Reserve(length)); + + for (int i = 0; i < length; ++i) { + if (values[i] > 0) { + util::set_bit(raw_data_, length_ + i); + } else { + util::clear_bit(raw_data_, length_ + i); + } + } + + if (valid_bytes != nullptr) { + PrimitiveBuilder::AppendNulls(valid_bytes, length); + } else { + for (int i = 0; i < length; ++i) { + util::set_bit(null_bitmap_data_, length_ + i); + } + } + length_ += length; + return Status::OK(); +} + +template class PrimitiveBuilder; +template class PrimitiveBuilder; +template class PrimitiveBuilder; +template class PrimitiveBuilder; +template class PrimitiveBuilder; +template class PrimitiveBuilder; +template class PrimitiveBuilder; +template class PrimitiveBuilder; +template class PrimitiveBuilder; +template class PrimitiveBuilder; +template class PrimitiveBuilder; BooleanArray::BooleanArray(int32_t length, const std::shared_ptr& data, int32_t null_count, @@ -222,31 +247,4 @@ bool BooleanArray::Equals(const std::shared_ptr& arr) const { return EqualsExact(*static_cast(arr.get())); } -Status BooleanBuilder::Append(const uint8_t* values, int32_t length, - const uint8_t* valid_bytes) { - RETURN_NOT_OK(Reserve(length)); - - for (int i = 0; i < length; ++i) { - if (values[i] > 0) { - util::set_bit(raw_data_, length_ + i); - } else { - util::clear_bit(raw_data_, length_ + i); - } - } - - if (valid_bytes != nullptr) { - PrimitiveBuilder::AppendNulls(valid_bytes, length); - } else { - for (int i = 0; i < length; ++i) { - util::set_bit(null_bitmap_data_, length_ + i); - } - } - length_ += length; - return Status::OK(); -} - -std::shared_ptr BooleanBuilder::Finish() { - return PrimitiveBuilder::Finish(); -} - } // namespace arrow diff --git a/cpp/src/arrow/types/primitive.h b/cpp/src/arrow/types/primitive.h index f090b46608c8f..ec6fee35513ce 100644 --- a/cpp/src/arrow/types/primitive.h +++ b/cpp/src/arrow/types/primitive.h @@ -121,10 +121,19 @@ class PrimitiveBuilder : public ArrayBuilder { return data_; } + // Vector append + // + // If passed, valid_bytes is of equal length to values, and any zero byte + // will be considered as a null for that slot + Status Append(const value_type* values, int32_t length, + const uint8_t* valid_bytes = nullptr); + // Ensure that builder can accommodate an additional number of // elements. Resizes if the current capacity is not sufficient Status Reserve(int32_t elements); + std::shared_ptr Finish() override; + protected: std::shared_ptr data_; value_type* raw_data_; @@ -134,15 +143,15 @@ class PrimitiveBuilder : public ArrayBuilder { // Increase the capacity of the builder to accommodate at least the indicated // number of elements Status Resize(int32_t capacity); - - std::shared_ptr Finish() override; }; -template -class NumericBuilder : public PrimitiveBuilder { +template +class NumericBuilder : public PrimitiveBuilder { public: - using typename PrimitiveBuilder::value_type; - using PrimitiveBuilder::PrimitiveBuilder; + using typename PrimitiveBuilder::value_type; + using PrimitiveBuilder::PrimitiveBuilder; + + using PrimitiveBuilder::Append; // Scalar append. Does not capacity-check; make sure to call Reserve beforehand void Append(value_type val) { @@ -150,19 +159,13 @@ class NumericBuilder : public PrimitiveBuilder { raw_data_[length_++] = val; } - // Vector append - // - // If passed, valid_bytes is of equal length to values, and any zero byte - // will be considered as a null for that slot - Status Append(const value_type* values, int32_t length, - const uint8_t* valid_bytes = nullptr); - - std::shared_ptr Finish() override; - protected: - using PrimitiveBuilder::length_; - using PrimitiveBuilder::null_bitmap_data_; - using PrimitiveBuilder::raw_data_; + using PrimitiveBuilder::length_; + using PrimitiveBuilder::null_bitmap_data_; + using PrimitiveBuilder::raw_data_; + + using PrimitiveBuilder::Init; + using PrimitiveBuilder::Resize; }; template <> @@ -306,7 +309,7 @@ class BooleanBuilder : public PrimitiveBuilder { virtual ~BooleanBuilder() {} - std::shared_ptr Finish() override; + using PrimitiveBuilder::Append; // Scalar append void Append(bool val) { @@ -322,16 +325,6 @@ class BooleanBuilder : public PrimitiveBuilder { void Append(uint8_t val) { Append(static_cast(val)); } - - // Vector append - // - // If passed, valid_bytes is of equal length to values, and any zero byte - // will be considered as a null for that slot - Status Append(const uint8_t* values, int32_t length, - const uint8_t* valid_bytes = nullptr); - - Status Append(const std::vector& values, - const uint8_t* valid_bytes = nullptr); }; } // namespace arrow