diff --git a/src/core/include/mp-units/framework/quantity_spec.h b/src/core/include/mp-units/framework/quantity_spec.h index 6a7cb9be..802cece1 100644 --- a/src/core/include/mp-units/framework/quantity_spec.h +++ b/src/core/include/mp-units/framework/quantity_spec.h @@ -610,7 +610,10 @@ template template [[nodiscard]] consteval int get_complexity(type_list) { - return (0 + ... + get_complexity(Ts{})); + if constexpr (sizeof...(Ts) == 0) + return 0; + else + return max({get_complexity(Ts{})...}); } template @@ -629,7 +632,7 @@ template [[nodiscard]] consteval int get_complexity(Q) { if constexpr (DerivedQuantitySpec) - return get_complexity(typename Q::_num_{}) + get_complexity(typename Q::_den_{}); + return max(get_complexity(typename Q::_num_{}), get_complexity(typename Q::_den_{})); else if constexpr (requires { Q::_equation_; }) return 1 + get_complexity(Q::_equation_); else diff --git a/test/static/quantity_spec_test.cpp b/test/static/quantity_spec_test.cpp index 63bb95bb..73778da6 100644 --- a/test/static/quantity_spec_test.cpp +++ b/test/static/quantity_spec_test.cpp @@ -458,9 +458,15 @@ static_assert(get_complexity(force) == 3); static_assert(get_complexity(acceleration * time) == 2); static_assert(get_complexity(acceleration / time) == 2); -static_assert(get_complexity(speed * area) == 2); -static_assert(get_complexity(speed / frequency) == 2); -static_assert(get_complexity(speed * area / frequency) == 3); +static_assert(get_complexity(speed * area) == 1); +static_assert(get_complexity(acceleration * area) == 2); +static_assert(get_complexity(acceleration * force) == 3); +static_assert(get_complexity(speed / frequency) == 1); +static_assert(get_complexity(acceleration / frequency) == 2); +static_assert(get_complexity(force / frequency) == 3); +static_assert(get_complexity(area / acceleration) == 2); +static_assert(get_complexity(area / force) == 3); +static_assert(get_complexity(speed * area / frequency) == 1); // explode static_assert(explode(frequency).quantity == inverse(period_duration));