3 #include <boost/lexical_cast.hpp> 4 #include <boost/program_options.hpp> 10 int main(
int argc,
char** argv) {
14 using namespace icedb;
15 namespace po = boost::program_options;
17 po::options_description desc(
"Allowed options"), cmdline(
"Command-line options"),
18 config(
"Config options"), hidden(
"Hidden options"), oall(
"all options");
21 (
"help,h",
"produce help message")
22 (
"input,i", po::value< double >(),
"Input quantity")
23 (
"input-units,u", po::value< string >(),
"Input units")
24 (
"output-units,o", po::value< string >(),
"Output units")
25 (
"spec",
"Perform spectral interconversion.")
28 po::positional_options_description p;
30 p.add(
"input-units", 1);
31 p.add(
"output-units", 1);
33 desc.add(cmdline).add(config);
34 oall.add(cmdline).add(config).add(hidden);
37 po::store(po::command_line_parser(argc, argv).
38 options(oall).positional(p).run(), vm);
41 auto doHelp = [&desc](
const std::string &msg) {
42 std::cerr << msg << std::endl << desc << std::endl;
45 if (vm.count(
"help")) doHelp(
"");
48 string inUnits, outUnits;
51 if (vm.count(
"spec")) isSpec =
true;
52 if (vm.count(
"input")) inVal = vm[
"input"].as<double>();
55 cout <<
"Specify input number (without units): ";
56 std::getline(cin, temp);
58 inVal = boost::lexical_cast<
double>(temp);
60 catch (boost::bad_lexical_cast) {
62 .add<std::string>(
"Reason",
"Cannot parse input number")
63 .add<string>(
"Input _Number_", temp);
66 if (vm.count(
"input-units")) inUnits = vm[
"input-units"].as<string>();
68 cout <<
"Specify input units (terminate with 'enter'): ";
69 std::getline(cin, inUnits);
70 if (!inUnits.size()) doHelp(
"Need to specify input units.");
72 if (vm.count(
"output-units")) outUnits = vm[
"output-units"].as<string>();
74 cout <<
"Specify output units (terminate with 'enter'): ";
75 std::getline(cin, outUnits);
76 if (!outUnits.size()) doHelp(
"Need to specify output units.");
78 bool hasLenUnits =
false;
79 bool hasFreqUnits =
false;
85 if (!isSpec && hasLenUnits && hasFreqUnits) {
87 cout <<
"Is this an in-vacuo spectral unit conversion (i.e. GHz to mm) [yes]? ";
89 std::getline(cin, temp);
93 case 'N':
case 'n':
case 'f':
case 'F':
case '0':
96 case 'Y':
case 'y':
case 't':
case 'T':
case '1':
101 .add<std::string>(
"Reason",
"Cannot parse boolean")
102 .add<string>(
"Input _Bool_", temp);
108 std::shared_ptr<icedb::units::converter> cnv;
116 if (cnv->isValid()) {
117 outVal = cnv->convert(inVal);
118 cout << outVal << endl;
120 else cerr <<
"Conversion is invalid or unhandled for \"" << inUnits <<
"\" to \"" << outUnits <<
"\"." << endl;
122 catch (std::exception &e) {
123 cerr <<
"An exception has occurred: " << e.what() << endl;
int main(int argc, char **argv)
bool isValid() const
Is this conversion valid?
Perform interconversions between frequency, wavelength and wavenumber (GHz, Hz, m, cm, um, cm^-1, m^-1)