// Boost.Units - A C++ library for zero-overhead dimensional analysis and // unit/quantity manipulation and conversion // // Copyright (C) 2003-2008 Matthias Christian Schabel // Copyright (C) 2008 Steven Watanabe // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) /** \file \brief Example of using autoprefixes. \details Example of using engineering (10^3) and binary (2^10) autoprefixes. Output: @verbatim autoprefixes.cpp using native typeof Linking... Embedding manifest... Autorun "j:\Cpp\Misc\debug\autoprefixes.exe" 2.345 m 2.345 km 5.49902 MJ 5.49902 megajoule 2.048 kb 2 Kib 2345.6 23456 2345.6 23456 m meter 0 1 @endverbatim //[autoprefixes_output //] [/autoprefixes_output **/ #include #include #include #include #include #include struct byte_base_unit : boost::units::base_unit { static constexpr const char* name() { return("byte"); } static constexpr const char* symbol() { return("b"); } }; struct thing_base_unit : boost::units::base_unit { static constexpr const char* name() { return("thing"); } static constexpr const char* symbol() { return(""); } }; struct euro_base_unit : boost::units::base_unit { static constexpr const char* name() { return("EUR"); } static constexpr const char* symbol() { return("€"); } }; int main() { using std::cout; using std::endl; using namespace boost::units; using namespace boost::units::si; //[autoprefixes_snippet_1 using boost::units::binary_prefix; using boost::units::engineering_prefix; using boost::units::no_prefix; quantity l = 2.345 * meters; // A quantity of length, in units of meters. cout << engineering_prefix << l << endl; // Outputs "2.345 m". l = 1000.0 * l; // Increase it by 1000, so expect a k prefix. // Note that a double 1000.0 is required - an integer will fail to compile. cout << engineering_prefix << l << endl; // Output autoprefixed with k to "2.345 km". quantity e = kilograms * pow<2>(l / seconds); // A quantity of energy. cout << engineering_prefix << e << endl; // 5.49902 MJ cout << name_format << engineering_prefix << e << endl; // 5.49902 megaJoule //] [/autoprefixes_snippet_1] //[autoprefixes_snippet_2 // Don't forget that the units name or symbol format specification is persistent. cout << symbol_format << endl; // Resets the format to the default symbol format. quantity b = 2048. * byte_base_unit::unit_type(); cout << engineering_prefix << b << endl; // 2.048 kb cout << symbol_format << binary_prefix << b << endl; // "2 Kib" //] [/autoprefixes_snippet_2] // Note that scalar dimensionless values are *not* prefixed automatically by the engineering_prefix or binary_prefix iostream manipulators. //[autoprefixes_snippet_3 const double s1 = 2345.6; const long x1 = 23456; cout << engineering_prefix << s1 << endl; // 2345.6 cout << engineering_prefix << x1 << endl; // 23456 cout << binary_prefix << s1 << endl; // 2345.6 cout << binary_prefix << x1 << endl; // 23456 //] [/autoprefixes_snippet_3] //[autoprefixes_snippet_4 const length L; // A unit of length (but not a quantity of length). cout << L << endl; // Default length unit is meter, // but default is symbol format so output is just "m". cout << name_format << L << endl; // default length name is "meter". //] [/autoprefixes_snippet_4] //[autoprefixes_snippet_5 no_prefix(cout); // Clear any prefix flag. cout << no_prefix << endl; // Clear any prefix flag using `no_prefix` manipulator. //] [/autoprefixes_snippet_5] //[autoprefixes_snippet_6 cout << boost::units::get_autoprefix(cout) << endl; // 8 is `autoprefix_binary` from `enum autoprefix_mode`. cout << boost::units::get_format(cout) << endl; // 1 is `name_fmt` from `enum format_mode`. //] [/autoprefixes_snippet_6] quantity t = 2048. * thing_base_unit::unit_type(); cout << name_format << engineering_prefix << t << endl; // 2.048 kilothing cout << symbol_format << engineering_prefix << t << endl; // 2.048 k cout << binary_prefix << t << endl; // "2 Ki" quantity ce = 2048. * euro_base_unit::unit_type(); cout << name_format << engineering_prefix << ce << endl; // 2.048 kiloEUR cout << symbol_format << engineering_prefix << ce << endl; // 2.048 k€ return 0; } // int main()