MCPcopy Create free account
hub / github.com/NVIDIAGameWorks/Falcor / parse_infnan

Function parse_infnan

external/include/fast_float/fast_float.h:2888–2926  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2886 **/
2887template <typename T>
2888from_chars_result parse_infnan(const char *first, const char *last, T &value) noexcept {
2889 from_chars_result answer;
2890 answer.ptr = first;
2891 answer.ec = std::errc(); // be optimistic
2892 bool minusSign = false;
2893 if (*first == '-') { // assume first < last, so dereference without checks; C++17 20.19.3.(7.1) explicitly forbids '+' here
2894 minusSign = true;
2895 ++first;
2896 }
2897 if (last - first >= 3) {
2898 if (fastfloat_strncasecmp(first, "nan", 3)) {
2899 answer.ptr = (first += 3);
2900 value = minusSign ? -std::numeric_limits<T>::quiet_NaN() : std::numeric_limits<T>::quiet_NaN();
2901 // 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).
2902 if(first != last && *first == '(') {
2903 for(const char* ptr = first + 1; ptr != last; ++ptr) {
2904 if (*ptr == ')') {
2905 answer.ptr = ptr + 1; // valid nan(n-char-seq-opt)
2906 break;
2907 }
2908 else if(!(('a' <= *ptr && *ptr <= 'z') || ('A' <= *ptr && *ptr <= 'Z') || ('0' <= *ptr && *ptr <= '9') || *ptr == '_'))
2909 break; // forbidden char, not nan(n-char-seq-opt)
2910 }
2911 }
2912 return answer;
2913 }
2914 if (fastfloat_strncasecmp(first, "inf", 3)) {
2915 if ((last - first >= 8) && fastfloat_strncasecmp(first + 3, "inity", 5)) {
2916 answer.ptr = first + 8;
2917 } else {
2918 answer.ptr = first + 3;
2919 }
2920 value = minusSign ? -std::numeric_limits<T>::infinity() : std::numeric_limits<T>::infinity();
2921 return answer;
2922 }
2923 }
2924 answer.ec = std::errc::invalid_argument;
2925 return answer;
2926}
2927
2928} // namespace detail
2929

Callers 1

from_chars_advancedFunction · 0.85

Calls 1

fastfloat_strncasecmpFunction · 0.85

Tested by

no test coverage detected