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_TYPENAME typename
|
||||||
#define MP_UNITS_EXPRESSION(x) (x)
|
#define MP_UNITS_EXPRESSION(x) (x)
|
||||||
|
#define MP_UNITS_IS_VALUE(x) (x)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define MP_UNITS_TYPENAME
|
#define MP_UNITS_TYPENAME
|
||||||
#define MP_UNITS_EXPRESSION(x) x
|
#define MP_UNITS_EXPRESSION(x) x
|
||||||
|
#define MP_UNITS_IS_VALUE(x)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -41,7 +41,7 @@ template<Reference R>
|
|||||||
struct delta_ {
|
struct delta_ {
|
||||||
template<typename Rep>
|
template<typename Rep>
|
||||||
requires RepresentationOf<std::remove_cvref_t<Rep>, get_quantity_spec(R{}).character>
|
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{}};
|
return quantity{std::forward<Rep>(lhs), R{}};
|
||||||
}
|
}
|
||||||
@@ -51,7 +51,7 @@ template<Reference R>
|
|||||||
struct absolute_ {
|
struct absolute_ {
|
||||||
template<typename Rep>
|
template<typename Rep>
|
||||||
requires RepresentationOf<std::remove_cvref_t<Rep>, get_quantity_spec(R{}).character>
|
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
|
Rep&& lhs) const
|
||||||
{
|
{
|
||||||
return quantity_point{quantity{std::forward<Rep>(lhs), R{}}};
|
return quantity_point{quantity{std::forward<Rep>(lhs), R{}}};
|
||||||
|
@@ -127,13 +127,13 @@ namespace detail {
|
|||||||
|
|
||||||
} // 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)
|
[[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};
|
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_>
|
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)
|
[[nodiscard]] constexpr auto to_chrono_time_point(const QP& qp)
|
||||||
{
|
{
|
||||||
|
@@ -43,7 +43,7 @@ import std;
|
|||||||
|
|
||||||
MP_UNITS_EXPORT
|
MP_UNITS_EXPORT
|
||||||
namespace mp_units::si {
|
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); }
|
requires requires(Rep v) { sin(v); } || requires(Rep v) { std::sin(v); }
|
||||||
[[nodiscard]] inline QuantityOf<dimensionless> auto sin(const quantity<R, Rep>& q) noexcept
|
[[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};
|
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); }
|
requires requires(Rep v) { cos(v); } || requires(Rep v) { std::cos(v); }
|
||||||
[[nodiscard]] inline QuantityOf<dimensionless> auto cos(const quantity<R, Rep>& q) noexcept
|
[[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};
|
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); }
|
requires requires(Rep v) { tan(v); } || requires(Rep v) { std::tan(v); }
|
||||||
[[nodiscard]] inline QuantityOf<dimensionless> auto tan(const quantity<R, Rep>& q) noexcept
|
[[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>
|
template<ReferenceOf<dimensionless> auto R, typename Rep>
|
||||||
requires requires(Rep v) { asin(v); } || requires(Rep v) { std::asin(v); }
|
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;
|
using std::asin;
|
||||||
if constexpr (!treat_as_floating_point<Rep>) {
|
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>
|
template<ReferenceOf<dimensionless> auto R, typename Rep>
|
||||||
requires requires(Rep v) { acos(v); } || requires(Rep v) { std::acos(v); }
|
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;
|
using std::acos;
|
||||||
if constexpr (!treat_as_floating_point<Rep>) {
|
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>
|
template<ReferenceOf<dimensionless> auto R, typename Rep>
|
||||||
requires requires(Rep v) { atan(v); } || requires(Rep v) { std::atan(v); }
|
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;
|
using std::atan;
|
||||||
if constexpr (!treat_as_floating_point<Rep>) {
|
if constexpr (!treat_as_floating_point<Rep>) {
|
||||||
@@ -132,7 +132,7 @@ template<auto R1, typename Rep1, auto R2, typename Rep2>
|
|||||||
common_reference(R1, R2);
|
common_reference(R1, R2);
|
||||||
requires requires { atan2(v1, v2); } || requires { std::atan2(v1, v2); };
|
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
|
const quantity<R2, Rep2>& x) noexcept
|
||||||
{
|
{
|
||||||
constexpr auto ref = common_reference(R1, R2);
|
constexpr auto ref = common_reference(R1, R2);
|
||||||
|
Reference in New Issue
Block a user