mirror of
https://github.com/mpusz/mp-units.git
synced 2025-07-30 10:27:16 +02:00
refactor: 💥 mag_constant
now takes a symbol and a value and the class deriving from it must be final
This commit is contained in:
@ -184,9 +184,7 @@ For some units, a magnitude might also be irrational. The best example here is a
|
|||||||
is defined using a floating-point magnitude having a factor of the number π (Pi):
|
is defined using a floating-point magnitude having a factor of the number π (Pi):
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
inline constexpr struct pi : mag_constant {
|
inline constexpr struct pi final : mag_constant<symbol_text{u8"𝜋", "pi"}, std::numbers::pi_v<long double>> {} pi;
|
||||||
static constexpr auto value = std::numbers::pi_v<long double>;
|
|
||||||
} pi;
|
|
||||||
```
|
```
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
|
@ -56,13 +56,27 @@ using factorizer = wheel_factorizer<4>;
|
|||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
MP_UNITS_EXPORT struct mag_constant {};
|
#if defined MP_UNITS_COMP_CLANG || MP_UNITS_COMP_CLANG < 18
|
||||||
|
|
||||||
template<typename T>
|
MP_UNITS_EXPORT template<symbol_text Symbol>
|
||||||
concept MagConstant = std::derived_from<T, mag_constant> && std::is_empty_v<T> && requires {
|
struct mag_constant {};
|
||||||
{ +T::value } -> std::same_as<long double>;
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
MP_UNITS_EXPORT template<symbol_text Symbol, auto Value>
|
||||||
|
struct mag_constant {
|
||||||
|
static constexpr auto value = Value;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MP_UNITS_EXPORT template<typename T>
|
||||||
|
concept MagConstant =
|
||||||
|
is_derived_from_specialization_of_v<T, mag_constant> && std::is_empty_v<T> && std::is_final_v<T> && requires {
|
||||||
|
{ +T::value } -> std::same_as<long double>;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Any type which can be used as a basis vector in a PowerV.
|
* @brief Any type which can be used as a basis vector in a PowerV.
|
||||||
*
|
*
|
||||||
@ -598,8 +612,12 @@ constexpr Magnitude auto mag_power = pow<Pow>(mag<Base>);
|
|||||||
/**
|
/**
|
||||||
* @brief A convenient Magnitude constant for pi, which we can manipulate like a regular number.
|
* @brief A convenient Magnitude constant for pi, which we can manipulate like a regular number.
|
||||||
*/
|
*/
|
||||||
inline constexpr struct pi : mag_constant {
|
#if defined MP_UNITS_COMP_CLANG || MP_UNITS_COMP_CLANG < 18
|
||||||
|
inline constexpr struct pi final : mag_constant<symbol_text{u8"𝜋", "pi"}> {
|
||||||
static constexpr auto value = std::numbers::pi_v<long double>;
|
static constexpr auto value = std::numbers::pi_v<long double>;
|
||||||
|
#else
|
||||||
|
inline constexpr struct pi final : mag_constant<symbol_text{u8"𝜋", "pi"}, std::numbers::pi_v<long double>> {
|
||||||
|
#endif
|
||||||
} pi;
|
} pi;
|
||||||
|
|
||||||
[[deprecated("Use `mag<pi>` instead")]] inline constexpr Magnitude auto mag_pi = mag<pi>;
|
[[deprecated("Use `mag<pi>` instead")]] inline constexpr Magnitude auto mag_pi = mag<pi>;
|
||||||
|
Reference in New Issue
Block a user