MCPcopy Create free account
hub / github.com/Open-GD/OpenGD / FASTFLOAT_CONSTEXPR14 parse_infnan

Function FASTFLOAT_CONSTEXPR14 parse_infnan

Source/external/fast_float.h:3128–3172  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3126 **/
3127template <typename T>
3128from_chars_result FASTFLOAT_CONSTEXPR14
3129parse_infnan(const char *first, const char *last, T &value) noexcept {
3130 from_chars_result answer{};
3131 answer.ptr = first;
3132 answer.ec = std::errc(); // be optimistic
3133 bool minusSign = false;
3134 if (*first == '-') { // assume first < last, so dereference without checks; C++17 20.19.3.(7.1) explicitly forbids '+' here
3135 minusSign = true;
3136 ++first;
3137 }
3138#if FASTFLOAT_ALLOWS_LEADING_PLUS // disabled by default
3139 if (*first == '+') {
3140 ++first;
3141 }
3142#endif
3143 if (last - first >= 3) {
3144 if (fastfloat_strncasecmp(first, "nan", 3)) {
3145 answer.ptr = (first += 3);
3146 value = minusSign ? -std::numeric_limits<T>::quiet_NaN() : std::numeric_limits<T>::quiet_NaN();
3147 // Check for possible nan(n-char-seq-opt), C++17 20.19.3.7, C11 7.20.1.3.3. At least MSVC produces nan(ind) and nan(snan).
3148 if(first != last && *first == '(') {
3149 for(const char* ptr = first + 1; ptr != last; ++ptr) {
3150 if (*ptr == ')') {
3151 answer.ptr = ptr + 1; // valid nan(n-char-seq-opt)
3152 break;
3153 }
3154 else if(!(('a' <= *ptr && *ptr <= 'z') || ('A' <= *ptr && *ptr <= 'Z') || ('0' <= *ptr && *ptr <= '9') || *ptr == '_'))
3155 break; // forbidden char, not nan(n-char-seq-opt)
3156 }
3157 }
3158 return answer;
3159 }
3160 if (fastfloat_strncasecmp(first, "inf", 3)) {
3161 if ((last - first >= 8) && fastfloat_strncasecmp(first + 3, "inity", 5)) {
3162 answer.ptr = first + 8;
3163 } else {
3164 answer.ptr = first + 3;
3165 }
3166 value = minusSign ? -std::numeric_limits<T>::infinity() : std::numeric_limits<T>::infinity();
3167 return answer;
3168 }
3169 }
3170 answer.ec = std::errc::invalid_argument;
3171 return answer;
3172}
3173
3174/**
3175 * Returns true if the floating-pointing rounding mode is to 'nearest'.

Callers

nothing calls this directly

Calls 1

fastfloat_strncasecmpFunction · 0.85

Tested by

no test coverage detected