forked from dolphin-emu/dolphin
		
	
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2016 Dolphin Emulator Project
 | |
| // Licensed under GPLv2+
 | |
| // Refer to the license.txt file included.
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <map>
 | |
| #include <memory>
 | |
| #include <string>
 | |
| #include <vector>
 | |
| 
 | |
| #include "Common/Config/Enums.h"
 | |
| #include "Common/Config/Section.h"
 | |
| 
 | |
| namespace Config
 | |
| {
 | |
| using LayerMap = std::map<System, std::vector<Section>>;
 | |
| 
 | |
| class ConfigLayerLoader
 | |
| {
 | |
| public:
 | |
|   explicit ConfigLayerLoader(LayerType layer);
 | |
|   virtual ~ConfigLayerLoader();
 | |
|   virtual void Load(Layer* config_layer) = 0;
 | |
|   virtual void Save(Layer* config_layer) = 0;
 | |
| 
 | |
|   LayerType GetLayer() const;
 | |
| 
 | |
| private:
 | |
|   const LayerType m_layer;
 | |
| };
 | |
| 
 | |
| class Layer
 | |
| {
 | |
| public:
 | |
|   explicit Layer(LayerType layer);
 | |
|   explicit Layer(std::unique_ptr<ConfigLayerLoader> loader);
 | |
|   virtual ~Layer();
 | |
| 
 | |
|   // Convenience functions
 | |
|   bool Exists(System system, const std::string& section_name, const std::string& key);
 | |
|   bool DeleteKey(System system, const std::string& section_name, const std::string& key);
 | |
|   template <typename T>
 | |
|   bool GetIfExists(System system, const std::string& section_name, const std::string& key, T* value)
 | |
|   {
 | |
|     if (Exists(system, section_name, key))
 | |
|       return GetOrCreateSection(system, section_name)->Get(key, value);
 | |
| 
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   virtual Section* GetSection(System system, const std::string& section_name);
 | |
|   virtual Section* GetOrCreateSection(System system, const std::string& section_name);
 | |
| 
 | |
|   // Explicit load and save of layers
 | |
|   void Load();
 | |
|   void Save();
 | |
| 
 | |
|   LayerType GetLayer() const;
 | |
|   const LayerMap& GetLayerMap() const;
 | |
|   // Stay away from this routine as much as possible
 | |
|   ConfigLayerLoader* GetLoader() const;
 | |
| 
 | |
| protected:
 | |
|   bool IsDirty() const;
 | |
|   void ClearDirty();
 | |
| 
 | |
|   LayerMap m_sections;
 | |
|   const LayerType m_layer;
 | |
|   std::unique_ptr<ConfigLayerLoader> m_loader;
 | |
| };
 | |
| 
 | |
| class RecursiveLayer final : public Layer
 | |
| {
 | |
| public:
 | |
|   RecursiveLayer();
 | |
|   Section* GetSection(System system, const std::string& section_name) override;
 | |
|   Section* GetOrCreateSection(System system, const std::string& section_name) override;
 | |
| };
 | |
| }
 |