template <typename T, T Min, T Max, typename CharT>
__attribute__((always_inline)) T StrToI(const CharT* s, CharT** end_ptr, int base) { // Ensure that base is between 2 and 36 inclusive, or the special value of 0. if (base < 0 || base == 1 || base > 36) { if (end_ptr != nullptr) *end_ptr = const_cast<CharT*>(s);
errno = EINVAL; return0;
}
// Skip white space and pick up leading +/- sign if any. const CharT* p = s; int c; while (isspace(c = *p++)) {
} bool neg = false; if (c == '-') {
neg = true;
c = *p++;
} elseif (c == '+') {
c = *p++;
}
// If base is 0 or 16, allow "0x" prefix for hex. if ((base == 0 || base == 16) && c == '0' && (*p == 'x' || *p == 'X') && isxdigit(p[1])) {
c = p[1];
p += 2;
base = 16;
} // If base is 0 or 2, allow "0b" prefix for binary. if ((base == 0 || base == 2) && c == '0' && (*p == 'b' || *p == 'B') && isdigit(p[1])) {
c = p[1];
p += 2;
base = 2;
} // If base is 0, allow "0" prefix for octal, otherwise base is 10. if (base == 0) base = (c == '0') ? 8 : 10;
constexpr bool is_signed = (Min != 0);
T acc = 0; // Non-zero if any digits consumed; negative to indicate overflow/underflow. int any = 0; for (;; c = *p++) { if (isdigit(c)) {
c -= '0';
} elseif (isalpha(c)) {
c = 10 + (_tolower(c) - 'a');
} else { break;
} if (c >= base) break; if (any < 0) continue; if (is_signed) { // We work in the negative space because the most negative value has a // larger magnitude than the most positive value. if (__builtin_mul_overflow(acc, base, &acc) || __builtin_sub_overflow(acc, c, &acc)) {
any = -1; continue;
}
} else { if (__builtin_mul_overflow(acc, base, &acc) || __builtin_add_overflow(acc, c, &acc)) {
any = -1; continue;
}
}
any = 1;
}
if (end_ptr != nullptr) *end_ptr = const_cast<CharT*>(any ? p - 1 : s);
// Detected overflow/underflow in the loop? if (any == -1) {
errno = ERANGE; return (is_signed && neg) ? Min : Max;
}
// Will we overflow by trying to negate the most negative value? if (any > 0 && is_signed && !neg && acc == Min) {
errno = ERANGE; return Max;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.