From d9d9d9d3b74ec9ce3a584301f64758cc4ae55c24 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Wed, 21 Jun 2023 11:29:22 +0200 Subject: [PATCH] feat(example): `storage_tank` example extended with custom quantity types --- example/CMakeLists.txt | 2 +- example/storage_tank.cpp | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 5741fc67..a06b518a 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -53,7 +53,7 @@ add_example(glide_computer mp-units::core-fmt mp-units::international mp-units:: add_example(hello_units mp-units::core-fmt mp-units::core-io mp-units::si mp-units::usc) add_example(measurement mp-units::core-io mp-units::si) add_example(si_constants mp-units::core-fmt mp-units::si) -add_example(storage_tank mp-units::core-fmt mp-units::si) +add_example(storage_tank mp-units::core-fmt mp-units::si mp-units::utility) add_example( strong_angular_quantities mp-units::core-fmt mp-units::core-io mp-units::si mp-units::isq_angle mp-units::utility ) diff --git a/example/storage_tank.cpp b/example/storage_tank.cpp index 0acddd2d..f8f4d9ee 100644 --- a/example/storage_tank.cpp +++ b/example/storage_tank.cpp @@ -21,6 +21,7 @@ // SOFTWARE. #include +#include #include #include #include @@ -28,6 +29,7 @@ #include #include #include +#include #include template @@ -39,6 +41,13 @@ namespace { using namespace mp_units; using namespace mp_units::si::unit_symbols; +// add a custom quantity type of kind isq::length +QUANTITY_SPEC(horizontal_length, isq::length); + +// add a custom derived quantity type of kind isq::area +// with a constrained quantity equation +QUANTITY_SPEC(horizontal_area, isq::area, horizontal_length* isq::width); + inline constexpr auto g = 1 * si::standard_gravity; inline constexpr auto air_density = isq::mass_density(1.225 * (kg / m3)); @@ -80,14 +89,14 @@ public: class CylindricalStorageTank : public StorageTank { public: constexpr CylindricalStorageTank(const quantity& radius, const quantity& height) : - StorageTank(std::numbers::pi * radius * radius, height) + StorageTank(quantity_cast(std::numbers::pi * pow<2>(radius)), height) { } }; class RectangularStorageTank : public StorageTank { public: - constexpr RectangularStorageTank(const quantity& length, const quantity& width, + constexpr RectangularStorageTank(const quantity& length, const quantity& width, const quantity& height) : StorageTank(length * width, height) { @@ -99,11 +108,8 @@ public: int main() { - using namespace mp_units; - using namespace mp_units::si::unit_symbols; - const auto height = isq::height(200 * mm); - auto tank = RectangularStorageTank(isq::length(1'000 * mm), isq::width(500 * mm), height); + auto tank = RectangularStorageTank(horizontal_length(1'000 * mm), isq::width(500 * mm), height); tank.set_contents_density(1'000 * isq::mass_density[kg / m3]); const auto fill_time = 200 * s; // time since starting fill