From c09e897dab07a124e94e957a08ed98112e5a265a Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Wed, 7 May 2014 12:05:51 +0200 Subject: [PATCH] migrate ProgramOptions to C++11 --- Util/ProgramOptions.h | 298 ++++++++++++++++++------------------------ 1 file changed, 130 insertions(+), 168 deletions(-) diff --git a/Util/ProgramOptions.h b/Util/ProgramOptions.h index c1e453016..47cd0e9bf 100644 --- a/Util/ProgramOptions.h +++ b/Util/ProgramOptions.h @@ -37,10 +37,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include -#include #include +#include #include const static unsigned INIT_OK_START_ENGINE = 0; @@ -48,118 +47,81 @@ const static unsigned INIT_OK_DO_NOT_START_ENGINE = 1; const static unsigned INIT_FAILED = -1; // support old capitalized option names by down-casing them with a regex replace -inline void PrepareConfigFile( - const boost::filesystem::path& path, - std::string& output -) { - std::ifstream config_stream( path.string().c_str() ); - std::string input_str( - (std::istreambuf_iterator(config_stream)), - std::istreambuf_iterator() - ); - boost::regex regex( "^([^=]*)" ); //match from start of line to '=' - std::string format( "\\L$1\\E" ); //replace with downcased substring - output = boost::regex_replace( input_str, regex, format ); +inline void PrepareConfigFile(const boost::filesystem::path &path, std::string &output) +{ + std::ifstream config_stream(path.string().c_str()); + std::string input_str((std::istreambuf_iterator(config_stream)), + std::istreambuf_iterator()); + std::regex regex("^([^=]*)"); // match from start of line to '=' + std::string format("\\L$1\\E"); // replace with downcased substring + output = std::regex_replace(input_str, regex, format); } // generate boost::program_options object for the routing part -inline unsigned GenerateServerProgramOptions( - const int argc, - const char * argv[], - ServerPaths & paths, - std::string & ip_address, - int & ip_port, - int & requested_num_threads, - bool & use_shared_memory, - bool & trial -) { +inline unsigned GenerateServerProgramOptions(const int argc, + const char *argv[], + ServerPaths &paths, + std::string &ip_address, + int &ip_port, + int &requested_num_threads, + bool &use_shared_memory, + bool &trial) +{ // declare a group of options that will be allowed only on command line boost::program_options::options_description generic_options("Options"); - generic_options.add_options() - ("version,v", "Show version") - ("help,h", "Show this help message") - ( - "config,c", - boost::program_options::value( - &paths["config"] - )->default_value("server.ini"), - "Path to a configuration file" - ) - ( - "trial", - boost::program_options::value(&trial)->implicit_value(true), - "Quit after initialization" - ); + generic_options.add_options()("version,v", "Show version")("help,h", "Show this help message")( + "config,c", + boost::program_options::value(&paths["config"]) + ->default_value("server.ini"), + "Path to a configuration file")( + "trial", + boost::program_options::value(&trial)->implicit_value(true), + "Quit after initialization"); // declare a group of options that will be allowed both on command line // as well as in a config file boost::program_options::options_description config_options("Configuration"); - config_options.add_options() - ( - "hsgrdata", - boost::program_options::value(&paths["hsgrdata"]), - ".hsgr file" - ) - ( - "nodesdata", - boost::program_options::value(&paths["nodesdata"]), - ".nodes file" - ) - ( - "edgesdata", - boost::program_options::value(&paths["edgesdata"]), - ".edges file") - ( - "geometry", - boost::program_options::value(&paths["geometries"]), - ".geometry file") - ( - "ramindex", - boost::program_options::value(&paths["ramindex"]), - ".ramIndex file") - ( - "fileindex", - boost::program_options::value(&paths["fileindex"]), - "File index file") - ( - "namesdata", - boost::program_options::value(&paths["namesdata"]), - ".names file") - ( - "timestamp", - boost::program_options::value(&paths["timestamp"]), - ".timestamp file") - ( - "ip,i", - boost::program_options::value(&ip_address)->default_value("0.0.0.0"), - "IP address" - ) - ( - "port,p", - boost::program_options::value(&ip_port)->default_value(5000), - "TCP/IP port" - ) - ( - "threads,t", - boost::program_options::value(&requested_num_threads)->default_value(8), - "Number of threads to use" - ) - ( - "sharedmemory,s", - boost::program_options::value(&use_shared_memory)->implicit_value(true), - "Load data from shared memory" - ); + config_options.add_options()( + "hsgrdata", + boost::program_options::value(&paths["hsgrdata"]), + ".hsgr file")("nodesdata", + boost::program_options::value(&paths["nodesdata"]), + ".nodes file")( + "edgesdata", + boost::program_options::value(&paths["edgesdata"]), + ".edges file")("geometry", + boost::program_options::value(&paths["geometries"]), + ".geometry file")( + "ramindex", + boost::program_options::value(&paths["ramindex"]), + ".ramIndex file")( + "fileindex", + boost::program_options::value(&paths["fileindex"]), + "File index file")( + "namesdata", + boost::program_options::value(&paths["namesdata"]), + ".names file")("timestamp", + boost::program_options::value(&paths["timestamp"]), + ".timestamp file")( + "ip,i", + boost::program_options::value(&ip_address)->default_value("0.0.0.0"), + "IP address")( + "port,p", boost::program_options::value(&ip_port)->default_value(5000), "TCP/IP port")( + "threads,t", + boost::program_options::value(&requested_num_threads)->default_value(8), + "Number of threads to use")( + "sharedmemory,s", + boost::program_options::value(&use_shared_memory)->implicit_value(true), + "Load data from shared memory"); // hidden options, will be allowed both on command line and in config // file, but will not be shown to the user boost::program_options::options_description hidden_options("Hidden options"); - hidden_options.add_options() - ( - "base,b", - boost::program_options::value(&paths["base"]), - "base path to .osrm file" - ); + hidden_options.add_options()( + "base,b", + boost::program_options::value(&paths["base"]), + "base path to .osrm file"); // positional option boost::program_options::positional_options_description positional_options; @@ -173,23 +135,25 @@ inline unsigned GenerateServerProgramOptions( config_file_options.add(config_options).add(hidden_options); boost::program_options::options_description visible_options( - boost::filesystem::basename(argv[0]) + " []" - ); + boost::filesystem::basename(argv[0]) + " []"); visible_options.add(generic_options).add(config_options); // parse command line options boost::program_options::variables_map option_variables; - boost::program_options::store( - boost::program_options::command_line_parser(argc, argv).options(cmdline_options).positional(positional_options).run(), - option_variables - ); + boost::program_options::store(boost::program_options::command_line_parser(argc, argv) + .options(cmdline_options) + .positional(positional_options) + .run(), + option_variables); - if(option_variables.count("version")) { + if (option_variables.count("version")) + { SimpleLogger().Write() << g_GIT_DESCRIPTION; return INIT_OK_DO_NOT_START_ENGINE; } - if(option_variables.count("help")) { + if (option_variables.count("help")) + { SimpleLogger().Write() << visible_options; return INIT_OK_DO_NOT_START_ENGINE; } @@ -198,112 +162,110 @@ inline unsigned GenerateServerProgramOptions( // parse config file ServerPaths::iterator path_iterator = paths.find("config"); - if( - path_iterator != paths.end() && - boost::filesystem::is_regular_file(path_iterator->second) && - !option_variables.count("base") - ) { - SimpleLogger().Write() << - "Reading options from: " << path_iterator->second.string(); + if (path_iterator != paths.end() && boost::filesystem::is_regular_file(path_iterator->second) && + !option_variables.count("base")) + { + SimpleLogger().Write() << "Reading options from: " << path_iterator->second.string(); std::string config_str; - PrepareConfigFile( path_iterator->second, config_str ); - std::stringstream config_stream( config_str ); - boost::program_options::store( - parse_config_file(config_stream, config_file_options), - option_variables - ); + PrepareConfigFile(path_iterator->second, config_str); + std::stringstream config_stream(config_str); + boost::program_options::store(parse_config_file(config_stream, config_file_options), + option_variables); boost::program_options::notify(option_variables); } - if( 1 > requested_num_threads ) { + if (1 > requested_num_threads) + { throw OSRMException("Number of threads must be a positive number"); } - if( !use_shared_memory && option_variables.count("base") ) { + if (!use_shared_memory && option_variables.count("base")) + { path_iterator = paths.find("base"); - BOOST_ASSERT( paths.end() != path_iterator ); + BOOST_ASSERT(paths.end() != path_iterator); std::string base_string = path_iterator->second.string(); path_iterator = paths.find("hsgrdata"); - if( - path_iterator != paths.end() && - !boost::filesystem::is_regular_file(path_iterator->second) - ) { + if (path_iterator != paths.end() && + !boost::filesystem::is_regular_file(path_iterator->second)) + { path_iterator->second = base_string + ".hsgr"; - } else { + } + else + { throw OSRMException(base_string + ".hsgr not found"); } path_iterator = paths.find("nodesdata"); - if( - path_iterator != paths.end() && - !boost::filesystem::is_regular_file(path_iterator->second) - ) { + if (path_iterator != paths.end() && + !boost::filesystem::is_regular_file(path_iterator->second)) + { path_iterator->second = base_string + ".nodes"; - } else { + } + else + { throw OSRMException(base_string + ".nodes not found"); } - path_iterator = paths.find("edgesdata"); - if( - path_iterator != paths.end() && - !boost::filesystem::is_regular_file(path_iterator->second) - ) { + if (path_iterator != paths.end() && + !boost::filesystem::is_regular_file(path_iterator->second)) + { path_iterator->second = base_string + ".edges"; - } else { + } + else + { throw OSRMException(base_string + ".edges not found"); } - path_iterator = paths.find("geometries"); - if( - path_iterator != paths.end() && - !boost::filesystem::is_regular_file(path_iterator->second) - ) { + if (path_iterator != paths.end() && + !boost::filesystem::is_regular_file(path_iterator->second)) + { path_iterator->second = base_string + ".geometry"; - } else { + } + else + { throw OSRMException(base_string + ".geometry not found"); } - path_iterator = paths.find("ramindex"); - if( - path_iterator != paths.end() && - !boost::filesystem::is_regular_file(path_iterator->second) - ) { + if (path_iterator != paths.end() && + !boost::filesystem::is_regular_file(path_iterator->second)) + { path_iterator->second = base_string + ".ramIndex"; - } else { + } + else + { throw OSRMException(base_string + ".ramIndex not found"); } - path_iterator = paths.find("fileindex"); - if( - path_iterator != paths.end() && - !boost::filesystem::is_regular_file(path_iterator->second) - ) { + if (path_iterator != paths.end() && + !boost::filesystem::is_regular_file(path_iterator->second)) + { path_iterator->second = base_string + ".fileIndex"; - } else { + } + else + { throw OSRMException(base_string + ".fileIndex not found"); } - path_iterator = paths.find("namesdata"); - if( - path_iterator != paths.end() && - !boost::filesystem::is_regular_file(path_iterator->second) - ) { + if (path_iterator != paths.end() && + !boost::filesystem::is_regular_file(path_iterator->second)) + { path_iterator->second = base_string + ".names"; - } else { + } + else + { throw OSRMException(base_string + ".namesIndex not found"); } path_iterator = paths.find("timestamp"); - if( - path_iterator != paths.end() && - !boost::filesystem::is_regular_file(path_iterator->second) - ) { + if (path_iterator != paths.end() && + !boost::filesystem::is_regular_file(path_iterator->second)) + { path_iterator->second = base_string + ".timestamp"; }