rapidyaml  0.7.2
parse and emit YAML, and do it fast
atou: chars to unsigned

Functions

template<class T >
bool c4::atou (csubstr str, T *v) noexcept
 Convert a trimmed string to an unsigned integral value. More...
 
template<class T >
size_t c4::atou_first (csubstr str, T *v)
 Select the next range of characters in the string that can be parsed as an unsigned integral value, and convert it using atou(). More...
 

Detailed Description

Function Documentation

◆ atou()

template<class T >
bool c4::atou ( csubstr  str,
T *  v 
)
noexcept

Convert a trimmed string to an unsigned integral value.

The string can be formatted as decimal, binary (prefix 0b or 0B), octal (prefix 0o or 0O) or hexadecimal (prefix 0x or 0X). Every character in the input string is read for the conversion; it must not contain any leading or trailing whitespace.

Returns
true if the conversion was successful.
Note
overflow is not detected: the return status is true even if the conversion would return a value outside of the type's range, in which case the result will wrap around the type's range. See overflows: does a number string overflow a type and Check read for overflow for overflow checking utilities.
If the string has a minus character, the return status will be false.
See also
atou_first() if the string is not trimmed to the value to read.

Definition at line 1548 of file charconv.hpp.

1549 {
1550  C4_STATIC_ASSERT(std::is_integral<T>::value);
1551 
1552  if(C4_UNLIKELY(str.len == 0 || str.front() == '-'))
1553  return false;
1554 
1555  bool parsed_ok = true;
1556  if(str.str[0] != '0')
1557  {
1558  parsed_ok = read_dec(str, v);
1559  }
1560  else
1561  {
1562  if(str.len > 1)
1563  {
1564  const char pfx = str.str[1];
1565  if(pfx == 'x' || pfx == 'X')
1566  parsed_ok = str.len > 2 && read_hex(str.sub(2), v);
1567  else if(pfx == 'b' || pfx == 'B')
1568  parsed_ok = str.len > 2 && read_bin(str.sub(2), v);
1569  else if(pfx == 'o' || pfx == 'O')
1570  parsed_ok = str.len > 2 && read_oct(str.sub(2), v);
1571  else
1572  parsed_ok = read_dec(str, v);
1573  }
1574  else
1575  {
1576  *v = 0; // we know the first character is 0
1577  }
1578  }
1579  return parsed_ok;
1580 }
bool read_bin(csubstr s, I *v) noexcept
read a binary integer from a string.
Definition: charconv.hpp:928
bool read_oct(csubstr s, I *v) noexcept
read an octal integer from a string.
Definition: charconv.hpp:958
bool read_hex(csubstr s, I *v) noexcept
read an hexadecimal integer from a string.
Definition: charconv.hpp:893
bool read_dec(csubstr s, I *v) noexcept
read a decimal integer from a string.
Definition: charconv.hpp:865

References c4::read_bin(), c4::read_dec(), c4::read_hex(), and c4::read_oct().

Referenced by c4::atou_first(), c4::atox(), and c4::from_chars().

◆ atou_first()

template<class T >
size_t c4::atou_first ( csubstr  str,
T *  v 
)
inline

Select the next range of characters in the string that can be parsed as an unsigned integral value, and convert it using atou().

Leading whitespace (space, newline, tabs) is skipped.

Returns
the number of characters read for conversion, or csubstr::npos if the conversion faileds
See also
atou() if the string is already trimmed to the value to read.
csubstr::first_uint_span()

Definition at line 1590 of file charconv.hpp.

1591 {
1592  csubstr trimmed = str.first_uint_span();
1593  if(trimmed.len == 0)
1594  return csubstr::npos;
1595  if(atou(trimmed, v))
1596  return static_cast<size_t>(trimmed.end() - str.begin());
1597  return csubstr::npos;
1598 }
bool atou(csubstr str, T *v) noexcept
Convert a trimmed string to an unsigned integral value.
Definition: charconv.hpp:1548
@ npos
a null string position
Definition: common.hpp:266

References c4::atou(), and c4::yml::npos.

Referenced by c4::from_chars_first().