forked from mpusz/mp-units
feat: abs(quantity)
exposed for conforming freestanding implementations
This commit is contained in:
@@ -22,8 +22,6 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <mp-units/bits/requires_hosted.h>
|
|
||||||
//
|
|
||||||
#include <mp-units/bits/module_macros.h>
|
#include <mp-units/bits/module_macros.h>
|
||||||
#include <mp-units/framework/customization_points.h>
|
#include <mp-units/framework/customization_points.h>
|
||||||
#include <mp-units/framework/quantity.h>
|
#include <mp-units/framework/quantity.h>
|
||||||
@@ -35,14 +33,38 @@
|
|||||||
#ifdef MP_UNITS_IMPORT_STD
|
#ifdef MP_UNITS_IMPORT_STD
|
||||||
import std;
|
import std;
|
||||||
#else
|
#else
|
||||||
#include <cmath>
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <cstdlib>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#endif
|
#if MP_UNITS_HOSTED
|
||||||
#endif
|
#include <cmath>
|
||||||
|
#endif // MP_UNITS_HOSTED
|
||||||
|
#endif // MP_UNITS_IMPORT_STD
|
||||||
|
#endif // MP_UNITS_IN_MODULE_INTERFACE
|
||||||
|
|
||||||
MP_UNITS_EXPORT
|
MP_UNITS_EXPORT
|
||||||
namespace mp_units {
|
namespace mp_units {
|
||||||
|
|
||||||
|
#if MP_UNITS_HOSTED || __cpp_lib_freestanding_cstdlib >= 202306L
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Computes the absolute value of a quantity
|
||||||
|
*
|
||||||
|
* @param q Quantity being the base of the operation
|
||||||
|
* @return Quantity The absolute value of a provided quantity
|
||||||
|
*/
|
||||||
|
template<auto R, typename Rep>
|
||||||
|
requires requires(Rep v) { abs(v); } || requires(Rep v) { std::abs(v); }
|
||||||
|
[[nodiscard]] constexpr quantity<R, Rep> abs(const quantity<R, Rep>& q) noexcept
|
||||||
|
{
|
||||||
|
using std::abs;
|
||||||
|
return {static_cast<Rep>(abs(q.numerical_value_ref_in(q.unit))), R};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if MP_UNITS_HOSTED
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Computes the value of a quantity raised to the `Num/Den` power
|
* @brief Computes the value of a quantity raised to the `Num/Den` power
|
||||||
*
|
*
|
||||||
@@ -122,20 +144,6 @@ template<ReferenceOf<dimensionless> auto R, typename Rep>
|
|||||||
quantity{static_cast<Rep>(exp(q.force_numerical_value_in(q.unit))), detail::clone_reference_with<one>(R)});
|
quantity{static_cast<Rep>(exp(q.force_numerical_value_in(q.unit))), detail::clone_reference_with<one>(R)});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Computes the absolute value of a quantity
|
|
||||||
*
|
|
||||||
* @param q Quantity being the base of the operation
|
|
||||||
* @return Quantity The absolute value of a provided quantity
|
|
||||||
*/
|
|
||||||
template<auto R, typename Rep>
|
|
||||||
requires requires(Rep v) { abs(v); } || requires(Rep v) { std::abs(v); }
|
|
||||||
[[nodiscard]] constexpr quantity<R, Rep> abs(const quantity<R, Rep>& q) noexcept
|
|
||||||
{
|
|
||||||
using std::abs;
|
|
||||||
return {static_cast<Rep>(abs(q.numerical_value_ref_in(q.unit))), R};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Determines if a quantity is finite.
|
* @brief Determines if a quantity is finite.
|
||||||
*
|
*
|
||||||
@@ -481,4 +489,6 @@ template<auto R1, typename Rep1, auto R2, typename Rep2, auto R3, typename Rep3>
|
|||||||
return quantity{hypot(x.numerical_value_in(unit), y.numerical_value_in(unit), z.numerical_value_in(unit)), ref};
|
return quantity{hypot(x.numerical_value_in(unit), y.numerical_value_in(unit), z.numerical_value_in(unit)), ref};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // MP_UNITS_HOSTED
|
||||||
|
|
||||||
} // namespace mp_units
|
} // namespace mp_units
|
||||||
|
Reference in New Issue
Block a user