jacktengg commented on code in PR #28027:
URL: https://github.com/apache/doris/pull/28027#discussion_r1417232266
##########
be/src/vec/core/types.h:
##########
@@ -495,38 +495,42 @@ static constexpr int max_decimal_string_length() {
+ 1; // Add a space for negative sign
}
+template <typename T>
+concept DecimalNativeTypeConcept = std::is_same_v<T, Int32> ||
std::is_same_v<T, Int64> ||
+ std::is_same_v<T, Int128> ||
std::is_same_v<T, wide::Int256>;
+
/// Own FieldType for Decimal.
/// It is only a "storage" for decimal. To perform operations, you also have
to provide a scale (number of digits after point).
-template <typename T>
+template <DecimalNativeTypeConcept T>
struct Decimal {
- static_assert(std::is_same_v<T, Int32> || std::is_same_v<T, Int64> ||
- std::is_same_v<T, Int128>);
using NativeType = T;
+ static constexpr bool IsInt256 = std::is_same_v<T, wide::Int256>;
+
Decimal() = default;
Decimal(Decimal<T>&&) = default;
Decimal(const Decimal<T>&) = default;
-#define DECLARE_NUMERIC_CTOR(TYPE) \
- Decimal(const TYPE& value_) : value(value_) {}
-
- DECLARE_NUMERIC_CTOR(wide::Int256)
- DECLARE_NUMERIC_CTOR(Int128)
- DECLARE_NUMERIC_CTOR(Int32)
- DECLARE_NUMERIC_CTOR(Int64)
- DECLARE_NUMERIC_CTOR(UInt32)
- DECLARE_NUMERIC_CTOR(UInt64)
-
-#undef DECLARE_NUMERIC_CTOR
- Decimal(const Float32& value_) : value(value_) {
- if constexpr (std::is_integral<T>::value) {
- value = round(value_);
- }
- }
- Decimal(const Float64& value_) : value(value_) {
- if constexpr (std::is_integral<T>::value) {
- value = round(value_);
+ explicit(IsInt256) Decimal(Int32 value) noexcept : value(value) {}
+ explicit(IsInt256) Decimal(Int64 value) noexcept : value(value) {}
+ explicit(IsInt256) Decimal(Int128 value) noexcept : value(value) {}
+ explicit(IsInt256) Decimal(wide::Int256 value) noexcept : value(value) {}
+ explicit(IsInt256) Decimal(UInt64 value) noexcept : value(value) {}
+ explicit(IsInt256) Decimal(UInt32 value) noexcept : value(value) {}
+ explicit(IsInt256) Decimal(Float32 value) noexcept :
value(type_round(value)) {}
+ explicit(IsInt256) Decimal(Float64 value) noexcept :
value(type_round(value)) {}
+
+ /// If T is integral and non wide::Int256, the given value will be rounded
to integer.
+ template <std::floating_point U>
+ static constexpr U type_round(U value) noexcept {
+ // When T is wide::Int256 will not round the value, according to the
old implementation.
+ // Is it right?
Review Comment:
Maybe it's a bug, should also round for Int256
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]