Skip to content

Commit 32a7086

Browse files
ryanofskysedited
authored andcommitted
refactor: Avoid needless chain type string conversions
1 parent 769c3ee commit 32a7086

File tree

2 files changed

+26
-16
lines changed

2 files changed

+26
-16
lines changed

src/util/system.cpp

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@
5151
#include <string>
5252
#include <system_error>
5353
#include <thread>
54+
#include <tuple>
5455
#include <typeinfo>
56+
#include <variant>
5557

5658
// Application startup time (used for uptime calculation)
5759
const int64_t nStartupTime = GetTime();
@@ -931,15 +933,19 @@ bool ArgsManager::ReadConfigFiles(std::string& error, bool ignore_invalid_keys)
931933

932934
ChainType ArgsManager::GetChainType() const
933935
{
934-
std::string chain_str = GetChainTypeString();
935-
std::optional<ChainType> chain = ChainTypeFromString(chain_str);
936-
if (!chain) {
937-
throw std::runtime_error(strprintf("Unknown chain %s.", chain_str));
938-
}
939-
return *chain;
936+
std::variant<ChainType, std::string> arg = GetChainArg();
937+
if (auto* parsed = std::get_if<ChainType>(&arg)) return *parsed;
938+
throw std::runtime_error(strprintf("Unknown chain %s.", std::get<std::string>(arg)));
940939
}
941940

942941
std::string ArgsManager::GetChainTypeString() const
942+
{
943+
auto arg = GetChainArg();
944+
if (auto* parsed = std::get_if<ChainType>(&arg)) return ChainTypeToString(*parsed);
945+
return std::get<std::string>(arg);
946+
}
947+
948+
std::variant<ChainType, std::string> ArgsManager::GetChainArg() const
943949
{
944950
auto get_net = [&](const std::string& arg) {
945951
LOCK(cs_args);
@@ -953,19 +959,20 @@ std::string ArgsManager::GetChainTypeString() const
953959
const bool fRegTest = get_net("-regtest");
954960
const bool fSigNet = get_net("-signet");
955961
const bool fTestNet = get_net("-testnet");
956-
const bool is_chain_arg_set = IsArgSet("-chain");
962+
const auto chain_arg = GetArg("-chain");
957963

958-
if ((int)is_chain_arg_set + (int)fRegTest + (int)fSigNet + (int)fTestNet > 1) {
964+
if ((int)chain_arg.has_value() + (int)fRegTest + (int)fSigNet + (int)fTestNet > 1) {
959965
throw std::runtime_error("Invalid combination of -regtest, -signet, -testnet and -chain. Can use at most one.");
960966
}
961-
if (fRegTest)
962-
return ChainTypeToString(ChainType::REGTEST);
963-
if (fSigNet)
964-
return ChainTypeToString(ChainType::SIGNET);
965-
if (fTestNet)
966-
return ChainTypeToString(ChainType::TESTNET);
967-
968-
return GetArg("-chain", ChainTypeToString(ChainType::MAIN));
967+
if (chain_arg) {
968+
if (auto parsed = ChainTypeFromString(*chain_arg)) return *parsed;
969+
// Not a known string, so return original string
970+
return *chain_arg;
971+
}
972+
if (fRegTest) return ChainType::REGTEST;
973+
if (fSigNet) return ChainType::SIGNET;
974+
if (fTestNet) return ChainType::TESTNET;
975+
return ChainType::MAIN;
969976
}
970977

971978
bool ArgsManager::UseDefaultSection(const std::string& arg) const

src/util/system.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <stdint.h>
3131
#include <string>
3232
#include <utility>
33+
#include <variant>
3334
#include <vector>
3435

3536
class ArgsManager;
@@ -434,6 +435,8 @@ class ArgsManager
434435
*/
435436
const fs::path& GetDataDir(bool net_specific) const;
436437

438+
std::variant<ChainType, std::string> GetChainArg() const;
439+
437440
// Helper function for LogArgs().
438441
void logArgsPrefix(
439442
const std::string& prefix,

0 commit comments

Comments
 (0)