123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- // 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)
- #include <map>
- #include <iostream>
- #include <boost/lexical_cast.hpp>
- #include <boost/units/quantity.hpp>
- #include <boost/units/cmath.hpp>
- #include <boost/units/systems/si/length.hpp>
- #include <boost/units/base_units/imperial/foot.hpp>
- //[runtime_unit_snippet_1
- namespace {
- using namespace boost::units;
- using imperial::foot_base_unit;
- std::map<std::string, quantity<si::length> > known_units;
- }
- quantity<si::length> calculate(const quantity<si::length>& t)
- {
- return(boost::units::hypot(t, 2.0 * si::meters));
- }
- int main()
- {
- known_units["meter"] = 1.0 * si::meters;
- known_units["centimeter"] = .01 * si::meters;
- known_units["foot"] =
- conversion_factor(foot_base_unit::unit_type(), si::meter) * si::meter;
-
- std::string output_type("meter");
- std::string input;
-
- while((std::cout << "> ") && (std::cin >> input))
- {
- if(!input.empty() && input[0] == '#')
- {
- std::getline(std::cin, input);
- }
- else if(input == "exit")
- {
- break;
- }
- else if(input == "help")
- {
- std::cout << "type \"exit\" to exit\n"
- "type \"return 'unit'\" to set the return units\n"
- "type \"'number' 'unit'\" to do a simple calculation"
- << std::endl;
- }
- else if(input == "return")
- {
- if(std::cin >> input)
- {
- if(known_units.find(input) != known_units.end())
- {
- output_type = input;
- std::cout << "Done." << std::endl;
- }
- else
- {
- std::cout << "Unknown unit \"" << input << "\""
- << std::endl;
- }
- }
- else
- {
- break;
- }
- }
- else
- {
- try
- {
- double value = boost::lexical_cast<double>(input);
-
- if(std::cin >> input)
- {
- if(known_units.find(input) != known_units.end())
- {
- std::cout << static_cast<double>(
- calculate(value * known_units[input]) /
- known_units[output_type])
- << ' ' << output_type << std::endl;
- }
- else
- {
- std::cout << "Unknown unit \"" << input << "\""
- << std::endl;
- }
- }
- else
- {
- break;
- }
- }
- catch(...)
- {
- std::cout << "Input error" << std::endl;
- }
- }
- }
- }
- //]
|