aboutsummaryrefslogtreecommitdiff
path: root/src/libutil
diff options
context:
space:
mode:
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/args.hh4
-rw-r--r--src/libutil/config.cc4
-rw-r--r--src/libutil/util.hh18
3 files changed, 18 insertions, 8 deletions
diff --git a/src/libutil/args.hh b/src/libutil/args.hh
index 62b9516d8..823d843aa 100644
--- a/src/libutil/args.hh
+++ b/src/libutil/args.hh
@@ -87,7 +87,9 @@ protected:
template<class I>
Handler(I * dest)
: fun([=](std::vector<std::string> ss) {
- if (!string2Int(ss[0], *dest))
+ if (auto n = string2Int<I>(ss[0]))
+ *dest = *n;
+ else
throw UsageError("'%s' is not an integer", ss[0]);
})
, arity(1)
diff --git a/src/libutil/config.cc b/src/libutil/config.cc
index 7af3e7883..7467e5ac0 100644
--- a/src/libutil/config.cc
+++ b/src/libutil/config.cc
@@ -230,7 +230,9 @@ template<typename T>
void BaseSetting<T>::set(const std::string & str, bool append)
{
static_assert(std::is_integral<T>::value, "Integer required.");
- if (!string2Int(str, value))
+ if (auto n = string2Int<T>(str))
+ value = *n;
+ else
throw UsageError("setting '%s' has invalid value '%s'", name, str);
}
diff --git a/src/libutil/util.hh b/src/libutil/util.hh
index 0f82bed78..7a4d5fe92 100644
--- a/src/libutil/util.hh
+++ b/src/libutil/util.hh
@@ -397,21 +397,27 @@ bool statusOk(int status);
/* Parse a string into an integer. */
-template<class N> bool string2Int(const string & s, N & n)
+template<class N>
+std::optional<N> string2Int(const std::string & s)
{
- if (string(s, 0, 1) == "-" && !std::numeric_limits<N>::is_signed)
- return false;
+ if (s.substr(0, 1) == "-" && !std::numeric_limits<N>::is_signed)
+ return {};
std::istringstream str(s);
+ N n;
str >> n;
- return str && str.get() == EOF;
+ if (str && str.get() == EOF) return n;
+ return {};
}
/* Parse a string into a float. */
-template<class N> bool string2Float(const string & s, N & n)
+template<class N>
+std::optional<N> string2Float(const string & s)
{
std::istringstream str(s);
+ N n;
str >> n;
- return str && str.get() == EOF;
+ if (str && str.get() == EOF) return n;
+ return {};
}