#include #include "./length.h" #include "./acceleration.h" #include "./density.h" #include "./force.h" #include "./mass.h" #include "./time.h" #include "./volume.h" #include using namespace units::experimental; struct Box { static constexpr auto air_density = density::kg_per_m3<>{1.225}; length::m<> length; length::m<> width; length::m<> height; constexpr Box(const length::m<>& l, const length::m<>& w, const length::m<>& h) : length{l}, width{w}, height{h} {} struct contents { density::kg_per_m3<> density = air_density; } contents; constexpr force::N<> filled_weight() const { const volume::m3<> volume = length * width * height; const mass::kg<> mass = contents.density * volume; return mass * acceleration::g<>; } constexpr length::m<> fill_level(const mass::kg<>& measured_mass) const { return height * (measured_mass * acceleration::g<>) / filled_weight(); } constexpr volume::m3<> spare_capacity(const mass::kg<>& measured_mass) const { return (height - fill_level(measured_mass)) * width * length; } constexpr void set_contents_density(const density::kg_per_m3<>& density_in) { assert(density_in > air_density); contents.density = density_in; } }; #include using namespace units::isq::si::literals; int main() { auto box = Box{1000.0_q_mm, 500.0_q_mm, 200.0_q_mm}; box.set_contents_density(1000.0_q_kg_per_m3); auto fill_time = 200.0_q_s; // time since starting fill auto measured_mass = 20.0_q_kg; // measured mass at fill_time std::cout << "mpusz/units box example ( using experimental alternative syntax for defining quantities) ...\n"; std::cout << "fill height at " << fill_time << " = " << box.fill_level(measured_mass) << " (" << (box.fill_level(measured_mass) / box.height) * 100 << "% full)\n"; std::cout << "spare_capacity at " << fill_time << " = " << box.spare_capacity(measured_mass) << '\n'; std::cout << "input flow rate after " << fill_time << " = " << measured_mass / fill_time << '\n'; std::cout << "float rise rate = " << box.fill_level(measured_mass) / fill_time << '\n'; auto fill_time_left = (box.height / box.fill_level(measured_mass) - 1) * fill_time; std::cout << "box full E.T.A. at current flow rate = " << fill_time_left << '\n'; }