diff --git a/cpp/src/arrow/compute/kernels/scalar_arithmetic.cc b/cpp/src/arrow/compute/kernels/scalar_arithmetic.cc index 7692f037124..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*) { - return arg > 0; + 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); } };