mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-22 01:11:42 +00:00
[wpimath] Make Rotation2d implicitly convert from any angle unit (#6316)
Add unit category concepts to support this.
This commit is contained in:
@@ -28,18 +28,11 @@ class WPILIB_DLLEXPORT Rotation2d {
|
||||
constexpr Rotation2d() = default;
|
||||
|
||||
/**
|
||||
* Constructs a Rotation2d with the given radian value.
|
||||
* Constructs a Rotation2d with the given angle.
|
||||
*
|
||||
* @param value The value of the angle in radians.
|
||||
* @param value The value of the angle.
|
||||
*/
|
||||
constexpr Rotation2d(units::radian_t value); // NOLINT
|
||||
|
||||
/**
|
||||
* Constructs a Rotation2d with the given degree value.
|
||||
*
|
||||
* @param value The value of the angle in degrees.
|
||||
*/
|
||||
constexpr Rotation2d(units::degree_t value); // NOLINT
|
||||
constexpr Rotation2d(units::angle_unit auto value); // NOLINT
|
||||
|
||||
/**
|
||||
* Constructs a Rotation2d with the given x and y (cosine and sine)
|
||||
|
||||
@@ -11,13 +11,10 @@
|
||||
|
||||
namespace frc {
|
||||
|
||||
constexpr Rotation2d::Rotation2d(units::radian_t value)
|
||||
constexpr Rotation2d::Rotation2d(units::angle_unit auto value)
|
||||
: m_value(value),
|
||||
m_cos(gcem::cos(value.to<double>())),
|
||||
m_sin(gcem::sin(value.to<double>())) {}
|
||||
|
||||
constexpr Rotation2d::Rotation2d(units::degree_t value)
|
||||
: Rotation2d(units::radian_t{value}) {}
|
||||
m_cos(gcem::cos(value.template convert<units::radian>().value())),
|
||||
m_sin(gcem::sin(value.template convert<units::radian>().value())) {}
|
||||
|
||||
constexpr Rotation2d::Rotation2d(double x, double y) {
|
||||
double magnitude = gcem::hypot(x, y);
|
||||
|
||||
@@ -53,7 +53,6 @@
|
||||
|
||||
#if !defined(_MSC_VER) || _MSC_VER > 1800
|
||||
# define UNIT_HAS_LITERAL_SUPPORT
|
||||
# define UNIT_HAS_VARIADIC_TEMPLATE_SUPPORT
|
||||
#endif
|
||||
|
||||
#ifndef UNIT_LIB_DEFAULT_TYPE
|
||||
@@ -358,25 +357,14 @@ template<> inline constexpr const char* abbreviation(const namespaceName::nameSi
|
||||
/** @endcond */\
|
||||
}
|
||||
|
||||
#if defined(UNIT_HAS_VARIADIC_TEMPLATE_SUPPORT)
|
||||
#define UNIT_ADD_IS_UNIT_CATEGORY_TRAIT(unitCategory)\
|
||||
namespace traits\
|
||||
{\
|
||||
template<typename... T> struct is_ ## unitCategory ## _unit : std::integral_constant<bool, units::all_true<units::traits::detail::is_ ## unitCategory ## _unit_impl<std::decay_t<T>>::value...>::value> {};\
|
||||
template<typename... T> inline constexpr bool is_ ## unitCategory ## _unit_v = is_ ## unitCategory ## _unit<T...>::value;\
|
||||
}
|
||||
#else
|
||||
#define UNIT_ADD_IS_UNIT_CATEGORY_TRAIT(unitCategory)\
|
||||
namespace traits\
|
||||
{\
|
||||
template<typename T1, typename T2 = T1, typename T3 = T1>\
|
||||
struct is_ ## unitCategory ## _unit : std::integral_constant<bool, units::traits::detail::is_ ## unitCategory ## _unit_impl<typename std::decay<T1>::type>::value &&\
|
||||
units::traits::detail::is_ ## unitCategory ## _unit_impl<typename std::decay<T2>::type>::value &&\
|
||||
units::traits::detail::is_ ## unitCategory ## _unit_impl<typename std::decay<T3>::type>::value>{};\
|
||||
template<typename T1, typename T2 = T1, typename T3 = T1>\
|
||||
inline constexpr bool is_ ## unitCategory ## _unit_v = is_ ## unitCategory ## _unit<T1, T2, T3>::value;\
|
||||
}
|
||||
#endif
|
||||
}\
|
||||
template <typename T>\
|
||||
concept unitCategory ## _unit = traits::is_ ## unitCategory ## _unit_v<T>;
|
||||
|
||||
#define UNIT_ADD_CATEGORY_TRAIT(unitCategory)\
|
||||
UNIT_ADD_CATEGORY_TRAIT_DETAIL(unitCategory)\
|
||||
|
||||
Reference in New Issue
Block a user