//===----------------------------------------------------------------------===// // DuckDB // // duckdb/common/operator/abs.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/common/types.hpp" #include "duckdb/common/exception.hpp" #include "duckdb/common/limits.hpp" namespace duckdb { struct AbsOperator { template static inline TR Operation(TA input) { return input < 0 ? -input : input; } }; template <> inline hugeint_t AbsOperator::Operation(hugeint_t input) { const hugeint_t zero(0); return (input < zero) ? -input : input; } struct TryAbsOperator { template static inline TR Operation(TA input) { return AbsOperator::Operation(input); } }; template <> inline int8_t TryAbsOperator::Operation(int8_t input) { if (input == NumericLimits::Minimum()) { throw OutOfRangeException("Overflow on abs(%d)", input); } return input < 0 ? -input : input; } template <> inline int16_t TryAbsOperator::Operation(int16_t input) { if (input == NumericLimits::Minimum()) { throw OutOfRangeException("Overflow on abs(%d)", input); } return input < 0 ? -input : input; } template <> inline int32_t TryAbsOperator::Operation(int32_t input) { if (input == NumericLimits::Minimum()) { throw OutOfRangeException("Overflow on abs(%d)", input); } return input < 0 ? -input : input; } template <> inline int64_t TryAbsOperator::Operation(int64_t input) { if (input == NumericLimits::Minimum()) { throw OutOfRangeException("Overflow on abs(%d)", input); } return input < 0 ? -input : input; } template <> inline dtime_t TryAbsOperator::Operation(dtime_t input) { return dtime_t(TryAbsOperator::Operation(input.micros)); } template <> inline interval_t TryAbsOperator::Operation(interval_t input) { return {TryAbsOperator::Operation(input.months), TryAbsOperator::Operation(input.days), TryAbsOperator::Operation(input.micros)}; } } // namespace duckdb