13 #include <type_traits>
23 namespace uhd {
namespace cast {
52 std::istringstream is(in);
53 is >> std::setbase(0) >> x;
69 template <
typename data_t>
73 (std::is_same_v<data_t,
74 size_t> || std::is_same_v<data_t, unsigned long> || std::is_same_v<data_t, unsigned long long>)&&!std::
75 is_same_v<data_t, uint32_t> && !std::is_same_v<data_t, uint64_t>) {
77 if (!val.empty() && val[0] ==
'-') {
78 throw std::out_of_range(
"negative value for unsigned type");
81 unsigned long long tmp = std::stoull(val, &pos);
82 if (pos != val.length()) {
83 throw std::invalid_argument(
"trailing characters");
85 if (tmp > std::numeric_limits<data_t>::max()) {
86 throw std::out_of_range(
"value out of range");
88 return static_cast<data_t
>(tmp);
89 }
catch (std::invalid_argument&) {
91 std::string(
"Cannot convert `") + val +
"' to numeric type!");
92 }
catch (std::out_of_range&) {
94 std::string(
"Cannot convert `") + val +
"' to numeric type!");
155 template <
typename T>
157 -> decltype(std::declval<T>().to_string(), std::true_type{});
158 template <
typename T>
160 template <
typename T>
172 template <
typename T>
173 auto to_str(
const T& val) -> std::enable_if_t<
174 std::is_arithmetic_v<
176 decltype(std::to_string(val))>
178 return std::to_string(val);
185 template <
typename T>
186 auto to_str(
const T& val) -> std::enable_if_t<std::is_enum_v<T>, std::string>
188 return std::to_string(
static_cast<std::underlying_type_t<T>
>(val));
196 template <
typename T>
197 auto to_str(
const T& val) -> std::enable_if_t<
198 std::is_floating_point_v<T> && !detail::has_to_string_method<T>::value,
201 std::ostringstream oss;
202 oss.imbue(std::locale::classic());
203 oss.precision(std::numeric_limits<T>::max_digits10);
211 template <
typename T>
213 -> std::enable_if_t<std::is_same_v<T, int8_t> || std::is_same_v<T, signed char>,
216 return std::to_string(
static_cast<int>(val));
220 template <
typename T>
222 -> std::enable_if_t<std::is_same_v<T, uint8_t> || std::is_same_v<T, unsigned char>,
225 return std::to_string(
static_cast<unsigned int>(val));
233 template <
typename T>
234 std::string
to_str(
const std::complex<T>& val)
236 std::string real_str =
to_str(val.real());
237 T imag_val = val.imag();
240 return real_str +
"+j" +
to_str(imag_val);
242 return real_str +
"-j" +
to_str(-imag_val);
251 template <
typename T>
253 -> std::enable_if_t<std::is_convertible_v<decltype(val.to_string()), std::string>,
256 return val.to_string();
260 inline std::string
to_str(
const std::string& val)
265 inline std::string
to_str(
const char* val)
267 return std::string(val);
#define UHD_API
Definition: config.h:87
decltype(has_to_string_method_impl< T >(0)) has_to_string_method
Definition: cast.hpp:161
auto has_to_string_method_impl(int) -> decltype(std::declval< T >().to_string(), std::true_type{})
T fromstr_cast(const std::string &in)
Convert hexadecimal, decimal, octal or other strings that support the >> operator into a value depend...
Definition: cast.hpp:49
T hexstr_cast(const std::string &in)
Convert a hexadecimal string into a value.
Definition: cast.hpp:31
auto to_str(const T &val) -> std::enable_if_t< std::is_arithmetic_v< T > &&!std::is_floating_point_v< T > &&!std::is_same_v< T, int8_t > &&!std::is_same_v< T, uint8_t > &&!std::is_enum_v< T > &&!detail::has_to_string_method< T >::value, decltype(std::to_string(val))>
SFINAE-based template for integer types that std::to_string can handle.
Definition: cast.hpp:173
data_t from_str(const std::string &val)
Generic cast-from-string function.
Definition: cast.hpp:70
UHD_API std::string to_ordinal_string(int val)
Create an ordinal string from a number.
Definition: build_info.hpp:12
Definition: exception.hpp:132