From ef4f65672420cbf920a4ddc10480d8378b0d7dd1 Mon Sep 17 00:00:00 2001 From: William Ayd Date: Sun, 14 Jan 2024 18:22:13 -0500 Subject: [PATCH] use nanoarrow functions (#223) --- pantab/src/pantab.cpp | 44 ++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/pantab/src/pantab.cpp b/pantab/src/pantab.cpp index a1a73504..a96d5352 100644 --- a/pantab/src/pantab.cpp +++ b/pantab/src/pantab.cpp @@ -68,8 +68,8 @@ class InsertHelper { InsertHelper(std::shared_ptr inserter, const struct ArrowArray *chunk, const struct ArrowSchema *schema, struct ArrowError *error, int64_t column_position) - : inserter_(inserter), chunk_(chunk), schema_(schema), error_(error), - column_position_(column_position) {} + : inserter_(std::move(inserter)), chunk_(chunk), schema_(schema), + error_(error), column_position_(column_position) {} virtual ~InsertHelper() {} @@ -99,7 +99,7 @@ class InsertHelper { struct ArrowArrayView array_view_; }; -template class PrimitiveInsertHelper : public InsertHelper { +template class IntegralInsertHelper : public InsertHelper { public: using InsertHelper::InsertHelper; @@ -110,12 +110,26 @@ template class PrimitiveInsertHelper : public InsertHelper { hyperapi::internal::ValueInserter{*inserter_}.addNull(); return; } - constexpr size_t elem_size = sizeof(T); - T result; - memcpy(&result, - array_view_.buffer_views[1].data.as_uint8 + (idx * elem_size), - elem_size); - inserter_->add(result); + + const int64_t value = ArrowArrayViewGetIntUnsafe(&array_view_, idx); + inserter_->add(static_cast(value)); + } +}; + +template class FloatingInsertHelper : public InsertHelper { +public: + using InsertHelper::InsertHelper; + + void insertValueAtIndex(size_t idx) override { + if (ArrowArrayViewIsNull(&array_view_, idx)) { + // MSVC on cibuildwheel doesn't like this templated optional + // inserter_->add(std::optional{std::nullopt}); + hyperapi::internal::ValueInserter{*inserter_}.addNull(); + return; + } + + const double value = ArrowArrayViewGetDoubleUnsafe(&array_view_, idx); + inserter_->add(static_cast(value)); } }; @@ -251,22 +265,22 @@ makeInsertHelper(std::shared_ptr inserter, switch (schema_view.type) { case NANOARROW_TYPE_INT16: - return std::unique_ptr(new PrimitiveInsertHelper( + return std::unique_ptr(new IntegralInsertHelper( inserter, chunk, schema, error, column_position)); case NANOARROW_TYPE_INT32: - return std::unique_ptr(new PrimitiveInsertHelper( + return std::unique_ptr(new IntegralInsertHelper( inserter, chunk, schema, error, column_position)); case NANOARROW_TYPE_INT64: - return std::unique_ptr(new PrimitiveInsertHelper( + return std::unique_ptr(new IntegralInsertHelper( inserter, chunk, schema, error, column_position)); case NANOARROW_TYPE_FLOAT: - return std::unique_ptr(new PrimitiveInsertHelper( + return std::unique_ptr(new FloatingInsertHelper( inserter, chunk, schema, error, column_position)); case NANOARROW_TYPE_DOUBLE: - return std::unique_ptr(new PrimitiveInsertHelper( + return std::unique_ptr(new FloatingInsertHelper( inserter, chunk, schema, error, column_position)); case NANOARROW_TYPE_BOOL: - return std::unique_ptr(new PrimitiveInsertHelper( + return std::unique_ptr(new IntegralInsertHelper( inserter, chunk, schema, error, column_position)); case NANOARROW_TYPE_STRING: case NANOARROW_TYPE_LARGE_STRING: