From 77197767119204e7b7cfdcef5a34d2e24e16d204 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 1 Sep 2022 10:48:34 +0200 Subject: [PATCH] feat: `gradian` support added --- example/aliases/experimental_angle.cpp | 1 + example/literals/experimental_angle.cpp | 1 + example/references/experimental_angle.cpp | 1 + src/core/include/units/generic/angle.h | 12 ++++++++++++ test/unit_test/static/angle_test.cpp | 13 +++---------- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/example/aliases/experimental_angle.cpp b/example/aliases/experimental_angle.cpp index d10413f6..d58e1938 100644 --- a/example/aliases/experimental_angle.cpp +++ b/example/aliases/experimental_angle.cpp @@ -40,4 +40,5 @@ int main() std::cout << angle << '\n'; std::cout << quantity_cast(angle) << '\n'; std::cout << quantity_cast(angle) << '\n'; + std::cout << quantity_cast(angle) << '\n'; } diff --git a/example/literals/experimental_angle.cpp b/example/literals/experimental_angle.cpp index b697114f..e91e7868 100644 --- a/example/literals/experimental_angle.cpp +++ b/example/literals/experimental_angle.cpp @@ -40,4 +40,5 @@ int main() std::cout << angle << '\n'; std::cout << quantity_cast(angle) << '\n'; std::cout << quantity_cast(angle) << '\n'; + std::cout << quantity_cast(angle) << '\n'; } diff --git a/example/references/experimental_angle.cpp b/example/references/experimental_angle.cpp index 2ee1d137..ba9d25cd 100644 --- a/example/references/experimental_angle.cpp +++ b/example/references/experimental_angle.cpp @@ -49,4 +49,5 @@ int main() std::cout << angle << '\n'; std::cout << quantity_cast(angle) << '\n'; std::cout << quantity_cast(angle) << '\n'; + std::cout << quantity_cast(angle) << '\n'; } diff --git a/src/core/include/units/generic/angle.h b/src/core/include/units/generic/angle.h index a3f7ef34..375c0f64 100644 --- a/src/core/include/units/generic/angle.h +++ b/src/core/include/units/generic/angle.h @@ -35,6 +35,7 @@ namespace units { struct radian : named_unit {}; struct rotation : named_scaled_unit() * mag_pi, radian> {}; struct degree : named_scaled_unit(), rotation> {}; +struct gradian : named_scaled_unit(), rotation> {}; template struct dim_angle : base_dimension<"A", U> {}; @@ -73,6 +74,14 @@ constexpr auto operator"" _q_deg(unsigned long long l) } constexpr auto operator"" _q_deg(long double l) { return angle(l); } +// grad +constexpr auto operator"" _q_grad(unsigned long long l) +{ + gsl_ExpectsAudit(std::in_range(l)); + return angle(static_cast(l)); +} +constexpr auto operator"" _q_grad(long double l) { return angle(l); } + } // namespace literals #endif // UNITS_NO_LITERALS @@ -84,6 +93,7 @@ namespace angle_references { inline constexpr auto rad = reference, radian>{}; inline constexpr auto rot = reference, rotation>{}; inline constexpr auto deg = reference, degree>{}; +inline constexpr auto grad = reference, gradian>{}; } // namespace angle_references @@ -107,6 +117,8 @@ template using rot = units::angle; template using deg = units::angle; +template +using grad = units::angle; } // namespace units::aliases::inline angle diff --git a/test/unit_test/static/angle_test.cpp b/test/unit_test/static/angle_test.cpp index d936909a..ccbd692c 100644 --- a/test/unit_test/static/angle_test.cpp +++ b/test/unit_test/static/angle_test.cpp @@ -27,26 +27,19 @@ namespace { using namespace units::references; -static_assert(360. * deg == 1. * rot); static_assert(360 * deg == 1 * rot); +static_assert(400 * grad == 1 * rot); static_assert(std::numbers::pi * 2 * rad == 1. * rot); -} // namespace - -namespace { - using namespace units::literals; -static_assert(360._q_deg == 1._q_rot); static_assert(360_q_deg == 1_q_rot); +static_assert(400_q_grad == 1_q_rot); static_assert(std::numbers::pi * quantity_cast(2._q_rad) == quantity_cast(1._q_rot)); -} // namespace - -namespace { - static_assert(units::aliases::deg<>(360.) == units::aliases::rot<>(1.)); static_assert(units::aliases::deg(360) == units::aliases::rot(1)); +static_assert(units::aliases::grad(400) == units::aliases::rot(1)); static_assert(std::numbers::pi * units::aliases::rad<>(2.) == units::aliases::rot<>(1.)); } // namespace