From 5da3b65406a8e04274b6df431eef27d44d39de8c Mon Sep 17 00:00:00 2001
From: Patrick Wuttke
Date: Fri, 27 Feb 2026 16:14:23 +0100
Subject: [PATCH] small improvements to config type - made set() and setValue()
functions return the actually stored value - added getOrAddValue() and
getOrComputeValue() helpers - added min and max value as parameters to
asInt()
---
private/raid/config.cpp | 33 ++++++++++++++++++++++++++-------
public/raid/config.hpp | 14 +++++++++++---
2 files changed, 37 insertions(+), 10 deletions(-)
diff --git a/private/raid/config.cpp b/private/raid/config.cpp
index c9e5bee..c855165 100644
--- a/private/raid/config.cpp
+++ b/private/raid/config.cpp
@@ -170,9 +170,9 @@ ConfigValue& ConfigSection::getOrAdd(std::string_view key)
return mValues[key];
}
-void ConfigSection::set(std::string_view key, ConfigValue value)
+ConfigValue& ConfigSection::set(std::string_view key, ConfigValue value)
{
- mValues[key] = std::move(value);
+ return (mValues[key] = std::move(value));
}
bool ConfigValue::asBool() const noexcept
@@ -188,9 +188,9 @@ bool ConfigValue::asBool() const noexcept
});
}
-config_int_t ConfigValue::asInt() const noexcept
+config_int_t ConfigValue::asInt(config_int_t minValue, config_int_t maxValue) const noexcept
{
- return visit(mijin::Visitor{
+ const config_int_t value = visit(mijin::Visitor{
[](std::nullptr_t) { return config_int_t(0); },
[](bool boolValue) { return config_int_t(boolValue); },
[](config_int_t intValue) { return intValue; },
@@ -205,6 +205,7 @@ config_int_t ConfigValue::asInt() const noexcept
[](const ConfigArray&) { return config_int_t(0); },
[](const ConfigSection&) { return config_int_t(0); }
});
+ return std::clamp(value, minValue, maxValue);
}
double ConfigValue::asDouble() const noexcept
@@ -293,7 +294,25 @@ const ConfigValue& FileConfig::getValue(std::string_view path) const noexcept
return (*section)[path];
}
-void FileConfig::setValue(std::string_view path, ConfigValue value) noexcept
+const ConfigValue& FileConfig::getOrAddValue(std::string_view path, ConfigValue defaultValue)
+{
+ const ConfigValue& value = getValue(path);
+ if (value.isUndefined()) {
+ return setValue(path, std::move(defaultValue));
+ }
+ return value;
+}
+
+const ConfigValue& FileConfig::getOrComputeValue(std::string_view path, std::function computeFunc)
+{
+ const ConfigValue& value = getValue(path);
+ if (value.isUndefined()) {
+ return setValue(path, computeFunc());
+ }
+ return value;
+}
+
+const ConfigValue& FileConfig::setValue(std::string_view path, ConfigValue value) noexcept
{
ConfigSection* section = &mRoot;
while (true)
@@ -312,14 +331,14 @@ void FileConfig::setValue(std::string_view path, ConfigValue value) noexcept
else if (!existing.isSection())
{
MIJIN_ERROR("Value already exists, but is not a section.");
- return;
+ return EMPTY_VALUE;
}
section = &existing.asMutableSection();
path = path.substr(pos + 1);
}
- section->set(path, std::move(value));
mDirty = true;
+ return section->set(path, std::move(value));
}
mijin::Result<> FileConfig::init(mijin::PathReference path)
diff --git a/public/raid/config.hpp b/public/raid/config.hpp
index 9cc07e0..5bf2fc3 100644
--- a/public/raid/config.hpp
+++ b/public/raid/config.hpp
@@ -5,6 +5,7 @@
#define RAID_PUBLIC_RAID_CONFIG_HPP_INCLUDED 1
#include
+#include
#include
#include
#include
@@ -82,7 +83,7 @@ public:
[[nodiscard]]
ConfigValue& getOrAdd(std::string_view key);
- void set(std::string_view key, ConfigValue value);
+ ConfigValue& set(std::string_view key, ConfigValue value);
[[nodiscard]]
mijin::VectorMap& getValues() noexcept { return mValues; }
@@ -136,7 +137,8 @@ public:
bool asBool() const noexcept;
[[nodiscard]]
- config_int_t asInt() const noexcept;
+ config_int_t asInt(config_int_t minValue = std::numeric_limits::min(),
+ config_int_t maxValue = std::numeric_limits::max()) const noexcept;
[[nodiscard]]
double asDouble() const noexcept;
@@ -173,7 +175,13 @@ public:
[[nodiscard]]
const ConfigValue& getValue(std::string_view path) const noexcept;
- void setValue(std::string_view path, ConfigValue value) noexcept;
+ [[nodiscard]]
+ const ConfigValue& getOrAddValue(std::string_view path, ConfigValue defaultValue);
+
+ [[nodiscard]]
+ const ConfigValue& getOrComputeValue(std::string_view path, std::function computeFunc);
+
+ const ConfigValue& setValue(std::string_view path, ConfigValue value) noexcept;
[[nodiscard]]
bool valueExists(std::string_view path) const noexcept;