diff --git a/TypeHelpers.hpp b/TypeHelpers.hpp index a7590f4..4162ea8 100644 --- a/TypeHelpers.hpp +++ b/TypeHelpers.hpp @@ -1,4 +1,5 @@ // Copyright (c) 2014-2017 Josh Blum +// 2023 Nicholas Corgan // SPDX-License-Identifier: GPL-3.0 #pragma once @@ -17,10 +18,9 @@ static inline SoapySDR::Kwargs dictToKwargs(const uhd::device_addr_t &addr) { SoapySDR::Kwargs kwargs; - const std::vector keys = addr.keys(); - for (size_t i = 0; i < keys.size(); i++) + for (const auto &key: addr.keys()) { - kwargs[keys[i]] = addr[keys[i]]; + kwargs[key] = addr[key]; } return kwargs; } @@ -28,22 +28,23 @@ static inline SoapySDR::Kwargs dictToKwargs(const uhd::device_addr_t &addr) static inline uhd::device_addr_t kwargsToDict(const SoapySDR::Kwargs &kwargs) { uhd::device_addr_t addr; - for (SoapySDR::Kwargs::const_iterator it = kwargs.begin(); it != kwargs.end(); ++it) + for (const auto &kwarg: kwargs) { - addr[it->first] = it->second; + addr[kwarg.first] = kwarg.second; } + return addr; } static inline SoapySDR::RangeList metaRangeToRangeList(const uhd::meta_range_t &metaRange) { SoapySDR::RangeList out; - for (size_t i = 0; i < metaRange.size(); i++) + for (const auto &range: metaRange) { #ifdef SOAPY_SDR_API_HAS_RANGE_TYPE_STEP - out.push_back(SoapySDR::Range(metaRange[i].start(), metaRange[i].stop(), metaRange[i].step())); + out.emplace_back(range.start(), range.stop(), range.step()); #else - out.push_back(SoapySDR::Range(metaRange[i].start(), metaRange[i].stop())); + out.emplace_back(range.start(), range.stop()); #endif } return out; @@ -52,15 +53,15 @@ static inline SoapySDR::RangeList metaRangeToRangeList(const uhd::meta_range_t & static inline uhd::meta_range_t rangeListToMetaRange(const SoapySDR::RangeList &ranges) { uhd::meta_range_t out; - for (size_t i = 0; i < ranges.size(); i++) + for (const auto &range: ranges) { #ifdef SOAPY_SDR_API_HAS_RANGE_TYPE_STEP - out.push_back(uhd::range_t(ranges[i].minimum(), ranges[i].maximum(), ranges[i].step())); + out.emplace_back(range.minimum(), range.maximum(), range.step()); #else - out.push_back(uhd::range_t(ranges[i].minimum(), ranges[i].maximum())); + out.emplace_back(range.minimum(), range.maximum()); #endif } - if (out.empty()) out.push_back(uhd::range_t(0.0)); + if (out.empty()) out.emplace_back(uhd::range_t(0.0)); return out; } @@ -76,11 +77,11 @@ static inline SoapySDR::Range metaRangeToRange(const uhd::meta_range_t &metaRang static inline uhd::meta_range_t numberListToMetaRange(const std::vector &nums) { uhd::meta_range_t out; - for (size_t i = 0; i < nums.size(); i++) + for(const double num: nums) { - out.push_back(uhd::range_t(nums[i])); + out.emplace_back(num); } - if (out.empty()) out.push_back(uhd::range_t(0.0)); + if (out.empty()) out.emplace_back(0.0); return out; } @@ -91,15 +92,15 @@ static inline std::vector metaRangeToNumericList(const uhd::meta_range_t //in this case, the bounds are in element 0 if (metaRange.size() == 1) { - out.push_back(metaRange[0].start()); - out.push_back(metaRange[0].stop()); + out.emplace_back(metaRange[0].start()); + out.emplace_back(metaRange[0].stop()); return out; } for (size_t i = 0; i < metaRange.size(); i++) { //in these cases start == stop - out.push_back(metaRange[i].start()); + out.emplace_back(metaRange[i].start()); } return out; } @@ -135,9 +136,30 @@ static inline uhd::sensor_value_t argInfoToSensor(const SoapySDR::ArgInfo &argIn { switch (argInfo.type) { - case SoapySDR::ArgInfo::BOOL: return uhd::sensor_value_t(argInfo.name, value == "true", argInfo.units, argInfo.units); - case SoapySDR::ArgInfo::INT: return uhd::sensor_value_t(argInfo.name, atoi(value.c_str()), argInfo.units); - case SoapySDR::ArgInfo::FLOAT: return uhd::sensor_value_t(argInfo.name, atof(value.c_str()), argInfo.units); + case SoapySDR::ArgInfo::BOOL: + return uhd::sensor_value_t( + argInfo.name, + SoapySDR::StringToSetting(value), + SOAPY_SDR_TRUE, + SOAPY_SDR_FALSE + ); + + // UHD's sensors are limited to an int32_t, but that should be enough for + // most cases. + case SoapySDR::ArgInfo::INT: + return uhd::sensor_value_t( + argInfo.name, + SoapySDR::StringToSetting(value), + argInfo.units + ); + + case SoapySDR::ArgInfo::FLOAT: + return uhd::sensor_value_t( + argInfo.name, + SoapySDR::StringToSetting(value), + argInfo.units + ); + case SoapySDR::ArgInfo::STRING: return uhd::sensor_value_t(argInfo.name, value, argInfo.units); } return uhd::sensor_value_t(argInfo.name, value, argInfo.units);