feat: DerivedQuantitySpecExpr and DerivedUnitExpr removed

This commit is contained in:
Mateusz Pusz
2024-10-25 22:49:06 +02:00
parent 9c7d3b0f95
commit 5ef499ac94
4 changed files with 13 additions and 45 deletions

View File

@@ -429,7 +429,10 @@ struct quantity_spec<Self, QS, Eq, Args...> : detail::quantity_spec_interface<Se
namespace detail { namespace detail {
template<detail::DerivedQuantitySpecExpr... Expr> template<typename T>
struct is_dimensionless : std::false_type {};
template<typename... Expr>
struct derived_quantity_spec_impl : struct derived_quantity_spec_impl :
#if MP_UNITS_API_NO_CRTP #if MP_UNITS_API_NO_CRTP
detail::quantity_spec_interface, detail::quantity_spec_interface,
@@ -492,7 +495,7 @@ struct derived_quantity_spec_impl :
* @note User should not instantiate this type! It is not exported from the C++ module. The library will * @note User should not instantiate this type! It is not exported from the C++ module. The library will
* instantiate this type automatically based on the dimensional arithmetic equation provided by the user. * instantiate this type automatically based on the dimensional arithmetic equation provided by the user.
*/ */
template<detail::DerivedQuantitySpecExpr... Expr> template<typename... Expr>
struct derived_quantity_spec final : detail::derived_quantity_spec_impl<Expr...> {}; struct derived_quantity_spec final : detail::derived_quantity_spec_impl<Expr...> {};
/** /**

View File

@@ -76,28 +76,9 @@ template<typename T>
concept NamedQuantitySpec = concept NamedQuantitySpec =
QuantitySpec<T> && is_derived_from_specialization_of_quantity_spec<T> && (!QuantityKindSpec<T>); QuantitySpec<T> && is_derived_from_specialization_of_quantity_spec<T> && (!QuantityKindSpec<T>);
template<typename T>
struct is_dimensionless : std::false_type {};
template<typename T>
concept IsPowerOfQuantitySpec = is_specialization_of_power<T> &&
(NamedQuantitySpec<typename T::factor> || is_dimensionless<typename T::factor>::value);
template<typename T>
constexpr bool is_per_of_quantity_specs = false;
template<typename... Ts>
constexpr bool is_per_of_quantity_specs<per<Ts...>> =
(... && (NamedQuantitySpec<Ts> || is_dimensionless<Ts>::value || IsPowerOfQuantitySpec<Ts>));
template<typename T>
concept DerivedQuantitySpecExpr = detail::NamedQuantitySpec<T> || detail::is_dimensionless<T>::value ||
detail::IsPowerOfQuantitySpec<T> || detail::is_per_of_quantity_specs<T>;
} // namespace detail } // namespace detail
template<detail::DerivedQuantitySpecExpr... Expr> template<typename... Expr>
struct derived_quantity_spec; struct derived_quantity_spec;
namespace detail { namespace detail {

View File

@@ -67,7 +67,7 @@ struct scaled_unit_impl;
template<typename T> template<typename T>
constexpr bool is_specialization_of_scaled_unit = false; constexpr bool is_specialization_of_scaled_unit = false;
template<DerivedUnitExpr... Expr> template<typename... Expr>
struct derived_unit_impl; struct derived_unit_impl;
/** /**
@@ -461,7 +461,7 @@ namespace detail {
template<typename T> template<typename T>
struct is_one : std::false_type {}; struct is_one : std::false_type {};
template<DerivedUnitExpr... Expr> template<typename... Expr>
struct derived_unit_impl : detail::unit_interface, detail::expr_fractions<detail::is_one, Expr...> { struct derived_unit_impl : detail::unit_interface, detail::expr_fractions<detail::is_one, Expr...> {
using _base_type_ = derived_unit_impl; // exposition only using _base_type_ = derived_unit_impl; // exposition only
}; };
@@ -513,7 +513,7 @@ struct derived_unit_impl : detail::unit_interface, detail::expr_fractions<detail
* @note User should not instantiate this type! It is not exported from the C++ module. The library will * @note User should not instantiate this type! It is not exported from the C++ module. The library will
* instantiate this type automatically based on the unit arithmetic equation provided by the user. * instantiate this type automatically based on the unit arithmetic equation provided by the user.
*/ */
template<detail::DerivedUnitExpr... Expr> template<typename... Expr>
struct derived_unit final : detail::derived_unit_impl<Expr...> {}; struct derived_unit final : detail::derived_unit_impl<Expr...> {};
/** /**
@@ -831,13 +831,13 @@ constexpr auto unit_symbol_impl(Out out, const power<F, Num, Den...>&, const uni
return copy_symbol_exponent<CharT, Num, Den...>(fmt.encoding, negative_power, out); return copy_symbol_exponent<CharT, Num, Den...>(fmt.encoding, negative_power, out);
} }
template<typename CharT, std::output_iterator<CharT> Out, DerivedUnitExpr... Us> template<typename CharT, std::output_iterator<CharT> Out, typename... Us>
constexpr Out unit_symbol_impl(Out out, const type_list<>&, const unit_symbol_formatting&, bool) constexpr Out unit_symbol_impl(Out out, const type_list<>&, const unit_symbol_formatting&, bool)
{ {
return out; return out;
} }
template<typename CharT, std::output_iterator<CharT> Out, DerivedUnitExpr U, DerivedUnitExpr... Rest> template<typename CharT, std::output_iterator<CharT> Out, typename U, typename... Rest>
constexpr Out unit_symbol_impl(Out out, const type_list<U, Rest...>&, const unit_symbol_formatting& fmt, constexpr Out unit_symbol_impl(Out out, const type_list<U, Rest...>&, const unit_symbol_formatting& fmt,
bool negative_power) bool negative_power)
{ {
@@ -845,7 +845,7 @@ constexpr Out unit_symbol_impl(Out out, const type_list<U, Rest...>&, const unit
(print_separator<CharT>(out, fmt), out = unit_symbol_impl<CharT>(out, Rest{}, fmt, negative_power))); (print_separator<CharT>(out, fmt), out = unit_symbol_impl<CharT>(out, Rest{}, fmt, negative_power)));
} }
template<typename CharT, std::output_iterator<CharT> Out, DerivedUnitExpr... Nums, DerivedUnitExpr... Dens> template<typename CharT, std::output_iterator<CharT> Out, typename... Nums, typename... Dens>
constexpr Out unit_symbol_impl(Out out, const type_list<Nums...>& nums, const type_list<Dens...>& dens, constexpr Out unit_symbol_impl(Out out, const type_list<Nums...>& nums, const type_list<Dens...>& dens,
const unit_symbol_formatting& fmt) const unit_symbol_formatting& fmt)
{ {

View File

@@ -60,23 +60,7 @@ MP_UNITS_EXPORT struct one;
MP_UNITS_EXPORT template<typename T> MP_UNITS_EXPORT template<typename T>
concept PrefixableUnit = Unit<T> && is_derived_from_specialization_of_v<T, named_unit>; concept PrefixableUnit = Unit<T> && is_derived_from_specialization_of_v<T, named_unit>;
namespace detail { template<typename... Expr>
template<typename T>
constexpr bool is_power_of_unit = requires { requires is_specialization_of_power<T> && Unit<typename T::factor>; };
template<typename T>
constexpr bool is_per_of_units = false;
template<typename... Ts>
constexpr bool is_per_of_units<per<Ts...>> = (... && (Unit<Ts> || is_power_of_unit<Ts>));
template<typename T>
concept DerivedUnitExpr = Unit<T> || detail::is_power_of_unit<T> || detail::is_per_of_units<T>;
} // namespace detail
template<detail::DerivedUnitExpr... Expr>
struct derived_unit; struct derived_unit;
MP_UNITS_EXPORT template<symbol_text Symbol, Magnitude auto M, PrefixableUnit auto U> MP_UNITS_EXPORT template<symbol_text Symbol, Magnitude auto M, PrefixableUnit auto U>