#ifndef ConfigFile_h__ #define ConfigFile_h__ #include #include #include #include #include #include "../Common.h" #include "ResourceManager.h" class ConfigFile : public Resource { friend class ResourceManager; private: ConfigFile(std::string path); public: template T Get(std::string key, T defaultValue); template std::vector> GetAll(std::string key); template void Set(std::string key, T value); void SaveToDisk(); private: boost::filesystem::path m_Path; boost::property_tree::ptree m_PTreeDefaults; boost::property_tree::ptree m_PTreeOverrides; boost::property_tree::ptree m_PTreeMerged; }; template T ConfigFile::Get(std::string key, T defaultValue) { return m_PTreeMerged.get(key, defaultValue); } template std::vector> ConfigFile::GetAll(std::string key) { std::vector> out; auto parent = m_PTreeMerged.find(key); if (parent == m_PTreeMerged.not_found()) { return out; } for (auto& child : parent->second) { T value = boost::lexical_cast(child.second.data()); out.push_back(std::make_pair(child.first, value)); } return out; } template void ConfigFile::Set(std::string key, T value) { m_PTreeOverrides.put(key, value); m_PTreeMerged.put(key, value); } #endif