mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-15 22:09:19 -07:00
7dca7c237e
This excludes the second argument from template deduction. Otherwise, it is required to manually cast the second argument to the ConfigInfo type (because implicit conversions won't work). e.g. to set the value for a ConfigInfo<std::string> from a string literal, you'd need a ugly `std::string("yourstring")`.
100 lines
2.4 KiB
C++
100 lines
2.4 KiB
C++
// Copyright 2016 Dolphin Emulator Project
|
|
// Licensed under GPLv2+
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <functional>
|
|
#include <map>
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
|
|
#include "Common/Config/ConfigInfo.h"
|
|
#include "Common/Config/Enums.h"
|
|
#include "Common/Config/Layer.h"
|
|
|
|
namespace Config
|
|
{
|
|
using Layers = std::map<LayerType, std::unique_ptr<Layer>>;
|
|
using ConfigChangedCallback = std::function<void()>;
|
|
|
|
// Layer management
|
|
Layers* GetLayers();
|
|
void AddLayer(std::unique_ptr<Layer> layer);
|
|
void AddLayer(std::unique_ptr<ConfigLayerLoader> loader);
|
|
Layer* GetLayer(LayerType layer);
|
|
void RemoveLayer(LayerType layer);
|
|
bool LayerExists(LayerType layer);
|
|
|
|
void AddConfigChangedCallback(ConfigChangedCallback func);
|
|
void InvokeConfigChangedCallbacks();
|
|
|
|
// Explicit load and save of layers
|
|
void Load();
|
|
void Save();
|
|
|
|
void Init();
|
|
void Shutdown();
|
|
void ClearCurrentRunLayer();
|
|
|
|
const std::string& GetSystemName(System system);
|
|
std::optional<System> GetSystemFromName(const std::string& system);
|
|
const std::string& GetLayerName(LayerType layer);
|
|
LayerType GetActiveLayerForConfig(const ConfigLocation&);
|
|
|
|
template <typename T>
|
|
T Get(LayerType layer, const ConfigInfo<T>& info)
|
|
{
|
|
if (layer == LayerType::Meta)
|
|
return Get(info);
|
|
return GetLayer(layer)->Get(info);
|
|
}
|
|
|
|
template <typename T>
|
|
T Get(const ConfigInfo<T>& info)
|
|
{
|
|
return GetLayer(GetActiveLayerForConfig(info.location))->Get(info);
|
|
}
|
|
|
|
template <typename T>
|
|
T GetBase(const ConfigInfo<T>& info)
|
|
{
|
|
return Get(LayerType::Base, info);
|
|
}
|
|
|
|
template <typename T>
|
|
LayerType GetActiveLayerForConfig(const ConfigInfo<T>& info)
|
|
{
|
|
return GetActiveLayerForConfig(info.location);
|
|
}
|
|
|
|
template <typename T>
|
|
void Set(LayerType layer, const ConfigInfo<T>& info, const std::common_type_t<T>& value)
|
|
{
|
|
GetLayer(layer)->Set(info, value);
|
|
InvokeConfigChangedCallbacks();
|
|
}
|
|
|
|
template <typename T>
|
|
void SetBase(const ConfigInfo<T>& info, const std::common_type_t<T>& value)
|
|
{
|
|
Set<T>(LayerType::Base, info, value);
|
|
}
|
|
|
|
template <typename T>
|
|
void SetCurrent(const ConfigInfo<T>& info, const std::common_type_t<T>& value)
|
|
{
|
|
Set<T>(LayerType::CurrentRun, info, value);
|
|
}
|
|
|
|
template <typename T>
|
|
void SetBaseOrCurrent(const ConfigInfo<T>& info, const std::common_type_t<T>& value)
|
|
{
|
|
if (GetActiveLayerForConfig(info) == LayerType::Base)
|
|
Set<T>(LayerType::Base, info, value);
|
|
else
|
|
Set<T>(LayerType::CurrentRun, info, value);
|
|
}
|
|
}
|