From 563b358d5e35c9650f6eb5aee42f8638d325fe49 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 8 Sep 2020 11:02:16 +0200 Subject: [PATCH] feat!: :boom: dimensionless quantities refactored Dimensionless quantities are now represented by quantity types rather than by plain representation types. Only dimensionless quantities with `unitless` unit are implicitly convertible from representation types. `units::exp()` now is a function doing std::exp() on a representation type (previous `units::exp` class template was renamed to `units::exponent`). BREAKING_CHANGE: gcc-9.3 support removed BREAKING_CHANGE: `exp` and `Exp` renamed to `exponent` and `Exponent` Resolves #27 Resolves #42 --- docs/CHANGELOG.md | 2 + docs/_static/img/concepts.png | Bin 27339 -> 27818 bytes docs/_static/img/downcast_1.png | Bin 10899 -> 10416 bytes docs/_static/img/downcast_2.png | Bin 32810 -> 33103 bytes docs/design/downcasting.rst | 22 +- docs/faq.rst | 8 - docs/framework/basic_concepts.rst | 6 +- docs/framework/dimensions.rst | 8 +- docs/framework/units.rst | 28 +- docs/reference/core/concepts.rst | 2 +- docs/reference/core/types/dimensions.rst | 2 +- docs/use_cases/extensions.rst | 5 +- docs/use_cases/unknown_dimensions.rst | 2 +- example/CMakeLists.txt | 2 +- .../capacitor_time_curve.cpp | 4 +- example/capacitor_time_curve.cpp | 4 +- example/glide_computer.cpp | 76 +++--- src/include/units/bits/base_units_ratio.h | 4 +- src/include/units/bits/deduced_symbol_text.h | 2 +- .../units/bits/derived_dimension_base.h | 17 +- src/include/units/bits/dim_consolidate.h | 6 +- src/include/units/bits/dim_unpack.h | 12 +- src/include/units/bits/dimension_op.h | 27 +- src/include/units/bits/to_string.h | 41 ++- src/include/units/concepts.h | 10 +- src/include/units/data/bitrate.h | 2 +- src/include/units/derived_dimension.h | 11 +- src/include/units/dimensionless.h | 46 ++++ src/include/units/{exp.h => exponent.h} | 10 +- src/include/units/math.h | 15 +- src/include/units/physical/dimensions.h | 80 +++--- src/include/units/quantity.h | 250 +++++++++--------- src/include/units/quantity_cast.h | 12 +- .../make_dimension/concepts_all.cpp.erb | 2 +- .../make_dimension/concepts_iface.cpp.erb | 2 +- .../make_dimension/dimension_concepts_all.h | 20 +- .../make_dimension/dimension_concepts_iface.h | 20 +- .../make_dimension/dimension_no_concepts.h | 12 +- .../make_dimension/no_concepts.cpp.erb | 2 +- test/unit_test/runtime/fmt_test.cpp | 74 +++++- test/unit_test/runtime/math_test.cpp | 4 + test/unit_test/static/custom_unit_test.cpp | 6 +- test/unit_test/static/dimension_op_test.cpp | 82 +++--- test/unit_test/static/quantity_test.cpp | 58 +++- test/unit_test/static/si_test.cpp | 7 +- test/unit_test/static/type_list_test.cpp | 14 +- test/unit_test/static/unit_test.cpp | 2 +- 47 files changed, 599 insertions(+), 422 deletions(-) create mode 100644 src/include/units/dimensionless.h rename src/include/units/{exp.h => exponent.h} (91%) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a667f22c..532abc63 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -15,6 +15,8 @@ - FPS system added (thanks [@mikeford3](https://github.com/mikeford3)) - `quantity_point` support added (thanks [@johelegp](https://github.com/johelegp)) - `ratio` changed to the NTTP kind + - `exp` and `Exp` renamed to `exponent` and `Exponent` + - Added support for `exp()` mathematical support - **0.5.0 May 17, 2020** - Major refactoring and rewrite of the library diff --git a/docs/_static/img/concepts.png b/docs/_static/img/concepts.png index 256bbd4af7aeada85fed4fdbfcf5b00d6a8c9698..fd9fd8162a7aff4012cac26617bcbf9ee8fa4751 100644 GIT binary patch literal 27818 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 diff --git a/docs/_static/img/downcast_1.png b/docs/_static/img/downcast_1.png index d8eaa468d26224b69aedebcc616a6bb83768058c..203d90397b3ee4896dcbe7f5dae47b8364614f8d 100644 GIT binary patch literal 10416 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 Iol`;+08|+EIRF3v literal 10899 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 RT|%HWr=G5UF6*2Ung9V^#18-f diff --git a/docs/_static/img/downcast_2.png b/docs/_static/img/downcast_2.png index 8a37faabbbec6aede29fbabc22807ef89a5a5d0b..94729025f831438fce7aee9da36f2d1922094951 100644 GIT binary patch literal 33103 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 DiTRY6 literal 32810 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 E0J)D~F#rGn diff --git a/docs/design/downcasting.rst b/docs/design/downcasting.rst index e5173482..37775459 100644 --- a/docs/design/downcasting.rst +++ b/docs/design/downcasting.rst @@ -14,18 +14,18 @@ The same can be observed during debugging of a source code that use template ali Let's assume that we want to provide a user friendly name for a derived dimension of capacitance quantity. Other libraries will do it in the following way:: - using dim_capacitance = detail::derived_dimension_base, - exp, - exp, - exp>; + using dim_capacitance = detail::derived_dimension_base, + exponent, + exponent, + exponent>; The above solution does provide a good developer's experience but a really poor one for the end user. If we will get a compilation error message containing `dim_capacitance` in most cases the compiler will print the following type instead of the alias:: - units::detail::derived_dimension_base, - units::exp, units::exp, - units::exp > + units::detail::derived_dimension_base, + units::exponent, units::exponent, units::exponent > You can notice that in case of **mp-units** even this long syntax was carefully selected to provide quite good user experience (some other units libraries produce a type that cannot easily @@ -48,7 +48,7 @@ to use inheritance: .. http://www.nomnoml.com - [derived_dimension_base>]<:-[dim_area] + [derived_dimension_base>]<:-[dim_area] This gives us a nice looking strong type when directly used by the user. However, we just got ourselves into problems. The library's framework does not know how to switch from a long @@ -79,9 +79,9 @@ The downcasting facility is provided by injecting two classes into our hierarchy .. http://www.nomnoml.com - [downcast_base>>]<:-[detail::derived_dimension_base>] - [detail::derived_dimension_base>]<:-[downcast_child>>] - [downcast_child>>]<:-[dim_area] + [downcast_base>>]<:-[detail::derived_dimension_base>] + [detail::derived_dimension_base>]<:-[downcast_child>>] + [downcast_child>>]<:-[dim_area] In the above example: diff --git a/docs/faq.rst b/docs/faq.rst index 5b1e8d64..12c8b5ec 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -97,14 +97,6 @@ Unfortunately, if `using-directives `_ function. In such a case the library's `time` function needs to be prefixed with at least one (or all) namespace names. -error: template argument 1 is invalid -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Again, usage of ``using namespace units`` -`using-directive `_ may result in -the collision between `units::exp` class template and C `exp `_ -function. In such a case the library's `exp` class template needs to be prefixed with `units` namespace name. - diff --git a/docs/framework/basic_concepts.rst b/docs/framework/basic_concepts.rst index 5406f90a..1ba4171b 100644 --- a/docs/framework/basic_concepts.rst +++ b/docs/framework/basic_concepts.rst @@ -13,9 +13,9 @@ The most important concepts in the library are `Unit`, `Dimension`, http://www.nomnoml.com [Dimension| - [base_dimension]<-[exp] - [derived_dimension]<-[exp] - [exp]<-[derived_dimension] + [base_dimension]<-[exponent] + [derived_dimension]<-[exponent] + [exponent]<-[derived_dimension] ] [Quantity| diff --git a/docs/framework/dimensions.rst b/docs/framework/dimensions.rst index 6185c939..b60c679c 100644 --- a/docs/framework/dimensions.rst +++ b/docs/framework/dimensions.rst @@ -147,9 +147,9 @@ The above dimensions can be defined in the library with the namespace si { struct dim_area : derived_dimension> {}; + exponent> {}; struct dim_speed : derived_dimension, exp> {}; + exponent, exponent> {}; } @@ -179,9 +179,9 @@ matter. Even if we define the above as: namespace si { struct dim_area : derived_dimension, exp> {}; + exponent, exponent> {}; struct dim_speed : derived_dimension, exp> {}; + exponent, exponent> {}; } diff --git a/docs/framework/units.rst b/docs/framework/units.rst index a10586f4..3faac996 100644 --- a/docs/framework/units.rst +++ b/docs/framework/units.rst @@ -120,17 +120,17 @@ will result in a different unnamed unit symbol: :emphasize-lines: 2-4, 6-8, 10-12 struct dim_momentum : derived_dimension, - exp, - exp> {}; // kg ⋅ m/s + exponent, + exponent, + exponent> {}; // kg ⋅ m/s struct dim_momentum : derived_dimension, - exp, - exp> {}; // m ⋅ kg/s + exponent, + exponent, + exponent> {}; // m ⋅ kg/s struct dim_momentum : derived_dimension, - exp, - exp> {}; // 1/s ⋅ m ⋅ kg + exponent, + exponent, + exponent> {}; // 1/s ⋅ m ⋅ kg where ``kilogram_metre_per_second`` is defined as:: @@ -143,8 +143,8 @@ However, the easiest way to define momentum is just to use the :emphasize-lines: 3 struct dim_momentum : derived_dimension, - exp> {}; // kg ⋅ m/s + exponent, + exponent> {}; // kg ⋅ m/s In such a case the library will do its magic and will automatically unpack a provided derived dimension to its base dimensions in order to @@ -161,8 +161,8 @@ of ``N/m``): :emphasize-lines: 2 struct dim_surface_tension : derived_dimension, - exp> {}; // N/m + exponent, + exponent> {}; // N/m If we defined the above in terms of base units we would end up with a ``kg/s²`` derived unit symbol. @@ -194,7 +194,7 @@ where `no_prefix` is a special tag type describing that the library should not allow to define a new prefixed unit that would use this unit as a reference ("kilohours" does not have much sense, right?). The `ratio` type used in the definition is really similar to ``std::ratio`` but it takes -an additional ``Exp`` template parameter that defines the exponent of the ratio. +an additional ``Exponent`` template parameter that defines the exponent of the ratio. Another important difference is the fact that the objects of that class are used as class NTTPs rather then a type template parameter kind. diff --git a/docs/reference/core/concepts.rst b/docs/reference/core/concepts.rst index 79e8367d..09fe5b60 100644 --- a/docs/reference/core/concepts.rst +++ b/docs/reference/core/concepts.rst @@ -27,7 +27,7 @@ Concepts .. concept:: template Exponent - A concept matching dimension's exponents. Satisfied by all instantiations of :class:`exp`. + A concept matching dimension's exponents. Satisfied by all instantiations of :class:`exponent`. .. concept:: template DerivedDimension diff --git a/docs/reference/core/types/dimensions.rst b/docs/reference/core/types/dimensions.rst index b7bfe170..2592ac4b 100644 --- a/docs/reference/core/types/dimensions.rst +++ b/docs/reference/core/types/dimensions.rst @@ -4,7 +4,7 @@ Dimensions .. doxygenstruct:: units::base_dimension :members: -.. doxygenstruct:: units::exp +.. doxygenstruct:: units::exponent :members: .. doxygenstruct:: units::derived_dimension diff --git a/docs/use_cases/extensions.rst b/docs/use_cases/extensions.rst index 219a049d..52ca9ffd 100644 --- a/docs/use_cases/extensions.rst +++ b/docs/use_cases/extensions.rst @@ -115,7 +115,7 @@ coherent unit:: // new derived dimensions struct dim_desk_rate : derived_dimension, exp> {}; + exponent, exponent> {}; // our unit of interest for a new derived dimension struct desk_per_hour : deduced_unit {}; @@ -164,7 +164,8 @@ With the above we can now define a new derived dimension:: struct person_per_square_metre : unit {}; struct dim_occupancy_rate : derived_dimension, exp> {}; + exponent, + exponent> {}; struct person_per_desk : deduced_unit {}; diff --git a/docs/use_cases/unknown_dimensions.rst b/docs/use_cases/unknown_dimensions.rst index 3456358e..c71ea45b 100644 --- a/docs/use_cases/unknown_dimensions.rst +++ b/docs/use_cases/unknown_dimensions.rst @@ -46,7 +46,7 @@ we forget to include a header file with the resulting dimension definition: constexpr auto result = 144q_km / 2q_h; static_assert(is_same_v, exp>>); + unknown_dimension, exponent>>); static_assert(is_same_v>); diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 3a2d15ee..afe0cd50 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -33,7 +33,6 @@ add_example(clcpp_response) add_example(conversion_factor) add_example(experimental_angle) add_example(foot_pound_second) -add_example(glide_computer) add_example(kalman_filter-alpha_beta_filter_example2) conan_check_testing(linear_algebra) @@ -51,6 +50,7 @@ if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") # TODO Those examples use Concepts terse syntax not yet supported by MSVC add_example(avg_speed) +add_example(glide_computer) add_example(hello_units) add_example(total_energy) diff --git a/example/alternative_namespaces/capacitor_time_curve.cpp b/example/alternative_namespaces/capacitor_time_curve.cpp index 8ff58195..e62a1408 100644 --- a/example/alternative_namespaces/capacitor_time_curve.cpp +++ b/example/alternative_namespaces/capacitor_time_curve.cpp @@ -23,8 +23,8 @@ #include #include #include +#include #include "./voltage.h" -#include #include using namespace units::experimental; @@ -41,7 +41,7 @@ int main() constexpr auto R = 4.7q_kR; for (auto t = 0q_ms; t <= 50q_ms; ++t) { - const auto Vt = V0 * std::exp(-t / (R * C)); + const auto Vt = V0 * units::exp(-t / (R * C)); std::cout << "at " << t << " voltage is "; diff --git a/example/capacitor_time_curve.cpp b/example/capacitor_time_curve.cpp index 04186e78..cdfa9fc1 100644 --- a/example/capacitor_time_curve.cpp +++ b/example/capacitor_time_curve.cpp @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include int main() @@ -41,7 +41,7 @@ int main() constexpr auto R = 4.7q_kR; for (auto t = 0q_ms; t <= 50q_ms; ++t) { - const Voltage AUTO Vt = V0 * std::exp(-t / (R * C)); + const Voltage AUTO Vt = V0 * units::exp(-t / (R * C)); std::cout << "at " << t << " voltage is "; diff --git a/example/glide_computer.cpp b/example/glide_computer.cpp index 771ce780..b35dacec 100644 --- a/example/glide_computer.cpp +++ b/example/glide_computer.cpp @@ -46,6 +46,7 @@ template requires Quantity || QuantityPoint class vector { public: + using value_type = Q; using magnitude_type = Q; static constexpr direction dir = D; @@ -74,6 +75,43 @@ public: return *this; } + template + [[nodiscard]] friend constexpr auto operator+(const vector& lhs, const vector& rhs) + requires requires { lhs.magnitude() + rhs.magnitude(); } + { + using ret_type = decltype(lhs.magnitude() + rhs.magnitude()); + return vector(lhs.magnitude() + rhs.magnitude()); + } + + template + [[nodiscard]] friend constexpr auto operator-(const vector& lhs, const vector& rhs) + requires requires { lhs.magnitude() - rhs.magnitude(); } + { + using ret_type = decltype(lhs.magnitude() - rhs.magnitude()); + return vector(lhs.magnitude() - rhs.magnitude()); + } + + template + [[nodiscard]] friend constexpr auto operator*(const vector& lhs, const V& value) + requires (Scalar || Dimensionless) && requires { lhs.magnitude() * value; } + { + return vector(lhs.magnitude() * value); + } + + template + [[nodiscard]] friend constexpr auto operator*(const V& value, const vector& rhs) + requires (Scalar || Dimensionless) && requires { value * rhs.magnitude(); } + { + return vector(value * rhs.magnitude()); + } + + template + [[nodiscard]] friend constexpr auto operator/(const vector& lhs, const vector& rhs) + requires requires { lhs.magnitude() / rhs.magnitude(); } + { + return lhs.magnitude() / rhs.magnitude(); + } + #if COMP_MSVC || COMP_GCC >= 10 template @@ -149,42 +187,6 @@ private: Q magnitude_{}; }; -template -[[nodiscard]] constexpr auto operator+(const vector& lhs, const vector& rhs) - requires requires { lhs.magnitude() + rhs.magnitude(); } -{ - using ret_type = decltype(lhs.magnitude() + rhs.magnitude()); - return vector(lhs.magnitude() + rhs.magnitude()); -} - -template -[[nodiscard]] constexpr auto operator-(const vector& lhs, const vector& rhs) - requires requires { lhs.magnitude() - rhs.magnitude(); } -{ - using ret_type = decltype(lhs.magnitude() - rhs.magnitude()); - return vector(lhs.magnitude() - rhs.magnitude()); -} - -template -[[nodiscard]] constexpr auto operator*(const vector& lhs, const V& value) - requires requires { lhs.magnitude() * value; } -{ - return vector(lhs.magnitude() * value); -} - -template -[[nodiscard]] constexpr auto operator*(const V& value, const vector& rhs) - requires requires { value * rhs.magnitude(); } -{ - return vector(value * rhs.magnitude()); -} - -template -[[nodiscard]] constexpr auto operator/(const vector& lhs, const vector& rhs) - requires requires { lhs.magnitude() / rhs.magnitude(); } -{ - return lhs.magnitude() / rhs.magnitude(); -} template inline constexpr bool is_vector = false; @@ -276,7 +278,7 @@ auto get_gliders() return gliders; } -constexpr double glide_ratio(const glider::polar_point& polar) +constexpr Dimensionless AUTO glide_ratio(const glider::polar_point& polar) { return polar.v / -polar.climb; } diff --git a/src/include/units/bits/base_units_ratio.h b/src/include/units/bits/base_units_ratio.h index c8aa2855..5d9cba92 100644 --- a/src/include/units/bits/base_units_ratio.h +++ b/src/include/units/bits/base_units_ratio.h @@ -23,7 +23,7 @@ #pragma once #include -#include +#include #include namespace units::detail { @@ -45,7 +45,7 @@ constexpr ratio exp_ratio() template constexpr ratio base_units_ratio(exp_list) { - return (exp_ratio() * ...); + return (exp_ratio() * ... * ratio(1)); } } // namespace units::detail diff --git a/src/include/units/bits/deduced_symbol_text.h b/src/include/units/bits/deduced_symbol_text.h index 38b071c0..b16d0f3b 100644 --- a/src/include/units/bits/deduced_symbol_text.h +++ b/src/include/units/bits/deduced_symbol_text.h @@ -77,7 +77,7 @@ constexpr auto exp_text() } template -inline constexpr int negative_exp_count = ((Es::num < 0 ? 1 : 0) + ...); +inline constexpr int negative_exp_count = ((Es::num < 0 ? 1 : 0) + ... + 0); template constexpr auto deduced_symbol_text(exp_list, std::index_sequence) diff --git a/src/include/units/bits/derived_dimension_base.h b/src/include/units/bits/derived_dimension_base.h index 71fdcc1b..74f8fa25 100644 --- a/src/include/units/bits/derived_dimension_base.h +++ b/src/include/units/bits/derived_dimension_base.h @@ -24,7 +24,7 @@ #include #include -#include +#include namespace units::detail { @@ -35,19 +35,18 @@ namespace units::detail { * quantities as a product of powers of factors corresponding to the base quantities, omitting any numerical factors. * A power of a factor is the factor raised to an exponent. * - * A derived dimension can be formed from multiple exponents (i.e. speed is represented as "exp, exp"). + * A derived dimension can be formed from multiple exponents (i.e. speed is represented as "exponent, exponent"). * It is also possible to form a derived dimension with only one exponent (i.e. frequency is represented as just - * "exp"). + * "exponent"). * * @note This class template is used by the library engine and should not be directly instantiated by the user. * - * @tparam E a first exponent of a derived dimension - * @tparam ERest zero or more following exponents of a derived dimension + * @tparam Es zero or more exponents of a derived dimension */ -template - requires (BaseDimension && ... && BaseDimension) -struct derived_dimension_base : downcast_base> { - using exponents = exp_list; +template + requires (BaseDimension && ...) +struct derived_dimension_base : downcast_base> { + using exponents = exp_list; }; template diff --git a/src/include/units/bits/dim_consolidate.h b/src/include/units/bits/dim_consolidate.h index aba1a706..fb3f11c5 100644 --- a/src/include/units/bits/dim_consolidate.h +++ b/src/include/units/bits/dim_consolidate.h @@ -23,7 +23,7 @@ #pragma once #include -#include +#include #include // TODO remove this dependency with #11 namespace units::detail { @@ -55,13 +55,13 @@ struct dim_consolidate> { }; template -struct dim_consolidate, exp, ERest...>> { +struct dim_consolidate, exponent, ERest...>> { // TODO: we have ration_add now, but dim_consolidate etc, now need to cope with our new ratio using r1 = std::ratio; using r2 = std::ratio; using r = std::ratio_add; using type = conditional>::type, - typename dim_consolidate, ERest...>>::type>; + typename dim_consolidate, ERest...>>::type>; }; } // namespace units::detail diff --git a/src/include/units/bits/dim_unpack.h b/src/include/units/bits/dim_unpack.h index fe9c6fd4..f9df5ee3 100644 --- a/src/include/units/bits/dim_unpack.h +++ b/src/include/units/bits/dim_unpack.h @@ -24,7 +24,7 @@ #include #include -#include +#include namespace units::detail { @@ -42,17 +42,17 @@ struct dim_unpack<> { }; template -struct dim_unpack, ERest...> { - using type = type_list_push_front::type, exp>; +struct dim_unpack, ERest...> { + using type = type_list_push_front::type, exponent>; }; template -struct dim_unpack, ERest...> { - using type = TYPENAME dim_unpack, Num, Den>, ERest...>::type; +struct dim_unpack, ERest...> { + using type = TYPENAME dim_unpack, Num, Den>, ERest...>::type; }; template -struct dim_unpack, Num, Den>, ERest...> { +struct dim_unpack, Num, Den>, ERest...> { using type = type_list_push_front::type, exp_multiply...>; }; diff --git a/src/include/units/bits/dimension_op.h b/src/include/units/bits/dimension_op.h index 325fcef1..a5fc0889 100644 --- a/src/include/units/bits/dimension_op.h +++ b/src/include/units/bits/dimension_op.h @@ -44,7 +44,7 @@ template struct equivalent_exp : std::false_type {}; template -struct equivalent_exp, exp> : equivalent_dim_impl {}; +struct equivalent_exp, exponent> : equivalent_dim_impl {}; template struct equivalent_derived_dim : std::false_type {}; @@ -68,11 +68,10 @@ inline constexpr bool equivalent_dim = detail::equivalent_dim_impl::valu * dimension. In such a case an `unknown_dimension` is created with a coherent unit of `unknown_coherent_unit` * and ratio(1). * - * @tparam E the list of exponents of ingredient dimensions - * @tparam ERest the list of exponents of ingredient dimensions + * @tparam Es the list of exponents of ingredient dimensions */ -template -struct unknown_dimension : derived_dimension, unknown_coherent_unit, E, ERest...> {}; +template +struct unknown_dimension : derived_dimension, unknown_coherent_unit, Es...> {}; namespace detail { @@ -113,11 +112,11 @@ struct dim_invert_impl; template struct dim_invert_impl { - using type = downcast_dimension>>; + using type = downcast_dimension>>; }; template -struct dim_invert_impl>> { +struct dim_invert_impl>> { using type = D; }; @@ -147,7 +146,7 @@ struct to_dimension> { }; template -struct to_dimension>> { +struct to_dimension>> { using type = D; }; @@ -168,12 +167,12 @@ struct dimension_multiply_impl; template struct dimension_multiply_impl { - using type = downcast_dimension>, derived_dimension_base>>>; + using type = downcast_dimension>, derived_dimension_base>>>; }; template struct dimension_multiply_impl { - using type = downcast_dimension>, typename D2::downcast_base_type>>; + using type = downcast_dimension>, typename D2::downcast_base_type>>; }; template @@ -202,11 +201,11 @@ struct dimension_sqrt_impl; template struct dimension_sqrt_impl { - using type = downcast_dimension>>; + using type = downcast_dimension>>; }; template -struct dimension_sqrt_impl>> { +struct dimension_sqrt_impl>> { using type = D; }; @@ -233,7 +232,7 @@ struct dimension_pow_impl; template struct dimension_pow_impl { - using type = downcast_dimension>>; + using type = downcast_dimension>>; }; template @@ -242,7 +241,7 @@ struct dimension_pow_impl { }; template -struct dimension_pow_impl>, N> { +struct dimension_pow_impl>, N> { using type = D; }; diff --git a/src/include/units/bits/to_string.h b/src/include/units/bits/to_string.h index 76625011..f2047f5b 100644 --- a/src/include/units/bits/to_string.h +++ b/src/include/units/bits/to_string.h @@ -36,28 +36,28 @@ template constexpr auto ratio_text() { if constexpr(R.num == 1 && R.den == 1 && R.exp != 0) { - return base_multiplier + superscript() + basic_fixed_string(" "); + return base_multiplier + superscript(); } else if constexpr(R.num != 1 || R.den != 1 || R.exp != 0) { auto txt = basic_fixed_string("[") + regular(); if constexpr(R.den == 1) { if constexpr(R.exp == 0) { - return txt + basic_fixed_string("] "); + return txt + basic_fixed_string("]"); } else { return txt + " " + base_multiplier + superscript() + - basic_fixed_string("] "); + basic_fixed_string("]"); } } else { if constexpr(R.exp == 0) { return txt + basic_fixed_string("/") + regular() + - basic_fixed_string("] "); + basic_fixed_string("]"); } else { return txt + basic_fixed_string("/") + regular() + " " + base_multiplier + superscript() + - basic_fixed_string("] "); + basic_fixed_string("]"); } } } @@ -66,7 +66,7 @@ constexpr auto ratio_text() } } -template +template constexpr auto prefix_or_ratio_text() { if constexpr(R.num == 1 && R.den == 1 && R.exp == 0) { @@ -84,12 +84,20 @@ constexpr auto prefix_or_ratio_text() } else { // print as a ratio of the coherent unit - return ratio_text(); + constexpr auto txt = ratio_text(); + if constexpr(SymbolLen > 0 && txt.standard().size() > 0) + return txt + basic_fixed_string(" "); + else + return txt; } } else { // print as a ratio of the coherent unit - return ratio_text(); + constexpr auto txt = ratio_text(); + if constexpr(SymbolLen > 0 && txt.standard().size() > 0) + return txt + basic_fixed_string(" "); + else + return txt; } } } @@ -97,8 +105,7 @@ constexpr auto prefix_or_ratio_text() template constexpr auto derived_dimension_unit_text(exp_list, std::index_sequence) { - constexpr auto neg_exp = negative_exp_count; - return (exp_text::symbol, neg_exp, Idxs>() + ...); + return (exp_text::symbol, negative_exp_count, Idxs>() + ... + basic_symbol_text(basic_fixed_string(""))); } template @@ -129,6 +136,11 @@ constexpr auto exp_list_with_named_units(exp_list) return type_list_join(); } +constexpr auto exp_list_with_named_units(exp_list<> empty) +{ + return empty; +} + template constexpr auto derived_dimension_unit_text() { @@ -150,15 +162,18 @@ constexpr auto unit_text() else { // print as a prefix or ratio of a coherent unit using coherent_unit = dimension_unit; - auto prefix_txt = prefix_or_ratio_text(); if constexpr(has_symbol) { // use predefined coherent unit symbol - return prefix_txt + coherent_unit::symbol; + constexpr auto symbol_text = coherent_unit::symbol; + constexpr auto prefix_txt = prefix_or_ratio_text(); + return prefix_txt + symbol_text; } else { // use derived dimension ingredients to create a unit symbol - return prefix_txt + derived_dimension_unit_text(); + constexpr auto symbol_text = derived_dimension_unit_text(); + constexpr auto prefix_txt = prefix_or_ratio_text(); + return prefix_txt + symbol_text; } } } diff --git a/src/include/units/concepts.h b/src/include/units/concepts.h index 549c8742..1ec4e064 100644 --- a/src/include/units/concepts.h +++ b/src/include/units/concepts.h @@ -128,23 +128,23 @@ concept BaseDimension = detail::is_derived_from_base_dimension; namespace detail { template -inline constexpr bool is_exp = false; +inline constexpr bool is_exponent = false; } // namespace detail /** * @brief A concept matching dimension's exponents. * - * Satisfied by all specializations of :class:`exp`. + * Satisfied by all specializations of :class:`exponent`. */ template -concept Exponent = detail::is_exp; +concept Exponent = detail::is_exponent; // DerivedDimension namespace detail { -template - requires (BaseDimension && ... && BaseDimension) +template + requires (BaseDimension && ...) struct derived_dimension_base; } // namespace detail diff --git a/src/include/units/data/bitrate.h b/src/include/units/data/bitrate.h index fa2068af..13a3078d 100644 --- a/src/include/units/data/bitrate.h +++ b/src/include/units/data/bitrate.h @@ -30,7 +30,7 @@ namespace units::data { struct bit_per_second : unit {}; -struct dim_bitrate : derived_dimension, exp> {}; +struct dim_bitrate : derived_dimension, exponent> {}; struct kibibit_per_second : deduced_unit {}; struct mebibit_per_second : deduced_unit {}; diff --git a/src/include/units/derived_dimension.h b/src/include/units/derived_dimension.h index e622b63f..4fb281bf 100644 --- a/src/include/units/derived_dimension.h +++ b/src/include/units/derived_dimension.h @@ -29,7 +29,7 @@ #include #include #include -#include +#include namespace units { @@ -75,12 +75,11 @@ using make_dimension = TYPENAME to_derived_dimension_base -struct derived_dimension : downcast_child> { - using recipe = exp_list; +template +struct derived_dimension : downcast_child> { + using recipe = exp_list; using coherent_unit = U; static constexpr ratio base_units_ratio = detail::base_units_ratio(typename derived_dimension::exponents()); }; diff --git a/src/include/units/dimensionless.h b/src/include/units/dimensionless.h new file mode 100644 index 00000000..5228c63b --- /dev/null +++ b/src/include/units/dimensionless.h @@ -0,0 +1,46 @@ +// The MIT License (MIT) +// +// Copyright (c) 2018 Mateusz Pusz +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#pragma once + +#include + +namespace units { + +struct unitless : named_unit {}; +struct percent : named_scaled_unit {}; + +/** + * @brief Dimension one + * + * Dimension for which all the exponents of the factors corresponding to the base + * dimensions are zero. Also commonly named as "dimensionless". + */ +struct dim_one : derived_dimension {}; + +template +concept Dimensionless = QuantityOf; + +template +using dimensionless = quantity; + +} // namespace units diff --git a/src/include/units/exp.h b/src/include/units/exponent.h similarity index 91% rename from src/include/units/exp.h rename to src/include/units/exponent.h index 61cfe0d7..1a8b6185 100644 --- a/src/include/units/exp.h +++ b/src/include/units/exponent.h @@ -35,17 +35,17 @@ namespace units { * @tparam Den denominator of the factor */ template -struct exp { +struct exponent { using dimension = Dim; static constexpr int num = Num; static constexpr int den = Den; }; -// is_exp +// is_exponent namespace detail { template -inline constexpr bool is_exp> = true; +inline constexpr bool is_exponent> = true; } // namespace detail @@ -58,7 +58,7 @@ struct exp_less : base_dimension_less -constexpr exp exp_invert_impl(exp); +constexpr exponent exp_invert_impl(exponent); } // namespace detail @@ -71,7 +71,7 @@ namespace detail { template struct exp_multiply_impl { static constexpr ratio r = ratio(E::num, E::den) * ratio(Num, Den); - using type = exp; + using type = exponent; }; } // namespace detail diff --git a/src/include/units/math.h b/src/include/units/math.h index 4ef1f982..f528c1c1 100644 --- a/src/include/units/math.h +++ b/src/include/units/math.h @@ -79,6 +79,19 @@ inline Quantity AUTO sqrt(const Q& q) noexcept return quantity(static_cast(std::sqrt(q.count()))); } +/** + * @brief Computes Euler's raised to the given power + * + * @param q Quantity being the base of the operation + * @return Quantity The value of the same quantity type + */ +template +inline quantity exp(const quantity& q) +{ + using coherent_unit = dimension_unit; + return quantity_cast(quantity(std::exp(quantity_cast(q).count()))); +} + /** * @brief Computes the absolute value of a quantity * @@ -86,7 +99,7 @@ inline Quantity AUTO sqrt(const Q& q) noexcept * @return Quantity The absolute value of a provided quantity */ template -constexpr Quantity AUTO abs(const Q& q) noexcept +inline Quantity AUTO abs(const Q& q) noexcept requires requires { std::abs(q.count()); } { return Q(std::abs(q.count())); diff --git a/src/include/units/physical/dimensions.h b/src/include/units/physical/dimensions.h index 40e13b0b..f23859f5 100644 --- a/src/include/units/physical/dimensions.h +++ b/src/include/units/physical/dimensions.h @@ -65,126 +65,126 @@ struct dim_angle : base_dimension<"A", U> {}; template A, DimensionOf T> -struct dim_angular_velocity : derived_dimension, exp> {}; +struct dim_angular_velocity : derived_dimension, exponent> {}; template T> -struct dim_frequency : derived_dimension> {}; +struct dim_frequency : derived_dimension> {}; template L> -struct dim_area : derived_dimension> {}; +struct dim_area : derived_dimension> {}; template L> -struct dim_volume : derived_dimension> {}; +struct dim_volume : derived_dimension> {}; template L, DimensionOf T> -struct dim_speed : derived_dimension, exp> {}; +struct dim_speed : derived_dimension, exponent> {}; template L, DimensionOf T> -struct dim_acceleration : derived_dimension, exp> {}; +struct dim_acceleration : derived_dimension, exponent> {}; template M, DimensionOf A> -struct dim_force : derived_dimension, exp> {}; +struct dim_force : derived_dimension, exponent> {}; template M, DimensionOf V> -struct dim_momentum : derived_dimension, exp> {}; +struct dim_momentum : derived_dimension, exponent> {}; template F, DimensionOf L> -struct dim_energy : derived_dimension, exp> {}; +struct dim_energy : derived_dimension, exponent> {}; template E, DimensionOf A> -struct dim_torque : derived_dimension, exp> {}; +struct dim_torque : derived_dimension, exponent> {}; template M, DimensionOf L> -struct dim_density : derived_dimension, exp> {}; +struct dim_density : derived_dimension, exponent> {}; template E, DimensionOf T> -struct dim_power : derived_dimension, exp> {}; +struct dim_power : derived_dimension, exponent> {}; template P, DimensionOf C> -struct dim_voltage : derived_dimension, exp> {}; +struct dim_voltage : derived_dimension, exponent> {}; template V, DimensionOf C> -struct dim_resistance : derived_dimension, exp> {}; +struct dim_resistance : derived_dimension, exponent> {}; template T, DimensionOf C> -struct dim_electric_charge : derived_dimension, exp> {}; +struct dim_electric_charge : derived_dimension, exponent> {}; template C, DimensionOf V> -struct dim_capacitance : derived_dimension, exp> {}; +struct dim_capacitance : derived_dimension, exponent> {}; template F, DimensionOf L> -struct dim_surface_tension : derived_dimension, exp> {}; +struct dim_surface_tension : derived_dimension, exponent> {}; template F, DimensionOf A> -struct dim_pressure : derived_dimension, exp> {}; +struct dim_pressure : derived_dimension, exponent> {}; template V, DimensionOf T, DimensionOf L> -struct dim_magnetic_induction : derived_dimension, exp, exp> {}; +struct dim_magnetic_induction : derived_dimension, exponent, exponent> {}; template B, DimensionOf A> -struct dim_magnetic_flux : derived_dimension, exp> {}; +struct dim_magnetic_flux : derived_dimension, exponent> {}; template F, DimensionOf I> -struct dim_inductance : derived_dimension, exp> {}; +struct dim_inductance : derived_dimension, exponent> {}; template R> -struct dim_conductance : derived_dimension> {}; +struct dim_conductance : derived_dimension> {}; // TODO Add when downcasting issue is solved // template T> -// struct dim_radioactivity : derived_dimension> {}; +// struct dim_radioactivity : derived_dimension> {}; template T, DimensionOf M> -struct dim_catalytic_activity : derived_dimension, exp> {}; +struct dim_catalytic_activity : derived_dimension, exponent> {}; template E, DimensionOf M> -struct dim_absorbed_dose : derived_dimension, exp> {}; +struct dim_absorbed_dose : derived_dimension, exponent> {}; template I, DimensionOf L> -struct dim_current_density : derived_dimension, exp> {}; +struct dim_current_density : derived_dimension, exponent> {}; template M, DimensionOf L> -struct dim_concentration : derived_dimension, exp> {}; +struct dim_concentration : derived_dimension, exponent> {}; template I, DimensionOf L> -struct dim_luminance : derived_dimension, exp> {}; +struct dim_luminance : derived_dimension, exponent> {}; template P, DimensionOf T> -struct dim_dynamic_viscosity : derived_dimension, exp> {}; +struct dim_dynamic_viscosity : derived_dimension, exponent> {}; template E, DimensionOf T> -struct dim_heat_capacity : derived_dimension, exp> {}; +struct dim_heat_capacity : derived_dimension, exponent> {}; template C, DimensionOf M> -struct dim_specific_heat_capacity : derived_dimension, exp> {}; +struct dim_specific_heat_capacity : derived_dimension, exponent> {}; template C, DimensionOf M> -struct dim_molar_heat_capacity : derived_dimension, exp> {}; +struct dim_molar_heat_capacity : derived_dimension, exponent> {}; template P, DimensionOf L, DimensionOf T> -struct dim_thermal_conductivity : derived_dimension, exp, exp> {}; +struct dim_thermal_conductivity : derived_dimension, exponent, exponent> {}; // TODO Add when downcasting issue is solved // template E, DimensionOf L> -// struct dim_energy_density : derived_dimension, exp> {}; +// struct dim_energy_density : derived_dimension, exponent> {}; template V, DimensionOf L> -struct dim_electric_field_strength : derived_dimension, exp> {}; +struct dim_electric_field_strength : derived_dimension, exponent> {}; template Q, DimensionOf L> -struct dim_charge_density : derived_dimension, exp> {}; +struct dim_charge_density : derived_dimension, exponent> {}; template Q, DimensionOf L> -struct dim_surface_charge_density : derived_dimension, exp> {}; +struct dim_surface_charge_density : derived_dimension, exponent> {}; template C, DimensionOf L> -struct dim_permittivity : derived_dimension, exp> {}; +struct dim_permittivity : derived_dimension, exponent> {}; template H, DimensionOf L> -struct dim_permeability : derived_dimension, exp> {}; +struct dim_permeability : derived_dimension, exponent> {}; template E, DimensionOf M> -struct dim_molar_energy : derived_dimension, exp> {}; +struct dim_molar_energy : derived_dimension, exponent> {}; template concept Length = QuantityOf; diff --git a/src/include/units/quantity.h b/src/include/units/quantity.h index e9b5fa38..c7336543 100644 --- a/src/include/units/quantity.h +++ b/src/include/units/quantity.h @@ -27,6 +27,7 @@ #include #include #include +#include #include #if COMP_MSVC || COMP_GCC >= 10 @@ -76,7 +77,7 @@ public: template requires detail::safe_convertible - constexpr explicit quantity(const Value& v) : value_{static_cast(v)} {} + constexpr explicit(!(std::is_same_v && std::is_same_v)) quantity(const Value& v) : value_{static_cast(v)} {} template requires equivalent_dim && @@ -220,6 +221,123 @@ public: // Hidden Friends // Below friend functions are to be found via argument-dependent lookup only + + [[nodiscard]] friend constexpr quantity operator+(const quantity& lhs, const quantity& rhs) + requires std::regular_invocable, Rep, Rep> + { + return quantity(lhs.count() + rhs.count()); + } + + template + [[nodiscard]] friend constexpr Quantity AUTO operator+(const quantity& lhs, const quantity& rhs) + requires std::regular_invocable, Rep, Rep2> + { + using common_rep = decltype(lhs.count() + rhs.count()); + using ret = common_quantity, common_rep>; + return ret(ret(lhs).count() + ret(rhs).count()); + } + + [[nodiscard]] friend constexpr quantity operator-(const quantity& lhs, const quantity& rhs) + requires std::regular_invocable, Rep, Rep> + { + return quantity(lhs.count() - rhs.count()); + } + + template + [[nodiscard]] friend constexpr Quantity AUTO operator-(const quantity& lhs, const quantity& rhs) + requires std::regular_invocable, Rep, Rep2> + { + using common_rep = decltype(lhs.count() - rhs.count()); + using ret = common_quantity, common_rep>; + return ret(ret(lhs).count() - ret(rhs).count()); + } + + template + [[nodiscard]] friend constexpr Quantity AUTO operator*(const quantity& q, const Value& v) + requires std::regular_invocable, Rep, Value> + { + using common_rep = decltype(q.count() * v); + using ret = quantity; + return ret(q.count() * v); + } + + template + [[nodiscard]] friend constexpr Quantity AUTO operator*(const Value& v, const quantity& q) + requires std::regular_invocable, Value, Rep> + { + return q * v; + } + + template + [[nodiscard]] friend constexpr Quantity AUTO operator*(const quantity& lhs, const quantity& rhs) + requires std::regular_invocable, Rep, Rep2> + { + using dim = dimension_multiply; + using ret_unit = downcast_unit::ratio) * (U2::ratio / dimension_unit::ratio) * dimension_unit::ratio>; + using common_rep = decltype(lhs.count() * rhs.count()); + using ret = quantity; + return ret(lhs.count() * rhs.count()); + } + + template + [[nodiscard]] friend constexpr Quantity AUTO operator/(const Value& v, const quantity& q) + requires std::regular_invocable, Value, Rep> + { + Expects(q.count() != 0); + + using dim = dim_invert; + using ret_unit = downcast_unit; + using common_rep = decltype(v / q.count()); + using ret = quantity; + return ret(v / q.count()); + } + + template + [[nodiscard]] friend constexpr Quantity AUTO operator/(const quantity& q, const Value& v) + requires std::regular_invocable, Rep, Value> + { + Expects(v != Value{0}); + + using common_rep = decltype(q.count() / v); + using ret = quantity; + return ret(q.count() / v); + } + + template + [[nodiscard]] friend constexpr Quantity AUTO operator/(const quantity& lhs, const quantity& rhs) + requires std::regular_invocable, Rep, Rep2> + { + Expects(rhs.count() != 0); + + using common_rep = decltype(lhs.count() / rhs.count()); + using dim = dimension_divide; + using ret_unit = downcast_unit::ratio) / (U2::ratio / dimension_unit::ratio) * dimension_unit::ratio>; + using ret = quantity; + return ret(lhs.count() / rhs.count()); + } + + template + [[nodiscard]] friend constexpr Quantity AUTO operator%(const quantity& q, const Value& v) + requires (!treat_as_floating_point) && + (!treat_as_floating_point) && + std::regular_invocable, Rep, Value> + { + using common_rep = decltype(q.count() % v); + using ret = quantity; + return ret(q.count() % v); + } + + template + [[nodiscard]] friend constexpr Quantity AUTO operator%(const quantity& lhs, const quantity& rhs) + requires (!treat_as_floating_point) && + (!treat_as_floating_point) && + std::regular_invocable, Rep, Rep2> + { + using common_rep = decltype(lhs.count() % rhs.count()); + using ret = common_quantity, common_rep>; + return ret(ret(lhs).count() % ret(rhs).count()); + } + #if COMP_MSVC || COMP_GCC >= 10 template @@ -301,136 +419,6 @@ public: } }; -template -[[nodiscard]] constexpr Quantity AUTO operator+(const quantity& lhs, const quantity& rhs) - requires std::regular_invocable, Rep1, Rep2> -{ - using common_rep = decltype(lhs.count() + rhs.count()); - using ret = common_quantity, quantity, common_rep>; - return ret(ret(lhs).count() + ret(rhs).count()); -} - -template -[[nodiscard]] constexpr Quantity AUTO operator-(const quantity& lhs, const quantity& rhs) - requires std::regular_invocable, Rep1, Rep2> -{ - using common_rep = decltype(lhs.count() - rhs.count()); - using ret = common_quantity, quantity, common_rep>; - return ret(ret(lhs).count() - ret(rhs).count()); -} - -template -[[nodiscard]] constexpr Quantity AUTO operator*(const quantity& q, const Value& v) - requires std::regular_invocable, Rep, Value> -{ - using common_rep = decltype(q.count() * v); - using ret = quantity; - return ret(q.count() * v); -} - -template -[[nodiscard]] constexpr Quantity AUTO operator*(const Value& v, const quantity& q) - requires std::regular_invocable, Value, Rep> -{ - return q * v; -} - -template -[[nodiscard]] constexpr Scalar AUTO operator*(const quantity& lhs, const quantity& rhs) - requires std::regular_invocable, Rep1, Rep2> && - equivalent_dim> -{ - using common_rep = decltype(lhs.count() * rhs.count()); - const ratio r = U1::ratio * U2::ratio; - if constexpr (treat_as_floating_point) { - return lhs.count() * rhs.count() * static_cast(r.num * detail::fpow10(r.exp)) / static_cast(r.den); - } else { - return lhs.count() * rhs.count() * static_cast(r.num * detail::ipow10(r.exp)) / static_cast(r.den); - } -} - -template -[[nodiscard]] constexpr Quantity AUTO operator*(const quantity& lhs, const quantity& rhs) - requires std::regular_invocable, Rep1, Rep2> -{ - using dim = dimension_multiply; - using unit = downcast_unit::ratio) * (U2::ratio / dimension_unit::ratio) * dimension_unit::ratio>; - using common_rep = decltype(lhs.count() * rhs.count()); - using ret = quantity; - return ret(lhs.count() * rhs.count()); -} - -template -[[nodiscard]] constexpr Quantity AUTO operator/(const Value& v, const quantity& q) - requires std::regular_invocable, Value, Rep> -{ - Expects(q.count() != 0); - - using dim = dim_invert; - using unit = downcast_unit; - using common_rep = decltype(v / q.count()); - using ret = quantity; - return ret(v / q.count()); -} - -template -[[nodiscard]] constexpr Quantity AUTO operator/(const quantity& q, const Value& v) - requires std::regular_invocable, Rep, Value> -{ - Expects(v != Value{0}); - - using common_rep = decltype(q.count() / v); - using ret = quantity; - return ret(q.count() / v); -} - -template -[[nodiscard]] constexpr Scalar AUTO operator/(const quantity& lhs, const quantity& rhs) - requires std::regular_invocable, Rep1, Rep2> && - equivalent_dim -{ - Expects(rhs.count() != 0); - - using common_rep = decltype(lhs.count() / rhs.count()); - using cq = common_quantity, quantity, common_rep>; - return cq(lhs).count() / cq(rhs).count(); -} - -template -[[nodiscard]] constexpr Quantity AUTO operator/(const quantity& lhs, const quantity& rhs) - requires std::regular_invocable, Rep1, Rep2> -{ - Expects(rhs.count() != 0); - - using common_rep = decltype(lhs.count() / rhs.count()); - using dim = dimension_divide; - using unit = downcast_unit::ratio) / (U2::ratio / dimension_unit::ratio) * dimension_unit::ratio>; - using ret = quantity; - return ret(lhs.count() / rhs.count()); -} - -template -[[nodiscard]] constexpr Quantity AUTO operator%(const quantity& q, const Value& v) - requires (!treat_as_floating_point) && - (!treat_as_floating_point) && - std::regular_invocable, Rep, Value> -{ - using common_rep = decltype(q.count() % v); - using ret = quantity; - return ret(q.count() % v); -} - -template -[[nodiscard]] constexpr Quantity AUTO operator%(const quantity& lhs, const quantity& rhs) - requires (!treat_as_floating_point) && - (!treat_as_floating_point) && - std::regular_invocable, Rep1, Rep2> -{ - using common_rep = decltype(lhs.count() % rhs.count()); - using ret = common_quantity, quantity, common_rep>; - return ret(ret(lhs).count() % ret(rhs).count()); -} - namespace detail { template diff --git a/src/include/units/quantity_cast.h b/src/include/units/quantity_cast.h index f9e23f4d..2f51af6b 100644 --- a/src/include/units/quantity_cast.h +++ b/src/include/units/quantity_cast.h @@ -27,8 +27,6 @@ #include #include #include -#include -#include #include #ifdef _MSC_VER @@ -38,6 +36,12 @@ namespace units { +template U, Scalar Rep> +class quantity; + +template U, Scalar Rep> +class quantity_point; + namespace detail { template @@ -284,8 +288,8 @@ struct quantity_cast_impl { template constexpr ratio cast_ratio(const Q1& from, const Q2& to) { - using FromU = Q1::unit; - using ToU = Q2::unit; + using FromU = TYPENAME Q1::unit; + using ToU = TYPENAME Q2::unit; if constexpr(same_unit_reference::value) { return FromU::ratio / ToU::ratio; } diff --git a/test/metabench/make_dimension/concepts_all.cpp.erb b/test/metabench/make_dimension/concepts_all.cpp.erb index b37b1dc7..cb987f93 100644 --- a/test/metabench/make_dimension/concepts_all.cpp.erb +++ b/test/metabench/make_dimension/concepts_all.cpp.erb @@ -8,7 +8,7 @@ struct test<%= k %> { #if defined(METABENCH) using dim = units::make_dimension_t<<%= - xs = ((1)..(n)).map { |j| "units::exp" } + xs = ((1)..(n)).map { |j| "units::exponent" } rng = Random.new(k) xs.shuffle(random: rng).join(', ') %>>; diff --git a/test/metabench/make_dimension/concepts_iface.cpp.erb b/test/metabench/make_dimension/concepts_iface.cpp.erb index 0d8cff6b..2e63f485 100644 --- a/test/metabench/make_dimension/concepts_iface.cpp.erb +++ b/test/metabench/make_dimension/concepts_iface.cpp.erb @@ -8,7 +8,7 @@ struct test<%= k %> { #if defined(METABENCH) using dim = units::make_dimension_t<<%= - xs = ((1)..(n)).map { |j| "units::exp" } + xs = ((1)..(n)).map { |j| "units::exponent" } rng = Random.new(k) xs.shuffle(random: rng).join(', ') %>>; diff --git a/test/metabench/make_dimension/dimension_concepts_all.h b/test/metabench/make_dimension/dimension_concepts_all.h index 8278f228..e23162e9 100644 --- a/test/metabench/make_dimension/dimension_concepts_all.h +++ b/test/metabench/make_dimension/dimension_concepts_all.h @@ -60,26 +60,26 @@ namespace units { struct base_dimension_less : std::bool_constant { }; - // exp + // exponent template - struct exp { + struct exponent { static constexpr const base_dimension& dimension = BaseDimension; static constexpr std::intmax_t num = Num; static constexpr std::intmax_t den = Den; }; - // is_exp + // is_exponent namespace detail { template - inline constexpr bool is_exp = false; + inline constexpr bool is_exponent = false; template - inline constexpr bool is_exp> = true; + inline constexpr bool is_exponent> = true; } // namespace detail template - concept Exponent = detail::is_exp; + concept Exponent = detail::is_exponent; // exp_dim_id_less @@ -93,8 +93,8 @@ namespace units { struct exp_invert; template - struct exp_invert> { - using type = exp; + struct exp_invert> { + using type = exponent; }; template @@ -161,12 +161,12 @@ namespace units { }; template - struct dim_consolidate, exp, ERest...>> { + struct dim_consolidate, exponent, ERest...>> { using r1 = std::ratio; using r2 = std::ratio; using r = std::ratio_add; using type = conditional>, - dim_consolidate_t, ERest...>>>; + dim_consolidate_t, ERest...>>>; }; } // namespace detail diff --git a/test/metabench/make_dimension/dimension_concepts_iface.h b/test/metabench/make_dimension/dimension_concepts_iface.h index 069c7458..c7cc4dac 100644 --- a/test/metabench/make_dimension/dimension_concepts_iface.h +++ b/test/metabench/make_dimension/dimension_concepts_iface.h @@ -60,26 +60,26 @@ namespace units { struct base_dimension_less : std::bool_constant { }; - // exp + // exponent template - struct exp { + struct exponent { static constexpr const base_dimension& dimension = BaseDimension; static constexpr int num = Num; static constexpr int den = Den; }; - // is_exp + // is_exponent namespace detail { template - inline constexpr bool is_exp = false; + inline constexpr bool is_exponent = false; template - inline constexpr bool is_exp> = true; + inline constexpr bool is_exponent> = true; } // namespace detail template - concept Exponent = detail::is_exp; + concept Exponent = detail::is_exponent; // exp_dim_id_less @@ -93,8 +93,8 @@ namespace units { struct exp_invert; template - struct exp_invert> { - using type = exp; + struct exp_invert> { + using type = exponent; }; template @@ -161,12 +161,12 @@ namespace units { }; template - struct dim_consolidate, exp, ERest...>> { + struct dim_consolidate, exponent, ERest...>> { using r1 = std::ratio; using r2 = std::ratio; using r = std::ratio_add; using type = conditional>, - dim_consolidate_t, ERest...>>>; + dim_consolidate_t, ERest...>>>; }; } // namespace detail diff --git a/test/metabench/make_dimension/dimension_no_concepts.h b/test/metabench/make_dimension/dimension_no_concepts.h index 569a4ba1..da073eed 100644 --- a/test/metabench/make_dimension/dimension_no_concepts.h +++ b/test/metabench/make_dimension/dimension_no_concepts.h @@ -60,10 +60,10 @@ namespace units { struct base_dimension_less : std::bool_constant { }; - // exp + // exponent template - struct exp { + struct exponent { static constexpr const base_dimension& dimension = BaseDimension; static constexpr std::intmax_t num = Num; static constexpr std::intmax_t den = Den; @@ -81,8 +81,8 @@ namespace units { struct exp_invert; template - struct exp_invert> { - using type = exp; + struct exp_invert> { + using type = exponent; }; template @@ -132,12 +132,12 @@ namespace units { }; template - struct dim_consolidate, exp, ERest...>> { + struct dim_consolidate, exponent, ERest...>> { using r1 = std::ratio; using r2 = std::ratio; using r = std::ratio_add; using type = conditional>, - dim_consolidate_t, ERest...>>>; + dim_consolidate_t, ERest...>>>; }; } // namespace detail diff --git a/test/metabench/make_dimension/no_concepts.cpp.erb b/test/metabench/make_dimension/no_concepts.cpp.erb index 68b98188..4f010f0d 100644 --- a/test/metabench/make_dimension/no_concepts.cpp.erb +++ b/test/metabench/make_dimension/no_concepts.cpp.erb @@ -8,7 +8,7 @@ struct test<%= k %> { #if defined(METABENCH) using dim = units::make_dimension_t<<%= - xs = ((1)..(n)).map { |j| "units::exp" } + xs = ((1)..(n)).map { |j| "units::exponent" } rng = Random.new(k) xs.shuffle(random: rng).join(', ') %>>; diff --git a/test/unit_test/runtime/fmt_test.cpp b/test/unit_test/runtime/fmt_test.cpp index 131105e6..f03cc87c 100644 --- a/test/unit_test/runtime/fmt_test.cpp +++ b/test/unit_test/runtime/fmt_test.cpp @@ -421,6 +421,72 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]") } } + SECTION("dimensionless quantity") + { + SECTION("unitless with ratio == 1") + { + const auto q = 4q_m / 2q_m; + os << q; + + SECTION("iostream") + { + CHECK(os.str() == "2"); + } + + SECTION("fmt with default format {} on a quantity") + { + CHECK(fmt::format("{}", q) == os.str()); + } + + SECTION("fmt with format {:%Q %q} on a quantity") + { + CHECK(fmt::format("{:%Q %q}", q) == "2 "); + } + } + + SECTION("unitless with ratio.exp != 0") + { + const auto q = 4q_km / 2q_m; + os << q; + + SECTION("iostream") + { + CHECK(os.str() == "2 × 10³"); + } + + SECTION("fmt with default format {} on a quantity") + { + CHECK(fmt::format("{}", q) == os.str()); + } + + SECTION("fmt with format {:%Q %q} on a quantity") + { + CHECK(fmt::format("{:%Q %q}", q) == "2 × 10³"); + } + } + + SECTION("percents") + { + const auto q = quantity_cast(15.q_m / 100.q_m); + os << q; + + SECTION("iostream") + { + CHECK(os.str() == "15 %"); + } + + SECTION("fmt with default format {} on a quantity") + { + CHECK(fmt::format("{}", q) == os.str()); + } + + SECTION("fmt with format {:%Q %q} on a quantity") + { + CHECK(fmt::format("{:%Q %q}", q) == os.str()); + } + } + } + SECTION("quantity with an unkown dimension") { SECTION("unit::ratio::num == 1 && unit::ratio::den == 1") @@ -573,7 +639,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]") } } - SECTION("exp::num == 1 && exp::den == 1") + SECTION("exponent::num == 1 && exponent::den == 1") { const auto q = 4q_m * 2q_s; os << q; @@ -594,7 +660,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]") } } - SECTION("exp::num == 2 && exp::den == 1 for positive exponent") + SECTION("exponent::num == 2 && exponent::den == 1 for positive exponent") { const auto q = 4q_m * 2q_s * 2q_s; os << q; @@ -615,7 +681,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]") } } - SECTION("exp::num == 2 && exp::den == 1 for negative exponent (first dimension)") + SECTION("exponent::num == 2 && exponent::den == 1 for negative exponent (first dimension)") { const auto q = 8q_s / 2q_m / 2q_m; os << q; @@ -636,7 +702,7 @@ TEST_CASE("operator<< on a quantity", "[text][ostream][fmt]") } } - SECTION("exp::num == 2 && exp::den == 1 for negative exponent (not first dimension)") + SECTION("exponent::num == 2 && exponent::den == 1 for negative exponent (not first dimension)") { const auto q = 8q_m / 2q_kg / 2q_kg; os << q; diff --git a/test/unit_test/runtime/math_test.cpp b/test/unit_test/runtime/math_test.cpp index fc33ad3e..6b0c0243 100644 --- a/test/unit_test/runtime/math_test.cpp +++ b/test/unit_test/runtime/math_test.cpp @@ -63,10 +63,12 @@ TEST_CASE("absolute functions on quantity returns the absolute value", "[math][a REQUIRE(abs(-1q_m) == 1q_m); } +#ifndef COMP_MSVC SECTION ("floating-point representation") { REQUIRE(abs(-1.q_m) == 1q_m); } +#endif } SECTION ("'abs()' on a positive quantity returns the abs") @@ -76,10 +78,12 @@ TEST_CASE("absolute functions on quantity returns the absolute value", "[math][a REQUIRE(abs(1q_m) == 1q_m); } +#ifndef COMP_MSVC SECTION ("floating-point representation") { REQUIRE(abs(1.q_m) == 1q_m); } +#endif } } diff --git a/test/unit_test/static/custom_unit_test.cpp b/test/unit_test/static/custom_unit_test.cpp index 5f773cb2..07ebc27f 100644 --- a/test/unit_test/static/custom_unit_test.cpp +++ b/test/unit_test/static/custom_unit_test.cpp @@ -33,14 +33,14 @@ using namespace units::physical::si; // power spectral density struct sq_volt_per_hertz : unit {}; -struct dim_power_spectral_density : derived_dimension, units::exp> {}; +struct dim_power_spectral_density : derived_dimension, units::exponent> {}; template using power_spectral_density = quantity; // amplitude spectral density struct volt_per_sqrt_hertz : unit {}; -struct dim_amplitude_spectral_density : derived_dimension, units::exp> {}; +struct dim_amplitude_spectral_density : derived_dimension, units::exponent> {}; template using amplitude_spectral_density = quantity; @@ -60,7 +60,7 @@ static_assert(is_same_v( namespace { struct kilogram_per_second : unit {}; -struct dim_mass_rate : derived_dimension, units::exp> {}; +struct dim_mass_rate : derived_dimension, units::exponent> {}; struct kilogram_per_hour : deduced_unit {}; constexpr auto a = 1q_kg / 1q_h; static_assert(is_same_v); diff --git a/test/unit_test/static/dimension_op_test.cpp b/test/unit_test/static/dimension_op_test.cpp index dff74f2c..94a27c0a 100644 --- a/test/unit_test/static/dimension_op_test.cpp +++ b/test/unit_test/static/dimension_op_test.cpp @@ -39,8 +39,8 @@ struct d3 : base_dimension<"d3", u3> {}; // exp_invert -static_assert(is_same_v>, units::exp>); -static_assert(is_same_v>, units::exp>); +static_assert(is_same_v>, units::exponent>); +static_assert(is_same_v>, units::exponent>); // dim_unpack @@ -54,66 +54,66 @@ template using derived_dim = detail::derived_dimension_base; static_assert(is_same_v, exp_list<>>); -static_assert(is_same_v>, exp_list>>); -static_assert(is_same_v, units::exp>, exp_list, units::exp>>); -using dim1 = derived_dim>; -using dim2 = derived_dim, units::exp>; -static_assert(is_same_v, units::exp>, exp_list, units::exp>>); -static_assert(is_same_v, units::exp, units::exp>, - exp_list, units::exp, units::exp, units::exp>>); +static_assert(is_same_v>, exp_list>>); +static_assert(is_same_v, units::exponent>, exp_list, units::exponent>>); +using dim1 = derived_dim>; +using dim2 = derived_dim, units::exponent>; +static_assert(is_same_v, units::exponent>, exp_list, units::exponent>>); +static_assert(is_same_v, units::exponent, units::exponent>, + exp_list, units::exponent, units::exponent, units::exponent>>); // dim_invert -static_assert(is_same_v>>, d0>); -static_assert(is_same_v>>, unknown_dimension>>); +static_assert(is_same_v>>, d0>); +static_assert(is_same_v>>, unknown_dimension>>); static_assert( - is_same_v, units::exp>>, unknown_dimension, units::exp>>); + is_same_v, units::exponent>>, unknown_dimension, units::exponent>>); // make_dimension template using make_dimension = detail::make_dimension; -static_assert(is_same_v>, derived_dim>>); -static_assert(is_same_v, units::exp>, derived_dim, units::exp>>); -static_assert(is_same_v, units::exp>, derived_dim, units::exp>>); -static_assert(is_same_v, units::exp>, derived_dim>>); -static_assert(is_same_v, units::exp>, derived_dim>>); -static_assert(is_same_v, units::exp>, derived_dim>>); -static_assert(is_same_v, units::exp>, derived_dim>>); +static_assert(is_same_v>, derived_dim>>); +static_assert(is_same_v, units::exponent>, derived_dim, units::exponent>>); +static_assert(is_same_v, units::exponent>, derived_dim, units::exponent>>); +static_assert(is_same_v, units::exponent>, derived_dim>>); +static_assert(is_same_v, units::exponent>, derived_dim>>); +static_assert(is_same_v, units::exponent>, derived_dim>>); +static_assert(is_same_v, units::exponent>, derived_dim>>); -static_assert(is_same_v, units::exp, units::exp, units::exp>, - derived_dim, units::exp>>); -static_assert(is_same_v, units::exp, units::exp, units::exp>, - derived_dim, units::exp>>); +static_assert(is_same_v, units::exponent, units::exponent, units::exponent>, + derived_dim, units::exponent>>); +static_assert(is_same_v, units::exponent, units::exponent, units::exponent>, + derived_dim, units::exponent>>); -static_assert(is_same_v, units::exp, units::exp>, derived_dim>>); -static_assert(is_same_v, units::exp, units::exp>, derived_dim>>); -static_assert(is_same_v, units::exp, units::exp>, derived_dim>>); +static_assert(is_same_v, units::exponent, units::exponent>, derived_dim>>); +static_assert(is_same_v, units::exponent, units::exponent>, derived_dim>>); +static_assert(is_same_v, units::exponent, units::exponent>, derived_dim>>); // dimension_multiply -static_assert(is_same_v>, derived_dim>>, - unknown_dimension, units::exp>>); +static_assert(is_same_v>, derived_dim>>, + unknown_dimension, units::exponent>>); static_assert( - is_same_v>, d1>, unknown_dimension, units::exp>>); + is_same_v>, d1>, unknown_dimension, units::exponent>>); static_assert( - is_same_v>>, unknown_dimension, units::exp>>); -static_assert(is_same_v, unknown_dimension, units::exp>>); + is_same_v>>, unknown_dimension, units::exponent>>); +static_assert(is_same_v, unknown_dimension, units::exponent>>); static_assert(is_same_v< - dimension_multiply, units::exp, units::exp>, derived_dim>>, - unknown_dimension, units::exp, units::exp, units::exp>>); + dimension_multiply, units::exponent, units::exponent>, derived_dim>>, + unknown_dimension, units::exponent, units::exponent, units::exponent>>); static_assert(is_same_v< - dimension_multiply, units::exp, units::exp>, derived_dim>>, - unknown_dimension, units::exp, units::exp>>); + dimension_multiply, units::exponent, units::exponent>, derived_dim>>, + unknown_dimension, units::exponent, units::exponent>>); static_assert(is_same_v< - dimension_multiply, units::exp, units::exp>, derived_dim>>, - unknown_dimension, units::exp>>); -static_assert(is_same_v>, derived_dim>>, d0>); + dimension_multiply, units::exponent, units::exponent>, derived_dim>>, + unknown_dimension, units::exponent>>); +static_assert(is_same_v>, derived_dim>>, d0>); // dimension_divide -static_assert(is_same_v>, derived_dim>>, - unknown_dimension, units::exp>>); -static_assert(is_same_v>, unknown_dimension>>, d0>); +static_assert(is_same_v>, derived_dim>>, + unknown_dimension, units::exponent>>); +static_assert(is_same_v>, unknown_dimension>>, d0>); } // namespace diff --git a/test/unit_test/static/quantity_test.cpp b/test/unit_test/static/quantity_test.cpp index eaf4832a..164bf533 100644 --- a/test/unit_test/static/quantity_test.cpp +++ b/test/unit_test/static/quantity_test.cpp @@ -161,21 +161,21 @@ static_assert( static_assert( is_same_v() * physical::si::time()), length, int>>); static_assert(is_same_v() * physical::si::time()), - quantity, units::exp>, scaled_unit>>); + quantity, units::exponent>, scaled_unit>>); static_assert(is_same_v()), frequency>); static_assert(is_same_v()), frequency, int>>); static_assert(is_same_v()), physical::si::time>); static_assert(is_same_v()), - quantity>, scaled_unit>>); + quantity>, scaled_unit>>); static_assert(is_same_v() / 1.0), length>); -static_assert(is_same_v() / length()), double>); -static_assert(is_same_v() / length()), double>); +static_assert(is_same_v() / length()), dimensionless>); +static_assert(is_same_v() / length()), dimensionless, double>>); static_assert( is_same_v() / physical::si::time()), speed>); static_assert( is_same_v() / physical::si::time()), speed>>); static_assert(is_same_v() / length()), - quantity, units::exp>, scaled_unit>>); + quantity, units::exponent>, scaled_unit>>); static_assert(is_same_v() % short(1)), length>); static_assert(is_same_v() % length(1)), length>); @@ -186,14 +186,27 @@ static_assert((1q_km - 1q_m).count() == 999); static_assert((2q_m * 2).count() == 4); static_assert((3 * 3q_m).count() == 9); static_assert((4q_m / 2).count() == 2); -static_assert(4q_m / 2q_m == 2); -static_assert(4q_km / 2000q_m == 2); +static_assert((4q_km / 2q_m).count() == 2); +static_assert((4000q_m / 2q_m).count() == 2000); static_assert((7q_m % 2).count() == 1); static_assert((7q_m % 2q_m).count() == 1); static_assert((7q_km % 2000q_m).count() == 1000); static_assert((10q_km2 * 10q_km2) / 50q_km2 == 2q_km2); +constexpr auto q1 = 10q_km / 5q_m; +static_assert(std::is_same_v, std::int64_t>>); +static_assert(q1.count() == 2); + +constexpr dimensionless q2 = q1; +static_assert(q2.count() == 2000); + +static_assert(quantity_cast(q1).count() == 2000); + +constexpr auto q3 = 10q_s * 2q_kHz; +static_assert(std::is_same_v, std::int64_t>>); +static_assert(q3.count() == 20); + // comparators static_assert(2q_m + 1q_m == 3q_m); @@ -264,6 +277,37 @@ static_assert(quantity_cast(2q_km).count() == 2000); static_assert(quantity_cast(2000q_m).count() == 2); static_assert(quantity_cast(1.23q_m).count() == 1); +// dimensionless + +static_assert(std::is_convertible_v>); +static_assert(std::is_convertible_v>); +static_assert(!std::is_convertible_v>); +static_assert(std::is_convertible_v>); + +static_assert(!std::is_convertible_v>>); +static_assert(std::is_constructible_v>, double>); + +static_assert(dimensionless(1.23) + dimensionless(1.23) == dimensionless(2.46)); +static_assert(dimensionless(1.23) + dimensionless(1.23) == 2.46); +static_assert(dimensionless(1.23) + 1.23 == 2.46); +static_assert(1.23 + dimensionless(1.23) == 2.46); +static_assert(dimensionless(1) + 1 == 2); +static_assert(dimensionless(1) + 1 == 2); + +template +concept invalid_dimensionless_operation = requires() +{ + !requires(dimensionless d) { d + 1.23; }; + !requires(dimensionless d) { 1.23 + d; }; + !requires(dimensionless, Rep> d) { 1 + d; }; + !requires(dimensionless, Rep> d) { d + 1; }; +}; +static_assert(invalid_dimensionless_operation); + +static_assert(quantity_cast(50.q_m / 100.q_m).count() == 50); +static_assert(50.q_m / 100.q_m == dimensionless(50)); + + // time static_assert(1q_h == 3600q_s); diff --git a/test/unit_test/static/si_test.cpp b/test/unit_test/static/si_test.cpp index a1b339f0..ae4a00e3 100644 --- a/test/unit_test/static/si_test.cpp +++ b/test/unit_test/static/si_test.cpp @@ -40,7 +40,9 @@ static_assert(1q_hm == 100q_m); static_assert(1q_au == 149'597'870'700q_m); static_assert(1q_km + 1q_m == 1001q_m); static_assert(10q_km / 5q_km == 2); -static_assert(100q_mm / 5q_cm == 2); +static_assert(10q_km / 5q_km < 3); +static_assert(100q_mm / 5q_cm == dimensionless>(20)); +static_assert(100q_mm / 5q_cm == dimensionless(2)); static_assert(10q_km / 2 == 5q_km); static_assert(millimetre::symbol == "mm"); @@ -102,7 +104,8 @@ static_assert(120 / 1q_min == 2q_Hz); static_assert(1000 / 1q_s == 1q_kHz); static_assert(1 / 1q_ms == 1q_kHz); static_assert(3.2q_GHz == 3'200'000'000q_Hz); -static_assert(10q_Hz * 1q_min == 600); +static_assert(10q_Hz * 1q_min == dimensionless>(10)); +static_assert(10q_Hz * 1q_min == dimensionless(600)); static_assert(2 / 1q_Hz == 2q_s); // force diff --git a/test/unit_test/static/type_list_test.cpp b/test/unit_test/static/type_list_test.cpp index d1afb67e..6f8cf8d4 100644 --- a/test/unit_test/static/type_list_test.cpp +++ b/test/unit_test/static/type_list_test.cpp @@ -98,20 +98,20 @@ struct d0 : base_dimension<"d0", u0> {}; struct u1 : named_unit {}; struct d1 : base_dimension<"d1", u1> {}; -static_assert(is_same_v>, type_list>, exp_less>, - type_list, units::exp>>); -static_assert(is_same_v>, type_list>, exp_less>, - type_list, units::exp>>); +static_assert(is_same_v>, type_list>, exp_less>, + type_list, units::exponent>>); +static_assert(is_same_v>, type_list>, exp_less>, + type_list, units::exponent>>); // type_list_sort template using exp_sort = type_list_sort; -static_assert(is_same_v>>, exp_list>>); +static_assert(is_same_v>>, exp_list>>); static_assert( - is_same_v, units::exp>>, exp_list, units::exp>>); + is_same_v, units::exponent>>, exp_list, units::exponent>>); static_assert( - is_same_v, units::exp>>, exp_list, units::exp>>); + is_same_v, units::exponent>>, exp_list, units::exponent>>); } // namespace diff --git a/test/unit_test/static/unit_test.cpp b/test/unit_test/static/unit_test.cpp index b0c90abf..43d1d473 100644 --- a/test/unit_test/static/unit_test.cpp +++ b/test/unit_test/static/unit_test.cpp @@ -46,7 +46,7 @@ static_assert([](P) { return !requires { typename prefixed_unit {}; -struct dim_speed : derived_dimension, units::exp> {}; +struct dim_speed : derived_dimension, units::exponent> {}; struct kilometre_per_hour : deduced_unit {}; static_assert(is_same_v>, metre>);