mirror of
https://github.com/mpusz/mp-units.git
synced 2025-08-03 12:24:26 +02:00
feat: QuantityLike
and QuantityPointLike
conversions improved
This commit is contained in:
@@ -133,9 +133,9 @@ public:
|
||||
template<QuantityLike Q>
|
||||
requires detail::QuantityConvertibleTo<
|
||||
quantity<quantity_like_traits<Q>::reference, typename quantity_like_traits<Q>::rep>, quantity>
|
||||
constexpr explicit(
|
||||
is_specialization_of<decltype(quantity_like_traits<Q>::to_numerical_value(std::declval<Q>())), convert_explicitly>)
|
||||
quantity(const Q& q) :
|
||||
constexpr explicit(is_specialization_of<decltype(quantity_like_traits<Q>::to_numerical_value(std::declval<Q>())),
|
||||
convert_explicitly> ||
|
||||
!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))
|
||||
{
|
||||
}
|
||||
@@ -192,22 +192,26 @@ public:
|
||||
}
|
||||
|
||||
// conversion operators
|
||||
template<typename Q>
|
||||
requires QuantityLike<std::remove_cvref_t<Q>>
|
||||
template<typename Q_, QuantityLike Q = 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_)),
|
||||
convert_explicitly>) constexpr
|
||||
operator Q() const& noexcept(noexcept(quantity_like_traits<Q>::from_numerical_value(numerical_value_)) &&
|
||||
std::is_nothrow_copy_constructible_v<rep>)
|
||||
convert_explicitly> ||
|
||||
!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>)
|
||||
{
|
||||
return quantity_like_traits<Q>::from_numerical_value(numerical_value_).value;
|
||||
}
|
||||
|
||||
template<typename Q>
|
||||
requires QuantityLike<std::remove_cvref_t<Q>>
|
||||
template<typename Q_, QuantityLike Q = 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_)),
|
||||
convert_explicitly>) constexpr
|
||||
operator Q() && noexcept(noexcept(quantity_like_traits<Q>::from_numerical_value(numerical_value_)) &&
|
||||
std::is_nothrow_move_constructible_v<rep>)
|
||||
convert_explicitly> ||
|
||||
!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>)
|
||||
{
|
||||
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_type>
|
||||
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_from_origin_(quantity_point_like_traits<QP>::to_quantity(qp).value)
|
||||
{
|
||||
@@ -186,24 +189,34 @@ public:
|
||||
}
|
||||
|
||||
// conversion operators
|
||||
template<typename QP>
|
||||
requires QuantityPointLike<std::remove_cvref_t<QP>>
|
||||
template<typename QP_, QuantityPointLike QP = 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(
|
||||
is_specialization_of<decltype(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)),
|
||||
convert_explicitly>) constexpr
|
||||
operator QP() const& noexcept(noexcept(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)) &&
|
||||
std::is_nothrow_copy_constructible_v<rep>)
|
||||
convert_explicitly> ||
|
||||
!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>)
|
||||
{
|
||||
return quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_).value;
|
||||
}
|
||||
|
||||
template<typename QP>
|
||||
requires QuantityPointLike<std::remove_cvref_t<QP>>
|
||||
template<typename QP_, QuantityPointLike QP = 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(
|
||||
is_specialization_of<decltype(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)),
|
||||
convert_explicitly>) constexpr
|
||||
operator QP() && noexcept(noexcept(quantity_point_like_traits<QP>::from_quantity(quantity_from_origin_)) &&
|
||||
std::is_nothrow_move_constructible_v<rep>)
|
||||
convert_explicitly> ||
|
||||
!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>)
|
||||
{
|
||||
return quantity_point_like_traits<QP>::from_quantity(std::move(quantity_from_origin_)).value;
|
||||
}
|
||||
|
Reference in New Issue
Block a user