Browse Source

Merge #10901: Fix constness of ArgsManager methods

a622a1768 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
0.16
MarcoFalke 7 years ago
parent
commit
22e301a3d5
No known key found for this signature in database
GPG Key ID: D2EA4850E7528B25
  1. 32
      src/util.cpp
  2. 21
      src/util.h

32
src/util.cpp

@ -419,49 +419,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); LOCK(cs_args);
if (IsArgSet(strArg)) auto it = mapMultiArgs.find(strArg);
return mapMultiArgs.at(strArg); if (it != mapMultiArgs.end()) return it->second;
return {}; return {};
} }
bool ArgsManager::IsArgSet(const std::string& strArg) bool ArgsManager::IsArgSet(const std::string& strArg) const
{ {
LOCK(cs_args); LOCK(cs_args);
return mapArgs.count(strArg); 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); LOCK(cs_args);
if (mapArgs.count(strArg)) auto it = mapArgs.find(strArg);
return mapArgs[strArg]; if (it != mapArgs.end()) return it->second;
return strDefault; 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); LOCK(cs_args);
if (mapArgs.count(strArg)) auto it = mapArgs.find(strArg);
return atoi64(mapArgs[strArg]); if (it != mapArgs.end()) return atoi64(it->second);
return nDefault; return nDefault;
} }
bool ArgsManager::GetBoolArg(const std::string& strArg, bool fDefault) bool ArgsManager::GetBoolArg(const std::string& strArg, bool fDefault) const
{ {
LOCK(cs_args); LOCK(cs_args);
if (mapArgs.count(strArg)) auto it = mapArgs.find(strArg);
return InterpretBool(mapArgs[strArg]); if (it != mapArgs.end()) return InterpretBool(it->second);
return fDefault; return fDefault;
} }
bool ArgsManager::SoftSetArg(const std::string& strArg, const std::string& strValue) bool ArgsManager::SoftSetArg(const std::string& strArg, const std::string& strValue)
{ {
LOCK(cs_args); LOCK(cs_args);
if (mapArgs.count(strArg)) if (IsArgSet(strArg)) return false;
return false;
ForceSetArg(strArg, strValue); ForceSetArg(strArg, strValue);
return true; return true;
} }
@ -478,8 +477,7 @@ void ArgsManager::ForceSetArg(const std::string& strArg, const std::string& strV
{ {
LOCK(cs_args); LOCK(cs_args);
mapArgs[strArg] = strValue; mapArgs[strArg] = strValue;
mapMultiArgs[strArg].clear(); mapMultiArgs[strArg] = {strValue};
mapMultiArgs[strArg].push_back(strValue);
} }

21
src/util.h

@ -195,13 +195,20 @@ inline bool IsSwitchChar(char c)
class ArgsManager class ArgsManager
{ {
protected: protected:
CCriticalSection cs_args; mutable CCriticalSection cs_args;
std::map<std::string, std::string> mapArgs; 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: public:
void ParseParameters(int argc, const char*const argv[]); void ParseParameters(int argc, const char*const argv[]);
void ReadConfigFile(const std::string& confPath); 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 * Return true if the given argument has been manually set
@ -209,7 +216,7 @@ public:
* @param strArg Argument to get (e.g. "-foo") * @param strArg Argument to get (e.g. "-foo")
* @return true if the argument has been set * @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 * Return string argument or default value
@ -218,7 +225,7 @@ public:
* @param strDefault (e.g. "1") * @param strDefault (e.g. "1")
* @return command-line argument or default value * @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 * Return integer argument or default value
@ -227,7 +234,7 @@ public:
* @param nDefault (e.g. 1) * @param nDefault (e.g. 1)
* @return command-line argument (0 if invalid number) or default value * @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 * Return boolean argument or default value
@ -236,7 +243,7 @@ public:
* @param fDefault (true or false) * @param fDefault (true or false)
* @return command-line argument or default value * @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 * Set an argument if it doesn't already have a value

Loading…
Cancel
Save