mirror of
https://github.com/saymrwulf/uhd.git
synced 2026-05-16 21:10:10 +00:00
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).
64 lines
1.8 KiB
C++
64 lines
1.8 KiB
C++
//
|
|
// Copyright 2019 Ettus Research, a National Instruments Brand
|
|
//
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
//
|
|
|
|
#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 {
|
|
return std::stod(val);
|
|
} catch (std::invalid_argument&) {
|
|
throw uhd::runtime_error(std::string("Cannot convert `") + val + "' to double!");
|
|
} catch (std::out_of_range&) {
|
|
throw uhd::runtime_error(std::string("Cannot convert `") + val + "' to double!");
|
|
}
|
|
}
|
|
|
|
template <>
|
|
int cast::from_str(const std::string& val)
|
|
{
|
|
try {
|
|
return std::stoi(val);
|
|
} catch (std::invalid_argument&) {
|
|
throw uhd::runtime_error(std::string("Cannot convert `") + val + "' to int!");
|
|
} catch (std::out_of_range&) {
|
|
throw uhd::runtime_error(std::string("Cannot convert `") + val + "' to int!");
|
|
}
|
|
}
|
|
|
|
template <>
|
|
std::string cast::from_str(const std::string& val)
|
|
{
|
|
return val;
|
|
}
|