gereon
12 years ago
1 changed files with 132 additions and 0 deletions
@ -0,0 +1,132 @@ |
|||
/* |
|||
* settings.h |
|||
* |
|||
* Created on: 22.11.2012 |
|||
* Author: Gereon Kremer |
|||
*/ |
|||
|
|||
#pragma once |
|||
|
|||
#include <iostream> |
|||
#include <boost/program_options.hpp> |
|||
|
|||
namespace mrmc { |
|||
namespace settings { |
|||
|
|||
namespace bpo = boost::program_options; |
|||
/*! |
|||
* @brief Simple wrapper around boost::program_options to handle configuration options. |
|||
* |
|||
* This class uses boost::program_options to read options from the |
|||
* commandline and additionally load options from a file. |
|||
*/ |
|||
class Settings |
|||
{ |
|||
private: |
|||
/*! |
|||
* @brief option descriptions |
|||
*/ |
|||
bpo::options_description configfile; |
|||
bpo::options_description generic; |
|||
bpo::options_description commandline; |
|||
|
|||
/*! |
|||
* @brief collecing option descriptions |
|||
* |
|||
* The options for command line and config file are collected |
|||
* here |
|||
*/ |
|||
bpo::options_description cli; |
|||
bpo::options_description conf; |
|||
|
|||
/*! |
|||
* @brief option mapping |
|||
*/ |
|||
bpo::variables_map vm; |
|||
|
|||
public: |
|||
|
|||
/*! |
|||
* @brief Constructor of Settings file |
|||
* |
|||
* The constructor fills the option descriptions, parses the |
|||
* command line and the config file and puts the option values to |
|||
* our option mapping. |
|||
* |
|||
* If a configfile is set in the commandline, we load this one. |
|||
* Otherwise, if filename is not NULL, we load this one. Otherwise, |
|||
* we load no config file. |
|||
* |
|||
* @param argc should be argc passed to main function |
|||
* @param argv should be argv passed to main function |
|||
* @param filename either NULL or name of config file |
|||
*/ |
|||
Settings(const int argc, const char* argv[], const char* filename) |
|||
: configfile("Config Options"), generic("Generic Options"), commandline("Commandline Options") |
|||
{ |
|||
/* |
|||
* fill option descriptions |
|||
*/ |
|||
this->commandline.add_options() |
|||
("help", "produce help message") |
|||
("help-config", "produce help message about config file") |
|||
("configfile", bpo::value<std::string>(), "name of config file") |
|||
; |
|||
|
|||
/* |
|||
* construct option descriptions for commandline and config file |
|||
*/ |
|||
this->cli.add(this->commandline).add(generic); |
|||
this->conf.add(this->configfile).add(generic); |
|||
|
|||
try |
|||
{ |
|||
/* |
|||
* load command line |
|||
*/ |
|||
bpo::store(bpo::parse_command_line(argc, argv, this->cli), this->vm); |
|||
/* |
|||
* load config file if specified |
|||
*/ |
|||
if (this->vm.count("configfile")) |
|||
{ |
|||
bpo::store(bpo::parse_config_file<char>(this->vm["configfile"].as<std::string>().c_str(), this->conf), this->vm, true); |
|||
} |
|||
else if (filename != NULL) |
|||
{ |
|||
bpo::store(bpo::parse_config_file<char>(filename, this->conf), this->vm, true); |
|||
} |
|||
} |
|||
/* |
|||
* catch errors... |
|||
*/ |
|||
catch (bpo::reading_file e) |
|||
{ |
|||
std::cout << "Could not read config file " << filename << std::endl; |
|||
} |
|||
catch (bpo::error e) |
|||
{ |
|||
std::cout << "Some error occurred: " << e.what() << std::endl; |
|||
} |
|||
bpo::notify(this->vm); |
|||
} |
|||
|
|||
/*! |
|||
* @brief Get option descriptions for commandline options |
|||
*/ |
|||
bpo::options_description getHelpForCommandline() |
|||
{ |
|||
return this->cli; |
|||
} |
|||
|
|||
/*! |
|||
* @brief Get option descriptions for config file options |
|||
*/ |
|||
bpo::options_description getHelpForConfigfile() |
|||
{ |
|||
return this->conf; |
|||
} |
|||
}; |
|||
|
|||
} // namespace parser |
|||
} // namespace mrmc |
Write
Preview
Loading…
Cancel
Save
Reference in new issue