From 979a00e7041b36368eb4c2c25b9a67bff08fb0f3 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 19 Dec 2022 20:35:22 +0100 Subject: [PATCH] fix: `get_canonical_unit()` fixed for powers of derived quantities --- src/core/include/units/unit.h | 42 ++++++++++++------- .../{isq-natural => natural}/CMakeLists.txt | 22 +++++----- .../include/units}/natural/acceleration.h | 0 .../include/units}/natural/constants.h | 0 .../include/units}/natural/energy.h | 0 .../include/units}/natural/force.h | 0 .../include/units}/natural/length.h | 0 .../include/units}/natural/mass.h | 0 .../include/units}/natural/momentum.h | 0 .../include/units}/natural/natural.h | 0 .../include/units}/natural/speed.h | 0 .../include/units}/natural/time.h | 0 .../include/units}/natural/units.h | 0 13 files changed, 39 insertions(+), 25 deletions(-) rename src/systems/{isq-natural => natural}/CMakeLists.txt (72%) rename src/systems/{isq-natural/include/units/isq => natural/include/units}/natural/acceleration.h (100%) rename src/systems/{isq-natural/include/units/isq => natural/include/units}/natural/constants.h (100%) rename src/systems/{isq-natural/include/units/isq => natural/include/units}/natural/energy.h (100%) rename src/systems/{isq-natural/include/units/isq => natural/include/units}/natural/force.h (100%) rename src/systems/{isq-natural/include/units/isq => natural/include/units}/natural/length.h (100%) rename src/systems/{isq-natural/include/units/isq => natural/include/units}/natural/mass.h (100%) rename src/systems/{isq-natural/include/units/isq => natural/include/units}/natural/momentum.h (100%) rename src/systems/{isq-natural/include/units/isq => natural/include/units}/natural/natural.h (100%) rename src/systems/{isq-natural/include/units/isq => natural/include/units}/natural/speed.h (100%) rename src/systems/{isq-natural/include/units/isq => natural/include/units}/natural/time.h (100%) rename src/systems/{isq-natural/include/units/isq => natural/include/units}/natural/units.h (100%) diff --git a/src/core/include/units/unit.h b/src/core/include/units/unit.h index ea2a3e2d..89f279ba 100644 --- a/src/core/include/units/unit.h +++ b/src/core/include/units/unit.h @@ -479,29 +479,43 @@ template return get_canonical_unit_impl(U, U); } +template +[[nodiscard]] consteval auto get_canonical_unit_impl(const power&, const type_list&) +{ + auto mag = (units::mag<1> * ... * pow(get_canonical_unit_impl(Us{}, Us{}).mag)); + auto u = (one * ... * pow(get_canonical_unit_impl(Us{}, Us{}).reference_unit)); + return canonical_unit{mag, u}; +} + template [[nodiscard]] consteval auto get_canonical_unit_impl(T, const power&) { auto base = get_canonical_unit_impl(F{}, F{}); - return canonical_unit{ - pow::exponent>(base.mag), - derived_unit, power::exponent>>{}}; + if constexpr (requires { typename decltype(base.reference_unit)::_num_; }) { + auto num = get_canonical_unit_impl(power{}, typename decltype(base.reference_unit)::_num_{}); + auto den = get_canonical_unit_impl(power{}, typename decltype(base.reference_unit)::_den_{}); + return canonical_unit{pow::exponent>(base.mag) * num.mag / den.mag, + num.reference_unit / den.reference_unit}; + } else { + return canonical_unit{pow::exponent>(base.mag), + derived_unit, Num, Den...>>{}}; + } +} + +template +[[nodiscard]] consteval auto get_canonical_unit_impl(const type_list&) +{ + auto mag = (units::mag<1> * ... * get_canonical_unit_impl(Us{}, Us{}).mag); + auto u = (one * ... * get_canonical_unit_impl(Us{}, Us{}).reference_unit); + return canonical_unit{mag, u}; } template [[nodiscard]] consteval auto get_canonical_unit_impl(T, const derived_unit&) { - if constexpr (type_list_size::_den_> != 0) { - using num_type = type_list_map::_num_, derived_unit>; - using den_type = type_list_map::_den_, derived_unit>; - auto num = get_canonical_unit_impl(num_type{}, num_type{}); - auto den = get_canonical_unit_impl(den_type{}, den_type{}); - return canonical_unit{num.mag / den.mag, num.reference_unit / den.reference_unit}; - } else { - auto num = (one * ... * get_canonical_unit_impl(Us{}, Us{}).reference_unit); - auto mag = (units::mag<1> * ... * get_canonical_unit_impl(Us{}, Us{}).mag); - return canonical_unit{mag, num}; - } + auto num = get_canonical_unit_impl(typename derived_unit::_num_{}); + auto den = get_canonical_unit_impl(typename derived_unit::_den_{}); + return canonical_unit{num.mag / den.mag, num.reference_unit / den.reference_unit}; } [[nodiscard]] consteval auto get_canonical_unit(Unit auto u) { return get_canonical_unit_impl(u, u); } diff --git a/src/systems/isq-natural/CMakeLists.txt b/src/systems/natural/CMakeLists.txt similarity index 72% rename from src/systems/isq-natural/CMakeLists.txt rename to src/systems/natural/CMakeLists.txt index e968bdff..f48268bc 100644 --- a/src/systems/isq-natural/CMakeLists.txt +++ b/src/systems/natural/CMakeLists.txt @@ -23,17 +23,17 @@ cmake_minimum_required(VERSION 3.19) add_units_module( - isq-natural + natural DEPENDENCIES mp-units::isq HEADERS include/units/isq/natural/acceleration.h - include/units/isq/natural/constants.h - include/units/isq/natural/energy.h - include/units/isq/natural/force.h - include/units/isq/natural/length.h - include/units/isq/natural/mass.h - include/units/isq/natural/momentum.h - include/units/isq/natural/natural.h - include/units/isq/natural/speed.h - include/units/isq/natural/time.h - include/units/isq/natural/units.h + include/units/isq/natural/constants.h + include/units/isq/natural/energy.h + include/units/isq/natural/force.h + include/units/isq/natural/length.h + include/units/isq/natural/mass.h + include/units/isq/natural/momentum.h + include/units/isq/natural/natural.h + include/units/isq/natural/speed.h + include/units/isq/natural/time.h + include/units/isq/natural/units.h ) diff --git a/src/systems/isq-natural/include/units/isq/natural/acceleration.h b/src/systems/natural/include/units/natural/acceleration.h similarity index 100% rename from src/systems/isq-natural/include/units/isq/natural/acceleration.h rename to src/systems/natural/include/units/natural/acceleration.h diff --git a/src/systems/isq-natural/include/units/isq/natural/constants.h b/src/systems/natural/include/units/natural/constants.h similarity index 100% rename from src/systems/isq-natural/include/units/isq/natural/constants.h rename to src/systems/natural/include/units/natural/constants.h diff --git a/src/systems/isq-natural/include/units/isq/natural/energy.h b/src/systems/natural/include/units/natural/energy.h similarity index 100% rename from src/systems/isq-natural/include/units/isq/natural/energy.h rename to src/systems/natural/include/units/natural/energy.h diff --git a/src/systems/isq-natural/include/units/isq/natural/force.h b/src/systems/natural/include/units/natural/force.h similarity index 100% rename from src/systems/isq-natural/include/units/isq/natural/force.h rename to src/systems/natural/include/units/natural/force.h diff --git a/src/systems/isq-natural/include/units/isq/natural/length.h b/src/systems/natural/include/units/natural/length.h similarity index 100% rename from src/systems/isq-natural/include/units/isq/natural/length.h rename to src/systems/natural/include/units/natural/length.h diff --git a/src/systems/isq-natural/include/units/isq/natural/mass.h b/src/systems/natural/include/units/natural/mass.h similarity index 100% rename from src/systems/isq-natural/include/units/isq/natural/mass.h rename to src/systems/natural/include/units/natural/mass.h diff --git a/src/systems/isq-natural/include/units/isq/natural/momentum.h b/src/systems/natural/include/units/natural/momentum.h similarity index 100% rename from src/systems/isq-natural/include/units/isq/natural/momentum.h rename to src/systems/natural/include/units/natural/momentum.h diff --git a/src/systems/isq-natural/include/units/isq/natural/natural.h b/src/systems/natural/include/units/natural/natural.h similarity index 100% rename from src/systems/isq-natural/include/units/isq/natural/natural.h rename to src/systems/natural/include/units/natural/natural.h diff --git a/src/systems/isq-natural/include/units/isq/natural/speed.h b/src/systems/natural/include/units/natural/speed.h similarity index 100% rename from src/systems/isq-natural/include/units/isq/natural/speed.h rename to src/systems/natural/include/units/natural/speed.h diff --git a/src/systems/isq-natural/include/units/isq/natural/time.h b/src/systems/natural/include/units/natural/time.h similarity index 100% rename from src/systems/isq-natural/include/units/isq/natural/time.h rename to src/systems/natural/include/units/natural/time.h diff --git a/src/systems/isq-natural/include/units/isq/natural/units.h b/src/systems/natural/include/units/natural/units.h similarity index 100% rename from src/systems/isq-natural/include/units/isq/natural/units.h rename to src/systems/natural/include/units/natural/units.h