added vector mult branch

This commit is contained in:
myrrc 2020-12-18 18:06:24 +03:00
parent 7611f8d15b
commit 9d24cafccd

View File

@ -186,8 +186,7 @@ inline constexpr const auto & undec(const T & x)
} }
/// Binary operations for Decimals need scale args /// Binary operations for Decimals need scale args
/// +|- scale one of args (which scale factor is not 1). ScaleR = oneof(Scale1, Scale2); /// +|-* scale one of args (which scale factor is not 1). ScaleR = oneof(Scale1, Scale2);
/// * no agrs scale. ScaleR = Scale1 + Scale2;
/// / first arg scale. ScaleR = Scale1 (scale_a = DecimalType<B>::getScale()). /// / first arg scale. ScaleR = Scale1 (scale_a = DecimalType<B>::getScale()).
template <template <typename, typename> typename Operation, typename ResultType_, bool check_overflow = true> template <template <typename, typename> typename Operation, typename ResultType_, bool check_overflow = true>
struct DecimalBinaryOperation struct DecimalBinaryOperation
@ -222,7 +221,7 @@ struct DecimalBinaryOperation
{ {
size_t size = a.size(); size_t size = a.size();
if constexpr (is_plus_minus_compare_mult) if constexpr (is_plus_minus_compare)
{ {
if (scale_a != 1) if (scale_a != 1)
{ {
@ -237,6 +236,21 @@ struct DecimalBinaryOperation
return; return;
} }
} }
else if constexpr(is_multiply && (!is_decimal_a || !is_decimal_b))
{
if (scale_a != 1)
{
for (size_t i = 0; i < size; ++i)
c[i] = apply(scale_a * undec(a[i]), undec(b[i]));
return;
}
else if (scale_b != 1)
{
for (size_t i = 0; i < size; ++i)
c[i] = apply(undec(a[i]), undec(b[i]) * scale_b);
return;
}
}
else if constexpr (is_division && is_decimal_b) else if constexpr (is_division && is_decimal_b)
{ {
for (size_t i = 0; i < size; ++i) for (size_t i = 0; i < size; ++i)
@ -353,13 +367,13 @@ private:
template <bool scale_left> template <bool scale_left>
static NO_SANITIZE_UNDEFINED NativeResultType applyScaled(NativeResultType a, NativeResultType b, NativeResultType scale) static NO_SANITIZE_UNDEFINED NativeResultType applyScaled(NativeResultType a, NativeResultType b, NativeResultType scale)
{ {
static_assert(is_plus_minus_compare_mult); static_assert(is_plus_minus_compare);
NativeResultType res; NativeResultType res;
if constexpr (check_overflow) if constexpr (check_overflow)
{ {
bool overflow = false; bool overflow = false;
if constexpr (scale_left) if constexpr (scale_left)
overflow |= common::mulOverflow(a, scale, a); overflow |= common::mulOverflow(a, scale, a);
else else