/* Copyright (c) 2003-2020 Andy Little. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses./ */ #include "./units_str.h" #include "./length.h" #include #include /* get conversion factor from one dimensionally equivalent quantity type to another */ namespace { template requires units::equivalent inline constexpr std::common_type_t conversion_factor(Target, Source) { // get quantities looking like inputs but with Q::rep that doesn't have narrowing conversion typedef std::common_type_t rep; typedef units::quantity source; typedef units::quantity target; return target{source{1}}.number(); } } // namespace using namespace units::isq::si::literals; using namespace units::experimental; int main() { std::cout << "conversion factor in mpusz/units...\n\n"; constexpr length::m<> lengthA = 2.0_q_m; constexpr length::mm<> lengthB = lengthA; std::cout << "lengthA( " << lengthA << " ) and lengthB( " << lengthB << " )\n" << "represent the same length in different units.\n\n"; std::cout << "therefore ratio lengthA / lengthB == " << lengthA / lengthB << "\n\n"; std::cout << "conversion factor from lengthA::unit of " << units_str(lengthA).standard() << " to lengthB::unit of " << units_str(lengthB).standard() << " :\n\n" << "lengthB.number( " << lengthB.number() << " ) == lengthA.number( " << lengthA.number() << " ) * conversion_factor( " << conversion_factor(lengthB, lengthA) << " )\n"; }