30namespace po = boost::program_options;
33namespace Configuration {
40 if (manager_ptr ==
nullptr) {
57 if (config_pair.second.find(root) != config_pair.second.end()) {
60 for (
auto& config : config_pair.second) {
73 logger.
debug() <<
"Cleaning dependencies of unregistered configurations...";
75 for (
auto& pair : dep_map) {
76 if (dict.find(pair.first) == dict.end()) {
81 for (
auto& value : pair.second) {
82 if (dict.find(value) == dict.end()) {
86 for (
auto& to_remove : unregistered_values) {
87 logger.
debug() <<
"Removing configuration dependency " << pair.first.name() <<
" -> " << to_remove.name();
88 pair.second.erase(to_remove);
91 for (
auto& to_remove : unregistered_keys) {
92 for (
auto& value : dep_map.at(to_remove)) {
93 logger.
debug() <<
"Removing configuration dependency " << to_remove.name() <<
" -> " << value.name();
95 dep_map.erase(to_remove);
104 m_dependency_map[pair.first].
insert(pair.second->getDependencies().begin(), pair.second->getDependencies().end());
113 if (!found.empty()) {
114 logger.
error() <<
"Found circular dependency between configurations:";
116 logger.
error() <<
" " << ++count <<
" : " << pair.first.name();
117 for (
auto& type : found) {
118 logger.
error() <<
" " << ++count <<
" : " << type.name();
126 for (
auto& pair : config.second->getProgramOptions()) {
127 if (all_options.find(pair.first) == all_options.end()) {
129 all_options.
emplace(pair.first, po::options_description{pair.first});
131 auto& group = all_options.at(pair.first);
132 for (
auto& option : pair.second) {
133 group.add(boost::shared_ptr<po::option_description>{
new po::option_description{option}});
138 po::options_description result{};
139 for (
auto& pair : all_options) {
140 result.add(pair.second);
150 if (dictionary.at(config)->getCurrentState() >= Configuration::State::INITIALIZED) {
154 for (
auto& dependency : dependency_map.at(config)) {
158 dictionary.at(config)->initialize(user_values);
159 dictionary.at(config)->getCurrentState() = Configuration::State::INITIALIZED;
163 m_state = State::INITIALIZED;
164 for (
auto& pair : m_config_dictionary) {
165 logger.
debug() <<
"Pre-Initializing configuration :" << pair.first.name();
166 pair.second->preInitialize(user_values);
167 pair.second->getCurrentState() = Configuration::State::PRE_INITIALIZED;
169 for (
auto& pair : m_config_dictionary) {
170 logger.
debug() <<
"Initializing configuration :" << pair.first.name();
173 for (
auto& pair : m_config_dictionary) {
174 logger.
debug() <<
"Post-Initializing configuration :" << pair.first.name();
175 pair.second->postInitialize(user_values);
176 pair.second->getCurrentState() = Configuration::State::FINAL;
static Elements::Logging logger
Logger.
T back_inserter(T... args)
void error(const std::string &logMessage)
void debug(const std::string &logMessage)
static Logging getLogger(const std::string &name="")
Manages a set of configuration classes.
static void deregisterInstance(long id)
std::map< std::type_index, std::unique_ptr< Configuration > > m_config_dictionary
std::map< std::type_index, std::set< std::type_index > > m_dependency_map
boost::program_options::options_description closeRegistration()
Terminates the manager registration phase.
static ConfigManager & getInstance(long id)
Returns a reference to the ConfigManager with the given ID.
T emplace_back(T... args)
std::vector< std::type_index > hasCircularDependencies(const std::map< std::type_index, std::set< std::type_index > > &dependency_map, const std::type_index &root, const std::pair< const std::type_index, std::set< std::type_index > > &config_pair)
static Elements::Logging logger
static std::map< long, std::unique_ptr< ConfigManager > > manager_map
static void recursiveInitialization(const std::map< std::type_index, std::unique_ptr< Configuration > > &dictionary, const std::map< std::type_index, std::set< std::type_index > > &dependency_map, const std::map< std::string, po::variable_value > &user_values, const std::type_index &config)
static void cleanupNonRegisteredDependencies(std::map< std::type_index, std::set< std::type_index > > &dep_map, const std::map< std::type_index, std::unique_ptr< Configuration > > &dict)