5 Quantities and units library [quantities]
Let
- q1 be qs...[0],
- q2 be qs...[1],
- Q1 be decltype(q1),
- Q2 be decltype(q2), and
- rest be a pack denoting the elements of qs without q1 and q2.
Effects: Equivalent to:
if constexpr (sizeof...(qs) == 1)
return q1;
else if constexpr (sizeof...(qs) == 2) {
using QQ1 = decltype(remove-kind(q1));
using QQ2 = decltype(remove-kind(q2));
if constexpr (std::is_same_v<Q1, Q2>)
return q1;
else if constexpr (NestedQuantityKindSpecOf<Q1{}, Q2{}>)
return QQ1{};
else if constexpr (NestedQuantityKindSpecOf<Q2{}, Q1{}>)
return QQ2{};
else if constexpr ((QuantityKindSpec<Q1> && !QuantityKindSpec<Q2>) ||
(DerivedQuantitySpec<QQ1> && NamedQuantitySpec<QQ2> &&
implicitly_convertible(Q1{}, Q2{})))
return q2;
else if constexpr ((!QuantityKindSpec<Q1> && QuantityKindSpec<Q2>) ||
(NamedQuantitySpec<QQ1> && DerivedQuantitySpec<QQ2> &&
implicitly_convertible(Q2{}, Q1{})))
return q1;
else if constexpr (constexpr auto common_base = get-common-base<Q1{}, Q2{}>())
return *common_base;
else if constexpr (implicitly_convertible(Q1{}, Q2{}))
return q2;
else if constexpr (implicitly_convertible(Q2{}, Q1{}))
return q1;
else if constexpr (implicitly_convertible(get-kind-tree-root(Q1{}),
get-kind-tree-root(Q2{})))
return get-kind-tree-root(q2);
else
return get-kind-tree-root(q1);
} else
return get_common_quantity_spec(get_common_quantity_spec(q1, q2), rest...);
Remarks: The expression in the
requires-clause is equivalent to:
(sizeof...(qs) != 0 &&
(sizeof...(qs) == 1 ||
(sizeof...(qs) == 2 &&
(QuantitySpecConvertibleTo<get-kind-tree-root(Q1{}), get-kind-tree-root(Q2{})> ||
QuantitySpecConvertibleTo<get-kind-tree-root(Q2{}), get-kind-tree-root(Q1{})>)) ||
requires { get_common_quantity_spec(get_common_quantity_spec(q1, q2), rest...); }))