Add support for getting all sections

This commit is contained in:
2025-02-01 23:29:56 +01:00
parent ef0f4ba908
commit e13cc5a94e

View File

@@ -165,6 +165,10 @@ namespace minipp
public: public:
std::vector<std::string>& GetComments() noexcept { return m_comments; } std::vector<std::string>& GetComments() noexcept { return m_comments; }
const std::vector<std::string>& GetComments() const noexcept { return m_comments; } const std::vector<std::string>& GetComments() const noexcept { return m_comments; }
std::unordered_map<std::string, Value*>& GetValues() noexcept { return m_values; }
const std::unordered_map<std::string, Value*>& GetValues() const noexcept { return m_values; }
std::unordered_map<std::string, Section*>& GetSubSections() noexcept { return m_subSections; }
const std::unordered_map<std::string, Section*>& GetSubSections() const noexcept { return m_subSections; }
public: public:
Section() = default; Section() = default;
@@ -177,16 +181,20 @@ namespace minipp
EResult GetValue(const std::string& key, ValueDataType** target) noexcept EResult GetValue(const std::string& key, ValueDataType** target) noexcept
{ {
static_assert(std::is_base_of<Value, ValueDataType>::value, "ValueDataType must be a subclass of Value"); static_assert(std::is_base_of<Value, ValueDataType>::value, "ValueDataType must be a subclass of Value");
int64_t firstSeparatorIndex = Tools::FirstIndexOf(key, '.'); int64_t firstSeparatorIndex = Tools::FirstIndexOf(key, '.');
if (firstSeparatorIndex != -1) if (firstSeparatorIndex != -1)
{ {
std::string thisKey = key.substr(0, firstSeparatorIndex); std::string thisKey = key.substr(0, firstSeparatorIndex);
std::string rest = key.substr(firstSeparatorIndex + 1); std::string rest = key.substr(firstSeparatorIndex + 1);
auto it = m_subSections.find(thisKey); auto it = m_subSections.find(thisKey);
if (it == m_subSections.end()) if (it == m_subSections.end())
return EResult::SectionNotPresent; return EResult::SectionNotPresent;
return it->second->GetValue(rest, target); return it->second->GetValue(rest, target);
} }
auto it = m_values.find(key); auto it = m_values.find(key);
if (it == m_values.end()) if (it == m_values.end())
return EResult::KeyNotPresent; return EResult::KeyNotPresent;
@@ -203,6 +211,7 @@ namespace minipp
EResult SetValue(const std::string& name, std::unique_ptr<ValueDataType> value, bool allowOverwrite = false) noexcept EResult SetValue(const std::string& name, std::unique_ptr<ValueDataType> value, bool allowOverwrite = false) noexcept
{ {
static_assert(std::is_base_of<Value, ValueDataType>::value, "ValueDataType must be a subclass of Value"); static_assert(std::is_base_of<Value, ValueDataType>::value, "ValueDataType must be a subclass of Value");
if (m_values.find(name) != m_values.end()) if (m_values.find(name) != m_values.end())
if (!allowOverwrite) if (!allowOverwrite)
return EResult::KeyAlreadyPresent; return EResult::KeyAlreadyPresent;
@@ -280,6 +289,7 @@ namespace minipp
minipp::EResult minipp::MiniPPFile::Values::StringValue::Parse(const std::string& str) noexcept minipp::EResult minipp::MiniPPFile::Values::StringValue::Parse(const std::string& str) noexcept
{ {
m_value = ""; m_value = "";
for (size_t i = 0; i < str.size(); ++i) for (size_t i = 0; i < str.size(); ++i)
{ {
if (str[i] == '\\') if (str[i] == '\\')
@@ -318,12 +328,14 @@ minipp::EResult minipp::MiniPPFile::Values::StringValue::Parse(const std::string
else else
m_value.push_back(str[i]); m_value.push_back(str[i]);
} }
return EResult::Success; return EResult::Success;
} }
minipp::EResult minipp::MiniPPFile::Values::StringValue::ToString(std::string& destination) const noexcept minipp::EResult minipp::MiniPPFile::Values::StringValue::ToString(std::string& destination) const noexcept
{ {
std::string sanitizedValue = m_value; std::string sanitizedValue = m_value;
for (size_t i = 0; i < sanitizedValue.size(); ++i) for (size_t i = 0; i < sanitizedValue.size(); ++i)
{ {
switch (sanitizedValue[i]) switch (sanitizedValue[i])
@@ -478,11 +490,13 @@ minipp::EResult minipp::MiniPPFile::Values::FloatValue::ToString(std::string& de
minipp::EResult minipp::MiniPPFile::Values::ArrayValue::Parse(const std::string& str) noexcept minipp::EResult minipp::MiniPPFile::Values::ArrayValue::Parse(const std::string& str) noexcept
{ {
std::string nValue = str; std::string nValue = str;
if (str.front() != '[' || str.back() != ']') if (str.front() != '[' || str.back() != ']')
{ {
COUT("Array value must be enclosed in [] brackets."); COUT("Array value must be enclosed in [] brackets.");
return EResult::FormatError; return EResult::FormatError;
} }
nValue = str.substr(1, str.size() - 2); nValue = str.substr(1, str.size() - 2);
if (nValue.empty()) if (nValue.empty())
return EResult::Success; return EResult::Success;
@@ -571,6 +585,7 @@ minipp::EResult minipp::MiniPPFile::Values::ArrayValue::Parse(const std::string&
m_values.push_back(std::move(parsed)); m_values.push_back(std::move(parsed));
} }
return EResult::Success; return EResult::Success;
} }
@@ -602,6 +617,7 @@ minipp::EResult minipp::MiniPPFile::Values::ArrayValue::ToString(std::string& de
valueString = valueString.substr(0, valueString.size() - 2); valueString = valueString.substr(0, valueString.size() - 2);
destination = "[" + valueString + "]"; destination = "[" + valueString + "]";
return EResult::Success; return EResult::Success;
} }
@@ -650,6 +666,7 @@ minipp::EResult minipp::MiniPPFile::Section::SetSubSection(const std::string& na
delete m_subSections[name]; delete m_subSections[name];
m_subSections[name] = value.release(); m_subSections[name] = value.release();
return EResult::Success; return EResult::Success;
} }
@@ -733,6 +750,7 @@ minipp::EResult minipp::MiniPPFile::WriteSection(const Section* section, std::of
} }
ofs << std::endl; ofs << std::endl;
} }
if (!partTreeName.empty()) if (!partTreeName.empty())
partTreeName += "."; partTreeName += ".";
@@ -891,6 +909,7 @@ bool minipp::MiniPPFile::Tools::StringStartsWith(const std::string& str, const s
for (size_t i = 0; i < beg.size(); ++i) for (size_t i = 0; i < beg.size(); ++i)
if (str[i] != beg[i]) if (str[i] != beg[i])
return false; return false;
return true; return true;
} }
@@ -902,6 +921,7 @@ bool minipp::MiniPPFile::Tools::StringEndsWith(const std::string& str, const std
for (size_t i = 0; i < end.size(); ++i) for (size_t i = 0; i < end.size(); ++i)
if (str[str.size() - i - 1] != end[end.size() - i - 1]) if (str[str.size() - i - 1] != end[end.size() - i - 1])
return false; return false;
return true; return true;
} }
@@ -909,6 +929,7 @@ void minipp::MiniPPFile::Tools::StringTrim(std::string& str)
{ {
if (str.empty()) if (str.empty())
return; return;
size_t start = 0; size_t start = 0;
size_t end = str.size() - 1; size_t end = str.size() - 1;
while (str[start] == ' ' || str[start] == '\t') while (str[start] == ' ' || str[start] == '\t')
@@ -942,6 +963,7 @@ int64_t minipp::MiniPPFile::Tools::FirstIndexOf(const std::string& str, char c)
return index; return index;
++index; ++index;
} }
return -1; return -1;
} }
@@ -954,6 +976,7 @@ int64_t minipp::MiniPPFile::Tools::LastIndexOf(const std::string& str, char c) n
return index; return index;
--index; --index;
} }
return -1; return -1;
} }
@@ -980,6 +1003,7 @@ std::vector<std::string> minipp::MiniPPFile::Tools::SplitByDelimiter(const std::
if (!tmp.empty()) if (!tmp.empty())
elements.push_back(tmp); elements.push_back(tmp);
return elements; return elements;
} }