[hacks] add MP_UNITS_IS_VALUE

This commit is contained in:
Jonas Hoppe
2024-09-03 12:14:42 +02:00
parent 5ae1304eee
commit a89bfc6c21
4 changed files with 13 additions and 11 deletions

View File

@@ -81,11 +81,13 @@
#define MP_UNITS_TYPENAME typename
#define MP_UNITS_EXPRESSION(x) (x)
#define MP_UNITS_IS_VALUE(x) (x)
#else
#define MP_UNITS_TYPENAME
#define MP_UNITS_EXPRESSION(x) x
#define MP_UNITS_IS_VALUE(x)
#endif

View File

@@ -41,7 +41,7 @@ template<Reference R>
struct delta_ {
template<typename Rep>
requires RepresentationOf<std::remove_cvref_t<Rep>, get_quantity_spec(R{}).character>
[[nodiscard]] constexpr quantity<(R{}), std::remove_cvref_t<Rep>> operator()(Rep&& lhs) const
[[nodiscard]] constexpr quantity<MP_UNITS_EXPRESSION(R{}), std::remove_cvref_t<Rep>> operator()(Rep&& lhs) const
{
return quantity{std::forward<Rep>(lhs), R{}};
}
@@ -51,7 +51,7 @@ template<Reference R>
struct absolute_ {
template<typename Rep>
requires RepresentationOf<std::remove_cvref_t<Rep>, get_quantity_spec(R{}).character>
[[nodiscard]] constexpr quantity_point<(R{}), default_point_origin(R{}), std::remove_cvref_t<Rep>> operator()(
[[nodiscard]] constexpr quantity_point<MP_UNITS_EXPRESSION(R{}), default_point_origin(R{}), std::remove_cvref_t<Rep>> operator()(
Rep&& lhs) const
{
return quantity_point{quantity{std::forward<Rep>(lhs), R{}}};

View File

@@ -127,13 +127,13 @@ namespace detail {
} // namespace detail
template<QuantityOf<(isq::time)> Q>
template<QuantityOf<MP_UNITS_IS_VALUE(isq::time)> Q>
[[nodiscard]] constexpr auto to_chrono_duration(const Q& q)
{
return std::chrono::duration<typename Q::rep, decltype(detail::as_ratio(get_canonical_unit(Q::unit).mag))>{q};
}
template<QuantityPointOf<(isq::time)> QP>
template<QuantityPointOf<MP_UNITS_IS_VALUE(isq::time)> QP>
requires is_specialization_of<std::remove_const_t<decltype(QP::absolute_point_origin)>, chrono_point_origin_>
[[nodiscard]] constexpr auto to_chrono_time_point(const QP& qp)
{

View File

@@ -43,7 +43,7 @@ import std;
MP_UNITS_EXPORT
namespace mp_units::si {
template<ReferenceOf<(isq::angular_measure)> auto R, typename Rep>
template<ReferenceOf<MP_UNITS_IS_VALUE(isq::angular_measure)> auto R, typename Rep>
requires requires(Rep v) { sin(v); } || requires(Rep v) { std::sin(v); }
[[nodiscard]] inline QuantityOf<dimensionless> auto sin(const quantity<R, Rep>& q) noexcept
{
@@ -57,7 +57,7 @@ template<ReferenceOf<(isq::angular_measure)> auto R, typename Rep>
return quantity{sin(q.numerical_value_in(radian)), one};
}
template<ReferenceOf<(isq::angular_measure)> auto R, typename Rep>
template<ReferenceOf<MP_UNITS_IS_VALUE(isq::angular_measure)> auto R, typename Rep>
requires requires(Rep v) { cos(v); } || requires(Rep v) { std::cos(v); }
[[nodiscard]] inline QuantityOf<dimensionless> auto cos(const quantity<R, Rep>& q) noexcept
{
@@ -71,7 +71,7 @@ template<ReferenceOf<(isq::angular_measure)> auto R, typename Rep>
return quantity{cos(q.numerical_value_in(radian)), one};
}
template<ReferenceOf<(isq::angular_measure)> auto R, typename Rep>
template<ReferenceOf<MP_UNITS_IS_VALUE(isq::angular_measure)> auto R, typename Rep>
requires requires(Rep v) { tan(v); } || requires(Rep v) { std::tan(v); }
[[nodiscard]] inline QuantityOf<dimensionless> auto tan(const quantity<R, Rep>& q) noexcept
{
@@ -87,7 +87,7 @@ template<ReferenceOf<(isq::angular_measure)> auto R, typename Rep>
template<ReferenceOf<dimensionless> auto R, typename Rep>
requires requires(Rep v) { asin(v); } || requires(Rep v) { std::asin(v); }
[[nodiscard]] inline QuantityOf<(isq::angular_measure)> auto asin(const quantity<R, Rep>& q) noexcept
[[nodiscard]] inline QuantityOf<MP_UNITS_IS_VALUE(isq::angular_measure)> auto asin(const quantity<R, Rep>& q) noexcept
{
using std::asin;
if constexpr (!treat_as_floating_point<Rep>) {
@@ -101,7 +101,7 @@ template<ReferenceOf<dimensionless> auto R, typename Rep>
template<ReferenceOf<dimensionless> auto R, typename Rep>
requires requires(Rep v) { acos(v); } || requires(Rep v) { std::acos(v); }
[[nodiscard]] inline QuantityOf<(isq::angular_measure)> auto acos(const quantity<R, Rep>& q) noexcept
[[nodiscard]] inline QuantityOf<MP_UNITS_IS_VALUE(isq::angular_measure)> auto acos(const quantity<R, Rep>& q) noexcept
{
using std::acos;
if constexpr (!treat_as_floating_point<Rep>) {
@@ -115,7 +115,7 @@ template<ReferenceOf<dimensionless> auto R, typename Rep>
template<ReferenceOf<dimensionless> auto R, typename Rep>
requires requires(Rep v) { atan(v); } || requires(Rep v) { std::atan(v); }
[[nodiscard]] inline QuantityOf<(isq::angular_measure)> auto atan(const quantity<R, Rep>& q) noexcept
[[nodiscard]] inline QuantityOf<MP_UNITS_IS_VALUE(isq::angular_measure)> auto atan(const quantity<R, Rep>& q) noexcept
{
using std::atan;
if constexpr (!treat_as_floating_point<Rep>) {
@@ -132,7 +132,7 @@ template<auto R1, typename Rep1, auto R2, typename Rep2>
common_reference(R1, R2);
requires requires { atan2(v1, v2); } || requires { std::atan2(v1, v2); };
}
[[nodiscard]] inline QuantityOf<(isq::angular_measure)> auto atan2(const quantity<R1, Rep1>& y,
[[nodiscard]] inline QuantityOf<MP_UNITS_IS_VALUE(isq::angular_measure)> auto atan2(const quantity<R1, Rep1>& y,
const quantity<R2, Rep2>& x) noexcept
{
constexpr auto ref = common_reference(R1, R2);