Skip to content

Commit

Permalink
Merge bitcoin#10901: Fix constness of ArgsManager methods
Browse files Browse the repository at this point in the history
a622a17 Fix constness of ArgsManager methods (João Barbosa)

Pull request description:

  Make `cs_args` mutex mutable so that const methods can acquire it.

  There's also tiny performance improvement by avoiding two map lookups when retrieving an argument value.

Tree-SHA512: ece58469745f2743b4b643242b51889a3d9c5b76492ed70bb74d4e5b378fff59da79fc129e499da779bf9f488c9435dda17ad1f3a804c1c30f56af422389e8bd
  • Loading branch information
MarcoFalke authored and PastaPastaPasta committed Nov 19, 2019
1 parent 5c6bd04 commit 92aa379
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 24 deletions.
32 changes: 15 additions & 17 deletions src/util.cpp
Expand Up @@ -512,49 +512,48 @@ void ArgsManager::ParseParameters(int argc, const char* const argv[])
}
}

std::vector<std::string> ArgsManager::GetArgs(const std::string& strArg)
std::vector<std::string> ArgsManager::GetArgs(const std::string& strArg) const
{
LOCK(cs_args);
if (IsArgSet(strArg))
return mapMultiArgs.at(strArg);
auto it = mapMultiArgs.find(strArg);
if (it != mapMultiArgs.end()) return it->second;
return {};
}

bool ArgsManager::IsArgSet(const std::string& strArg)
bool ArgsManager::IsArgSet(const std::string& strArg) const
{
LOCK(cs_args);
return mapArgs.count(strArg);
}

std::string ArgsManager::GetArg(const std::string& strArg, const std::string& strDefault)
std::string ArgsManager::GetArg(const std::string& strArg, const std::string& strDefault) const
{
LOCK(cs_args);
if (mapArgs.count(strArg))
return mapArgs[strArg];
auto it = mapArgs.find(strArg);
if (it != mapArgs.end()) return it->second;
return strDefault;
}

int64_t ArgsManager::GetArg(const std::string& strArg, int64_t nDefault)
int64_t ArgsManager::GetArg(const std::string& strArg, int64_t nDefault) const
{
LOCK(cs_args);
if (mapArgs.count(strArg))
return atoi64(mapArgs[strArg]);
auto it = mapArgs.find(strArg);
if (it != mapArgs.end()) return atoi64(it->second);
return nDefault;
}

bool ArgsManager::GetBoolArg(const std::string& strArg, bool fDefault)
bool ArgsManager::GetBoolArg(const std::string& strArg, bool fDefault) const
{
LOCK(cs_args);
if (mapArgs.count(strArg))
return InterpretBool(mapArgs[strArg]);
auto it = mapArgs.find(strArg);
if (it != mapArgs.end()) return InterpretBool(it->second);
return fDefault;
}

bool ArgsManager::SoftSetArg(const std::string& strArg, const std::string& strValue)
{
LOCK(cs_args);
if (mapArgs.count(strArg))
return false;
if (IsArgSet(strArg)) return false;
ForceSetArg(strArg, strValue);
return true;
}
Expand All @@ -571,8 +570,7 @@ void ArgsManager::ForceSetArg(const std::string& strArg, const std::string& strV
{
LOCK(cs_args);
mapArgs[strArg] = strValue;
mapMultiArgs[strArg].clear();
mapMultiArgs[strArg].push_back(strValue);
mapMultiArgs[strArg] = {strValue};
}

void ArgsManager::ForceSetMultiArgs(const std::string& strArg, const std::vector<std::string>& values)
Expand Down
21 changes: 14 additions & 7 deletions src/util.h
Expand Up @@ -248,21 +248,28 @@ inline bool IsSwitchChar(char c)
class ArgsManager
{
protected:
CCriticalSection cs_args;
mutable CCriticalSection cs_args;
std::map<std::string, std::string> mapArgs;
std::map<std::string, std::vector<std::string> > mapMultiArgs;
std::map<std::string, std::vector<std::string>> mapMultiArgs;
public:
void ParseParameters(int argc, const char*const argv[]);
void ReadConfigFile(const std::string& confPath);
std::vector<std::string> GetArgs(const std::string& strArg);

/**
* Return a vector of strings of the given argument
*
* @param strArg Argument to get (e.g. "-foo")
* @return command-line arguments
*/
std::vector<std::string> GetArgs(const std::string& strArg) const;

/**
* Return true if the given argument has been manually set
*
* @param strArg Argument to get (e.g. "-foo")
* @return true if the argument has been set
*/
bool IsArgSet(const std::string& strArg);
bool IsArgSet(const std::string& strArg) const;

/**
* Return string argument or default value
Expand All @@ -271,7 +278,7 @@ class ArgsManager
* @param strDefault (e.g. "1")
* @return command-line argument or default value
*/
std::string GetArg(const std::string& strArg, const std::string& strDefault);
std::string GetArg(const std::string& strArg, const std::string& strDefault) const;

/**
* Return integer argument or default value
Expand All @@ -280,7 +287,7 @@ class ArgsManager
* @param nDefault (e.g. 1)
* @return command-line argument (0 if invalid number) or default value
*/
int64_t GetArg(const std::string& strArg, int64_t nDefault);
int64_t GetArg(const std::string& strArg, int64_t nDefault) const;

/**
* Return boolean argument or default value
Expand All @@ -289,7 +296,7 @@ class ArgsManager
* @param fDefault (true or false)
* @return command-line argument or default value
*/
bool GetBoolArg(const std::string& strArg, bool fDefault);
bool GetBoolArg(const std::string& strArg, bool fDefault) const;

/**
* Set an argument if it doesn't already have a value
Expand Down

0 comments on commit 92aa379

Please sign in to comment.