164 lines
4.0 KiB
C++
164 lines
4.0 KiB
C++
// CARLA, Copyright (C) 2017 Computer Vision Center (CVC)
|
|
|
|
#pragma once
|
|
|
|
#include "ConfigCacheIni.h"
|
|
|
|
#include <limits>
|
|
|
|
/// Wrapper around Unreal's INI file. In get functions, @a Target value is only
|
|
/// set if it was present in the INI file, otherwise it keeps its value.
|
|
class CARLA_API IniFile : private NonCopyable
|
|
{
|
|
private:
|
|
|
|
template <typename TARGET, typename SOURCE>
|
|
static void SafeCastTo(SOURCE source, TARGET &target)
|
|
{
|
|
if ((source >= std::numeric_limits<TARGET>::lowest()) &&
|
|
(source <= std::numeric_limits<TARGET>::max())) {
|
|
target = static_cast<TARGET>(source);
|
|
} else {
|
|
UE_LOG(LogCarla, Error, TEXT("IniFile: Type cast failed"));
|
|
}
|
|
}
|
|
|
|
public:
|
|
|
|
// ===========================================================================
|
|
/// @name Constructor
|
|
// ===========================================================================
|
|
/// @{
|
|
|
|
IniFile() = default;
|
|
|
|
explicit IniFile(const FString &FileName)
|
|
{
|
|
ConfigFile.Read(FileName);
|
|
}
|
|
|
|
/// @}
|
|
// ===========================================================================
|
|
/// @name Other functions
|
|
// ===========================================================================
|
|
/// @{
|
|
|
|
void ProcessInputFileContents(const FString &INIFileContents)
|
|
{
|
|
ConfigFile.ProcessInputFileContents(INIFileContents);
|
|
}
|
|
|
|
bool HasSection(const FString &Section) const
|
|
{
|
|
return (ConfigFile.Num() > 0) && (ConfigFile.Find(Section) != nullptr);
|
|
}
|
|
|
|
void AddSectionIfMissing(const FString &Section)
|
|
{
|
|
if (!HasSection(Section)) {
|
|
ConfigFile.Add(Section, FConfigSection());
|
|
}
|
|
}
|
|
|
|
/// Write contents to disk.
|
|
bool Write(const FString &Filename)
|
|
{
|
|
return ConfigFile.Write(Filename);
|
|
}
|
|
|
|
/// Retrieve Unreal's FConfigFile.
|
|
const FConfigFile &GetFConfigFile() const
|
|
{
|
|
return ConfigFile;
|
|
}
|
|
|
|
/// @}
|
|
// ===========================================================================
|
|
/// @name Get functions
|
|
// ===========================================================================
|
|
/// @{
|
|
|
|
template <typename T>
|
|
void GetInt(const TCHAR* Section, const TCHAR* Key, T &Target) const
|
|
{
|
|
int64 Value;
|
|
if (ConfigFile.GetInt64(Section, Key, Value)) {
|
|
SafeCastTo<T>(Value, Target);
|
|
}
|
|
}
|
|
|
|
void GetString(const TCHAR* Section, const TCHAR* Key, FString &Target) const
|
|
{
|
|
FString Value;
|
|
if (ConfigFile.GetString(Section, Key, Value)) {
|
|
Target = Value;
|
|
}
|
|
}
|
|
|
|
void GetBool(const TCHAR* Section, const TCHAR* Key, bool &Target) const
|
|
{
|
|
bool Value;
|
|
if (ConfigFile.GetBool(Section, Key, Value)) {
|
|
Target = Value;
|
|
}
|
|
}
|
|
|
|
void GetFloat(const TCHAR* Section, const TCHAR* Key, float &Target) const
|
|
{
|
|
FString Value;
|
|
if (ConfigFile.GetString(Section, Key, Value)) {
|
|
Target = FCString::Atof(*Value);
|
|
}
|
|
}
|
|
|
|
void GetLinearColor(const TCHAR* Section, const TCHAR* Key, FLinearColor &Target) const
|
|
{
|
|
FString Value;
|
|
if (ConfigFile.GetString(Section, Key, Value)) {
|
|
Target.InitFromString(Value);
|
|
}
|
|
}
|
|
|
|
/// @}
|
|
// ===========================================================================
|
|
/// @name Set functions
|
|
// ===========================================================================
|
|
/// @{
|
|
|
|
void SetInt(const TCHAR* Section, const TCHAR* Key, const int64 Value)
|
|
{
|
|
ConfigFile.SetInt64(Section, Key, Value);
|
|
}
|
|
|
|
void SetString(const TCHAR* Section, const TCHAR* Key, const TCHAR* Value)
|
|
{
|
|
ConfigFile.SetString(Section, Key, Value);
|
|
}
|
|
|
|
void SetString(const TCHAR* Section, const TCHAR* Key, const FString &Value)
|
|
{
|
|
SetString(Section, Key, *Value);
|
|
}
|
|
|
|
void SetBool(const TCHAR* Section, const TCHAR* Key, const bool Value)
|
|
{
|
|
SetString(Section, Key, Value ? TEXT("True") : TEXT("False"));
|
|
}
|
|
|
|
void SetFloat(const TCHAR* Section, const TCHAR* Key, const float Value)
|
|
{
|
|
SetString(Section, Key, FText::AsNumber(Value).ToString());
|
|
}
|
|
|
|
void SetLinearColor(const TCHAR* Section, const TCHAR* Key, const FLinearColor &Value)
|
|
{
|
|
SetString(Section, Key, Value.ToString());
|
|
}
|
|
|
|
/// @}
|
|
|
|
private:
|
|
|
|
FConfigFile ConfigFile;
|
|
};
|