forked from mpusz/mp-units
[hacks] add MP_UNITS_IS_VALUE
This commit is contained in:
@@ -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
|
||||
|
||||
|
@@ -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{}}};
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user