From 717b8f9a4cfeb89e1ea17e01ac3a21f728b44dfb Mon Sep 17 00:00:00 2001 From: Eduardo Ponce Date: Wed, 8 Sep 2021 14:09:33 -0400 Subject: [PATCH 1/2] add explicit output values to unsigned int variant --- cpp/src/arrow/compute/kernels/scalar_arithmetic.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/src/arrow/compute/kernels/scalar_arithmetic.cc b/cpp/src/arrow/compute/kernels/scalar_arithmetic.cc index 7692f037124..eb5e9d9bd46 100644 --- a/cpp/src/arrow/compute/kernels/scalar_arithmetic.cc +++ b/cpp/src/arrow/compute/kernels/scalar_arithmetic.cc @@ -473,7 +473,7 @@ struct Sign { template static constexpr enable_if_unsigned_c_integer Call(KernelContext*, Arg arg, Status*) { - return arg > 0; + return (arg > 0) ? 1 : 0; } template From 459e9267bb4c80324d9a5a8df7a09ce1483b578b Mon Sep 17 00:00:00 2001 From: Eduardo Ponce Date: Mon, 13 Sep 2021 01:28:05 -0400 Subject: [PATCH 2/2] fix unary arithmetic enable_if type checks --- .../compute/kernels/scalar_arithmetic.cc | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/cpp/src/arrow/compute/kernels/scalar_arithmetic.cc b/cpp/src/arrow/compute/kernels/scalar_arithmetic.cc index eb5e9d9bd46..3f39a0bd28b 100644 --- a/cpp/src/arrow/compute/kernels/scalar_arithmetic.cc +++ b/cpp/src/arrow/compute/kernels/scalar_arithmetic.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include "arrow/compute/kernels/codegen_internal.h" #include "arrow/compute/kernels/common.h" @@ -78,24 +79,27 @@ using enable_if_decimal_value = struct AbsoluteValue { template - static constexpr enable_if_floating_point Call(KernelContext*, T arg, Status*) { + static constexpr enable_if_floating_point Call(KernelContext*, Arg arg, + Status*) { return std::fabs(arg); } template - static constexpr enable_if_unsigned_c_integer Call(KernelContext*, T arg, Status*) { + static constexpr enable_if_unsigned_c_integer Call(KernelContext*, Arg arg, + Status*) { return arg; } template - static constexpr enable_if_signed_c_integer Call(KernelContext*, T arg, Status* st) { + static constexpr enable_if_signed_c_integer Call(KernelContext*, Arg arg, + Status* st) { return (arg < 0) ? arrow::internal::SafeSignedNegate(arg) : arg; } }; struct AbsoluteValueChecked { template - static enable_if_signed_c_integer Call(KernelContext*, Arg arg, Status* st) { + static enable_if_signed_c_integer Call(KernelContext*, Arg arg, Status* st) { static_assert(std::is_same::value, ""); if (arg == std::numeric_limits::min()) { *st = Status::Invalid("overflow"); @@ -105,13 +109,15 @@ struct AbsoluteValueChecked { } template - static enable_if_unsigned_c_integer Call(KernelContext* ctx, Arg arg, Status* st) { + static enable_if_unsigned_c_integer Call(KernelContext* ctx, Arg arg, + Status* st) { static_assert(std::is_same::value, ""); return arg; } template - static constexpr enable_if_floating_point Call(KernelContext*, Arg arg, Status* st) { + static constexpr enable_if_floating_point Call(KernelContext*, Arg arg, + Status* st) { static_assert(std::is_same::value, ""); return std::fabs(arg); } @@ -378,7 +384,7 @@ struct Negate { struct NegateChecked { template - static enable_if_signed_c_integer Call(KernelContext*, Arg arg, Status* st) { + static enable_if_signed_c_integer Call(KernelContext*, Arg arg, Status* st) { static_assert(std::is_same::value, ""); T result = 0; if (ARROW_PREDICT_FALSE(NegateWithOverflow(arg, &result))) { @@ -388,7 +394,8 @@ struct NegateChecked { } template - static enable_if_unsigned_c_integer Call(KernelContext* ctx, Arg arg, Status* st) { + static enable_if_unsigned_c_integer Call(KernelContext* ctx, Arg arg, + Status* st) { static_assert(std::is_same::value, ""); DCHECK(false) << "This is included only for the purposes of instantiability from the " "arithmetic kernel generator"; @@ -396,7 +403,8 @@ struct NegateChecked { } template - static constexpr enable_if_floating_point Call(KernelContext*, Arg arg, Status* st) { + static constexpr enable_if_floating_point Call(KernelContext*, Arg arg, + Status* st) { static_assert(std::is_same::value, ""); return -arg; } @@ -466,18 +474,20 @@ struct PowerChecked { struct Sign { template - static constexpr enable_if_floating_point Call(KernelContext*, Arg arg, Status*) { + static constexpr enable_if_floating_point Call(KernelContext*, Arg arg, + Status*) { return std::isnan(arg) ? arg : ((arg == 0) ? 0 : (std::signbit(arg) ? -1 : 1)); } template - static constexpr enable_if_unsigned_c_integer Call(KernelContext*, Arg arg, - Status*) { + static constexpr enable_if_unsigned_c_integer Call(KernelContext*, Arg arg, + Status*) { return (arg > 0) ? 1 : 0; } template - static constexpr enable_if_signed_c_integer Call(KernelContext*, Arg arg, Status*) { + static constexpr enable_if_signed_c_integer Call(KernelContext*, Arg arg, + Status*) { return (arg > 0) ? 1 : ((arg == 0) ? 0 : -1); } }; @@ -854,21 +864,24 @@ struct LogbChecked { struct Floor { template - static constexpr enable_if_floating_point Call(KernelContext*, Arg arg, Status*) { + static constexpr enable_if_floating_point Call(KernelContext*, Arg arg, + Status*) { return std::floor(arg); } }; struct Ceil { template - static constexpr enable_if_floating_point Call(KernelContext*, Arg arg, Status*) { + static constexpr enable_if_floating_point Call(KernelContext*, Arg arg, + Status*) { return std::ceil(arg); } }; struct Trunc { template - static constexpr enable_if_floating_point Call(KernelContext*, Arg arg, Status*) { + static constexpr enable_if_floating_point Call(KernelContext*, Arg arg, + Status*) { return std::trunc(arg); } };