From c2e5532ae21bfedb676eec227f6e097fd3f88e6c Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sun, 10 Nov 2019 00:16:41 +0000 Subject: [PATCH] Basic support for deduced units printing added --- src/include/units/dimension.h | 6 ++- src/include/units/dimensions/acceleration.h | 2 +- src/include/units/dimensions/area.h | 2 +- .../units/dimensions/electric_charge.h | 2 +- src/include/units/dimensions/force.h | 2 +- src/include/units/dimensions/frequency.h | 2 +- src/include/units/dimensions/power.h | 2 +- src/include/units/dimensions/velocity.h | 2 +- src/include/units/dimensions/voltage.h | 2 +- src/include/units/dimensions/volume.h | 2 +- src/include/units/unit.h | 46 +++++++++++++------ 11 files changed, 47 insertions(+), 23 deletions(-) diff --git a/src/include/units/dimension.h b/src/include/units/dimension.h index 7ac6f7b0..2ff0ca49 100644 --- a/src/include/units/dimension.h +++ b/src/include/units/dimension.h @@ -141,9 +141,13 @@ namespace units { struct dimension : downcast_base> {}; // same_dim - template + template + requires BaseDimension || Dimension inline constexpr bool same_dim = std::is_same_v; + template + inline constexpr bool same_dim = std::is_same_v>, typename D2::base_type>; + // dim_invert namespace detail { diff --git a/src/include/units/dimensions/acceleration.h b/src/include/units/dimensions/acceleration.h index de4f9d73..891ad786 100644 --- a/src/include/units/dimensions/acceleration.h +++ b/src/include/units/dimensions/acceleration.h @@ -26,7 +26,7 @@ namespace units { - struct acceleration : derived_dimension, exp> {}; + struct acceleration : derived_dimension, exp> {}; template concept Acceleration = QuantityOf; diff --git a/src/include/units/dimensions/area.h b/src/include/units/dimensions/area.h index b5d36938..1a8e8830 100644 --- a/src/include/units/dimensions/area.h +++ b/src/include/units/dimensions/area.h @@ -26,7 +26,7 @@ namespace units { - struct area : derived_dimension> {}; + struct area : derived_dimension> {}; template concept Area = QuantityOf; diff --git a/src/include/units/dimensions/electric_charge.h b/src/include/units/dimensions/electric_charge.h index 20586ef8..31cd410f 100644 --- a/src/include/units/dimensions/electric_charge.h +++ b/src/include/units/dimensions/electric_charge.h @@ -28,7 +28,7 @@ namespace units { - struct electric_charge : derived_dimension, exp> {}; + struct electric_charge : derived_dimension, exp> {}; template concept ElectricCharge = QuantityOf; diff --git a/src/include/units/dimensions/force.h b/src/include/units/dimensions/force.h index 798b3220..5ec11f3d 100644 --- a/src/include/units/dimensions/force.h +++ b/src/include/units/dimensions/force.h @@ -28,7 +28,7 @@ namespace units { - struct force : derived_dimension, exp> {}; + struct force : derived_dimension, exp> {}; template concept Force = QuantityOf; diff --git a/src/include/units/dimensions/frequency.h b/src/include/units/dimensions/frequency.h index ff01380f..3594a22b 100644 --- a/src/include/units/dimensions/frequency.h +++ b/src/include/units/dimensions/frequency.h @@ -28,7 +28,7 @@ namespace units { - struct frequency : derived_dimension> {}; + struct frequency : derived_dimension> {}; template concept Frequency = QuantityOf; diff --git a/src/include/units/dimensions/power.h b/src/include/units/dimensions/power.h index d83642da..afffb2d2 100644 --- a/src/include/units/dimensions/power.h +++ b/src/include/units/dimensions/power.h @@ -28,7 +28,7 @@ namespace units { - struct power : derived_dimension, exp> {}; + struct power : derived_dimension, exp> {}; template concept Power = QuantityOf; diff --git a/src/include/units/dimensions/velocity.h b/src/include/units/dimensions/velocity.h index 9b58a118..e583fba9 100644 --- a/src/include/units/dimensions/velocity.h +++ b/src/include/units/dimensions/velocity.h @@ -27,7 +27,7 @@ namespace units { - struct velocity : derived_dimension, exp> {}; + struct velocity : derived_dimension, exp> {}; template concept Velocity = QuantityOf; diff --git a/src/include/units/dimensions/voltage.h b/src/include/units/dimensions/voltage.h index b4581061..f862a873 100644 --- a/src/include/units/dimensions/voltage.h +++ b/src/include/units/dimensions/voltage.h @@ -30,7 +30,7 @@ namespace units { - struct voltage : derived_dimension, exp> {}; + struct voltage : derived_dimension, exp> {}; template concept Voltage = QuantityOf; diff --git a/src/include/units/dimensions/volume.h b/src/include/units/dimensions/volume.h index 3e2a55c3..bdd549d4 100644 --- a/src/include/units/dimensions/volume.h +++ b/src/include/units/dimensions/volume.h @@ -26,7 +26,7 @@ namespace units { - struct volume : derived_dimension> {}; + struct volume : derived_dimension> {}; template concept Volume = QuantityOf; diff --git a/src/include/units/unit.h b/src/include/units/unit.h index 218e80c8..62aa9f75 100644 --- a/src/include/units/unit.h +++ b/src/include/units/unit.h @@ -53,7 +53,7 @@ namespace units { std::is_empty_v && detail::is_unit>; - // make_derived_unit + // deduced_derived_unit namespace detail { @@ -110,7 +110,7 @@ namespace units { }; template - using make_derived_unit = unit::ratio>; + using deduced_derived_unit = unit::ratio>; } @@ -214,11 +214,11 @@ namespace units { } } - template + template constexpr auto exp_text() { // get calculation operator + symbol - const auto txt = operator_text() + E::dimension::symbol; + const auto txt = operator_text() + Symbol; if constexpr(E::den != 1) { // add root part return txt + basic_fixed_string("^(") + regular() + basic_fixed_string("/") + regular() + basic_fixed_string(")"); @@ -233,15 +233,35 @@ namespace units { } template - constexpr auto symbol_text_impl(dimension, std::index_sequence) + constexpr auto base_symbol_text_impl(dimension, std::index_sequence) { - return (exp_text() + ...); + return (exp_text() + ...); } template - constexpr auto symbol_text(dimension d) + constexpr auto base_symbol_text(dimension d) { - return symbol_text_impl<>(d, std::index_sequence_for()); + return base_symbol_text_impl(d, std::index_sequence_for()); + } + + template + constexpr auto exp_validate_and_text() + { + static_assert(same_dim); + return exp_text(); + } + + template + constexpr auto deduced_symbol_text_impl(dimension, std::index_sequence) + { + return (exp_validate_and_text() + ...); + } + + template + constexpr auto deduced_symbol_text(dimension d) + { + static_assert(sizeof...(Us) == sizeof...(Es), "`deduced_derived_unit` should get the same number of exponents as provided to `derived_dimension<>`"); + return deduced_symbol_text_impl(d, std::index_sequence_for()); } template @@ -263,7 +283,7 @@ namespace units { } else { // print as a ratio of a coherent unit + coherent unit dimensions and their exponents - return ratio_text() + symbol_text(dim{}); + return ratio_text() + base_symbol_text(dim{}); } } } @@ -281,7 +301,7 @@ namespace units { template struct coherent_derived_unit : downcast_child>> { - static constexpr auto symbol = detail::symbol_text(Dim()); + static constexpr auto symbol = detail::base_symbol_text(Dim()); using prefix_type = no_prefix; }; @@ -292,14 +312,14 @@ namespace units { }; template - struct named_deduced_derived_unit : downcast_child> { + struct named_deduced_derived_unit : downcast_child> { static constexpr auto symbol = Symbol; using prefix_type = PT; }; template - struct deduced_derived_unit : downcast_child> { - static constexpr auto symbol = basic_fixed_string("bbb"); + struct deduced_derived_unit : downcast_child> { + static constexpr auto symbol = detail::deduced_symbol_text(Dim()); using prefix_type = no_prefix; };