Move Section out of IniFile so it can be forward declared. Unlocked further improvements to build speed.

This commit is contained in:
Henrik Rydgård 2020-08-10 15:53:52 +02:00
parent 72d5b29434
commit 5ec2da0f2d
20 changed files with 186 additions and 170 deletions

View File

@ -16,6 +16,9 @@
// http://code.google.com/p/dolphin-emu/
#include "ppsspp_config.h"
#include <sstream>
#if PPSSPP_ARCH(ARM) || PPSSPP_ARCH(ARM64)
#include <ctype.h>

View File

@ -916,7 +916,7 @@ void LoadFromIni(IniFile &file) {
return;
}
IniFile::Section *controls = file.GetOrCreateSection("ControlMapping");
Section *controls = file.GetOrCreateSection("ControlMapping");
for (size_t i = 0; i < ARRAY_SIZE(psp_button_names); i++) {
std::string value;
controls->Get(psp_button_names[i].name, &value, "");
@ -943,7 +943,7 @@ void LoadFromIni(IniFile &file) {
}
void SaveToIni(IniFile &file) {
IniFile::Section *controls = file.GetOrCreateSection("ControlMapping");
Section *controls = file.GetOrCreateSection("ControlMapping");
for (size_t i = 0; i < ARRAY_SIZE(psp_button_names); i++) {
std::vector<KeyDef> keys;

View File

@ -185,14 +185,14 @@ void LogManager::ChangeFileLog(const char *filename) {
}
}
void LogManager::SaveConfig(IniFile::Section *section) {
void LogManager::SaveConfig(Section *section) {
for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; i++) {
section->Set((std::string(log_[i].m_shortName) + "Enabled").c_str(), log_[i].enabled);
section->Set((std::string(log_[i].m_shortName) + "Level").c_str(), (int)log_[i].level);
}
}
void LogManager::LoadConfig(IniFile::Section *section, bool debugDefaults) {
void LogManager::LoadConfig(Section *section, bool debugDefaults) {
for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; i++) {
bool enabled = false;
int level = 0;

View File

@ -180,6 +180,6 @@ public:
void ChangeFileLog(const char *filename);
void SaveConfig(IniFile::Section *section);
void LoadConfig(IniFile::Section *section, bool debugDefaults);
void SaveConfig(Section *section);
void LoadConfig(Section *section, bool debugDefaults);
};

View File

@ -203,7 +203,7 @@ struct ConfigSetting {
return type_ != TYPE_TERMINATOR;
}
bool Get(IniFile::Section *section) {
bool Get(Section *section) {
switch (type_) {
case TYPE_BOOL:
if (cb_.b) {
@ -256,7 +256,7 @@ struct ConfigSetting {
}
}
void Set(IniFile::Section *section) {
void Set(Section *section) {
if (!save_)
return;
@ -1108,9 +1108,9 @@ static ConfigSectionSettings sections[] = {
{"Theme", themeSettings},
};
static void IterateSettings(IniFile &iniFile, std::function<void(IniFile::Section *section, ConfigSetting *setting)> func) {
static void IterateSettings(IniFile &iniFile, std::function<void(Section *section, ConfigSetting *setting)> func) {
for (size_t i = 0; i < ARRAY_SIZE(sections); ++i) {
IniFile::Section *section = iniFile.GetOrCreateSection(sections[i].section);
Section *section = iniFile.GetOrCreateSection(sections[i].section);
for (auto setting = sections[i].settings; setting->HasMore(); ++setting) {
func(section, setting);
}
@ -1147,8 +1147,8 @@ std::map<std::string, std::pair<std::string, int>> GetLangValuesMapping() {
langCodeMapping["CHINESE_TRADITIONAL"] = PSP_SYSTEMPARAM_LANGUAGE_CHINESE_TRADITIONAL;
langCodeMapping["CHINESE_SIMPLIFIED"] = PSP_SYSTEMPARAM_LANGUAGE_CHINESE_SIMPLIFIED;
IniFile::Section *langRegionNames = mapping.GetOrCreateSection("LangRegionNames");
IniFile::Section *systemLanguage = mapping.GetOrCreateSection("SystemLanguage");
Section *langRegionNames = mapping.GetOrCreateSection("LangRegionNames");
Section *systemLanguage = mapping.GetOrCreateSection("SystemLanguage");
for (size_t i = 0; i < keys.size(); i++) {
std::string langName;
@ -1187,7 +1187,7 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) {
// Continue anyway to initialize the config.
}
IterateSettings(iniFile, [](IniFile::Section *section, ConfigSetting *setting) {
IterateSettings(iniFile, [](Section *section, ConfigSetting *setting) {
setting->Get(section);
});
@ -1195,7 +1195,7 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) {
if (!File::Exists(currentDirectory))
currentDirectory = "";
IniFile::Section *log = iniFile.GetOrCreateSection(logSectionName);
Section *log = iniFile.GetOrCreateSection(logSectionName);
bool debugDefaults = false;
#ifdef _DEBUG
@ -1203,7 +1203,7 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) {
#endif
LogManager::GetInstance()->LoadConfig(log, debugDefaults);
IniFile::Section *recent = iniFile.GetOrCreateSection("Recent");
Section *recent = iniFile.GetOrCreateSection("Recent");
recent->Get("MaxRecent", &iMaxRecent, 30);
// Fix issue from switching from uint (hex in .ini) to int (dec)
@ -1249,7 +1249,7 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) {
}
// Check for an old dpad setting
IniFile::Section *control = iniFile.GetOrCreateSection("Control");
Section *control = iniFile.GetOrCreateSection("Control");
float f;
control->Get("DPadRadius", &f, 0.0f);
if (f > 0.0f) {
@ -1338,13 +1338,13 @@ void Config::Save(const char *saveReason) {
// Need to do this somewhere...
bFirstRun = false;
IterateSettings(iniFile, [&](IniFile::Section *section, ConfigSetting *setting) {
IterateSettings(iniFile, [&](Section *section, ConfigSetting *setting) {
if (!bGameSpecific || !setting->perGame_) {
setting->Set(section);
}
});
IniFile::Section *recent = iniFile.GetOrCreateSection("Recent");
Section *recent = iniFile.GetOrCreateSection("Recent");
recent->Set("MaxRecent", iMaxRecent);
for (int i = 0; i < iMaxRecent; i++) {
@ -1357,7 +1357,7 @@ void Config::Save(const char *saveReason) {
}
}
IniFile::Section *pinnedPaths = iniFile.GetOrCreateSection("PinnedPaths");
Section *pinnedPaths = iniFile.GetOrCreateSection("PinnedPaths");
pinnedPaths->Clear();
for (size_t i = 0; i < vPinnedPaths.size(); ++i) {
char keyName[64];
@ -1366,17 +1366,17 @@ void Config::Save(const char *saveReason) {
}
if (!bGameSpecific) {
IniFile::Section *postShaderSetting = iniFile.GetOrCreateSection("PostShaderSetting");
Section *postShaderSetting = iniFile.GetOrCreateSection("PostShaderSetting");
postShaderSetting->Clear();
for (auto it = mPostShaderSetting.begin(), end = mPostShaderSetting.end(); it != end; ++it) {
postShaderSetting->Set(it->first.c_str(), it->second);
}
}
IniFile::Section *control = iniFile.GetOrCreateSection("Control");
Section *control = iniFile.GetOrCreateSection("Control");
control->Delete("DPadRadius");
IniFile::Section *log = iniFile.GetOrCreateSection(logSectionName);
Section *log = iniFile.GetOrCreateSection(logSectionName);
if (LogManager::GetInstance())
LogManager::GetInstance()->SaveConfig(log);
@ -1614,16 +1614,16 @@ bool Config::saveGameConfig(const std::string &pGameId, const std::string &title
IniFile iniFile;
IniFile::Section *top = iniFile.GetOrCreateSection("");
Section *top = iniFile.GetOrCreateSection("");
top->AddComment(StringFromFormat("Game config for %s - %s", pGameId.c_str(), title.c_str()));
IterateSettings(iniFile, [](IniFile::Section *section, ConfigSetting *setting) {
IterateSettings(iniFile, [](Section *section, ConfigSetting *setting) {
if (setting->perGame_) {
setting->Set(section);
}
});
IniFile::Section *postShaderSetting = iniFile.GetOrCreateSection("PostShaderSetting");
Section *postShaderSetting = iniFile.GetOrCreateSection("PostShaderSetting");
postShaderSetting->Clear();
for (auto it = mPostShaderSetting.begin(), end = mPostShaderSetting.end(); it != end; ++it) {
postShaderSetting->Set(it->first.c_str(), it->second);
@ -1653,7 +1653,7 @@ bool Config::loadGameConfig(const std::string &pGameId, const std::string &title
mPostShaderSetting[it.first] = std::stof(it.second);
}
IterateSettings(iniFile, [](IniFile::Section *section, ConfigSetting *setting) {
IterateSettings(iniFile, [](Section *section, ConfigSetting *setting) {
if (setting->perGame_) {
setting->Get(section);
}
@ -1671,7 +1671,7 @@ void Config::unloadGameConfig() {
iniFile.Load(iniFilename_);
// Reload game specific settings back to standard.
IterateSettings(iniFile, [](IniFile::Section *section, ConfigSetting *setting) {
IterateSettings(iniFile, [](Section *section, ConfigSetting *setting) {
if (setting->perGame_) {
setting->Get(section);
}

View File

@ -21,6 +21,7 @@
#include <thread>
#include "base/stringutil.h"
#include "i18n/i18n.h"
#include "thread/threadutil.h"

View File

@ -19,6 +19,8 @@
#include <algorithm>
#include <limits>
#include "base/stringutil.h"
#include "file/free.h"
#include "file/zip_read.h"
#include "i18n/i18n.h"

View File

@ -21,6 +21,7 @@
#include <mutex>
#include "base/timeutil.h"
#include "base/stringutil.h"
#include "i18n/i18n.h"
#include "thread/threadutil.h"
#include "util/text/parsers.h"

View File

@ -30,6 +30,7 @@
#include "ext/libzip/zip.h"
#endif
#include "util/text/utf8.h"
#include "file/ini_file.h"
#include "Common/Log.h"
#include "Common/FileUtil.h"

View File

@ -103,7 +103,7 @@ void LoadPostShaderInfo(const std::vector<std::string> &directories) {
// Alright, let's loop through the sections and see if any is a shader.
for (size_t i = 0; i < ini.Sections().size(); i++) {
IniFile::Section &section = ini.Sections()[i];
Section &section = ini.Sections()[i];
std::string shaderType;
section.Get("Type", &shaderType, "render");

View File

@ -15,6 +15,7 @@
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
#include "base/stringutil.h"
#include "ext/cityhash/city.h"
#include "i18n/i18n.h"
#include "ui/ui.h"

View File

@ -17,6 +17,8 @@
#include <algorithm>
#include <memory>
#include "base/stringutil.h"
#include "i18n/i18n.h"
#include "gfx_es2/draw_buffer.h"
#include "ui/view.h"

View File

@ -25,6 +25,7 @@
#include <netfw.h>
#endif
#include "base/stringutil.h"
#include "base/timeutil.h"
#include "file/path.h"
// TODO: For text align flags, probably shouldn't be in gfx_es2/...

View File

@ -16,7 +16,9 @@
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
#include <string>
#include "base/display.h"
#include "base/stringutil.h"
// TODO: For text align flags, probably shouldn't be in gfx_es2/...
#include "gfx_es2/draw_buffer.h"
#include "i18n/i18n.h"

View File

@ -20,6 +20,7 @@
#include "base/colorutil.h"
#include "base/timeutil.h"
#include "base/stringutil.h"
#include "gfx_es2/draw_buffer.h"
#include "i18n/i18n.h"
#include "math/curves.h"

View File

@ -149,11 +149,11 @@ static std::string EscapeComments(const std::string &value) {
return result;
}
void IniFile::Section::Clear() {
void Section::Clear() {
lines.clear();
}
std::string* IniFile::Section::GetLine(const char* key, std::string* valueOut, std::string* commentOut)
std::string* Section::GetLine(const char* key, std::string* valueOut, std::string* commentOut)
{
for (std::vector<std::string>::iterator iter = lines.begin(); iter != lines.end(); ++iter)
{
@ -166,7 +166,7 @@ std::string* IniFile::Section::GetLine(const char* key, std::string* valueOut, s
return 0;
}
void IniFile::Section::Set(const char* key, const char* newValue)
void Section::Set(const char* key, const char* newValue)
{
std::string value, commented;
std::string* line = GetLine(key, &value, &commented);
@ -182,7 +182,7 @@ void IniFile::Section::Set(const char* key, const char* newValue)
}
}
void IniFile::Section::Set(const char* key, const std::string& newValue, const std::string& defaultValue)
void Section::Set(const char* key, const std::string& newValue, const std::string& defaultValue)
{
if (newValue != defaultValue)
Set(key, newValue);
@ -190,7 +190,7 @@ void IniFile::Section::Set(const char* key, const std::string& newValue, const s
Delete(key);
}
bool IniFile::Section::Get(const char* key, std::string* value, const char* defaultValue)
bool Section::Get(const char* key, std::string* value, const char* defaultValue)
{
const std::string* line = GetLine(key, value, 0);
if (!line)
@ -204,7 +204,7 @@ bool IniFile::Section::Get(const char* key, std::string* value, const char* defa
return true;
}
void IniFile::Section::Set(const char* key, const float newValue, const float defaultValue)
void Section::Set(const char* key, const float newValue, const float defaultValue)
{
if (newValue != defaultValue)
Set(key, newValue);
@ -212,7 +212,7 @@ void IniFile::Section::Set(const char* key, const float newValue, const float de
Delete(key);
}
void IniFile::Section::Set(const char* key, int newValue, int defaultValue)
void Section::Set(const char* key, int newValue, int defaultValue)
{
if (newValue != defaultValue)
Set(key, newValue);
@ -220,7 +220,7 @@ void IniFile::Section::Set(const char* key, int newValue, int defaultValue)
Delete(key);
}
void IniFile::Section::Set(const char* key, bool newValue, bool defaultValue)
void Section::Set(const char* key, bool newValue, bool defaultValue)
{
if (newValue != defaultValue)
Set(key, newValue);
@ -228,7 +228,7 @@ void IniFile::Section::Set(const char* key, bool newValue, bool defaultValue)
Delete(key);
}
void IniFile::Section::Set(const char* key, const std::vector<std::string>& newValues)
void Section::Set(const char* key, const std::vector<std::string>& newValues)
{
std::string temp;
// Join the strings with ,
@ -243,11 +243,11 @@ void IniFile::Section::Set(const char* key, const std::vector<std::string>& newV
Set(key, temp.c_str());
}
void IniFile::Section::AddComment(const std::string &comment) {
void Section::AddComment(const std::string &comment) {
lines.push_back("# " + comment);
}
bool IniFile::Section::Get(const char* key, std::vector<std::string>& values)
bool Section::Get(const char* key, std::vector<std::string>& values)
{
std::string temp;
bool retval = Get(key, &temp, 0);
@ -275,7 +275,7 @@ bool IniFile::Section::Get(const char* key, std::vector<std::string>& values)
return true;
}
bool IniFile::Section::Get(const char* key, int* value, int defaultValue)
bool Section::Get(const char* key, int* value, int defaultValue)
{
std::string temp;
bool retval = Get(key, &temp, 0);
@ -285,7 +285,7 @@ bool IniFile::Section::Get(const char* key, int* value, int defaultValue)
return false;
}
bool IniFile::Section::Get(const char* key, uint32_t* value, uint32_t defaultValue)
bool Section::Get(const char* key, uint32_t* value, uint32_t defaultValue)
{
std::string temp;
bool retval = Get(key, &temp, 0);
@ -295,7 +295,7 @@ bool IniFile::Section::Get(const char* key, uint32_t* value, uint32_t defaultVal
return false;
}
bool IniFile::Section::Get(const char* key, bool* value, bool defaultValue)
bool Section::Get(const char* key, bool* value, bool defaultValue)
{
std::string temp;
bool retval = Get(key, &temp, 0);
@ -305,7 +305,7 @@ bool IniFile::Section::Get(const char* key, bool* value, bool defaultValue)
return false;
}
bool IniFile::Section::Get(const char* key, float* value, float defaultValue)
bool Section::Get(const char* key, float* value, float defaultValue)
{
std::string temp;
bool retval = Get(key, &temp, 0);
@ -315,7 +315,7 @@ bool IniFile::Section::Get(const char* key, float* value, float defaultValue)
return false;
}
bool IniFile::Section::Get(const char* key, double* value, double defaultValue)
bool Section::Get(const char* key, double* value, double defaultValue)
{
std::string temp;
bool retval = Get(key, &temp, 0);
@ -325,7 +325,7 @@ bool IniFile::Section::Get(const char* key, double* value, double defaultValue)
return false;
}
bool IniFile::Section::Exists(const char *key) const
bool Section::Exists(const char *key) const
{
for (std::vector<std::string>::const_iterator iter = lines.begin(); iter != lines.end(); ++iter)
{
@ -337,7 +337,7 @@ bool IniFile::Section::Exists(const char *key) const
return false;
}
std::map<std::string, std::string> IniFile::Section::ToMap() const
std::map<std::string, std::string> Section::ToMap() const
{
std::map<std::string, std::string> outMap;
for (std::vector<std::string>::const_iterator iter = lines.begin(); iter != lines.end(); ++iter)
@ -351,7 +351,7 @@ std::map<std::string, std::string> IniFile::Section::ToMap() const
}
bool IniFile::Section::Delete(const char *key)
bool Section::Delete(const char *key)
{
std::string* line = GetLine(key, 0, 0);
for (std::vector<std::string>::iterator liter = lines.begin(); liter != lines.end(); ++liter)
@ -367,7 +367,7 @@ bool IniFile::Section::Delete(const char *key)
// IniFile
const IniFile::Section* IniFile::GetSection(const char* sectionName) const
const Section* IniFile::GetSection(const char* sectionName) const
{
for (std::vector<Section>::const_iterator iter = sections.begin(); iter != sections.end(); ++iter)
if (!strcasecmp(iter->name().c_str(), sectionName))
@ -375,7 +375,7 @@ const IniFile::Section* IniFile::GetSection(const char* sectionName) const
return 0;
}
IniFile::Section* IniFile::GetSection(const char* sectionName)
Section* IniFile::GetSection(const char* sectionName)
{
for (std::vector<Section>::iterator iter = sections.begin(); iter != sections.end(); ++iter)
if (!strcasecmp(iter->name().c_str(), sectionName))
@ -383,7 +383,7 @@ IniFile::Section* IniFile::GetSection(const char* sectionName)
return 0;
}
IniFile::Section* IniFile::GetOrCreateSection(const char* sectionName)
Section* IniFile::GetOrCreateSection(const char* sectionName)
{
Section* section = GetSection(sectionName);
if (!section)

View File

@ -19,120 +19,120 @@ inline std::string ValueToString(const N value)
return string.str();
}
class Section
{
friend class IniFile;
public:
Section() {}
Section(const std::string& name) : name_(name) {}
bool Exists(const char *key) const;
bool Delete(const char *key);
void Clear();
std::map<std::string, std::string> ToMap() const;
std::string* GetLine(const char* key, std::string* valueOut, std::string* commentOut);
void Set(const char* key, const char* newValue);
void Set(const char* key, const std::string& newValue, const std::string& defaultValue);
void Set(const std::string &key, const std::string &value) {
Set(key.c_str(), value.c_str());
}
bool Get(const char* key, std::string* value, const char* defaultValue);
void Set(const char* key, uint32_t newValue) {
Set(key, StringFromFormat("0x%08x", newValue).c_str());
}
void Set(const char* key, float newValue) {
Set(key, StringFromFormat("%f", newValue).c_str());
}
void Set(const char* key, const float newValue, const float defaultValue);
void Set(const char* key, double newValue) {
Set(key, StringFromFormat("%f", newValue).c_str());
}
void Set(const char* key, int newValue, int defaultValue);
void Set(const char* key, int newValue) {
Set(key, StringFromInt(newValue).c_str());
}
void Set(const char* key, bool newValue, bool defaultValue);
void Set(const char* key, bool newValue) {
Set(key, StringFromBool(newValue).c_str());
}
void Set(const char* key, const std::vector<std::string>& newValues);
template<typename U, typename V>
void Set(const char* key, const std::map<U, V>& newValues)
{
std::vector<std::string> temp;
for (typename std::map<U, V>::const_iterator it = newValues.begin(); it != newValues.end(); it++)
{
temp.push_back(ValueToString<U>(it->first) + "_" + ValueToString<V>(it->second));
}
Set(key, temp);
}
// Declare without a body to make it fail to compile. This is to prevent accidentally
// setting a pointer as a bool. The failure is in the linker unfortunately, but that's better
// than accidentally succeeding in a bad way.
template<class T>
void Set(const char *key, T *ptr);
void AddComment(const std::string &comment);
bool Get(const char* key, int* value, int defaultValue = 0);
bool Get(const char* key, uint32_t* value, uint32_t defaultValue = 0);
bool Get(const char* key, bool* value, bool defaultValue = false);
bool Get(const char* key, float* value, float defaultValue = false);
bool Get(const char* key, double* value, double defaultValue = false);
bool Get(const char* key, std::vector<std::string>& values);
template<typename U, typename V>
bool Get(const char* key, std::map<U, V>& values)
{
std::vector<std::string> temp;
if (!Get(key, temp))
{
return false;
}
values.clear();
for (size_t i = 0; i < temp.size(); i++)
{
std::vector<std::string> key_val;
SplitString(temp[i], '_', key_val);
if (key_val.size() < 2)
continue;
U mapKey;
V mapValue;
if (!TryParse(key_val[0], &mapKey))
continue;
if (!TryParse(key_val[1], &mapValue))
continue;
values[mapKey] = mapValue;
}
return true;
}
bool operator < (const Section& other) const {
return name_ < other.name_;
}
const std::string &name() const {
return name_;
}
protected:
std::vector<std::string> lines;
std::string name_;
std::string comment;
};
class IniFile
{
public:
class Section
{
friend class IniFile;
public:
Section() {}
Section(const std::string& name) : name_(name) {}
bool Exists(const char *key) const;
bool Delete(const char *key);
void Clear();
std::map<std::string, std::string> ToMap() const;
std::string* GetLine(const char* key, std::string* valueOut, std::string* commentOut);
void Set(const char* key, const char* newValue);
void Set(const char* key, const std::string& newValue, const std::string& defaultValue);
void Set(const std::string &key, const std::string &value) {
Set(key.c_str(), value.c_str());
}
bool Get(const char* key, std::string* value, const char* defaultValue);
void Set(const char* key, uint32_t newValue) {
Set(key, StringFromFormat("0x%08x", newValue).c_str());
}
void Set(const char* key, float newValue) {
Set(key, StringFromFormat("%f", newValue).c_str());
}
void Set(const char* key, const float newValue, const float defaultValue);
void Set(const char* key, double newValue) {
Set(key, StringFromFormat("%f", newValue).c_str());
}
void Set(const char* key, int newValue, int defaultValue);
void Set(const char* key, int newValue) {
Set(key, StringFromInt(newValue).c_str());
}
void Set(const char* key, bool newValue, bool defaultValue);
void Set(const char* key, bool newValue) {
Set(key, StringFromBool(newValue).c_str());
}
void Set(const char* key, const std::vector<std::string>& newValues);
template<typename U, typename V>
void Set(const char* key, const std::map<U,V>& newValues)
{
std::vector<std::string> temp;
for(typename std::map<U,V>::const_iterator it = newValues.begin(); it != newValues.end(); it++)
{
temp.push_back(ValueToString<U>(it->first)+"_"+ValueToString<V>(it->second));
}
Set(key,temp);
}
// Declare without a body to make it fail to compile. This is to prevent accidentally
// setting a pointer as a bool. The failure is in the linker unfortunately, but that's better
// than accidentally succeeding in a bad way.
template<class T>
void Set(const char *key, T *ptr);
void AddComment(const std::string &comment);
bool Get(const char* key, int* value, int defaultValue = 0);
bool Get(const char* key, uint32_t* value, uint32_t defaultValue = 0);
bool Get(const char* key, bool* value, bool defaultValue = false);
bool Get(const char* key, float* value, float defaultValue = false);
bool Get(const char* key, double* value, double defaultValue = false);
bool Get(const char* key, std::vector<std::string>& values);
template<typename U, typename V>
bool Get(const char* key, std::map<U,V>& values)
{
std::vector<std::string> temp;
if(!Get(key,temp))
{
return false;
}
values.clear();
for(size_t i = 0; i < temp.size(); i++)
{
std::vector<std::string> key_val;
SplitString(temp[i], '_', key_val);
if (key_val.size() < 2)
continue;
U mapKey;
V mapValue;
if (!TryParse(key_val[0], &mapKey))
continue;
if (!TryParse(key_val[1], &mapValue))
continue;
values[mapKey] = mapValue;
}
return true;
}
bool operator < (const Section& other) const {
return name_ < other.name_;
}
const std::string &name() const {
return name_;
}
protected:
std::vector<std::string> lines;
std::string name_;
std::string comment;
};
bool Load(const char* filename);
bool Load(const std::string &filename) { return Load(filename.c_str()); }
bool Load(std::istream &istream);

View File

@ -95,7 +95,7 @@ bool I18NRepo::LoadIni(const std::string &languageID, const std::string &overrid
Clear();
const std::vector<IniFile::Section> &sections = ini.Sections();
const std::vector<Section> &sections = ini.Sections();
std::lock_guard<std::mutex> guard(catsLock_);
for (auto iter = sections.begin(); iter != sections.end(); ++iter) {
@ -108,7 +108,7 @@ bool I18NRepo::LoadIni(const std::string &languageID, const std::string &overrid
return true;
}
I18NCategory *I18NRepo::LoadSection(const IniFile::Section *section, const char *name) {
I18NCategory *I18NRepo::LoadSection(const Section *section, const char *name) {
I18NCategory *cat = new I18NCategory(this, name);
std::map<std::string, std::string> sectionMap = section->ToMap();
cat->SetMap(sectionMap);
@ -123,13 +123,13 @@ void I18NRepo::SaveIni(const std::string &languageID) {
std::lock_guard<std::mutex> guard(catsLock_);
for (auto iter = cats_.begin(); iter != cats_.end(); ++iter) {
std::string categoryName = iter->first;
IniFile::Section *section = ini.GetOrCreateSection(categoryName.c_str());
Section *section = ini.GetOrCreateSection(categoryName.c_str());
SaveSection(ini, section, iter->second);
}
ini.Save(GetIniPath(languageID));
}
void I18NRepo::SaveSection(IniFile &ini, IniFile::Section *section, std::shared_ptr<I18NCategory> cat) {
void I18NRepo::SaveSection(IniFile &ini, Section *section, std::shared_ptr<I18NCategory> cat) {
const std::map<std::string, std::string> &missed = cat->Missed();
for (auto iter = missed.begin(); iter != missed.end(); ++iter) {

View File

@ -13,11 +13,13 @@
#include <string>
#include <vector>
#include "file/ini_file.h"
#include "Common/Common.h"
// Reasonably thread safe.
class I18NRepo;
class IniFile;
class Section;
struct I18NEntry {
I18NEntry(const std::string &t) : text(t), readFlag(false) {}
@ -63,8 +65,6 @@ private:
// Noone else can create these.
friend class I18NRepo;
DISALLOW_COPY_AND_ASSIGN(I18NCategory);
};
class I18NRepo {
@ -88,8 +88,8 @@ public:
private:
std::string GetIniPath(const std::string &languageID) const;
void Clear();
I18NCategory *LoadSection(const IniFile::Section *section, const char *name);
void SaveSection(IniFile &ini, IniFile::Section *section, std::shared_ptr<I18NCategory> cat);
I18NCategory *LoadSection(const Section *section, const char *name);
void SaveSection(IniFile &ini, Section *section, std::shared_ptr<I18NCategory> cat);
mutable std::mutex catsLock_;
std::map<std::string, std::shared_ptr<I18NCategory>> cats_;

View File

@ -3,6 +3,7 @@
#include <sstream>
#include "base/display.h"
#include "base/stringutil.h"
#include "input/input_state.h"
#include "input/keycodes.h"
#include "math/curves.h"