9 #include <aliceVision/system/Logger.hpp>
10 #include <aliceVision/system/Timer.hpp>
11 #include <aliceVision/system/hardwareContext.hpp>
13 #include <boost/program_options/variables_map.hpp>
14 #include <boost/program_options/option.hpp>
15 #include <boost/program_options/errors.hpp>
16 #include <boost/program_options/parsers.hpp>
17 #include <boost/program_options/options_description.hpp>
22 #define ALICEVISION_COMMANDLINE_START \
26 system::Timer commandLineTimer;
28 #define ALICEVISION_COMMANDLINE_END \
30 ALICEVISION_LOG_INFO("Task done in (s): " + std::to_string(commandLineTimer.elapsed())); \
31 return EXIT_SUCCESS; \
33 catch (std::exception & e) \
35 ALICEVISION_CERR("================================================================================"); \
36 ALICEVISION_CERR("====================== Command line failed with an error ======================="); \
37 ALICEVISION_CERR(e.what()); \
38 ALICEVISION_CERR("================================================================================"); \
39 return EXIT_FAILURE; \
43 ALICEVISION_CERR("================================================================================"); \
44 ALICEVISION_CERR("============== Command line failed with an unrecognized exception =============="); \
45 ALICEVISION_CERR("================================================================================"); \
46 return EXIT_FAILURE; \
52 std::function<void(T)> optInRange(T min, T max,
const char* opt_name)
55 if (v < min || v > max)
57 throw boost::program_options::validation_error(
58 boost::program_options::validation_error::invalid_option_value, opt_name, std::to_string(v));
66 inline std::ostream& operator<<(std::ostream& os,
const boost::any& value)
71 boost::any_cast<const char*>(value);
74 catch (
const boost::bad_any_cast&)
81 boost::any_cast<std::string>(value);
84 catch (
const boost::bad_any_cast&)
89 if (value.type() ==
typeid(
int))
91 os << boost::any_cast<int>(value);
93 else if (value.type() ==
typeid(std::size_t))
95 os << boost::any_cast<std::size_t>(value);
97 else if (((boost::any)value).type() ==
typeid(
bool))
99 os << boost::any_cast<bool>(value);
101 else if (value.type() ==
typeid(
float))
103 os << boost::any_cast<float>(value);
105 else if (value.type() ==
typeid(
double))
107 os << boost::any_cast<double>(value);
111 os <<
"\"" << boost::any_cast<const char*>(value) <<
"\"";
115 os <<
"\"" << boost::any_cast<std::string>(value) <<
"\"";
122 std::vector<std::string> vect = boost::any_cast<std::vector<std::string>>(value);
127 for (
int i = 1; i < static_cast<int>(vect.size()); ++i)
128 os <<
", " << vect[i];
132 catch (
const boost::bad_any_cast&)
134 os <<
" Unknown Type \"" << value.type().name() <<
"\"";
140 namespace program_options {
142 inline std::ostream& operator<<(std::ostream& os,
const variables_map& vm)
144 for (
const auto& v : vm)
146 const std::string& optionName = v.first;
147 const boost::program_options::variable_value& var = v.second;
149 os <<
" * " << optionName <<
" = " << var.value();
151 if (var.value().empty())
155 if (vm[optionName].defaulted() || var.defaulted())
172 CmdLine(
const std::string& name)
176 void add(
const boost::program_options::options_description& options) { _allParams.add(options); }
178 bool execute(
int argc,
char** argv);
183 boost::program_options::options_description _allParams;