mirror of
https://github.com/mpusz/mp-units.git
synced 2025-08-06 05:34:27 +02:00
feat: QuantityLike
and QuantityPointLike
conversions improved
This commit is contained in:
@@ -133,9 +133,9 @@ public:
|
|||||||
template<QuantityLike Q>
|
template<QuantityLike Q>
|
||||||
requires detail::QuantityConvertibleTo<
|
requires detail::QuantityConvertibleTo<
|
||||||
quantity<quantity_like_traits<Q>::reference, typename quantity_like_traits<Q>::rep>, quantity>
|
quantity<quantity_like_traits<Q>::reference, typename quantity_like_traits<Q>::rep>, quantity>
|
||||||
constexpr explicit(
|
constexpr explicit(is_specialization_of<decltype(quantity_like_traits<Q>::to_numerical_value(std::declval<Q>())),
|
||||||
is_specialization_of<decltype(quantity_like_traits<Q>::to_numerical_value(std::declval<Q>())), convert_explicitly>)
|
convert_explicitly> ||
|
||||||
quantity(const Q& q) :
|
!std::convertible_to<typename Q::rep, Rep>) quantity(const Q& q) :
|
||||||
quantity(make_quantity<quantity_like_traits<Q>::reference>(quantity_like_traits<Q>::to_numerical_value(q).value))
|
quantity(make_quantity<quantity_like_traits<Q>::reference>(quantity_like_traits<Q>::to_numerical_value(q).value))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -192,21 +192,25 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// conversion operators
|
// conversion operators
|
||||||
template<typename Q>
|
template<typename Q_, QuantityLike Q = std::remove_cvref_t<Q_>>
|
||||||
requires QuantityLike<std::remove_cvref_t<Q>>
|
requires detail::QuantityConvertibleTo<
|
||||||
|
quantity, quantity<quantity_like_traits<Q>::reference, typename quantity_like_traits<Q>::rep>>
|
||||||
[[nodiscard]] explicit(is_specialization_of<decltype(quantity_like_traits<Q>::from_numerical_value(numerical_value_)),
|
[[nodiscard]] explicit(is_specialization_of<decltype(quantity_like_traits<Q>::from_numerical_value(numerical_value_)),
|
||||||
convert_explicitly>) constexpr
|
convert_explicitly> ||
|
||||||
operator Q() const& noexcept(noexcept(quantity_like_traits<Q>::from_numerical_value(numerical_value_)) &&
|
!std::convertible_to<Rep, typename Q::rep>) constexpr
|
||||||
|
operator Q_() const& noexcept(noexcept(quantity_like_traits<Q>::from_numerical_value(numerical_value_)) &&
|
||||||
std::is_nothrow_copy_constructible_v<rep>)
|
std::is_nothrow_copy_constructible_v<rep>)
|
||||||
{
|
{
|
||||||
return quantity_like_traits<Q>::from_numerical_value(numerical_value_).value;
|
return quantity_like_traits<Q>::from_numerical_value(numerical_value_).value;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Q>
|
template<typename Q_, QuantityLike Q = std::remove_cvref_t<Q_>>
|
||||||
requires QuantityLike<std::remove_cvref_t<Q>>
|
requires detail::QuantityConvertibleTo<
|
||||||
|
quantity, quantity<quantity_like_traits<Q>::reference, typename quantity_like_traits<Q>::rep>>
|
||||||
[[nodiscard]] explicit(is_specialization_of<decltype(quantity_like_traits<Q>::from_numerical_value(numerical_value_)),
|
[[nodiscard]] explicit(is_specialization_of<decltype(quantity_like_traits<Q>::from_numerical_value(numerical_value_)),
|
||||||
convert_explicitly>) constexpr
|
convert_explicitly> ||
|
||||||
operator Q() && noexcept(noexcept(quantity_like_traits<Q>::from_numerical_value(numerical_value_)) &&
|
!std::convertible_to<Rep, typename Q::rep>) constexpr
|
||||||
|
operator Q_() && noexcept(noexcept(quantity_like_traits<Q>::from_numerical_value(numerical_value_)) &&
|
||||||
std::is_nothrow_move_constructible_v<rep>)
|
std::is_nothrow_move_constructible_v<rep>)
|
||||||
{
|
{
|
||||||
return quantity_like_traits<Q>::from_numerical_value(std::move(numerical_value_)).value;
|
return quantity_like_traits<Q>::from_numerical_value(std::move(numerical_value_)).value;
|
||||||
|
@@ -129,7 +129,10 @@ public:
|
|||||||
quantity<quantity_point_like_traits<QP>::reference, typename quantity_point_like_traits<QP>::rep>,
|
quantity<quantity_point_like_traits<QP>::reference, typename quantity_point_like_traits<QP>::rep>,
|
||||||
quantity_type>
|
quantity_type>
|
||||||
constexpr explicit(
|
constexpr explicit(
|
||||||
is_specialization_of<decltype(quantity_point_like_traits<QP>::to_quantity(std::declval<QP>())), convert_explicitly>)
|
is_specialization_of<decltype(quantity_point_like_traits<QP>::to_quantity(std::declval<QP>())),
|
||||||
|
convert_explicitly> ||
|
||||||
|
!std::convertible_to<
|
||||||
|
quantity<quantity_point_like_traits<QP>::reference, typename quantity_point_like_traits<QP>::rep>, quantity_type>)
|
||||||
quantity_point(const QP& qp) :
|
quantity_point(const QP& qp) :
|
||||||
quantity_from_origin_(quantity_point_like_traits<QP>::to_quantity(qp).value)
|
quantity_from_origin_(quantity_point_like_traits<QP>::to_quantity(qp).value)
|
||||||
{
|
{
|
||||||
@@ -186,23 +189,33 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// conversion operators
|
// conversion operators
|
||||||
template<typename QP>
|
template<typename QP_, QuantityPointLike QP = std::remove_cvref_t<QP_>>
|
||||||
requires QuantityPointLike<std::remove_cvref_t<QP>>
|
requires std::same_as<std::remove_const_t<decltype(point_origin)>,
|
||||||
|
std::remove_const_t<decltype(quantity_point_like_traits<QP>::point_origin)>> &&
|
||||||
|
std::convertible_to<quantity_type, quantity<quantity_point_like_traits<QP>::reference,
|
||||||
|
typename quantity_point_like_traits<QP>::rep>>
|
||||||
[[nodiscard]] explicit(
|
[[nodiscard]] explicit(
|
||||||
is_specialization_of<decltype(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)),
|
is_specialization_of<decltype(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)),
|
||||||
convert_explicitly>) constexpr
|
convert_explicitly> ||
|
||||||
operator QP() const& noexcept(noexcept(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)) &&
|
!std::convertible_to<quantity_type, quantity<quantity_point_like_traits<QP>::reference,
|
||||||
|
typename quantity_point_like_traits<QP>::rep>>) constexpr
|
||||||
|
operator QP_() const& noexcept(noexcept(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)) &&
|
||||||
std::is_nothrow_copy_constructible_v<rep>)
|
std::is_nothrow_copy_constructible_v<rep>)
|
||||||
{
|
{
|
||||||
return quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_).value;
|
return quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_).value;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename QP>
|
template<typename QP_, QuantityPointLike QP = std::remove_cvref_t<QP_>>
|
||||||
requires QuantityPointLike<std::remove_cvref_t<QP>>
|
requires std::same_as<std::remove_const_t<decltype(point_origin)>,
|
||||||
|
std::remove_const_t<decltype(quantity_point_like_traits<QP>::point_origin)>> &&
|
||||||
|
std::convertible_to<quantity_type, quantity<quantity_point_like_traits<QP>::reference,
|
||||||
|
typename quantity_point_like_traits<QP>::rep>>
|
||||||
[[nodiscard]] explicit(
|
[[nodiscard]] explicit(
|
||||||
is_specialization_of<decltype(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)),
|
is_specialization_of<decltype(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)),
|
||||||
convert_explicitly>) constexpr
|
convert_explicitly> ||
|
||||||
operator QP() && noexcept(noexcept(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)) &&
|
!std::convertible_to<quantity_type, quantity<quantity_point_like_traits<QP>::reference,
|
||||||
|
typename quantity_point_like_traits<QP>::rep>>) constexpr
|
||||||
|
operator QP_() && noexcept(noexcept(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)) &&
|
||||||
std::is_nothrow_move_constructible_v<rep>)
|
std::is_nothrow_move_constructible_v<rep>)
|
||||||
{
|
{
|
||||||
return quantity_point_like_traits<QP>::from_quantity(std::move(quantity_from_origin_)).value;
|
return quantity_point_like_traits<QP>::from_quantity(std::move(quantity_from_origin_)).value;
|
||||||
|
Reference in New Issue
Block a user