refactor: QuantityLike now requires value to exactly return rep

This commit is contained in:
Mateusz Pusz
2023-08-23 20:00:32 +02:00
parent a9204e2473
commit 14c1f34664
3 changed files with 7 additions and 7 deletions

View File

@@ -32,6 +32,10 @@ namespace mp_units {
template<Reference auto R, RepresentationOf<get_quantity_spec(R).character> Rep>
class quantity;
template<Reference auto R, typename Rep>
requires quantity<R, std::remove_cvref_t<Rep>>::_rep_safe_constructible_
[[nodiscard]] constexpr quantity<R, std::remove_cvref_t<Rep>> make_quantity(Rep&& v);
namespace detail {
template<auto R, typename Rep>
@@ -74,8 +78,8 @@ concept QuantityLike = requires(T q) {
requires RepresentationOf<typename quantity_like_traits<T>::rep,
get_quantity_spec(quantity_like_traits<T>::reference).character>;
{
quantity_like_traits<T>::value(q)
} -> std::convertible_to<typename quantity_like_traits<T>::rep>;
make_quantity<quantity_like_traits<T>::reference>(quantity_like_traits<T>::value(q))
} -> std::same_as<quantity<quantity_like_traits<T>::reference, typename quantity_like_traits<T>::rep>>;
};
} // namespace mp_units

View File

@@ -29,10 +29,6 @@
namespace mp_units {
template<Reference auto R, typename Rep>
requires quantity<R, std::remove_cvref_t<Rep>>::_rep_safe_constructible_
[[nodiscard]] constexpr quantity<R, std::remove_cvref_t<Rep>> make_quantity(Rep&& v);
[[nodiscard]] consteval QuantitySpec auto get_quantity_spec(AssociatedUnit auto u)
{
return detail::get_associated_quantity(u);

View File

@@ -80,7 +80,7 @@ struct quantity_point_like_traits<std::chrono::time_point<C, std::chrono::durati
static constexpr auto reference = detail::time_unit_from_chrono_period<Period>();
static constexpr auto point_origin = chrono_point_origin<C>;
using rep = Rep;
[[nodiscard]] static constexpr auto quantity_from_origin(
[[nodiscard]] static constexpr quantity<reference, rep> quantity_from_origin(
const std::chrono::time_point<C, std::chrono::duration<Rep, Period>>& qp)
{
return quantity{qp.time_since_epoch()};