diff options
author | Aaron Rossetto <aaron.rossetto@ni.com> | 2020-03-18 07:31:16 -0500 |
---|---|---|
committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2020-03-18 07:43:20 -0500 |
commit | b12c3b203773649e61f61344829924ab7ad43110 (patch) | |
tree | d3b425d01f2239ec73cc8378e51d323ec111ac08 /host | |
parent | 5fb585c328a45b022744e884ec9d52808a9354cb (diff) | |
download | uhd-b12c3b203773649e61f61344829924ab7ad43110.tar.gz uhd-b12c3b203773649e61f61344829924ab7ad43110.tar.bz2 uhd-b12c3b203773649e61f61344829924ab7ad43110.zip |
utils: Add bool specialization to cast::from_str()
This adds a specialization to `uhd::cast::from_str()` to handle `bool`
as a target type and interpret strings like 'y', 'Y', 'n', 'No', 'True',
'False', etc. as Boolean values, as well as the traditional '0' and '1'
(which also work).
Diffstat (limited to 'host')
-rw-r--r-- | host/include/uhd/utils/cast.hpp | 15 | ||||
-rw-r--r-- | host/lib/utils/cast.cpp | 25 | ||||
-rw-r--r-- | host/tests/cast_test.cpp | 20 |
3 files changed, 60 insertions, 0 deletions
diff --git a/host/include/uhd/utils/cast.hpp b/host/include/uhd/utils/cast.hpp index fd591dae7..7bfb05a4c 100644 --- a/host/include/uhd/utils/cast.hpp +++ b/host/include/uhd/utils/cast.hpp @@ -37,12 +37,27 @@ data_t from_str(const std::string&) throw uhd::runtime_error("Cannot convert from string!"); } +// Specializations of `uhd::cast::from_str()` for supported data types + +//! Specialization of `uhd::cast::from_str()` for Boolean values +// +// Examples evaluating to `true`: 'True', 'Yes', 'y', '1', empty string +// Examples evaluating to `false`: 'false', 'NO', 'n', '0' +// Throws `uhd::runtime_error` if the string can't be converted to `bool` +template <> +UHD_API bool from_str(const std::string& val); + +//! Specialization of `uhd::cast::from_str()` for double-precision values template <> UHD_API double from_str(const std::string& val); +//! Specialization of `uhd::cast::from_str()` for integer values template <> UHD_API int from_str(const std::string& val); +//! Specialization of `uhd::cast::from_str()` for strings +// +// This function simply returns the incoming string template <> UHD_API std::string from_str(const std::string& val); diff --git a/host/lib/utils/cast.cpp b/host/lib/utils/cast.cpp index 635d844ee..6b008ff45 100644 --- a/host/lib/utils/cast.cpp +++ b/host/lib/utils/cast.cpp @@ -5,10 +5,35 @@ // #include <uhd/utils/cast.hpp> +#include <uhd/exception.hpp> +#include <boost/algorithm/string.hpp> using namespace uhd; template <> +bool cast::from_str(const std::string& val) +{ + try { + return (std::stoi(val) != 0); + } catch (std::exception& ex) { + if (boost::algorithm::to_lower_copy(val) == "true" + || boost::algorithm::to_lower_copy(val) == "yes" + || boost::algorithm::to_lower_copy(val) == "y" + || val == "1") { + return true; + } else if (boost::algorithm::to_lower_copy(val) == "false" + || boost::algorithm::to_lower_copy(val) == "no" + || boost::algorithm::to_lower_copy(val) == "n" + || val == "0") { + return false; + } else { + throw uhd::runtime_error("Cannot convert `" + val + "' to boolean!"); + return false; + } + } +} + +template <> double cast::from_str(const std::string& val) { try { diff --git a/host/tests/cast_test.cpp b/host/tests/cast_test.cpp index 9f7941a1d..556cb94a0 100644 --- a/host/tests/cast_test.cpp +++ b/host/tests/cast_test.cpp @@ -27,4 +27,24 @@ BOOST_AUTO_TEST_CASE(test_from_str) BOOST_CHECK_EQUAL(5.0, from_str<double>("5.0")); BOOST_CHECK_EQUAL(23, from_str<int>("23")); BOOST_CHECK_EQUAL("foo", from_str<std::string>("foo")); + + BOOST_CHECK_EQUAL(true, from_str<bool>("true")); + BOOST_CHECK_EQUAL(true, from_str<bool>("True")); + BOOST_CHECK_EQUAL(true, from_str<bool>("Y")); + BOOST_CHECK_EQUAL(true, from_str<bool>("y")); + BOOST_CHECK_EQUAL(true, from_str<bool>("YES")); + BOOST_CHECK_EQUAL(true, from_str<bool>("yEs")); + BOOST_CHECK_EQUAL(true, from_str<bool>("1")); + + BOOST_CHECK_EQUAL(false, from_str<bool>("false")); + BOOST_CHECK_EQUAL(false, from_str<bool>("False")); + BOOST_CHECK_EQUAL(false, from_str<bool>("n")); + BOOST_CHECK_EQUAL(false, from_str<bool>("N")); + BOOST_CHECK_EQUAL(false, from_str<bool>("No")); + BOOST_CHECK_EQUAL(false, from_str<bool>("nO")); + BOOST_CHECK_EQUAL(false, from_str<bool>("0")); + + BOOST_CHECK_THROW(from_str<bool>(""), uhd::runtime_error); + BOOST_CHECK_THROW(from_str<bool>("abc"), uhd::runtime_error); + BOOST_CHECK_THROW(from_str<bool>("deadbeef"), uhd::runtime_error); } |