diff --git a/src/include/units/ratio.h b/src/include/units/ratio.h index 8a8a0a7f..09055d96 100644 --- a/src/include/units/ratio.h +++ b/src/include/units/ratio.h @@ -128,10 +128,15 @@ namespace std::experimental::units { }; template - struct ratio_pow_impl { + struct ratio_pow_impl { using type = R; }; + template + struct ratio_pow_impl { + using type = ratio<1>; + }; + } template @@ -158,10 +163,20 @@ namespace std::experimental::units { return sqrt_impl(v, 1, v); } + template + struct ratio_sqrt_impl { + using type = ratio; + }; + + template + struct ratio_sqrt_impl> { + using type = ratio<0>; + }; + } template - using ratio_sqrt = ratio; + using ratio_sqrt = detail::ratio_sqrt_impl::type; // common_ratio diff --git a/test/unit_test/CMakeLists.txt b/test/unit_test/CMakeLists.txt index cbb5f987..328cbe37 100644 --- a/test/unit_test/CMakeLists.txt +++ b/test/unit_test/CMakeLists.txt @@ -25,7 +25,7 @@ add_library(unit_tests test_custom_units.cpp test_dimension.cpp test_quantity.cpp - test_tools.cpp + test_ratio.cpp test_type_list.cpp test_units.cpp ) diff --git a/test/unit_test/test_tools.cpp b/test/unit_test/test_ratio.cpp similarity index 72% rename from test/unit_test/test_tools.cpp rename to test/unit_test/test_ratio.cpp index 23899293..d60acfdf 100644 --- a/test/unit_test/test_tools.cpp +++ b/test/unit_test/test_ratio.cpp @@ -41,6 +41,21 @@ namespace { static_assert(std::is_same_v, ratio<2>>, ratio<1, 16>>); static_assert(std::is_same_v, ratio<3>>, ratio<2>>); + static_assert(std::is_same_v, 0>, ratio<1>>); + static_assert(std::is_same_v, 1>, ratio<2>>); + static_assert(std::is_same_v, 2>, ratio<4>>); + static_assert(std::is_same_v, 3>, ratio<8>>); + static_assert(std::is_same_v, 0>, ratio<1>>); + static_assert(std::is_same_v, 1>, ratio<1, 2>>); + static_assert(std::is_same_v, 2>, ratio<1, 4>>); + static_assert(std::is_same_v, 3>, ratio<1, 8>>); + + static_assert(std::is_same_v>, ratio<3>>); + static_assert(std::is_same_v>, ratio<2>>); + static_assert(std::is_same_v>, ratio<1>>); + static_assert(std::is_same_v>, ratio<0>>); + static_assert(std::is_same_v>, ratio<1, 2>>); + // common_ratio static_assert(std::is_same_v, ratio<1000>>, ratio<1>>);