You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
4.6 KiB
209 lines
4.6 KiB
/*
|
|
* settings.h
|
|
*
|
|
* Created on: 22.11.2012
|
|
* Author: Gereon Kremer
|
|
*/
|
|
|
|
#ifndef SETTINGS_H_
|
|
#define SETTINGS_H_
|
|
|
|
#include <iostream>
|
|
#include <list>
|
|
#include <boost/program_options.hpp>
|
|
#include "src/exceptions/InvalidSettings.h"
|
|
|
|
namespace mrmc {
|
|
|
|
/*!
|
|
* @brief Contains Settings class and associated methods.
|
|
*
|
|
* The settings namespace contains the Settings class some friend methods like instance().
|
|
*/
|
|
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.
|
|
*
|
|
* It is meant to be used as a singleton. Call
|
|
* @code mrmc::settings::Settings::instance(argc, argv, filename) @endcode
|
|
* to initialize it and obtain an instance for the first time.
|
|
* Afterwards, it is possible to use
|
|
* @code mrmc::settings::instance() @endcode
|
|
*/
|
|
class Settings
|
|
{
|
|
public:
|
|
|
|
/*!
|
|
* @brief Get value of a generic option.
|
|
*/
|
|
template <typename T>
|
|
const T& get(const std::string &name) const {
|
|
return this->vm[name].as<T>();
|
|
}
|
|
|
|
/*!
|
|
* @brief Get value of string option
|
|
*/
|
|
const std::string& getString(const std::string &name) const {
|
|
return this->get<std::string>(name);
|
|
}
|
|
|
|
/*!
|
|
* @brief Check if an option is set
|
|
*/
|
|
const bool isSet(const std::string &name) const {
|
|
return this->vm.count(name) > 0;
|
|
}
|
|
|
|
friend std::ostream& help(std::ostream& os);
|
|
friend std::ostream& helpConfigfile(std::ostream& os);
|
|
friend Settings* instance();
|
|
|
|
/*!
|
|
* @brief Creates a new instance.
|
|
*/
|
|
static Settings* instance(const int argc, const char* argv[], const char* filename);
|
|
|
|
private:
|
|
/*!
|
|
* @brief Constructor.
|
|
*/
|
|
Settings(const int argc, const char* argv[], const char* filename);
|
|
|
|
/*!
|
|
* @brief Option descriptions.
|
|
*/
|
|
static bpo::options_description configfile;
|
|
static bpo::options_description generic;
|
|
static bpo::options_description commandline;
|
|
static bpo::positional_options_description positional;
|
|
|
|
/*!
|
|
* @brief Collecting option descriptions.
|
|
*
|
|
* The options for command line and config file are collected
|
|
* here.
|
|
*/
|
|
static bpo::options_description cli;
|
|
static bpo::options_description conf;
|
|
|
|
/*!
|
|
* @brief option mapping.
|
|
*/
|
|
bpo::variables_map vm;
|
|
|
|
/*!
|
|
* @brief actual instance of this class.
|
|
*/
|
|
static Settings* inst;
|
|
};
|
|
|
|
/*!
|
|
* @brief Print usage help.
|
|
*/
|
|
std::ostream& help(std::ostream& os);
|
|
|
|
/*!
|
|
* @brief Print help for config file options.
|
|
*/
|
|
std::ostream& helpConfigfile(std::ostream& os);
|
|
|
|
/*!
|
|
* @brief Return current instance.
|
|
*/
|
|
Settings* instance();
|
|
|
|
|
|
/*!
|
|
* @brief Function type for functions registering new options.
|
|
*/
|
|
typedef void(*fptr_regOption)(bpo::options_description&);
|
|
|
|
/*!
|
|
* @brief Function type for function checking constraints on settings.
|
|
*/
|
|
typedef bool(*fptr_checkOption)(bpo::variables_map&);
|
|
|
|
|
|
/*!
|
|
* @brief This class handles callbacks for registering new options and
|
|
* checking constraints on them afterwards.
|
|
*
|
|
* This class is also a singleton (like Settings) and is implemented much
|
|
* simpler as we don't need any custom initialization code.
|
|
*/
|
|
class Callbacks
|
|
{
|
|
private:
|
|
/*!
|
|
* @brief Stores register callbacks.
|
|
*/
|
|
std::list<fptr_regOption> reg_list;
|
|
/*!
|
|
* @brief Stores check callbacks.
|
|
*/
|
|
std::list<fptr_checkOption> check_list;
|
|
|
|
/*!
|
|
* @brief Private constructor.
|
|
*/
|
|
Callbacks() {}
|
|
/*!
|
|
* @brief Private copy constructor.
|
|
*/
|
|
Callbacks(const Callbacks&) {}
|
|
/*!
|
|
* @brief Private destructor.
|
|
*/
|
|
~Callbacks() {}
|
|
public:
|
|
/*!
|
|
* @brief Returns current instance to create singleton.
|
|
* @return current instance
|
|
*/
|
|
static Callbacks& getInstance()
|
|
{
|
|
static Callbacks instance;
|
|
return instance;
|
|
}
|
|
|
|
/*!
|
|
* @brief Register class needs access to lists.
|
|
*/
|
|
friend class Register;
|
|
};
|
|
|
|
/*!
|
|
* @brief Wrapper class to allow for registering callbacks during
|
|
* static initialization.
|
|
*/
|
|
class Register
|
|
{
|
|
public:
|
|
/*!
|
|
* @brief Registers given function as register callback.
|
|
*/
|
|
Register(const fptr_regOption ptr)
|
|
{
|
|
mrmc::settings::Callbacks::getInstance().reg_list.push_back(ptr);
|
|
}
|
|
|
|
/*!
|
|
* @brief Registers given function as check callback.
|
|
*/
|
|
Register(const fptr_checkOption ptr)
|
|
{
|
|
mrmc::settings::Callbacks::getInstance().check_list.push_back(ptr);
|
|
}
|
|
};
|
|
|
|
} // namespace settings
|
|
} // namespace mrmc
|
|
|
|
#endif // SETTINGS_H_
|