#include "fast_float/fast_float.h" #include #include #include bool many() { const std::string input = "234532.3426362,7869234.9823,324562.645"; double result; auto answer = fast_float::from_chars(input.data(), input.data()+input.size(), result); if(answer.ec != std::errc()) { return false; } if(result != 234532.3426362) { return false; } if(answer.ptr[0] != ',') { return false; } answer = fast_float::from_chars(answer.ptr + 1, input.data()+input.size(), result); if(answer.ec != std::errc()) { return false; } if(result != 7869234.9823) { return false; } if(answer.ptr[0] != ',') { return false; } answer = fast_float::from_chars(answer.ptr + 1, input.data()+input.size(), result); if(answer.ec != std::errc()) { return false; } if(result != 324562.645) { return false; } return true; } void many_loop() { const std::string input = "234532.3426362,7869234.9823,324562.645"; double result; const char* pointer = input.data(); const char* end_pointer = input.data() + input.size(); while(pointer < end_pointer) { auto answer = fast_float::from_chars(pointer, end_pointer, result); if(answer.ec != std::errc()) { std::cerr << "error while parsing" << std::endl; break; } std::cout << "parsed: " << result << std::endl; pointer = answer.ptr; if ((answer.ptr < end_pointer) && (*pointer == ',')) { pointer++; } } } #if FASTFLOAT_IS_CONSTEXPR // consteval forces compile-time evaluation of the function in C++20. consteval double parse(std::string_view input) { double result; auto answer = fast_float::from_chars(input.data(), input.data()+input.size(), result); if(answer.ec != std::errc()) { return -1.0; } return result; } // This function should compile to a function which // merely returns 3.1415. constexpr double constexptest() { return parse("3.1415 input"); } #endif int main() { const std::string input = "3.1416 xyz "; double result; auto answer = fast_float::from_chars(input.data(), input.data()+input.size(), result); if((answer.ec != std::errc()) || ((result != 3.1416))) { std::cerr << "parsing failure\n"; return EXIT_FAILURE; } std::cout << "parsed the number " << result << std::endl; if(!many()) { printf("Bug\n"); return EXIT_FAILURE; } many_loop(); #if FASTFLOAT_IS_CONSTEXPR if constexpr(constexptest() != 3.1415) { return EXIT_FAILURE; } #endif return EXIT_SUCCESS; }