From faee36f63b5fde886458d0415778719ea2233d14 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Fri, 13 Feb 2026 15:08:37 +0100 Subject: [PATCH] util: Add SettingTo() and GetArg() Redirect: * SettingToInt to SettingTo, and * GetIntArg to GetArg --- src/common/args.cpp | 39 ++++++++++++++++++++++++++++++--------- src/common/args.h | 21 +++++++++++++++++---- src/test/getarg_tests.cpp | 21 ++++++++++++++++++--- 3 files changed, 65 insertions(+), 16 deletions(-) diff --git a/src/common/args.cpp b/src/common/args.cpp index 3ffa4d3f105..5c8589cf440 100644 --- a/src/common/args.cpp +++ b/src/common/args.cpp @@ -483,29 +483,33 @@ std::string SettingToString(const common::SettingsValue& value, const std::strin return SettingToString(value).value_or(strDefault); } -int64_t ArgsManager::GetIntArg(const std::string& strArg, int64_t nDefault) const +template +Int ArgsManager::GetArg(const std::string& strArg, Int nDefault) const { - return GetIntArg(strArg).value_or(nDefault); + return GetArg(strArg).value_or(nDefault); } -std::optional ArgsManager::GetIntArg(const std::string& strArg) const +template +std::optional ArgsManager::GetArg(const std::string& strArg) const { const common::SettingsValue value = GetSetting(strArg); - return SettingToInt(value); + return SettingTo(value); } -std::optional SettingToInt(const common::SettingsValue& value) +template +std::optional SettingTo(const common::SettingsValue& value) { if (value.isNull()) return std::nullopt; if (value.isFalse()) return 0; if (value.isTrue()) return 1; - if (value.isNum()) return value.getInt(); - return LocaleIndependentAtoi(value.get_str()); + if (value.isNum()) return value.getInt(); + return LocaleIndependentAtoi(value.get_str()); } -int64_t SettingToInt(const common::SettingsValue& value, int64_t nDefault) +template +Int SettingTo(const common::SettingsValue& value, Int nDefault) { - return SettingToInt(value).value_or(nDefault); + return SettingTo(value).value_or(nDefault); } bool ArgsManager::GetBoolArg(const std::string& strArg, bool fDefault) const @@ -531,6 +535,23 @@ bool SettingToBool(const common::SettingsValue& value, bool fDefault) return SettingToBool(value).value_or(fDefault); } +#define INSTANTIATE_INT_TYPE(Type) \ + template Type ArgsManager::GetArg(const std::string&, Type) const; \ + template std::optional ArgsManager::GetArg(const std::string&) const; \ + template Type SettingTo(const common::SettingsValue&, Type); \ + template std::optional SettingTo(const common::SettingsValue&) + +INSTANTIATE_INT_TYPE(int8_t); +INSTANTIATE_INT_TYPE(uint8_t); +INSTANTIATE_INT_TYPE(int16_t); +INSTANTIATE_INT_TYPE(uint16_t); +INSTANTIATE_INT_TYPE(int32_t); +INSTANTIATE_INT_TYPE(uint32_t); +INSTANTIATE_INT_TYPE(int64_t); +INSTANTIATE_INT_TYPE(uint64_t); + +#undef INSTANTIATE_INT_TYPE + bool ArgsManager::SoftSetArg(const std::string& strArg, const std::string& strValue) { LOCK(cs_args); diff --git a/src/common/args.h b/src/common/args.h index 1b9233ec75c..477f2cbf6c8 100644 --- a/src/common/args.h +++ b/src/common/args.h @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -89,8 +90,14 @@ struct SectionInfo { std::string SettingToString(const common::SettingsValue&, const std::string&); std::optional SettingToString(const common::SettingsValue&); -int64_t SettingToInt(const common::SettingsValue&, int64_t); -std::optional SettingToInt(const common::SettingsValue&); +template +Int SettingTo(const common::SettingsValue&, Int); + +template +std::optional SettingTo(const common::SettingsValue&); + +inline int64_t SettingToInt(const common::SettingsValue& value, int64_t nDefault) { return SettingTo(value, nDefault); } +inline std::optional SettingToInt(const common::SettingsValue& value) { return SettingTo(value); } bool SettingToBool(const common::SettingsValue&, bool); std::optional SettingToBool(const common::SettingsValue&); @@ -293,8 +300,14 @@ protected: * @param nDefault (e.g. 1) * @return command-line argument (0 if invalid number) or default value */ - int64_t GetIntArg(const std::string& strArg, int64_t nDefault) const; - std::optional GetIntArg(const std::string& strArg) const; + template + Int GetArg(const std::string& strArg, Int nDefault) const; + + template + std::optional GetArg(const std::string& strArg) const; + + int64_t GetIntArg(const std::string& strArg, int64_t nDefault) const { return GetArg(strArg, nDefault); } + std::optional GetIntArg(const std::string& strArg) const { return GetArg(strArg); } /** * Return boolean argument or default value diff --git a/src/test/getarg_tests.cpp b/src/test/getarg_tests.cpp index ee369272370..ec17fe39971 100644 --- a/src/test/getarg_tests.cpp +++ b/src/test/getarg_tests.cpp @@ -247,26 +247,41 @@ BOOST_AUTO_TEST_CASE(intarg) const auto foo = std::make_pair("-foo", ArgsManager::ALLOW_ANY); const auto bar = std::make_pair("-bar", ArgsManager::ALLOW_ANY); SetupArgs(local_args, {foo, bar}); + ResetArgs(local_args, ""); + BOOST_CHECK(!local_args.GetArg("-foo").has_value()); + BOOST_CHECK(!local_args.GetArg("-bar").has_value()); BOOST_CHECK_EQUAL(local_args.GetIntArg("-foo", 11), 11); BOOST_CHECK_EQUAL(local_args.GetIntArg("-foo", 0), 0); + BOOST_CHECK_EQUAL(local_args.GetArg("-bar", uint8_t{222}), 222); + BOOST_CHECK_EQUAL(local_args.GetArg("-bar", uint8_t{0}), 0); ResetArgs(local_args, "-foo -bar"); + BOOST_CHECK_EQUAL(local_args.GetArg("-foo"), 0); + BOOST_CHECK_EQUAL(local_args.GetArg("-bar"), 0); BOOST_CHECK_EQUAL(local_args.GetIntArg("-foo", 11), 0); - BOOST_CHECK_EQUAL(local_args.GetIntArg("-bar", 11), 0); + BOOST_CHECK_EQUAL(local_args.GetArg("-bar", uint8_t{222}), 0); // Check under-/overflow behavior. ResetArgs(local_args, "-foo=-9223372036854775809 -bar=9223372036854775808"); + BOOST_CHECK_EQUAL(local_args.GetArg("-foo"), std::numeric_limits::min()); + BOOST_CHECK_EQUAL(local_args.GetArg("-bar"), std::numeric_limits::max()); BOOST_CHECK_EQUAL(local_args.GetIntArg("-foo", 0), std::numeric_limits::min()); BOOST_CHECK_EQUAL(local_args.GetIntArg("-bar", 0), std::numeric_limits::max()); + BOOST_CHECK_EQUAL(local_args.GetArg("-foo", uint8_t{0}), std::numeric_limits::min()); + BOOST_CHECK_EQUAL(local_args.GetArg("-bar", uint8_t{0}), std::numeric_limits::max()); ResetArgs(local_args, "-foo=11 -bar=12"); + BOOST_CHECK_EQUAL(local_args.GetArg("-foo"), 11); + BOOST_CHECK_EQUAL(local_args.GetArg("-bar"), 12); BOOST_CHECK_EQUAL(local_args.GetIntArg("-foo", 0), 11); - BOOST_CHECK_EQUAL(local_args.GetIntArg("-bar", 11), 12); + BOOST_CHECK_EQUAL(local_args.GetArg("-bar", uint8_t{11}), 12); ResetArgs(local_args, "-foo=NaN -bar=NotANumber"); + BOOST_CHECK_EQUAL(local_args.GetArg("-foo"), 0); + BOOST_CHECK_EQUAL(local_args.GetArg("-bar"), 0); BOOST_CHECK_EQUAL(local_args.GetIntArg("-foo", 1), 0); - BOOST_CHECK_EQUAL(local_args.GetIntArg("-bar", 11), 0); + BOOST_CHECK_EQUAL(local_args.GetArg("-bar", uint8_t{11}), 0); } BOOST_AUTO_TEST_CASE(patharg)