diff --git a/.gitignore b/.gitignore index 6f123362ef1..73df6db05dc 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ arrow-src.tar arrow-src.tar.gz # Compiled source +cpp/debug *.a *.dll *.o diff --git a/cpp/src/arrow/array/builder_primitive.h b/cpp/src/arrow/array/builder_primitive.h index e0f39f97967..2eebe2ffc69 100644 --- a/cpp/src/arrow/array/builder_primitive.h +++ b/cpp/src/arrow/array/builder_primitive.h @@ -293,6 +293,9 @@ using Int64Builder = NumericBuilder; using HalfFloatBuilder = NumericBuilder; using FloatBuilder = NumericBuilder; using DoubleBuilder = NumericBuilder; +using ComplexFloatBuilder = NumericBuilder; +using ComplexDoubleBuilder = NumericBuilder; + class ARROW_EXPORT BooleanBuilder : public ArrayBuilder { public: diff --git a/cpp/src/arrow/array/diff.cc b/cpp/src/arrow/array/diff.cc index a94ca178a40..b6b1e70fd04 100644 --- a/cpp/src/arrow/array/diff.cc +++ b/cpp/src/arrow/array/diff.cc @@ -410,9 +410,21 @@ class MakeFormatterImpl { return Status::OK(); } +template +enable_if_complex Visit(const T&) { + impl_ = [](const Array& array, int64_t index, std::ostream* os) { + const auto& numeric = checked_cast&>(array); + *os << numeric.Value(index); + }; + return Status::OK(); +} + + // format Numerics with std::ostream defaults template - enable_if_number Visit(const T&) { + enable_if_t::value && + !is_complex_type::value, Status> + Visit(const T&) { impl_ = [](const Array& array, int64_t index, std::ostream* os) { const auto& numeric = checked_cast&>(array); if (sizeof(decltype(numeric.Value(index))) == sizeof(char)) { diff --git a/cpp/src/arrow/compute/kernels/aggregate_basic_internal.h b/cpp/src/arrow/compute/kernels/aggregate_basic_internal.h index 86e321ba522..f4cde72cc90 100644 --- a/cpp/src/arrow/compute/kernels/aggregate_basic_internal.h +++ b/cpp/src/arrow/compute/kernels/aggregate_basic_internal.h @@ -105,6 +105,35 @@ struct MeanImpl : public SumImpl { ScalarAggregateOptions options; }; + +template +struct MeanImpl : public SumImpl { + Status Finalize(KernelContext*, Datum* out) override { + if (this->count < options.min_count) { + out->value = std::make_shared(); + } else { + const std::complex mean = this->sum / double(this->count); + out->value = std::make_shared(mean); + } + return Status::OK(); + } + ScalarAggregateOptions options; +}; + +template +struct MeanImpl : public SumImpl { + Status Finalize(KernelContext*, Datum* out) override { + if (this->count < options.min_count) { + out->value = std::make_shared(); + } else { + const std::complex mean = this->sum / double(this->count); + out->value = std::make_shared(mean); + } + return Status::OK(); + } + ScalarAggregateOptions options; +}; + template