From ae92b497756e843129d6e1ff5920b616cc1e38c5 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Wed, 23 Aug 2023 16:46:15 +0200 Subject: [PATCH] refactor: `op[U]` for `quantity` and `quantity_point` replaced with `.in(U)` Resolves #469 --- README.md | 4 +- docs/getting_started/code_example.md | 6 +-- .../faster_than_lightspeed_constants.md | 14 +++---- .../interface_introduction.md | 2 +- .../simple_and_typed_quantities.md | 8 ++-- .../framework_basics/systems_of_units.md | 6 +-- .../framework_basics/text_output.md | 2 +- .../framework_basics/value_conversions.md | 6 +-- example/capacitor_time_curve.cpp | 10 ++--- example/clcpp_response.cpp | 40 +++++++++---------- example/conversion_factor.cpp | 2 +- example/hello_units.cpp | 2 +- example/measurement.cpp | 2 +- example/si_constants.cpp | 20 ++++++---- example/spectroscopy_units.cpp | 5 ++- example/storage_tank.cpp | 6 +-- example/strong_angular_quantities.cpp | 2 +- example/total_energy.cpp | 16 ++++---- src/core/include/mp-units/quantity.h | 6 +-- src/core/include/mp-units/quantity_point.h | 4 +- src/utility/include/mp-units/math.h | 12 +++--- .../unit_test/runtime/linear_algebra_test.cpp | 9 +---- test/unit_test/static/quantity_point_test.cpp | 22 +++++----- test/unit_test/static/quantity_test.cpp | 20 +++++----- 24 files changed, 113 insertions(+), 113 deletions(-) diff --git a/README.md b/README.md index cf240c79..b8506972 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ int main() constexpr auto v2 = 70 * mph; constexpr auto v3 = avg_speed(220. * isq::distance[km], 2 * h); constexpr auto v4 = avg_speed(isq::distance(140. * mi), 2 * h); - constexpr auto v5 = v3[m / s]; + constexpr auto v5 = v3.in(m / s); constexpr auto v6 = value_cast(v4); constexpr auto v7 = value_cast(v6); @@ -123,4 +123,4 @@ int main() } ``` -_Try it on the [Compiler Explorer](https://godbolt.org/z/zPnerKqzh)._ +_Try it on the [Compiler Explorer](https://godbolt.org/z/E4rvPGa3n)._ diff --git a/docs/getting_started/code_example.md b/docs/getting_started/code_example.md index 37595275..9aeb3e93 100644 --- a/docs/getting_started/code_example.md +++ b/docs/getting_started/code_example.md @@ -62,7 +62,7 @@ int main() constexpr auto v2 = 70 * mph; constexpr auto v3 = avg_speed(220. * isq::distance[km], 2 * h); constexpr auto v4 = avg_speed(isq::distance(140. * mi), 2 * h); - constexpr auto v5 = v3[m / s]; + constexpr auto v5 = v3.in(m / s); constexpr auto v6 = value_cast(v4); constexpr auto v7 = value_cast(v6); @@ -76,8 +76,8 @@ int main() } ``` -!!! example "[Try it on Compiler Explorer](https://godbolt.org/z/zPnerKqzh)" +!!! example "[Try it on Compiler Explorer](https://godbolt.org/z/E4rvPGa3n)" !!! note - You can find more code examples in the Examples chapter. + You can find more code examples in the [Examples](../users_guide/examples/tags_index.md) chapter. diff --git a/docs/users_guide/framework_basics/faster_than_lightspeed_constants.md b/docs/users_guide/framework_basics/faster_than_lightspeed_constants.md index 04026efa..454ea271 100644 --- a/docs/users_guide/framework_basics/faster_than_lightspeed_constants.md +++ b/docs/users_guide/framework_basics/faster_than_lightspeed_constants.md @@ -61,7 +61,7 @@ constexpr auto speed_of_light_in_vacuum = 1 * si::si2019::speed_of_light_in_vacu QuantityOf auto q = 1 / (permeability_of_vacuum * pow<2>(speed_of_light_in_vacuum)); -std::cout << "permittivity of vacuum = " << q << " = " << q[F / m] << "\n"; +std::cout << "permittivity of vacuum = " << q << " = " << q.in(F / m) << "\n"; ``` The above first prints the following: @@ -99,18 +99,18 @@ std::cout << "in `GeV` and `c`:\n" << "m = " << m1 << "\n" << "E = " << E << "\n"; -const auto p2 = p1[GeV / (m / s)]; -const auto m2 = m1[GeV / pow<2>(m / s)]; -const auto E2 = total_energy(p2, m2, c)[GeV]; +const auto p2 = p1.in(GeV / (m / s)); +const auto m2 = m1.in(GeV / pow<2>(m / s)); +const auto E2 = total_energy(p2, m2, c).in(GeV); std::cout << "\nin `GeV`:\n" << "p = " << p2 << "\n" << "m = " << m2 << "\n" << "E = " << E2 << "\n"; -const auto p3 = p1[kg * m / s]; -const auto m3 = m1[kg]; -const auto E3 = total_energy(p3, m3, c)[J]; +const auto p3 = p1.in(kg * m / s); +const auto m3 = m1.in(kg); +const auto E3 = total_energy(p3, m3, c).in(J); std::cout << "\nin SI base units:\n" << "p = " << p3 << "\n" diff --git a/docs/users_guide/framework_basics/interface_introduction.md b/docs/users_guide/framework_basics/interface_introduction.md index e85b1ceb..6b034a4b 100644 --- a/docs/users_guide/framework_basics/interface_introduction.md +++ b/docs/users_guide/framework_basics/interface_introduction.md @@ -264,7 +264,7 @@ using namespace mp_units::si::unit_symbols; auto speed = 60. * isq::speed[km / h]; auto duration = 8 * s; auto acceleration = speed / duration; -std::cout << "acceleration: " << acceleration << " (" << acceleration[m / s2] << ")\n"; +std::cout << "acceleration: " << acceleration << " (" << acceleration.in(m / s2) << ")\n"; ``` The `acceleration`, being the result of the above code, has the following type diff --git a/docs/users_guide/framework_basics/simple_and_typed_quantities.md b/docs/users_guide/framework_basics/simple_and_typed_quantities.md index 781ba4fe..abf60618 100644 --- a/docs/users_guide/framework_basics/simple_and_typed_quantities.md +++ b/docs/users_guide/framework_basics/simple_and_typed_quantities.md @@ -72,7 +72,7 @@ int main() std::cout << "A car driving " << distance << " in " << duration << " has an average speed of " << speed - << " (" << speed[km / h] << ")\n"; + << " (" << speed.in(km / h) << ")\n"; } ``` @@ -82,7 +82,7 @@ The code above prints: A car driving 110 km in 2 h has an average speed of 15.2778 m/s (55 km/h) ``` -!!! example "[Try it on Compiler Explorer](https://godbolt.org/z/4zecYqn5z)" +!!! example "[Try it on Compiler Explorer](https://godbolt.org/z/zWe8ecf93)" ### Easy to understand compilation error messages @@ -146,7 +146,7 @@ int main() std::cout << "A car driving " << distance << " in " << duration << " has an average speed of " << speed - << " (" << speed[km / h] << ")\n"; + << " (" << speed.in(km / h) << ")\n"; } ``` @@ -154,7 +154,7 @@ int main() A car driving 110 km in 2 h has an average speed of 15.2778 m/s (55 km/h) ``` -!!! example "[Try it on Compiler Explorer](https://godbolt.org/z/jhfWjGadz)" +!!! example "[Try it on Compiler Explorer](https://godbolt.org/z/q3PzMzqsh)" In case we will accidentally make the same calculation error as before, this time, we will get a bit longer error message also containing information about the quantity type: diff --git a/docs/users_guide/framework_basics/systems_of_units.md b/docs/users_guide/framework_basics/systems_of_units.md index 073019d0..18fcb8dd 100644 --- a/docs/users_guide/framework_basics/systems_of_units.md +++ b/docs/users_guide/framework_basics/systems_of_units.md @@ -76,9 +76,9 @@ the following: ```cpp auto q1 = 42 * W; std::cout << q1 << "\n"; -std::cout << q1[J / s] << "\n"; -std::cout << q1[N * m / s] << "\n"; -std::cout << q1[kg * m2 / s3] << "\n"; +std::cout << q1.in(J / s) << "\n"; +std::cout << q1.in(N * m / s) << "\n"; +std::cout << q1.in(kg * m2 / s3) << "\n"; ``` prints: diff --git a/docs/users_guide/framework_basics/text_output.md b/docs/users_guide/framework_basics/text_output.md index 34623dbc..951441a8 100644 --- a/docs/users_guide/framework_basics/text_output.md +++ b/docs/users_guide/framework_basics/text_output.md @@ -44,7 +44,7 @@ associated with this quantity. before passing it to the text output: ```cpp - std::cout << v1[km / h] << '\n'; // 110 km/h + std::cout << v1.in(km / h) << '\n'; // 110 km/h std::cout << value_cast(v1) << '\n'; // 30.5556 m/s ``` diff --git a/docs/users_guide/framework_basics/value_conversions.md b/docs/users_guide/framework_basics/value_conversions.md index d0a1c8ae..41781eee 100644 --- a/docs/users_guide/framework_basics/value_conversions.md +++ b/docs/users_guide/framework_basics/value_conversions.md @@ -4,7 +4,7 @@ ```cpp auto q1 = 5 * km; -std::cout << q1[m] << '\n'; +std::cout << q1.in(m) << '\n'; quantity q2 = q1; ``` @@ -23,7 +23,7 @@ In case a user would like to perform an opposite transformation: ```cpp auto q1 = 5 * m; -std::cout << q1[km] << '\n'; +std::cout << q1.in(km) << '\n'; quantity, int> q2 = q1; ``` @@ -34,7 +34,7 @@ representation type: ```cpp auto q1 = 5. * m; -std::cout << q1[km] << '\n'; +std::cout << q1.in(km) << '\n'; quantity> q2 = q1; ``` diff --git a/example/capacitor_time_curve.cpp b/example/capacitor_time_curve.cpp index edee1f1a..d1fb12ce 100644 --- a/example/capacitor_time_curve.cpp +++ b/example/capacitor_time_curve.cpp @@ -47,15 +47,15 @@ int main() std::cout << "at " << tt << " voltage is "; if (Vt >= 1 * V) - std::cout << Vt[V]; + std::cout << Vt.in(V); else if (Vt >= 1 * mV) - std::cout << Vt[mV]; + std::cout << Vt.in(mV); else if (Vt >= 1 * uV) - std::cout << Vt[uV]; + std::cout << Vt.in(uV); else if (Vt >= 1 * nV) - std::cout << Vt[nV]; + std::cout << Vt.in(nV); else - std::cout << Vt[pV]; + std::cout << Vt.in(pV); std::cout << "\n"; } } diff --git a/example/clcpp_response.cpp b/example/clcpp_response.cpp index 47ef636c..fb9f93e3 100644 --- a/example/clcpp_response.cpp +++ b/example/clcpp_response.cpp @@ -81,24 +81,24 @@ void quantities_with_typed_units() std::cout << meter << '\n'; - std::cout << " = " << meter[astronomical_unit] << '\n'; - std::cout << " = " << meter[iau::angstrom] << '\n'; - std::cout << " = " << meter[imperial::chain] << '\n'; - std::cout << " = " << meter[imperial::fathom] << '\n'; - std::cout << " = " << meter[usc::fathom] << '\n'; - std::cout << " = " << meter[international::foot] << '\n'; - std::cout << " = " << meter[usc::survey1893::us_survey_foot] << '\n'; - std::cout << " = " << meter[international::inch] << '\n'; - std::cout << " = " << meter[iau::light_year] << '\n'; - std::cout << " = " << meter[international::mile] << '\n'; - std::cout << " = " << meter[international::nautical_mile] << '\n'; - std::cout << " = " << meter[iau::parsec] << '\n'; - std::cout << " = " << meter[typographic::pica_dtp] << '\n'; - std::cout << " = " << meter[typographic::pica_us] << '\n'; - std::cout << " = " << meter[typographic::point_dtp] << '\n'; - std::cout << " = " << meter[typographic::point_us] << '\n'; - std::cout << " = " << meter[imperial::rod] << '\n'; - std::cout << " = " << meter[international::yard] << '\n'; + std::cout << " = " << meter.in(astronomical_unit) << '\n'; + std::cout << " = " << meter.in(iau::angstrom) << '\n'; + std::cout << " = " << meter.in(imperial::chain) << '\n'; + std::cout << " = " << meter.in(imperial::fathom) << '\n'; + std::cout << " = " << meter.in(usc::fathom) << '\n'; + std::cout << " = " << meter.in(international::foot) << '\n'; + std::cout << " = " << meter.in(usc::survey1893::us_survey_foot) << '\n'; + std::cout << " = " << meter.in(international::inch) << '\n'; + std::cout << " = " << meter.in(iau::light_year) << '\n'; + std::cout << " = " << meter.in(international::mile) << '\n'; + std::cout << " = " << meter.in(international::nautical_mile) << '\n'; + std::cout << " = " << meter.in(iau::parsec) << '\n'; + std::cout << " = " << meter.in(typographic::pica_dtp) << '\n'; + std::cout << " = " << meter.in(typographic::pica_us) << '\n'; + std::cout << " = " << meter.in(typographic::point_dtp) << '\n'; + std::cout << " = " << meter.in(typographic::point_us) << '\n'; + std::cout << " = " << meter.in(imperial::rod) << '\n'; + std::cout << " = " << meter.in(international::yard) << '\n'; } void calcs_comparison() @@ -119,8 +119,8 @@ void calcs_comparison() "or small values in other units to the base unit.\n" "This is both inefficient and inaccurate\n\n"; - const auto L1B = L1A[m]; - const auto L2B = L2A[m]; + const auto L1B = L1A.in(m); + const auto L2B = L2A.in(m); const auto LrB = L1B + L2B; std::cout << MP_UNITS_STD_FMT::format("{:%.30eQ %q}\n + {:%.30eQ %q}\n = {:%.30eQ %q}\n\n", L1B, L2B, LrB); diff --git a/example/conversion_factor.cpp b/example/conversion_factor.cpp index 5975fc93..6fbda2cf 100644 --- a/example/conversion_factor.cpp +++ b/example/conversion_factor.cpp @@ -46,7 +46,7 @@ int main() std::cout << "conversion factor in mp-units...\n\n"; constexpr auto lengthA = 2.0 * m; - constexpr auto lengthB = lengthA[mm]; + constexpr auto lengthB = lengthA.in(mm); std::cout << MP_UNITS_STD_FMT::format("lengthA( {} ) and lengthB( {} )\n", lengthA, lengthB) << "represent the same length in different units.\n\n"; diff --git a/example/hello_units.cpp b/example/hello_units.cpp index 49e5a095..041bbf84 100644 --- a/example/hello_units.cpp +++ b/example/hello_units.cpp @@ -48,7 +48,7 @@ int main() constexpr auto v2 = 70 * mph; constexpr auto v3 = avg_speed(220. * km, 2 * h); constexpr auto v4 = avg_speed(isq::distance(140. * mi), 2 * isq::duration[h]); - constexpr auto v5 = v3[m / s]; + constexpr auto v5 = v3.in(m / s); constexpr auto v6 = value_cast(v4); constexpr auto v7 = value_cast(v6); diff --git a/example/measurement.cpp b/example/measurement.cpp index bfa86b8d..b11492af 100644 --- a/example/measurement.cpp +++ b/example/measurement.cpp @@ -135,7 +135,7 @@ void example() const auto t = measurement{1.2, 0.1} * s; const QuantityOf auto v = a * t; - std::cout << a << " * " << t << " = " << v << " = " << v[km / h] << '\n'; + std::cout << a << " * " << t << " = " << v << " = " << v.in(km / h) << '\n'; const auto length = measurement{123., 1.} * m; std::cout << "10 * " << length << " = " << 10 * length << '\n'; diff --git a/example/si_constants.cpp b/example/si_constants.cpp index 3f53663a..99355a61 100644 --- a/example/si_constants.cpp +++ b/example/si_constants.cpp @@ -20,9 +20,13 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// !!! Before you commit any changes to this file please make sure to check if it !!! +// !!! renders correctly in the documentation "Examples" section. !!! +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + #include -#include -#include +#include #include template @@ -37,18 +41,18 @@ int main() std::cout << "The seven defining constants of the SI and the seven corresponding units they define:\n"; std::cout << MP_UNITS_STD_FMT::format("- hyperfine transition frequency of Cs: {} = {:%.0Q %q}\n", 1. * si2019::hyperfine_structure_transition_frequency_of_cs, - (1. * si2019::hyperfine_structure_transition_frequency_of_cs)[Hz]); + (1. * si2019::hyperfine_structure_transition_frequency_of_cs).in(Hz)); std::cout << MP_UNITS_STD_FMT::format("- speed of light in vacuum: {} = {:%.0Q %q}\n", 1. * si2019::speed_of_light_in_vacuum, - (1. * si2019::speed_of_light_in_vacuum)[m / s]); + (1. * si2019::speed_of_light_in_vacuum).in(m / s)); std::cout << MP_UNITS_STD_FMT::format("- Planck constant: {} = {:%.8eQ %q}\n", - 1. * si2019::planck_constant, (1. * si2019::planck_constant)[J * s]); + 1. * si2019::planck_constant, (1. * si2019::planck_constant).in(J * s)); std::cout << MP_UNITS_STD_FMT::format("- elementary charge: {} = {:%.9eQ %q}\n", - 1. * si2019::elementary_charge, (1. * si2019::elementary_charge)[C]); + 1. * si2019::elementary_charge, (1. * si2019::elementary_charge).in(C)); std::cout << MP_UNITS_STD_FMT::format("- Boltzmann constant: {} = {:%.6eQ %q}\n", - 1. * si2019::boltzmann_constant, (1. * si2019::boltzmann_constant)[J / K]); + 1. * si2019::boltzmann_constant, (1. * si2019::boltzmann_constant).in(J / K)); std::cout << MP_UNITS_STD_FMT::format("- Avogadro constant: {} = {:%.8eQ %q}\n", - 1. * si2019::avogadro_constant, (1. * si2019::avogadro_constant)[1 / mol]); + 1. * si2019::avogadro_constant, (1. * si2019::avogadro_constant).in(1 / mol)); // TODO uncomment the below when ISQ is done // std::cout << MP_UNITS_STD_FMT::format("- luminous efficacy: {} = {}\n", // si2019::luminous_efficacy(1.), diff --git a/example/spectroscopy_units.cpp b/example/spectroscopy_units.cpp index 64a6f18d..6cf9e953 100644 --- a/example/spectroscopy_units.cpp +++ b/example/spectroscopy_units.cpp @@ -60,8 +60,9 @@ template T1, QuantityOf T2, QuantityOf< QuantityOf T4, QuantityOf T5> void print_line_si(const std::tuple& t) { - MP_UNITS_STD_FMT::println("| {:<15} | {:<15} | {:<15} | {:<15} | {:<15} |", std::get<0>(t)[eV], - std::get<1>(t)[1 / cm], std::get<2>(t)[THz], std::get<3>(t)[K], std::get<4>(t)[um]); + MP_UNITS_STD_FMT::println("| {:<15} | {:<15} | {:<15} | {:<15} | {:<15} |", std::get<0>(t).in(eV), + std::get<1>(t).in(1 / cm), std::get<2>(t).in(THz), std::get<3>(t).in(K), + std::get<4>(t).in(um)); } int main() diff --git a/example/storage_tank.cpp b/example/storage_tank.cpp index 27e5dea6..4ec3f725 100644 --- a/example/storage_tank.cpp +++ b/example/storage_tank.cpp @@ -126,10 +126,10 @@ int main() const auto fill_ratio = fill_level / height; std::cout << MP_UNITS_STD_FMT::format("fill height at {} = {} ({} full)\n", fill_time, fill_level, - fill_ratio[percent]); - std::cout << MP_UNITS_STD_FMT::format("fill weight at {} = {} ({})\n", fill_time, filled_weight, filled_weight[N]); + fill_ratio.in(percent)); + std::cout << MP_UNITS_STD_FMT::format("fill weight at {} = {} ({})\n", fill_time, filled_weight, filled_weight.in(N)); std::cout << MP_UNITS_STD_FMT::format("spare capacity at {} = {}\n", fill_time, spare_capacity); std::cout << MP_UNITS_STD_FMT::format("input flow rate = {}\n", input_flow_rate); std::cout << MP_UNITS_STD_FMT::format("float rise rate = {}\n", float_rise_rate); - std::cout << MP_UNITS_STD_FMT::format("tank full E.T.A. at current flow rate = {}\n", fill_time_left[s]); + std::cout << MP_UNITS_STD_FMT::format("tank full E.T.A. at current flow rate = {}\n", fill_time_left.in(s)); } diff --git a/example/strong_angular_quantities.cpp b/example/strong_angular_quantities.cpp index 375a980d..7d375e3c 100644 --- a/example/strong_angular_quantities.cpp +++ b/example/strong_angular_quantities.cpp @@ -44,5 +44,5 @@ int main() const auto torque = isq_angle::torque(lever * force * angular::sin(angle) / (1 * isq_angle::cotes_angle)); std::cout << "Applying a perpendicular force of " << force << " to a " << lever << " long lever results in " - << torque[N * m / rad] << " of torque.\n"; + << torque.in(N * m / rad) << " of torque.\n"; } diff --git a/example/total_energy.cpp b/example/total_energy.cpp index 4b68a750..61c28842 100644 --- a/example/total_energy.cpp +++ b/example/total_energy.cpp @@ -48,31 +48,31 @@ void si_example() using namespace mp_units::si::unit_symbols; constexpr auto GeV = si::giga; constexpr QuantityOf auto c = 1. * si::si2019::speed_of_light_in_vacuum; - auto c2 = pow<2>(c); + constexpr auto c2 = pow<2>(c); const auto p1 = isq::momentum(4. * GeV / c); const QuantityOf auto m1 = 3. * GeV / c2; const auto E = total_energy(p1, m1, c); - std::cout << "\n*** SI units (c = " << c << " = " << c[si::metre / s] << ") ***\n"; + std::cout << "\n*** SI units (c = " << c << " = " << c.in(si::metre / s) << ") ***\n"; std::cout << "\n[in `GeV` and `c`]\n" << "p = " << p1 << "\n" << "m = " << m1 << "\n" << "E = " << E << "\n"; - const auto p2 = p1[GeV / (m / s)]; - const auto m2 = m1[GeV / pow<2>(m / s)]; - const auto E2 = total_energy(p2, m2, c)[GeV]; + const auto p2 = p1.in(GeV / (m / s)); + const auto m2 = m1.in(GeV / pow<2>(m / s)); + const auto E2 = total_energy(p2, m2, c).in(GeV); std::cout << "\n[in `GeV`]\n" << "p = " << p2 << "\n" << "m = " << m2 << "\n" << "E = " << E2 << "\n"; - const auto p3 = p1[kg * m / s]; - const auto m3 = m1[kg]; - const auto E3 = total_energy(p3, m3, c)[J]; + const auto p3 = p1.in(kg * m / s); + const auto m3 = m1.in(kg); + const auto E3 = total_energy(p3, m3, c).in(J); std::cout << "\n[in SI base units]\n" << "p = " << p3 << "\n" diff --git a/src/core/include/mp-units/quantity.h b/src/core/include/mp-units/quantity.h index 91f37979..15483449 100644 --- a/src/core/include/mp-units/quantity.h +++ b/src/core/include/mp-units/quantity.h @@ -164,15 +164,15 @@ public: #endif template - requires requires(quantity q) { q[U{}]; } + requires requires(quantity q) { q.in(U{}); } [[nodiscard]] constexpr rep number_in(U) const noexcept { - return (*this)[U{}].number(); + return (*this).in(U{}).number(); } template requires detail::QuantityConvertibleTo{}, Rep>> - [[nodiscard]] constexpr quantity<::mp_units::reference{}, Rep> operator[](U) const + [[nodiscard]] constexpr quantity<::mp_units::reference{}, Rep> in(U) const { return quantity{*this}; } diff --git a/src/core/include/mp-units/quantity_point.h b/src/core/include/mp-units/quantity_point.h index 11c712b0..810e2b28 100644 --- a/src/core/include/mp-units/quantity_point.h +++ b/src/core/include/mp-units/quantity_point.h @@ -164,9 +164,9 @@ public: template requires detail::QuantityConvertibleTo{}, Rep>> - [[nodiscard]] constexpr quantity_point<::mp_units::reference{}, PO, Rep> operator[](U) const + [[nodiscard]] constexpr quantity_point<::mp_units::reference{}, PO, Rep> in(U) const { - return make_quantity_point(quantity_from_origin()[U{}]); + return make_quantity_point(quantity_from_origin().in(U{})); } // member unary operators diff --git a/src/utility/include/mp-units/math.h b/src/utility/include/mp-units/math.h index 094f4b6e..7ac3f195 100644 --- a/src/utility/include/mp-units/math.h +++ b/src/utility/include/mp-units/math.h @@ -304,7 +304,7 @@ template auto R, typename Rep> requires requires { sin(q.number()); } || requires { std::sin(q.number()); } { using std::sin; - return make_quantity(static_cast(sin(q[si::radian].number()))); + return make_quantity(static_cast(sin(q.in(si::radian).number()))); } template auto R, typename Rep> @@ -313,7 +313,7 @@ template auto R, typename Rep> requires requires { cos(q.number()); } || requires { std::cos(q.number()); } { using std::cos; - return make_quantity(static_cast(cos(q[si::radian].number()))); + return make_quantity(static_cast(cos(q.in(si::radian).number()))); } template auto R, typename Rep> @@ -322,7 +322,7 @@ template auto R, typename Rep> requires requires { tan(q.number()); } || requires { std::tan(q.number()); } { using std::tan; - return make_quantity(static_cast(tan(q[si::radian].number()))); + return make_quantity(static_cast(tan(q.in(si::radian).number()))); } template auto R, typename Rep> @@ -362,7 +362,7 @@ template auto R, typename Rep> requires requires { sin(q.number()); } || requires { std::sin(q.number()); } { using std::sin; - return make_quantity(static_cast(sin(q[radian].number()))); + return make_quantity(static_cast(sin(q.in(radian).number()))); } template auto R, typename Rep> @@ -371,7 +371,7 @@ template auto R, typename Rep> requires requires { cos(q.number()); } || requires { std::cos(q.number()); } { using std::cos; - return make_quantity(static_cast(cos(q[radian].number()))); + return make_quantity(static_cast(cos(q.in(radian).number()))); } template auto R, typename Rep> @@ -380,7 +380,7 @@ template auto R, typename Rep> requires requires { tan(q.number()); } || requires { std::tan(q.number()); } { using std::tan; - return make_quantity(static_cast(tan(q[radian].number()))); + return make_quantity(static_cast(tan(q.in(radian).number()))); } template auto R, typename Rep> diff --git a/test/unit_test/runtime/linear_algebra_test.cpp b/test/unit_test/runtime/linear_algebra_test.cpp index bef57ee7..4fc15271 100644 --- a/test/unit_test/runtime/linear_algebra_test.cpp +++ b/test/unit_test/runtime/linear_algebra_test.cpp @@ -31,17 +31,14 @@ #include #include - template using vector = STD_LA::fixed_size_column_vector; template inline constexpr bool mp_units::is_vector> = true; -namespace STD_LA { - template -std::ostream& operator<<(std::ostream& os, const ::vector& v) +std::ostream& operator<<(std::ostream& os, const vector& v) { os << "|"; for (auto i = 0U; i < v.size(); ++i) { @@ -51,8 +48,6 @@ std::ostream& operator<<(std::ostream& os, const ::vector& v) return os; } -} // namespace STD_LA - namespace { using namespace mp_units; @@ -88,7 +83,7 @@ TEST_CASE("vector quantity", "[la]") SECTION("non-truncating") { const auto v = vector{3, 2, 1} * isq::position_vector[km]; - CHECK(v[m].number() == vector{3000, 2000, 1000}); + CHECK(v.in(m).number() == vector{3000, 2000, 1000}); } SECTION("truncating") diff --git a/test/unit_test/static/quantity_point_test.cpp b/test/unit_test/static/quantity_point_test.cpp index 51bef68a..37df9452 100644 --- a/test/unit_test/static/quantity_point_test.cpp +++ b/test/unit_test/static/quantity_point_test.cpp @@ -576,21 +576,21 @@ static_assert(is_of_type<(ground_level + isq::height(short(42) * m)).point_for(m // converting to a different unit /////////////////////////////////// -static_assert((mean_sea_level + 2. * km)[km].quantity_from_origin().number() == 2.); -static_assert((mean_sea_level + 2. * km)[m].quantity_from_origin().number() == 2000.); -static_assert((mean_sea_level + 2000. * m)[km].quantity_from_origin().number() == 2.); -static_assert((ground_level + 2. * km)[km].quantity_from_origin().number() == 2.); -static_assert((ground_level + 2. * km)[m].quantity_from_origin().number() == 2000.); -static_assert((ground_level + 2000. * m)[km].quantity_from_origin().number() == 2.); -static_assert((tower_peak + 2. * km)[km].quantity_from_origin().number() == 2.); -static_assert((tower_peak + 2. * km)[m].quantity_from_origin().number() == 2000.); -static_assert((tower_peak + 2000. * m)[km].quantity_from_origin().number() == 2.); +static_assert((mean_sea_level + 2. * km).in(km).quantity_from_origin().number() == 2.); +static_assert((mean_sea_level + 2. * km).in(m).quantity_from_origin().number() == 2000.); +static_assert((mean_sea_level + 2000. * m).in(km).quantity_from_origin().number() == 2.); +static_assert((ground_level + 2. * km).in(km).quantity_from_origin().number() == 2.); +static_assert((ground_level + 2. * km).in(m).quantity_from_origin().number() == 2000.); +static_assert((ground_level + 2000. * m).in(km).quantity_from_origin().number() == 2.); +static_assert((tower_peak + 2. * km).in(km).quantity_from_origin().number() == 2.); +static_assert((tower_peak + 2. * km).in(m).quantity_from_origin().number() == 2000.); +static_assert((tower_peak + 2000. * m).in(km).quantity_from_origin().number() == 2.); #if MP_UNITS_COMP_GCC != 10 || MP_UNITS_COMP_GCC_MINOR > 2 template typename QP> concept invalid_unit_conversion = requires { - requires !requires { QP(2000 * m)[km]; }; // truncating conversion - requires !requires { QP(2 * m)[s]; }; // invalid unit + requires !requires { QP(2000 * m).in(km); }; // truncating conversion + requires !requires { QP(2 * m).in(s); }; // invalid unit }; static_assert(invalid_unit_conversion); #endif diff --git a/test/unit_test/static/quantity_test.cpp b/test/unit_test/static/quantity_test.cpp index b1a6851a..259a7036 100644 --- a/test/unit_test/static/quantity_test.cpp +++ b/test/unit_test/static/quantity_test.cpp @@ -198,17 +198,17 @@ static_assert(quantity(1500 * m).number() == 1.5); // converting to a different unit /////////////////////////////////// -static_assert(quantity(2. * km)[km].number() == 2.); -static_assert(quantity(2. * km)[m].number() == 2000.); -static_assert(quantity(2000. * m)[km].number() == 2.); -static_assert(quantity(2 * km)[km].number() == 2); -static_assert(quantity(2 * km)[m].number() == 2000); +static_assert(quantity(2. * km).in(km).number() == 2.); +static_assert(quantity(2. * km).in(m).number() == 2000.); +static_assert(quantity(2000. * m).in(km).number() == 2.); +static_assert(quantity(2 * km).in(km).number() == 2); +static_assert(quantity(2 * km).in(m).number() == 2000); #if MP_UNITS_COMP_GCC != 10 || MP_UNITS_COMP_GCC_MINOR > 2 template typename Q> concept invalid_unit_conversion = requires { - requires !requires { Q(2000 * m)[km]; }; // truncating conversion - requires !requires { Q(2 * m)[s]; }; // invalid unit + requires !requires { Q(2000 * m).in(km); }; // truncating conversion + requires !requires { Q(2 * m).in(s); }; // invalid unit }; static_assert(invalid_unit_conversion); #endif @@ -648,7 +648,7 @@ static_assert((7 * one % (2 * one)).number() == 1); static_assert((10 * m2 * (10 * m2)) / (50 * m2) == 2 * m2); static_assert((10 * km / (5 * m)).number() == 2); -static_assert((10 * km / (5 * m))[one].number() == 2000); +static_assert((10 * km / (5 * m)).in(one).number() == 2000); static_assert((10 * s * (2 * kHz)).number() == 20); // commutativity and associativity @@ -872,10 +872,10 @@ static_assert(!(123 * km >= 321'000 * m)); static_assert(is_of_type<10 * km / (5 * km), quantity>); -static_assert((50. * m / (100. * m))[percent].number() == 50); +static_assert((50. * m / (100. * m)).in(percent).number() == 50); static_assert(50. * m / (100. * m) == 50 * percent); -static_assert(((50. * percent)[one]).number() == 0.5); +static_assert((50. * percent).in(one).number() == 0.5); //////////////////