mirror of
https://github.com/mpusz/mp-units.git
synced 2025-07-30 18:37:15 +02:00
refactor: most std::remove_const_t
removed and some replaced with the GCC-specific workaround
This commit is contained in:
@ -363,7 +363,7 @@ Example 1 (clang):
|
||||
61 | concept QuantityOf = Quantity<Q> && QuantitySpecOf<std::remove_const_t<decltype(Q::quantity_spec)>, QS>;
|
||||
| ^
|
||||
note: because 'implicitly_convertible(kind_of_<derived_quantity_spec<isq::time, per<isq::length> > >{}, struct speed{{{}}})' evaluated to false
|
||||
147 | QuantitySpec<T> && QuantitySpec<std::remove_const_t<decltype(QS)>> && implicitly_convertible(T{}, QS) &&
|
||||
147 | QuantitySpec<T> && QuantitySpec<decltype(QS)> && implicitly_convertible(T{}, QS) &&
|
||||
| ^
|
||||
1 error generated.
|
||||
Compiler returned: 1
|
||||
@ -386,7 +386,7 @@ Example 1 (clang):
|
||||
61 | concept QuantityOf = Quantity<Q> && QuantitySpecOf<std::remove_const_t<decltype(Q::quantity_spec)>, QS>;
|
||||
| ^
|
||||
note: because 'implicitly_convertible(kind_of_<derived_quantity_spec<isq::time, per<isq::length> >{{}, {{}}}>{}, struct speed{{{}}})' evaluated to false
|
||||
147 | QuantitySpec<T> && QuantitySpec<std::remove_const_t<decltype(QS)>> && implicitly_convertible(T{}, QS) &&
|
||||
147 | QuantitySpec<T> && QuantitySpec<decltype(QS)> && implicitly_convertible(T{}, QS) &&
|
||||
| ^
|
||||
1 error generated.
|
||||
Compiler returned: 1
|
||||
|
@ -59,7 +59,7 @@ template<AssociatedUnit U>
|
||||
[[nodiscard]] consteval auto get_associated_quantity_impl(U u);
|
||||
|
||||
template<AssociatedUnit U>
|
||||
using to_quantity_spec = std::remove_const_t<decltype(get_associated_quantity_impl(U{}))>;
|
||||
using to_quantity_spec = decltype(get_associated_quantity_impl(U{}));
|
||||
|
||||
template<AssociatedUnit U>
|
||||
[[nodiscard]] consteval auto get_associated_quantity_impl(U u)
|
||||
|
@ -87,6 +87,13 @@
|
||||
|
||||
#endif
|
||||
|
||||
#if MP_UNITS_COMP_GCC
|
||||
|
||||
#define MP_UNITS_REMOVE_CONST(expr) std::remove_const_t<expr>
|
||||
|
||||
#else
|
||||
|
||||
#define MP_UNITS_REMOVE_CONST(expr) expr
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -136,7 +136,7 @@ concept one_of = (false || ... || std::same_as<T, Ts>);
|
||||
template<typename T, auto... Vs>
|
||||
[[nodiscard]] consteval bool contains()
|
||||
{
|
||||
return (false || ... || is_same_v<std::remove_const_t<decltype(Vs)>, T>);
|
||||
return (false || ... || is_same_v<decltype(Vs), T>);
|
||||
}
|
||||
|
||||
template<template<typename...> typename T, typename... Ts>
|
||||
@ -160,7 +160,7 @@ template<typename T, std::same_as<T> auto V>
|
||||
template<typename T, auto V1, auto V2, auto... Vs>
|
||||
[[nodiscard]] consteval auto get()
|
||||
{
|
||||
if constexpr (is_same_v<T, std::remove_const_t<decltype(V1)>>)
|
||||
if constexpr (is_same_v<T, decltype(V1)>)
|
||||
return V1;
|
||||
else
|
||||
return get<T, V2, Vs...>();
|
||||
|
@ -109,6 +109,6 @@ concept Dimension = detail::BaseDimension<T> || detail::DerivedDimension<T>;
|
||||
* Satisfied when both argument satisfy a `Dimension` concept and when they compare equal.
|
||||
*/
|
||||
MP_UNITS_EXPORT template<typename T, auto D>
|
||||
concept DimensionOf = Dimension<T> && Dimension<std::remove_const_t<decltype(D)>> && (T{} == D);
|
||||
concept DimensionOf = Dimension<T> && Dimension<MP_UNITS_REMOVE_CONST(decltype(D))> && (T{} == D);
|
||||
|
||||
} // namespace mp_units
|
||||
|
@ -534,8 +534,8 @@ template<template<typename> typename Proj, template<typename...> typename To, ty
|
||||
expr_type_projectable<Proj>... Dens>
|
||||
[[nodiscard]] consteval auto expr_map_impl(type_list<Nums...>, type_list<Dens...>)
|
||||
{
|
||||
return (OneType{} * ... * map_power(typename expr_type_map<std::remove_const_t<Nums>, Proj>::type{})) /
|
||||
(OneType{} * ... * map_power(typename expr_type_map<std::remove_const_t<Dens>, Proj>::type{}));
|
||||
return (OneType{} * ... * map_power(typename expr_type_map<Nums, Proj>::type{})) /
|
||||
(OneType{} * ... * map_power(typename expr_type_map<Dens, Proj>::type{}));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -140,8 +140,7 @@ public:
|
||||
|
||||
template<typename Value>
|
||||
requires std::same_as<std::remove_cvref_t<Value>, Rep>
|
||||
constexpr quantity(Value&& v, std::remove_const_t<decltype(R)>) :
|
||||
numerical_value_is_an_implementation_detail_(std::forward<Value>(v))
|
||||
constexpr quantity(Value&& v, decltype(R)) : numerical_value_is_an_implementation_detail_(std::forward<Value>(v))
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -169,8 +169,7 @@ public:
|
||||
|
||||
template<typename Q>
|
||||
requires QuantityOf<std::remove_cvref_t<Q>, get_quantity_spec(R)> && std::constructible_from<quantity_type, Q>
|
||||
constexpr quantity_point(Q&& q, std::remove_const_t<decltype(PO)>) :
|
||||
quantity_from_origin_is_an_implementation_detail_(std::forward<Q>(q))
|
||||
constexpr quantity_point(Q&& q, decltype(PO)) : quantity_from_origin_is_an_implementation_detail_(std::forward<Q>(q))
|
||||
{
|
||||
}
|
||||
|
||||
@ -187,7 +186,6 @@ public:
|
||||
|
||||
template<QuantityPointOf<absolute_point_origin> QP>
|
||||
requires std::constructible_from<quantity_type, typename QP::quantity_type>
|
||||
// TODO add perfect forwarding
|
||||
// NOLINTNEXTLINE(google-explicit-constructor, hicpp-explicit-conversions)
|
||||
constexpr explicit(!std::convertible_to<typename QP::quantity_type, quantity_type>) quantity_point(const QP& qp) :
|
||||
quantity_from_origin_is_an_implementation_detail_([&] {
|
||||
@ -222,7 +220,7 @@ public:
|
||||
[[nodiscard]] constexpr MP_UNITS_CONSTRAINED_AUTO_WORKAROUND(QuantityPointOf<NewPO{}>) auto point_for(
|
||||
NewPO new_origin) const
|
||||
{
|
||||
if constexpr (is_same_v<NewPO, std::remove_const_t<decltype(point_origin)>>)
|
||||
if constexpr (is_same_v<NewPO, decltype(PO)>)
|
||||
return *this;
|
||||
else
|
||||
return ::mp_units::quantity_point{*this - new_origin, new_origin};
|
||||
@ -388,7 +386,7 @@ explicit(
|
||||
|
||||
template<auto R1, auto PO1, typename Rep1, auto R2, typename Rep2>
|
||||
// TODO simplify when gcc catches up
|
||||
requires ReferenceOf<std::remove_const_t<decltype(R2)>, PO1.quantity_spec>
|
||||
requires ReferenceOf<decltype(R2), PO1.quantity_spec>
|
||||
[[nodiscard]] constexpr QuantityPoint auto operator+(const quantity_point<R1, PO1, Rep1>& qp,
|
||||
const quantity<R2, Rep2>& q)
|
||||
requires requires { qp.quantity_ref_from(PO1) + q; }
|
||||
@ -401,7 +399,7 @@ template<auto R1, auto PO1, typename Rep1, auto R2, typename Rep2>
|
||||
|
||||
template<auto R1, typename Rep1, auto R2, auto PO2, typename Rep2>
|
||||
// TODO simplify when gcc catches up
|
||||
requires ReferenceOf<std::remove_const_t<decltype(R1)>, PO2.quantity_spec>
|
||||
requires ReferenceOf<decltype(R1), PO2.quantity_spec>
|
||||
[[nodiscard]] constexpr QuantityPoint auto operator+(const quantity<R1, Rep1>& q,
|
||||
const quantity_point<R2, PO2, Rep2>& qp)
|
||||
requires requires { q + qp.quantity_ref_from(PO2); }
|
||||
@ -425,7 +423,7 @@ template<Quantity Q, PointOrigin PO>
|
||||
|
||||
template<auto R1, auto PO1, typename Rep1, auto R2, typename Rep2>
|
||||
// TODO simplify when gcc catches up
|
||||
requires ReferenceOf<std::remove_const_t<decltype(R2)>, PO1.quantity_spec>
|
||||
requires ReferenceOf<decltype(R2), PO1.quantity_spec>
|
||||
[[nodiscard]] constexpr QuantityPoint auto operator-(const quantity_point<R1, PO1, Rep1>& qp,
|
||||
const quantity<R2, Rep2>& q)
|
||||
requires requires { qp.quantity_ref_from(PO1) - q; }
|
||||
|
@ -105,7 +105,7 @@ concept PointOrigin = detail::AbsolutePointOrigin<T> || detail::RelativePointOri
|
||||
* Satisfied by all quantity point origins that are defined using a provided quantity specification.
|
||||
*/
|
||||
MP_UNITS_EXPORT template<typename T, auto QS>
|
||||
concept PointOriginFor = PointOrigin<T> && QuantitySpecOf<std::remove_const_t<decltype(QS)>, T::quantity_spec>;
|
||||
concept PointOriginFor = PointOrigin<T> && QuantitySpecOf<MP_UNITS_REMOVE_CONST(decltype(QS)), T::quantity_spec>;
|
||||
|
||||
MP_UNITS_EXPORT template<Reference auto R, PointOriginFor<get_quantity_spec(R)> auto PO,
|
||||
RepresentationOf<get_quantity_spec(R).character> Rep>
|
||||
@ -141,7 +141,7 @@ template<PointOrigin PO1, PointOrigin PO2>
|
||||
|
||||
template<typename T, auto V>
|
||||
concept SameAbsolutePointOriginAs =
|
||||
PointOrigin<T> && PointOrigin<std::remove_const_t<decltype(V)>> && same_absolute_point_origins(T{}, V);
|
||||
PointOrigin<T> && PointOrigin<MP_UNITS_REMOVE_CONST(decltype(V))> && same_absolute_point_origins(T{}, V);
|
||||
|
||||
} // namespace detail
|
||||
|
||||
|
@ -218,11 +218,11 @@ MP_UNITS_EXPORT_END
|
||||
*/
|
||||
#ifdef MP_UNITS_API_NO_CRTP
|
||||
template<detail::BaseDimension auto Dim, one_of<quantity_character> auto... Args>
|
||||
requires(... && !QuantitySpec<std::remove_const_t<decltype(Args)>>)
|
||||
requires(... && !QuantitySpec<decltype(Args)>)
|
||||
struct quantity_spec<Dim, Args...> : detail::quantity_spec_interface {
|
||||
#else
|
||||
template<typename Self, detail::BaseDimension auto Dim, one_of<quantity_character> auto... Args>
|
||||
requires(... && !QuantitySpec<std::remove_const_t<decltype(Args)>>)
|
||||
requires(... && !QuantitySpec<decltype(Args)>)
|
||||
struct quantity_spec<Self, Dim, Args...> : detail::quantity_spec_interface<Self> {
|
||||
#endif
|
||||
static constexpr detail::BaseDimension auto dimension = Dim;
|
||||
@ -261,11 +261,11 @@ struct quantity_spec<Self, Dim, Args...> : detail::quantity_spec_interface<Self>
|
||||
*/
|
||||
#ifdef MP_UNITS_API_NO_CRTP
|
||||
template<detail::IntermediateDerivedQuantitySpec auto Eq, one_of<quantity_character> auto... Args>
|
||||
requires(... && !QuantitySpec<std::remove_const_t<decltype(Args)>>)
|
||||
requires(... && !QuantitySpec<decltype(Args)>)
|
||||
struct quantity_spec<Eq, Args...> : detail::quantity_spec_interface {
|
||||
#else
|
||||
template<typename Self, detail::IntermediateDerivedQuantitySpec auto Eq, one_of<quantity_character> auto... Args>
|
||||
requires(... && !QuantitySpec<std::remove_const_t<decltype(Args)>>)
|
||||
requires(... && !QuantitySpec<decltype(Args)>)
|
||||
struct quantity_spec<Self, Eq, Args...> : detail::quantity_spec_interface<Self> {
|
||||
#endif
|
||||
static constexpr auto _equation_ = Eq;
|
||||
@ -302,12 +302,12 @@ struct quantity_spec<Self, Eq, Args...> : detail::quantity_spec_interface<Self>
|
||||
*/
|
||||
#ifdef MP_UNITS_API_NO_CRTP
|
||||
template<detail::NamedQuantitySpec auto QS, one_of<quantity_character, struct is_kind> auto... Args>
|
||||
requires(... && !QuantitySpec<std::remove_const_t<decltype(Args)>>)
|
||||
struct quantity_spec<QS, Args...> : std::remove_const_t<decltype(QS)> {
|
||||
requires(... && !QuantitySpec<decltype(Args)>)
|
||||
struct quantity_spec<QS, Args...> : decltype(QS) {
|
||||
#else
|
||||
template<typename Self, detail::NamedQuantitySpec auto QS, one_of<quantity_character, struct is_kind> auto... Args>
|
||||
requires(... && !QuantitySpec<std::remove_const_t<decltype(Args)>>)
|
||||
struct quantity_spec<Self, QS, Args...> : std::remove_const_t<decltype(QS)> {
|
||||
requires(... && !QuantitySpec<decltype(Args)>)
|
||||
struct quantity_spec<Self, QS, Args...> : decltype(QS) {
|
||||
#endif
|
||||
static constexpr auto _parent_ = QS;
|
||||
static constexpr quantity_character character = detail::quantity_character_init<Args...>(QS.character);
|
||||
@ -361,16 +361,16 @@ struct quantity_spec<Self, QS, Args...> : std::remove_const_t<decltype(QS)> {
|
||||
#ifdef MP_UNITS_API_NO_CRTP
|
||||
template<detail::NamedQuantitySpec auto QS, detail::IntermediateDerivedQuantitySpec auto Eq,
|
||||
one_of<quantity_character, struct is_kind> auto... Args>
|
||||
requires(!requires { QS._equation_; } ||
|
||||
(requires { QS._equation_; } && (explicitly_convertible(Eq, QS._equation_)))) &&
|
||||
(... && !QuantitySpec<std::remove_const_t<decltype(Args)>>)
|
||||
requires(!requires { QS._equation_; } || (requires {
|
||||
QS._equation_;
|
||||
} && (explicitly_convertible(Eq, QS._equation_)))) && (... && !QuantitySpec<decltype(Args)>)
|
||||
struct quantity_spec<QS, Eq, Args...> : quantity_spec<QS, Args...> {
|
||||
#else
|
||||
template<typename Self, detail::NamedQuantitySpec auto QS, detail::IntermediateDerivedQuantitySpec auto Eq,
|
||||
one_of<quantity_character, struct is_kind> auto... Args>
|
||||
requires(!requires { QS._equation_; } ||
|
||||
(requires { QS._equation_; } && (explicitly_convertible(Eq, QS._equation_)))) &&
|
||||
(... && !QuantitySpec<std::remove_const_t<decltype(Args)>>)
|
||||
requires(!requires { QS._equation_; } || (requires {
|
||||
QS._equation_;
|
||||
} && (explicitly_convertible(Eq, QS._equation_)))) && (... && !QuantitySpec<decltype(Args)>)
|
||||
struct quantity_spec<Self, QS, Eq, Args...> : quantity_spec<Self, QS, Args...> {
|
||||
#endif
|
||||
static constexpr auto _equation_ = Eq;
|
||||
@ -483,7 +483,7 @@ struct kind_of_<Q> : quantity_spec<kind_of_<Q>, Q{}> {
|
||||
|
||||
MP_UNITS_EXPORT template<detail::QuantitySpecWithNoSpecifiers auto Q>
|
||||
requires(detail::get_kind_tree_root(Q) == Q)
|
||||
inline constexpr kind_of_<std::remove_const_t<decltype(Q)>> kind_of;
|
||||
inline constexpr kind_of_<decltype(Q)> kind_of;
|
||||
|
||||
namespace detail {
|
||||
|
||||
@ -493,7 +493,7 @@ struct is_dimensionless<struct dimensionless> : std::true_type {};
|
||||
template<QuantitySpec auto... From, QuantitySpec Q>
|
||||
[[nodiscard]] consteval QuantitySpec auto clone_kind_of(Q q)
|
||||
{
|
||||
if constexpr ((... && QuantityKindSpec<std::remove_const_t<decltype(From)>>))
|
||||
if constexpr ((... && QuantityKindSpec<decltype(From)>))
|
||||
return kind_of<Q{}>;
|
||||
else
|
||||
return q;
|
||||
@ -566,11 +566,9 @@ template<std::intmax_t Num, std::intmax_t Den = 1, QuantitySpec Q>
|
||||
detail::expr_pow<Num, Den, derived_quantity_spec, struct dimensionless, detail::type_list_of_quantity_spec_less>(
|
||||
detail::remove_kind(q)));
|
||||
else if constexpr (Den == 1)
|
||||
return detail::clone_kind_of<Q{}>(
|
||||
derived_quantity_spec<power<std::remove_const_t<decltype(detail::remove_kind(Q{}))>, Num>>{});
|
||||
return detail::clone_kind_of<Q{}>(derived_quantity_spec<power<decltype(detail::remove_kind(Q{})), Num>>{});
|
||||
else
|
||||
return detail::clone_kind_of<Q{}>(
|
||||
derived_quantity_spec<power<std::remove_const_t<decltype(detail::remove_kind(Q{}))>, Num, Den>>{});
|
||||
return detail::clone_kind_of<Q{}>(derived_quantity_spec<power<decltype(detail::remove_kind(Q{})), Num, Den>>{});
|
||||
}
|
||||
|
||||
|
||||
@ -1398,7 +1396,7 @@ template<QuantitySpec From, QuantitySpec To>
|
||||
return are_ingredients_convertible(from, to);
|
||||
} else if constexpr (IntermediateDerivedQuantitySpec<From>) {
|
||||
auto res = explode<get_complexity(to)>(from);
|
||||
if constexpr (NamedQuantitySpec<std::remove_const_t<decltype(res.quantity)>>)
|
||||
if constexpr (NamedQuantitySpec<decltype(res.quantity)>)
|
||||
return convertible_impl(res.quantity, to);
|
||||
else if constexpr (requires { to._equation_; }) {
|
||||
auto eq = explode_to_equation(to);
|
||||
@ -1407,7 +1405,7 @@ template<QuantitySpec From, QuantitySpec To>
|
||||
return are_ingredients_convertible(from, to);
|
||||
} else if constexpr (IntermediateDerivedQuantitySpec<To>) {
|
||||
auto res = explode<get_complexity(from)>(to);
|
||||
if constexpr (NamedQuantitySpec<std::remove_const_t<decltype(res.quantity)>>)
|
||||
if constexpr (NamedQuantitySpec<decltype(res.quantity)>)
|
||||
return min(res.result, convertible_impl(from, res.quantity));
|
||||
else if constexpr (requires { from._equation_; })
|
||||
return min(res.result, convertible_impl(from._equation_, res.quantity));
|
||||
@ -1452,7 +1450,7 @@ namespace detail {
|
||||
|
||||
template<QuantitySpec Q>
|
||||
requires requires(Q q) { get_kind_tree_root(q); }
|
||||
using to_kind = std::remove_const_t<decltype(get_kind_tree_root(Q{}))>;
|
||||
using to_kind = decltype(get_kind_tree_root(Q{}));
|
||||
|
||||
#ifdef MP_UNITS_API_NO_CRTP
|
||||
template<NamedQuantitySpec auto QS, auto... Args>
|
||||
@ -1509,8 +1507,8 @@ template<QuantitySpec Q1, QuantitySpec Q2>
|
||||
requires(implicitly_convertible(get_kind_tree_root(q1), get_kind_tree_root(q2)) ||
|
||||
implicitly_convertible(get_kind_tree_root(q2), get_kind_tree_root(q1)))
|
||||
{
|
||||
using QQ1 = std::remove_const_t<decltype(detail::remove_kind(q1))>;
|
||||
using QQ2 = std::remove_const_t<decltype(detail::remove_kind(q2))>;
|
||||
using QQ1 = decltype(detail::remove_kind(q1));
|
||||
using QQ2 = decltype(detail::remove_kind(q2));
|
||||
|
||||
// NOLINTBEGIN(bugprone-branch-clone)
|
||||
if constexpr (is_same_v<Q1, Q2>)
|
||||
|
@ -140,7 +140,7 @@ namespace detail {
|
||||
|
||||
template<auto To, auto From>
|
||||
concept NestedQuantityKindSpecOf =
|
||||
QuantitySpec<std::remove_const_t<decltype(From)>> && QuantitySpec<std::remove_const_t<decltype(To)>> &&
|
||||
QuantitySpec<decltype(From)> && QuantitySpec<decltype(To)> &&
|
||||
get_kind(From) != get_kind(To) &&
|
||||
std::derived_from<std::remove_cvref_t<decltype(To)>, std::remove_cvref_t<decltype(get_kind(From)._quantity_spec_)>>;
|
||||
|
||||
@ -148,7 +148,7 @@ concept NestedQuantityKindSpecOf =
|
||||
|
||||
MP_UNITS_EXPORT template<typename T, auto QS>
|
||||
concept QuantitySpecOf =
|
||||
QuantitySpec<T> && QuantitySpec<std::remove_const_t<decltype(QS)>> && implicitly_convertible(T{}, QS) &&
|
||||
QuantitySpec<T> && QuantitySpec<MP_UNITS_REMOVE_CONST(decltype(QS))> && implicitly_convertible(T{}, QS) &&
|
||||
// the below is to make the following work
|
||||
// static_assert(ReferenceOf<si::radian, isq::angular_measure>);
|
||||
// static_assert(!ReferenceOf<si::radian, dimensionless>);
|
||||
|
@ -38,7 +38,7 @@ namespace mp_units {
|
||||
namespace detail {
|
||||
|
||||
template<QuantitySpec auto Q, Unit auto U>
|
||||
using reference_t = reference<std::remove_const_t<decltype(Q)>, std::remove_const_t<decltype(U)>>;
|
||||
using reference_t = reference<decltype(Q), decltype(U)>;
|
||||
|
||||
}
|
||||
|
||||
@ -258,13 +258,13 @@ MP_UNITS_EXPORT_END
|
||||
namespace detail {
|
||||
|
||||
template<AssociatedUnit auto To, AssociatedUnit From>
|
||||
[[nodiscard]] consteval std::remove_const_t<decltype(To)> clone_reference_with(From)
|
||||
[[nodiscard]] consteval decltype(To) clone_reference_with(From)
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
template<Unit auto To, QuantitySpec QS, Unit U>
|
||||
[[nodiscard]] consteval reference<QS, std::remove_const_t<decltype(To)>> clone_reference_with(reference<QS, U>)
|
||||
[[nodiscard]] consteval reference<QS, decltype(To)> clone_reference_with(reference<QS, U>)
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
@ -76,7 +76,7 @@ template<typename Q, typename U>
|
||||
* the provided quantity_spec type.
|
||||
*/
|
||||
template<typename T, auto QS>
|
||||
concept ReferenceOf = Reference<T> && QuantitySpecOf<std::remove_const_t<decltype(get_quantity_spec(T{}))>, QS>;
|
||||
concept ReferenceOf = Reference<T> && QuantitySpecOf<decltype(get_quantity_spec(T{})), QS>;
|
||||
|
||||
MP_UNITS_EXPORT_END
|
||||
|
||||
|
@ -60,7 +60,7 @@ namespace mp_units {
|
||||
* @tparam CoU coherent unit for a quantity in this system
|
||||
*/
|
||||
template<QuantitySpec auto Q, Unit auto CoU>
|
||||
requires(!AssociatedUnit<std::remove_const_t<decltype(CoU)>>) || (CoU == one)
|
||||
requires(!AssociatedUnit<decltype(CoU)>) || (CoU == one)
|
||||
struct system_reference {
|
||||
static constexpr auto quantity_spec = Q;
|
||||
static constexpr auto coherent_unit = CoU;
|
||||
@ -68,9 +68,9 @@ struct system_reference {
|
||||
template<Unit U>
|
||||
requires(convertible(coherent_unit, U{}))
|
||||
#if MP_UNITS_COMP_MSVC
|
||||
[[nodiscard]] constexpr decltype(reference<std::remove_const_t<decltype(quantity_spec)>, U>{}) operator[](U) const
|
||||
[[nodiscard]] constexpr decltype(reference<decltype(Q), U>{}) operator[](U) const
|
||||
#else
|
||||
[[nodiscard]] constexpr reference<std::remove_const_t<decltype(quantity_spec)>, U> operator[](U) const
|
||||
[[nodiscard]] constexpr reference<decltype(Q), U> operator[](U) const
|
||||
#endif
|
||||
{
|
||||
return {};
|
||||
|
@ -175,13 +175,13 @@ struct named_unit<Symbol> {
|
||||
*/
|
||||
template<symbol_text Symbol, Unit auto U>
|
||||
requires(!Symbol.empty())
|
||||
struct named_unit<Symbol, U> : std::remove_const_t<decltype(U)> {
|
||||
struct named_unit<Symbol, U> : decltype(U) {
|
||||
static constexpr auto symbol = Symbol; ///< Unique unit identifier
|
||||
};
|
||||
|
||||
template<symbol_text Symbol, Unit auto U, PointOrigin auto PO>
|
||||
requires(!Symbol.empty())
|
||||
struct named_unit<Symbol, U, PO> : std::remove_const_t<decltype(U)> {
|
||||
struct named_unit<Symbol, U, PO> : decltype(U) {
|
||||
static constexpr auto symbol = Symbol; ///< Unique unit identifier
|
||||
static constexpr auto point_origin = PO;
|
||||
};
|
||||
@ -197,14 +197,14 @@ struct named_unit<Symbol, U, PO> : std::remove_const_t<decltype(U)> {
|
||||
*/
|
||||
template<symbol_text Symbol, AssociatedUnit auto U, detail::QuantityKindSpec auto QS>
|
||||
requires(!Symbol.empty()) && (QS.dimension == detail::get_associated_quantity(U).dimension)
|
||||
struct named_unit<Symbol, U, QS> : std::remove_const_t<decltype(U)> {
|
||||
struct named_unit<Symbol, U, QS> : decltype(U) {
|
||||
static constexpr auto symbol = Symbol; ///< Unique unit identifier
|
||||
static constexpr auto quantity_spec = QS;
|
||||
};
|
||||
|
||||
template<symbol_text Symbol, AssociatedUnit auto U, detail::QuantityKindSpec auto QS, PointOrigin auto PO>
|
||||
requires(!Symbol.empty()) && (QS.dimension == detail::get_associated_quantity(U).dimension)
|
||||
struct named_unit<Symbol, U, QS, PO> : std::remove_const_t<decltype(U)> {
|
||||
struct named_unit<Symbol, U, QS, PO> : decltype(U) {
|
||||
static constexpr auto symbol = Symbol; ///< Unique unit identifier
|
||||
static constexpr auto quantity_spec = QS;
|
||||
static constexpr auto point_origin = PO;
|
||||
@ -234,7 +234,7 @@ struct named_unit<Symbol, U, QS, PO> : std::remove_const_t<decltype(U)> {
|
||||
*/
|
||||
MP_UNITS_EXPORT template<symbol_text Symbol, Magnitude auto M, PrefixableUnit auto U>
|
||||
requires(!Symbol.empty())
|
||||
struct prefixed_unit : std::remove_const_t<decltype(M * U)> {
|
||||
struct prefixed_unit : decltype(M * U) {
|
||||
static constexpr auto symbol = Symbol + U.symbol;
|
||||
};
|
||||
|
||||
@ -392,7 +392,7 @@ template<typename T, typename F, int Num, int... Den>
|
||||
return canonical_unit{pow<Num, Den...>(base.mag) * num.mag / den.mag, num.reference_unit / den.reference_unit};
|
||||
} else {
|
||||
return canonical_unit{pow<Num, Den...>(base.mag),
|
||||
derived_unit<power<std::remove_const_t<decltype(base.reference_unit)>, Num, Den...>>{}};
|
||||
derived_unit<power<decltype(base.reference_unit), Num, Den...>>{}};
|
||||
}
|
||||
}
|
||||
|
||||
@ -573,7 +573,7 @@ template<std::intmax_t Num, std::intmax_t Den = 1, Unit U>
|
||||
else if constexpr (detail::ratio{Num, Den} == 1)
|
||||
return u;
|
||||
else if constexpr (detail::is_specialization_of_scaled_unit<U>)
|
||||
return scaled_unit<pow<Num, Den>(U::mag), std::remove_const_t<decltype(pow<Num, Den>(U::reference_unit))>>{};
|
||||
return scaled_unit<pow<Num, Den>(U::mag), decltype(pow<Num, Den>(U::reference_unit))>{};
|
||||
else if constexpr (detail::is_specialization_of_derived_unit<U>)
|
||||
return detail::expr_pow<Num, Den, derived_unit, struct one, detail::type_list_of_unit_less>(u);
|
||||
else if constexpr (Den == 1)
|
||||
@ -659,7 +659,7 @@ template<Unit U1, Unit U2>
|
||||
return u1;
|
||||
else {
|
||||
constexpr auto cm = detail::common_magnitude(canonical_lhs.mag, canonical_rhs.mag);
|
||||
return scaled_unit<cm, std::remove_const_t<decltype(canonical_lhs.reference_unit)>>{};
|
||||
return scaled_unit<cm, decltype(canonical_lhs.reference_unit)>{};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -190,7 +190,7 @@ concept AssociatedUnit = Unit<U> && detail::has_associated_quantity(U{});
|
||||
*/
|
||||
MP_UNITS_EXPORT template<typename U, auto QS>
|
||||
concept UnitOf =
|
||||
AssociatedUnit<U> && QuantitySpec<std::remove_const_t<decltype(QS)>> &&
|
||||
AssociatedUnit<U> && QuantitySpec<MP_UNITS_REMOVE_CONST(decltype(QS))> &&
|
||||
implicitly_convertible(get_quantity_spec(U{}), QS) &&
|
||||
// the below is to make `dimensionless[radian]` invalid
|
||||
(get_kind(QS) == get_kind(get_quantity_spec(U{})) || !detail::NestedQuantityKindSpecOf<get_quantity_spec(U{}), QS>);
|
||||
@ -209,7 +209,7 @@ namespace detail {
|
||||
*/
|
||||
MP_UNITS_EXPORT template<typename U, auto U2, auto QS>
|
||||
concept UnitCompatibleWith =
|
||||
Unit<U> && Unit<std::remove_const_t<decltype(U2)>> && QuantitySpec<std::remove_const_t<decltype(QS)>> &&
|
||||
Unit<U> && Unit<MP_UNITS_REMOVE_CONST(decltype(U2))> && QuantitySpec<MP_UNITS_REMOVE_CONST(decltype(QS))> &&
|
||||
(!AssociatedUnit<U> || UnitOf<U, QS>)&&detail::have_same_canonical_reference_unit(U{}, U2);
|
||||
|
||||
|
||||
|
@ -42,14 +42,14 @@ template<PrefixableUnit U> struct yobi_ : prefixed_unit<"Yi", mag_power<2, 80>,
|
||||
|
||||
MP_UNITS_EXPORT_BEGIN
|
||||
|
||||
template<PrefixableUnit auto U> inline constexpr kibi_<std::remove_const_t<decltype(U)>> kibi;
|
||||
template<PrefixableUnit auto U> inline constexpr mebi_<std::remove_const_t<decltype(U)>> mebi;
|
||||
template<PrefixableUnit auto U> inline constexpr gibi_<std::remove_const_t<decltype(U)>> gibi;
|
||||
template<PrefixableUnit auto U> inline constexpr tebi_<std::remove_const_t<decltype(U)>> tebi;
|
||||
template<PrefixableUnit auto U> inline constexpr pebi_<std::remove_const_t<decltype(U)>> pebi;
|
||||
template<PrefixableUnit auto U> inline constexpr exbi_<std::remove_const_t<decltype(U)>> exbi;
|
||||
template<PrefixableUnit auto U> inline constexpr zebi_<std::remove_const_t<decltype(U)>> zebi;
|
||||
template<PrefixableUnit auto U> inline constexpr yobi_<std::remove_const_t<decltype(U)>> yobi;
|
||||
template<PrefixableUnit auto U> inline constexpr kibi_<decltype(U)> kibi;
|
||||
template<PrefixableUnit auto U> inline constexpr mebi_<decltype(U)> mebi;
|
||||
template<PrefixableUnit auto U> inline constexpr gibi_<decltype(U)> gibi;
|
||||
template<PrefixableUnit auto U> inline constexpr tebi_<decltype(U)> tebi;
|
||||
template<PrefixableUnit auto U> inline constexpr pebi_<decltype(U)> pebi;
|
||||
template<PrefixableUnit auto U> inline constexpr exbi_<decltype(U)> exbi;
|
||||
template<PrefixableUnit auto U> inline constexpr zebi_<decltype(U)> zebi;
|
||||
template<PrefixableUnit auto U> inline constexpr yobi_<decltype(U)> yobi;
|
||||
// clang-format on
|
||||
|
||||
MP_UNITS_EXPORT_END
|
||||
|
@ -58,30 +58,30 @@ template<PrefixableUnit U> struct quetta_ : prefixed_unit<"Q", mag_power<10, 30>
|
||||
|
||||
MP_UNITS_EXPORT_BEGIN
|
||||
|
||||
template<PrefixableUnit auto U> inline constexpr quecto_<std::remove_const_t<decltype(U)>> quecto;
|
||||
template<PrefixableUnit auto U> inline constexpr ronto_<std::remove_const_t<decltype(U)>> ronto;
|
||||
template<PrefixableUnit auto U> inline constexpr yocto_<std::remove_const_t<decltype(U)>> yocto;
|
||||
template<PrefixableUnit auto U> inline constexpr zepto_<std::remove_const_t<decltype(U)>> zepto;
|
||||
template<PrefixableUnit auto U> inline constexpr atto_<std::remove_const_t<decltype(U)>> atto;
|
||||
template<PrefixableUnit auto U> inline constexpr femto_<std::remove_const_t<decltype(U)>> femto;
|
||||
template<PrefixableUnit auto U> inline constexpr pico_<std::remove_const_t<decltype(U)>> pico;
|
||||
template<PrefixableUnit auto U> inline constexpr nano_<std::remove_const_t<decltype(U)>> nano;
|
||||
template<PrefixableUnit auto U> inline constexpr micro_<std::remove_const_t<decltype(U)>> micro;
|
||||
template<PrefixableUnit auto U> inline constexpr milli_<std::remove_const_t<decltype(U)>> milli;
|
||||
template<PrefixableUnit auto U> inline constexpr centi_<std::remove_const_t<decltype(U)>> centi;
|
||||
template<PrefixableUnit auto U> inline constexpr deci_<std::remove_const_t<decltype(U)>> deci;
|
||||
template<PrefixableUnit auto U> inline constexpr deca_<std::remove_const_t<decltype(U)>> deca;
|
||||
template<PrefixableUnit auto U> inline constexpr hecto_<std::remove_const_t<decltype(U)>> hecto;
|
||||
template<PrefixableUnit auto U> inline constexpr kilo_<std::remove_const_t<decltype(U)>> kilo;
|
||||
template<PrefixableUnit auto U> inline constexpr mega_<std::remove_const_t<decltype(U)>> mega;
|
||||
template<PrefixableUnit auto U> inline constexpr giga_<std::remove_const_t<decltype(U)>> giga;
|
||||
template<PrefixableUnit auto U> inline constexpr tera_<std::remove_const_t<decltype(U)>> tera;
|
||||
template<PrefixableUnit auto U> inline constexpr peta_<std::remove_const_t<decltype(U)>> peta;
|
||||
template<PrefixableUnit auto U> inline constexpr exa_<std::remove_const_t<decltype(U)>> exa;
|
||||
template<PrefixableUnit auto U> inline constexpr zetta_<std::remove_const_t<decltype(U)>> zetta;
|
||||
template<PrefixableUnit auto U> inline constexpr yotta_<std::remove_const_t<decltype(U)>> yotta;
|
||||
template<PrefixableUnit auto U> inline constexpr ronna_<std::remove_const_t<decltype(U)>> ronna;
|
||||
template<PrefixableUnit auto U> inline constexpr quetta_<std::remove_const_t<decltype(U)>> quetta;
|
||||
template<PrefixableUnit auto U> inline constexpr quecto_<decltype(U)> quecto;
|
||||
template<PrefixableUnit auto U> inline constexpr ronto_<decltype(U)> ronto;
|
||||
template<PrefixableUnit auto U> inline constexpr yocto_<decltype(U)> yocto;
|
||||
template<PrefixableUnit auto U> inline constexpr zepto_<decltype(U)> zepto;
|
||||
template<PrefixableUnit auto U> inline constexpr atto_<decltype(U)> atto;
|
||||
template<PrefixableUnit auto U> inline constexpr femto_<decltype(U)> femto;
|
||||
template<PrefixableUnit auto U> inline constexpr pico_<decltype(U)> pico;
|
||||
template<PrefixableUnit auto U> inline constexpr nano_<decltype(U)> nano;
|
||||
template<PrefixableUnit auto U> inline constexpr micro_<decltype(U)> micro;
|
||||
template<PrefixableUnit auto U> inline constexpr milli_<decltype(U)> milli;
|
||||
template<PrefixableUnit auto U> inline constexpr centi_<decltype(U)> centi;
|
||||
template<PrefixableUnit auto U> inline constexpr deci_<decltype(U)> deci;
|
||||
template<PrefixableUnit auto U> inline constexpr deca_<decltype(U)> deca;
|
||||
template<PrefixableUnit auto U> inline constexpr hecto_<decltype(U)> hecto;
|
||||
template<PrefixableUnit auto U> inline constexpr kilo_<decltype(U)> kilo;
|
||||
template<PrefixableUnit auto U> inline constexpr mega_<decltype(U)> mega;
|
||||
template<PrefixableUnit auto U> inline constexpr giga_<decltype(U)> giga;
|
||||
template<PrefixableUnit auto U> inline constexpr tera_<decltype(U)> tera;
|
||||
template<PrefixableUnit auto U> inline constexpr peta_<decltype(U)> peta;
|
||||
template<PrefixableUnit auto U> inline constexpr exa_<decltype(U)> exa;
|
||||
template<PrefixableUnit auto U> inline constexpr zetta_<decltype(U)> zetta;
|
||||
template<PrefixableUnit auto U> inline constexpr yotta_<decltype(U)> yotta;
|
||||
template<PrefixableUnit auto U> inline constexpr ronna_<decltype(U)> ronna;
|
||||
template<PrefixableUnit auto U> inline constexpr quetta_<decltype(U)> quetta;
|
||||
// clang-format on
|
||||
|
||||
MP_UNITS_EXPORT_END
|
||||
|
@ -49,9 +49,9 @@ struct dim_speed : decltype(isq::dim_length / isq::dim_time) {};
|
||||
|
||||
// BaseDimension
|
||||
static_assert(detail::BaseDimension<struct isq::dim_length>);
|
||||
static_assert(!detail::BaseDimension<std::remove_const_t<decltype(isq::dim_length / isq::dim_time)>>);
|
||||
static_assert(!detail::BaseDimension<std::remove_const_t<decltype(inverse(isq::dim_time))>>);
|
||||
static_assert(!detail::BaseDimension<std::remove_const_t<decltype(pow<2>(isq::dim_length))>>);
|
||||
static_assert(!detail::BaseDimension<decltype(isq::dim_length / isq::dim_time)>);
|
||||
static_assert(!detail::BaseDimension<decltype(inverse(isq::dim_time))>);
|
||||
static_assert(!detail::BaseDimension<decltype(pow<2>(isq::dim_length))>);
|
||||
static_assert(!detail::BaseDimension<derived_dimension<struct isq::dim_length, per<struct isq::dim_time>>>);
|
||||
static_assert(!detail::BaseDimension<dim_speed>);
|
||||
static_assert(!detail::BaseDimension<base_dimension<"L">>);
|
||||
@ -59,9 +59,9 @@ static_assert(!detail::BaseDimension<struct si::metre>);
|
||||
static_assert(!detail::BaseDimension<int>);
|
||||
|
||||
// DerivedDimension
|
||||
static_assert(detail::DerivedDimension<std::remove_const_t<decltype(isq::dim_length / isq::dim_time)>>);
|
||||
static_assert(detail::DerivedDimension<std::remove_const_t<decltype(inverse(isq::dim_time))>>);
|
||||
static_assert(detail::DerivedDimension<std::remove_const_t<decltype(pow<2>(isq::dim_length))>>);
|
||||
static_assert(detail::DerivedDimension<decltype(isq::dim_length / isq::dim_time)>);
|
||||
static_assert(detail::DerivedDimension<decltype(inverse(isq::dim_time))>);
|
||||
static_assert(detail::DerivedDimension<decltype(pow<2>(isq::dim_length))>);
|
||||
static_assert(detail::DerivedDimension<derived_dimension<struct isq::dim_length, per<struct isq::dim_time>>>);
|
||||
static_assert(detail::DerivedDimension<struct dimension_one>);
|
||||
static_assert(!detail::DerivedDimension<dim_speed>);
|
||||
@ -71,9 +71,9 @@ static_assert(!detail::DerivedDimension<int>);
|
||||
|
||||
// Dimension
|
||||
static_assert(Dimension<struct isq::dim_length>);
|
||||
static_assert(Dimension<std::remove_const_t<decltype(isq::dim_length / isq::dim_time)>>);
|
||||
static_assert(Dimension<std::remove_const_t<decltype(inverse(isq::dim_time))>>);
|
||||
static_assert(Dimension<std::remove_const_t<decltype(pow<2>(isq::dim_length))>>);
|
||||
static_assert(Dimension<decltype(isq::dim_length / isq::dim_time)>);
|
||||
static_assert(Dimension<decltype(inverse(isq::dim_time))>);
|
||||
static_assert(Dimension<decltype(pow<2>(isq::dim_length))>);
|
||||
static_assert(Dimension<derived_dimension<struct isq::dim_length, per<struct isq::dim_time>>>);
|
||||
static_assert(Dimension<struct dimension_one>);
|
||||
static_assert(!Dimension<dim_speed>);
|
||||
@ -90,9 +90,9 @@ struct speed : decltype(isq::length / isq::time) {}; // this is not recommended
|
||||
static_assert(QuantitySpec<struct isq::length>);
|
||||
static_assert(QuantitySpec<struct isq::radius>);
|
||||
static_assert(QuantitySpec<struct isq::speed>);
|
||||
static_assert(QuantitySpec<std::remove_const_t<decltype(kind_of<isq::length>)>>);
|
||||
static_assert(QuantitySpec<std::remove_const_t<decltype(isq::length / isq::time)>>);
|
||||
static_assert(QuantitySpec<std::remove_const_t<decltype(pow<2>(isq::length))>>);
|
||||
static_assert(QuantitySpec<decltype(kind_of<isq::length>)>);
|
||||
static_assert(QuantitySpec<decltype(isq::length / isq::time)>);
|
||||
static_assert(QuantitySpec<decltype(pow<2>(isq::length))>);
|
||||
static_assert(QuantitySpec<struct dimensionless>);
|
||||
static_assert(!QuantitySpec<speed>);
|
||||
static_assert(!QuantitySpec<struct isq::dim_length>);
|
||||
@ -103,8 +103,8 @@ static_assert(detail::NamedQuantitySpec<struct isq::length>);
|
||||
static_assert(detail::NamedQuantitySpec<struct isq::radius>);
|
||||
static_assert(detail::NamedQuantitySpec<struct isq::speed>);
|
||||
static_assert(!detail::NamedQuantitySpec<std::remove_const_t<decltype(kind_of<isq::length>)>>);
|
||||
static_assert(!detail::NamedQuantitySpec<std::remove_const_t<decltype(isq::length / isq::time)>>);
|
||||
static_assert(!detail::NamedQuantitySpec<std::remove_const_t<decltype(pow<2>(isq::length))>>);
|
||||
static_assert(!detail::NamedQuantitySpec<decltype(isq::length / isq::time)>);
|
||||
static_assert(!detail::NamedQuantitySpec<decltype(pow<2>(isq::length))>);
|
||||
static_assert(detail::NamedQuantitySpec<struct dimensionless>);
|
||||
static_assert(!detail::NamedQuantitySpec<speed>);
|
||||
static_assert(!detail::NamedQuantitySpec<struct isq::dim_length>);
|
||||
@ -113,10 +113,10 @@ static_assert(!detail::NamedQuantitySpec<int>);
|
||||
// IntermediateDerivedQuantitySpec
|
||||
static_assert(!detail::IntermediateDerivedQuantitySpec<struct isq::length>);
|
||||
static_assert(!detail::IntermediateDerivedQuantitySpec<struct isq::radius>);
|
||||
static_assert(!detail::IntermediateDerivedQuantitySpec<std::remove_const_t<decltype(kind_of<isq::length>)>>);
|
||||
static_assert(!detail::IntermediateDerivedQuantitySpec<decltype(kind_of<isq::length>)>);
|
||||
static_assert(!detail::IntermediateDerivedQuantitySpec<struct isq::speed>);
|
||||
static_assert(detail::IntermediateDerivedQuantitySpec<std::remove_const_t<decltype(isq::length / isq::time)>>);
|
||||
static_assert(detail::IntermediateDerivedQuantitySpec<std::remove_const_t<decltype(pow<2>(isq::length))>>);
|
||||
static_assert(detail::IntermediateDerivedQuantitySpec<decltype(isq::length / isq::time)>);
|
||||
static_assert(detail::IntermediateDerivedQuantitySpec<decltype(pow<2>(isq::length))>);
|
||||
static_assert(!detail::IntermediateDerivedQuantitySpec<struct dimensionless>);
|
||||
static_assert(!detail::IntermediateDerivedQuantitySpec<speed>);
|
||||
static_assert(!detail::IntermediateDerivedQuantitySpec<struct isq::dim_length>);
|
||||
@ -127,8 +127,8 @@ static_assert(!detail::QuantityKindSpec<struct isq::length>);
|
||||
static_assert(!detail::QuantityKindSpec<struct isq::radius>);
|
||||
static_assert(detail::QuantityKindSpec<std::remove_const_t<decltype(kind_of<isq::length>)>>);
|
||||
static_assert(!detail::QuantityKindSpec<struct isq::speed>);
|
||||
static_assert(!detail::QuantityKindSpec<std::remove_const_t<decltype(isq::length / isq::time)>>);
|
||||
static_assert(!detail::QuantityKindSpec<std::remove_const_t<decltype(pow<2>(isq::length))>>);
|
||||
static_assert(!detail::QuantityKindSpec<decltype(isq::length / isq::time)>);
|
||||
static_assert(!detail::QuantityKindSpec<decltype(pow<2>(isq::length))>);
|
||||
static_assert(!detail::QuantityKindSpec<struct dimensionless>);
|
||||
static_assert(!detail::QuantityKindSpec<speed>);
|
||||
static_assert(!detail::QuantityKindSpec<struct isq::dim_length>);
|
||||
@ -142,13 +142,13 @@ struct metre_per_second : decltype(si::metre / si::second) {};
|
||||
|
||||
static_assert(Unit<struct si::metre>);
|
||||
static_assert(Unit<struct si::kilogram>);
|
||||
static_assert(Unit<std::remove_const_t<decltype(si::kilo<si::gram>)>>);
|
||||
static_assert(Unit<decltype(si::kilo<si::gram>)>);
|
||||
static_assert(Unit<struct natural::electronvolt>);
|
||||
static_assert(Unit<std::remove_const_t<decltype(si::metre / si::second)>>);
|
||||
static_assert(Unit<std::remove_const_t<decltype(inverse(si::second))>>);
|
||||
static_assert(Unit<std::remove_const_t<decltype(mag<10> * si::second)>>);
|
||||
static_assert(Unit<std::remove_const_t<decltype(square(si::metre))>>);
|
||||
static_assert(Unit<std::remove_const_t<decltype(pow<2>(si::metre))>>);
|
||||
static_assert(Unit<decltype(si::metre / si::second)>);
|
||||
static_assert(Unit<decltype(inverse(si::second))>);
|
||||
static_assert(Unit<decltype(mag<10> * si::second)>);
|
||||
static_assert(Unit<decltype(square(si::metre))>);
|
||||
static_assert(Unit<decltype(pow<2>(si::metre))>);
|
||||
static_assert(Unit<struct si::standard_gravity>);
|
||||
static_assert(Unit<scaled_unit<mag<10>, struct si::second>>);
|
||||
static_assert(Unit<metre_per_second>);
|
||||
@ -169,12 +169,12 @@ static_assert(!Unit<std::chrono::seconds>);
|
||||
static_assert(detail::NamedUnit<struct si::metre>);
|
||||
static_assert(detail::NamedUnit<struct natural::electronvolt>);
|
||||
static_assert(!detail::NamedUnit<struct si::kilogram>);
|
||||
static_assert(!detail::NamedUnit<std::remove_const_t<decltype(si::kilo<si::gram>)>>);
|
||||
static_assert(!detail::NamedUnit<std::remove_const_t<decltype(si::metre / si::second)>>);
|
||||
static_assert(!detail::NamedUnit<std::remove_const_t<decltype(inverse(si::second))>>);
|
||||
static_assert(!detail::NamedUnit<std::remove_const_t<decltype(mag<10> * si::second)>>);
|
||||
static_assert(!detail::NamedUnit<std::remove_const_t<decltype(square(si::metre))>>);
|
||||
static_assert(!detail::NamedUnit<std::remove_const_t<decltype(pow<2>(si::metre))>>);
|
||||
static_assert(!detail::NamedUnit<decltype(si::kilo<si::gram>)>);
|
||||
static_assert(!detail::NamedUnit<decltype(si::metre / si::second)>);
|
||||
static_assert(!detail::NamedUnit<decltype(inverse(si::second))>);
|
||||
static_assert(!detail::NamedUnit<decltype(mag<10> * si::second)>);
|
||||
static_assert(!detail::NamedUnit<decltype(square(si::metre))>);
|
||||
static_assert(!detail::NamedUnit<decltype(pow<2>(si::metre))>);
|
||||
static_assert(detail::NamedUnit<struct si::standard_gravity>);
|
||||
static_assert(!detail::NamedUnit<scaled_unit<mag<10>, struct si::second>>);
|
||||
static_assert(!detail::NamedUnit<metre_per_second>);
|
||||
@ -195,12 +195,12 @@ static_assert(!detail::NamedUnit<std::chrono::seconds>);
|
||||
static_assert(PrefixableUnit<struct si::metre>);
|
||||
static_assert(PrefixableUnit<struct natural::electronvolt>);
|
||||
static_assert(!PrefixableUnit<struct si::kilogram>);
|
||||
static_assert(!PrefixableUnit<std::remove_const_t<decltype(si::kilo<si::gram>)>>);
|
||||
static_assert(!PrefixableUnit<std::remove_const_t<decltype(si::metre / si::second)>>);
|
||||
static_assert(!PrefixableUnit<std::remove_const_t<decltype(inverse(si::second))>>);
|
||||
static_assert(!PrefixableUnit<std::remove_const_t<decltype(mag<10> * si::second)>>);
|
||||
static_assert(!PrefixableUnit<std::remove_const_t<decltype(square(si::metre))>>);
|
||||
static_assert(!PrefixableUnit<std::remove_const_t<decltype(pow<2>(si::metre))>>);
|
||||
static_assert(!PrefixableUnit<decltype(si::kilo<si::gram>)>);
|
||||
static_assert(!PrefixableUnit<decltype(si::metre / si::second)>);
|
||||
static_assert(!PrefixableUnit<decltype(inverse(si::second))>);
|
||||
static_assert(!PrefixableUnit<decltype(mag<10> * si::second)>);
|
||||
static_assert(!PrefixableUnit<decltype(square(si::metre))>);
|
||||
static_assert(!PrefixableUnit<decltype(pow<2>(si::metre))>);
|
||||
static_assert(PrefixableUnit<struct si::standard_gravity>);
|
||||
static_assert(!PrefixableUnit<scaled_unit<mag<10>, struct si::second>>);
|
||||
static_assert(!PrefixableUnit<metre_per_second>);
|
||||
@ -221,12 +221,12 @@ static_assert(!PrefixableUnit<std::chrono::seconds>);
|
||||
static_assert(AssociatedUnit<struct si::metre>);
|
||||
static_assert(!AssociatedUnit<struct natural::electronvolt>);
|
||||
static_assert(AssociatedUnit<struct si::kilogram>);
|
||||
static_assert(AssociatedUnit<std::remove_const_t<decltype(si::kilo<si::gram>)>>);
|
||||
static_assert(AssociatedUnit<std::remove_const_t<decltype(si::metre / si::second)>>);
|
||||
static_assert(AssociatedUnit<std::remove_const_t<decltype(inverse(si::second))>>);
|
||||
static_assert(AssociatedUnit<std::remove_const_t<decltype(mag<10> * si::second)>>);
|
||||
static_assert(AssociatedUnit<std::remove_const_t<decltype(square(si::metre))>>);
|
||||
static_assert(AssociatedUnit<std::remove_const_t<decltype(pow<2>(si::metre))>>);
|
||||
static_assert(AssociatedUnit<decltype(si::kilo<si::gram>)>);
|
||||
static_assert(AssociatedUnit<decltype(si::metre / si::second)>);
|
||||
static_assert(AssociatedUnit<decltype(inverse(si::second))>);
|
||||
static_assert(AssociatedUnit<decltype(mag<10> * si::second)>);
|
||||
static_assert(AssociatedUnit<decltype(square(si::metre))>);
|
||||
static_assert(AssociatedUnit<decltype(pow<2>(si::metre))>);
|
||||
static_assert(AssociatedUnit<struct si::standard_gravity>);
|
||||
static_assert(AssociatedUnit<scaled_unit<mag<10>, struct si::second>>);
|
||||
static_assert(AssociatedUnit<metre_per_second>);
|
||||
@ -260,13 +260,13 @@ static_assert(!UnitOf<struct natural::electronvolt, isq::energy>);
|
||||
|
||||
// Reference
|
||||
static_assert(Reference<struct si::metre>);
|
||||
static_assert(Reference<std::remove_const_t<decltype(si::metre / si::second)>>);
|
||||
static_assert(Reference<std::remove_const_t<decltype(isq::length[si::metre])>>);
|
||||
static_assert(Reference<std::remove_const_t<decltype(isq::radius[si::metre])>>);
|
||||
static_assert(Reference<std::remove_const_t<decltype(isq::radius[si::metre] / isq::time[si::second])>>);
|
||||
static_assert(Reference<decltype(si::metre / si::second)>);
|
||||
static_assert(Reference<decltype(isq::length[si::metre])>);
|
||||
static_assert(Reference<decltype(isq::radius[si::metre])>);
|
||||
static_assert(Reference<decltype(isq::radius[si::metre] / isq::time[si::second])>);
|
||||
static_assert(!Reference<struct natural::electronvolt>);
|
||||
static_assert(!Reference<struct isq::length>);
|
||||
static_assert(!Reference<std::remove_const_t<decltype(kind_of<isq::length>)>>);
|
||||
static_assert(!Reference<decltype(kind_of<isq::length>)>);
|
||||
static_assert(!Reference<struct isq::dim_length>);
|
||||
static_assert(!Reference<int>);
|
||||
|
||||
@ -274,24 +274,24 @@ static_assert(!Reference<int>);
|
||||
static_assert(ReferenceOf<struct si::metre, isq::length>);
|
||||
static_assert(ReferenceOf<struct si::metre, isq::radius>);
|
||||
static_assert(!ReferenceOf<struct si::second, isq::length>);
|
||||
static_assert(ReferenceOf<std::remove_const_t<decltype(isq::length[si::metre])>, isq::length>);
|
||||
static_assert(!ReferenceOf<std::remove_const_t<decltype(isq::length[si::metre])>, isq::radius>);
|
||||
static_assert(ReferenceOf<std::remove_const_t<decltype(isq::radius[si::metre])>, isq::length>);
|
||||
static_assert(ReferenceOf<std::remove_const_t<decltype(isq::radius[si::metre])>, isq::radius>);
|
||||
static_assert(ReferenceOf<decltype(isq::length[si::metre]), isq::length>);
|
||||
static_assert(!ReferenceOf<decltype(isq::length[si::metre]), isq::radius>);
|
||||
static_assert(ReferenceOf<decltype(isq::radius[si::metre]), isq::length>);
|
||||
static_assert(ReferenceOf<decltype(isq::radius[si::metre]), isq::radius>);
|
||||
static_assert(!ReferenceOf<struct si::second, isq::dim_length>);
|
||||
|
||||
static_assert(ReferenceOf<struct one, dimensionless>);
|
||||
static_assert(ReferenceOf<std::remove_const_t<decltype(dimensionless[one])>, dimensionless>);
|
||||
static_assert(ReferenceOf<std::remove_const_t<decltype(isq::rotation[one])>, isq::rotation>);
|
||||
static_assert(ReferenceOf<std::remove_const_t<decltype(isq::rotation[one])>, dimensionless>);
|
||||
static_assert(ReferenceOf<decltype(dimensionless[one]), dimensionless>);
|
||||
static_assert(ReferenceOf<decltype(isq::rotation[one]), isq::rotation>);
|
||||
static_assert(ReferenceOf<decltype(isq::rotation[one]), dimensionless>);
|
||||
static_assert(ReferenceOf<struct si::radian, isq::angular_measure>);
|
||||
static_assert(!ReferenceOf<struct si::radian, dimensionless>);
|
||||
static_assert(ReferenceOf<std::remove_const_t<decltype(isq::angular_measure[si::radian])>, isq::angular_measure>);
|
||||
static_assert(!ReferenceOf<std::remove_const_t<decltype(isq::angular_measure[si::radian])>, dimensionless>);
|
||||
static_assert(ReferenceOf<decltype(isq::angular_measure[si::radian]), isq::angular_measure>);
|
||||
static_assert(!ReferenceOf<decltype(isq::angular_measure[si::radian]), dimensionless>);
|
||||
static_assert(ReferenceOf<struct one, isq::rotation>);
|
||||
static_assert(ReferenceOf<struct one, isq::angular_measure>);
|
||||
static_assert(!ReferenceOf<std::remove_const_t<decltype(dimensionless[one])>, isq::rotation>);
|
||||
static_assert(!ReferenceOf<std::remove_const_t<decltype(dimensionless[one])>, isq::angular_measure>);
|
||||
static_assert(!ReferenceOf<decltype(dimensionless[one]), isq::rotation>);
|
||||
static_assert(!ReferenceOf<decltype(dimensionless[one]), isq::angular_measure>);
|
||||
|
||||
// Representation
|
||||
static_assert(Representation<int>);
|
||||
@ -324,7 +324,7 @@ static_assert(Quantity<quantity<isq::length[si::metre], int>>);
|
||||
static_assert(!Quantity<std::chrono::seconds>);
|
||||
#endif
|
||||
static_assert(!Quantity<quantity_point<si::metre, my_origin>>);
|
||||
static_assert(!Quantity<std::remove_const_t<decltype(isq::length[si::metre])>>);
|
||||
static_assert(!Quantity<decltype(isq::length[si::metre])>);
|
||||
|
||||
// QuantityOf
|
||||
static_assert(QuantityOf<quantity<si::metre>, isq::length>);
|
||||
@ -365,7 +365,7 @@ static_assert(QuantityPoint<quantity_point<isq::length[si::metre], my_origin>>);
|
||||
static_assert(QuantityPoint<quantity_point<isq::length[si::metre], my_relative_origin, int>>);
|
||||
static_assert(QuantityPoint<quantity_point<isq::radius[si::metre], my_origin>>);
|
||||
static_assert(QuantityPoint<quantity_point<isq::radius[si::metre], my_relative_origin>>);
|
||||
static_assert(!QuantityPoint<std::remove_const_t<decltype(isq::length[si::metre])>>);
|
||||
static_assert(!QuantityPoint<decltype(isq::length[si::metre])>);
|
||||
static_assert(!QuantityPoint<absolute_point_origin<struct my_origin, isq::length>>);
|
||||
static_assert(!QuantityPoint<struct my_origin>);
|
||||
static_assert(!QuantityPoint<struct my_relative_origin>);
|
||||
@ -405,7 +405,7 @@ static_assert(!PointOrigin<relative_point_origin<my_origin + 42 * si::metre>>);
|
||||
static_assert(!PointOrigin<quantity_point<si::metre, my_origin>>);
|
||||
static_assert(!PointOrigin<quantity_point<isq::length[si::metre], my_origin>>);
|
||||
static_assert(!PointOrigin<quantity_point<isq::radius[si::metre], my_origin>>);
|
||||
static_assert(!PointOrigin<std::remove_const_t<decltype(isq::length[si::metre])>>);
|
||||
static_assert(!PointOrigin<decltype(isq::length[si::metre])>);
|
||||
#if MP_UNITS_HOSTED
|
||||
static_assert(!PointOrigin<std::chrono::seconds>);
|
||||
static_assert(!PointOrigin<std::chrono::time_point<std::chrono::system_clock>>);
|
||||
@ -431,7 +431,7 @@ static_assert(!PointOriginFor<quantity_point<isq::radius[si::metre], my_origin>,
|
||||
static_assert(!PointOriginFor<quantity_point<isq::radius[si::metre], my_relative_origin>, isq::length>);
|
||||
static_assert(!PointOriginFor<quantity_point<isq::radius[si::metre], my_relative_origin>, isq::radius>);
|
||||
static_assert(!PointOriginFor<quantity_point<isq::radius[si::metre], my_relative_origin>, isq::time>);
|
||||
static_assert(!PointOriginFor<std::remove_const_t<decltype(isq::length[si::metre])>, isq::length>);
|
||||
static_assert(!PointOriginFor<decltype(isq::length[si::metre]), isq::length>);
|
||||
#if MP_UNITS_HOSTED
|
||||
static_assert(!PointOriginFor<std::chrono::seconds, isq::length>);
|
||||
static_assert(!PointOriginFor<std::chrono::time_point<std::chrono::system_clock>, isq::length>);
|
||||
|
@ -121,10 +121,10 @@ static_assert(!detail::NamedQuantitySpec<decltype(inverse(time))>);
|
||||
static_assert(detail::IntermediateDerivedQuantitySpec<decltype(inverse(time))>);
|
||||
static_assert(!detail::QuantityKindSpec<decltype(inverse(time))>);
|
||||
|
||||
static_assert(QuantitySpec<kind_of_<std::remove_const_t<decltype(length / time)>>>);
|
||||
static_assert(!detail::NamedQuantitySpec<kind_of_<std::remove_const_t<decltype(length / time)>>>);
|
||||
static_assert(detail::IntermediateDerivedQuantitySpec<kind_of_<std::remove_const_t<decltype(length / time)>>>);
|
||||
static_assert(detail::QuantityKindSpec<kind_of_<std::remove_const_t<decltype(length / time)>>>);
|
||||
static_assert(QuantitySpec<kind_of_<decltype(length / time)>>);
|
||||
static_assert(!detail::NamedQuantitySpec<kind_of_<decltype(length / time)>>);
|
||||
static_assert(detail::IntermediateDerivedQuantitySpec<kind_of_<decltype(length / time)>>);
|
||||
static_assert(detail::QuantityKindSpec<kind_of_<decltype(length / time)>>);
|
||||
|
||||
static_assert(QuantitySpec<decltype(kind_of<length> / kind_of<time>)>);
|
||||
static_assert(!detail::NamedQuantitySpec<decltype(kind_of<length> / kind_of<time>)>);
|
||||
|
@ -99,7 +99,7 @@ static_assert(is_of_type<kind_of<length>[metre], metre_>);
|
||||
|
||||
static_assert(
|
||||
is_of_type<(length / time)[metre / second],
|
||||
reference<std::remove_const_t<decltype(length / time)>, std::remove_const_t<decltype(metre / second)>>>);
|
||||
reference<decltype(length / time), decltype(metre / second)>>);
|
||||
static_assert(is_of_type<(kind_of<length> / kind_of<time>)[metre / second], derived_unit<metre_, per<second_>>>);
|
||||
|
||||
// Unit as a reference
|
||||
|
@ -58,7 +58,7 @@ static_assert(1 * Qm == 1'000'000'000'000'000'000 * Tm);
|
||||
// check for invalid prefixes
|
||||
template<template<typename U> typename prefix, auto V1>
|
||||
concept can_not_be_prefixed =
|
||||
Unit<std::remove_const_t<decltype(V1)>> && !requires { typename prefix<std::remove_const_t<decltype(V1)>>; };
|
||||
Unit<decltype(V1)> && !requires { typename prefix<decltype(V1)>; };
|
||||
|
||||
static_assert(can_not_be_prefixed<si::milli_, si::degree_Celsius>);
|
||||
static_assert(can_not_be_prefixed<si::milli_, si::minute>);
|
||||
|
Reference in New Issue
Block a user