diff options
| -rw-r--r-- | project2/common/optionsSource.cpp | 43 | ||||
| -rw-r--r-- | project2/common/optionsSource.h | 2 | 
2 files changed, 33 insertions, 12 deletions
diff --git a/project2/common/optionsSource.cpp b/project2/common/optionsSource.cpp index 0112ad4..2461c58 100644 --- a/project2/common/optionsSource.cpp +++ b/project2/common/optionsSource.cpp @@ -24,23 +24,44 @@ class DefaultConfigConsumer : public ConfigConsumer {  boost::posix_time::ptime OptionsSource::loadedTime = boost::posix_time::special_values::neg_infin;  void +OptionsSource::resetOptions() +{ +	auto options = AdHoc::PluginManager::getDefault()->getAll<Options>(); +	decltype(options) resetConfigs; +	while (options != resetConfigs) { +		for (auto opts : options) { +			if (resetConfigs.find(opts) == resetConfigs.end()) { +				opts->implementation()->reset(); +				resetConfigs.insert(opts); +				auto newOptions = AdHoc::PluginManager::getDefault()->getAll<Options>(); +				if (newOptions != options) { +					options = newOptions; +					break; +				} +			} +		} +	} +} + +void  OptionsSource::loadSources(const Options::CurrentPlatform & platform)  {  	auto configs = AdHoc::PluginManager::getDefault()->getAll<OptionsSource>();  	if (std::find_if(configs.begin(), configs.end(), [](boost::shared_ptr<const AdHoc::PluginOf<OptionsSource>> c) { return c->implementation()->modifiedTime() > loadedTime; }) != configs.end()) { -		for (auto opts : AdHoc::PluginManager::getDefault()->getAll<Options>()) { -			opts->implementation()->reset(); -		} +		resetOptions();  		DefaultConfigConsumer dcc; -		std::set<const OptionsSource *> loadedConfigs; -		while (loadedConfigs.size() != configs.size()) { +		decltype(configs) loadedConfigs; +		while (loadedConfigs != configs) {  			for (const auto & c : configs) { -				if (loadedConfigs.find(c->implementation()) == loadedConfigs.end()) { +				if (loadedConfigs.find(c) == loadedConfigs.end()) {  					c->implementation()->loadInto(dcc, platform); -					loadedConfigs.insert(c->implementation()); -					configs = AdHoc::PluginManager::getDefault()->getAll<OptionsSource>(); -					break; +					loadedConfigs.insert(c); +					auto newConfigs = AdHoc::PluginManager::getDefault()->getAll<OptionsSource>(); +					if (newConfigs != configs) { +						configs = newConfigs; +						break; +					}  				}  			}  		} @@ -54,9 +75,7 @@ OptionsSource::loadSources(const Options::CurrentPlatform & platform)  void  OptionsSource::loadSource(const Options::CurrentPlatform & platform, OptionsSourcePtr opts)  { -	for (auto opts : AdHoc::PluginManager::getDefault()->getAll<Options>()) { -		opts->implementation()->reset(); -	} +	resetOptions();  	DefaultConfigConsumer dcc;  	opts->loadInto(dcc, platform); diff --git a/project2/common/optionsSource.h b/project2/common/optionsSource.h index 32c43ed..a6b50e9 100644 --- a/project2/common/optionsSource.h +++ b/project2/common/optionsSource.h @@ -29,6 +29,8 @@ class OptionsSource : public AdHoc::AbstractPluginImplementation {  		static void loadSource(const Options::CurrentPlatform & platform, OptionsSourcePtr opts);  	private: +		static void resetOptions(); +  		static boost::posix_time::ptime loadedTime;  };  | 
