Skip to content

Commit

Permalink
Revert "feat: 💥 variadic template versions of get_common_XXX() remo…
Browse files Browse the repository at this point in the history
…ved (only 2-argument overloads used in practice)"

This reverts commit ab888aa.
  • Loading branch information
mpusz committed Sep 25, 2024
1 parent 534df1b commit 8c12f95
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 11 deletions.
7 changes: 7 additions & 0 deletions src/core/include/mp-units/framework/quantity_spec.h
Original file line number Diff line number Diff line change
Expand Up @@ -1535,6 +1535,13 @@ template<QuantitySpec Q1, QuantitySpec Q2>
// NOLINTEND(bugprone-branch-clone)
}

[[nodiscard]] consteval QuantitySpec auto get_common_quantity_spec(QuantitySpec auto q1, QuantitySpec auto q2,
QuantitySpec auto q3, QuantitySpec auto... rest)
requires requires { get_common_quantity_spec(get_common_quantity_spec(q1, q2), q3, rest...); }
{
return get_common_quantity_spec(get_common_quantity_spec(q1, q2), q3, rest...);
}

MP_UNITS_EXPORT_END

} // namespace mp_units
28 changes: 17 additions & 11 deletions src/core/include/mp-units/framework/reference.h
Original file line number Diff line number Diff line change
Expand Up @@ -268,24 +268,30 @@ template<Reference R, typename Q>
// NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
constexpr auto operator/(R, Q&& q) = delete;

[[nodiscard]] consteval AssociatedUnit auto get_common_reference(AssociatedUnit auto u1, AssociatedUnit auto u2)
[[nodiscard]] consteval AssociatedUnit auto get_common_reference(AssociatedUnit auto u1, AssociatedUnit auto u2,
AssociatedUnit auto... rest)
requires requires {
{ get_common_quantity_spec(get_quantity_spec(u1), get_quantity_spec(u2)) } -> QuantitySpec;
{ get_common_unit(u1, u2) } -> AssociatedUnit;
{
get_common_quantity_spec(get_quantity_spec(u1), get_quantity_spec(u2), get_quantity_spec(rest)...)
} -> QuantitySpec;
{ get_common_unit(u1, u2, rest...) } -> AssociatedUnit;
}
{
return get_common_unit(u1, u2);
return get_common_unit(u1, u2, rest...);
}

template<Reference R1, Reference R2>
[[nodiscard]] consteval Reference auto get_common_reference(R1 r1, R2 r2)
requires(!(AssociatedUnit<R1> && AssociatedUnit<R2>)) && requires {
{ get_common_quantity_spec(get_quantity_spec(r1), get_quantity_spec(r2)) } -> QuantitySpec;
{ get_common_unit(get_unit(r1), get_unit(r2)) } -> Unit;
template<Reference R1, Reference R2, Reference... Rest>
[[nodiscard]] consteval Reference auto get_common_reference(R1 r1, R2 r2, Rest... rest)
requires(!(AssociatedUnit<R1> && AssociatedUnit<R2> && (... && AssociatedUnit<Rest>))) && requires {
{
get_common_quantity_spec(get_quantity_spec(r1), get_quantity_spec(r2), get_quantity_spec(rest)...)
} -> QuantitySpec;
{ get_common_unit(get_unit(r1), get_unit(r2), get_unit(rest)...) } -> Unit;
}
{
return detail::reference_t<get_common_quantity_spec(get_quantity_spec(R1{}), get_quantity_spec(R2{})),
get_common_unit(get_unit(R1{}), get_unit(R2{}))>{};
return detail::reference_t<get_common_quantity_spec(get_quantity_spec(R1{}), get_quantity_spec(R2{}),
get_quantity_spec(rest)...),
get_common_unit(get_unit(R1{}), get_unit(R2{}), get_unit(rest)...)>{};
}

MP_UNITS_EXPORT_END
Expand Down
6 changes: 6 additions & 0 deletions src/core/include/mp-units/framework/unit.h
Original file line number Diff line number Diff line change
Expand Up @@ -654,6 +654,12 @@ template<Unit U1, Unit U2>
}
}

[[nodiscard]] consteval Unit auto get_common_unit(Unit auto u1, Unit auto u2, Unit auto u3, Unit auto... rest)
requires requires { get_common_unit(get_common_unit(u1, u2), u3, rest...); }
{
return get_common_unit(get_common_unit(u1, u2), u3, rest...);
}


/**
* @brief Puts a space ' ' sign before a unit symbol
Expand Down

0 comments on commit 8c12f95

Please sign in to comment.