mirror of
https://github.com/fastfloat/fast_float.git
synced 2025-12-07 01:06:48 +08:00
manually checked modified files for errors, but not committing .clang-format due to the following warning: >>> Setting `QualifierAlignment` to something other than `Leave`, COULD lead to incorrect code formatting due to incorrect decisions made due to clang-formats lack of complete semantic information. As such extra care should be taken to review code changes made by the use of this option.
145 lines
3.5 KiB
C++
145 lines
3.5 KiB
C++
|
|
#include "fast_float/fast_float.h"
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <system_error>
|
|
|
|
bool many() {
|
|
std::string const 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() {
|
|
std::string const input = "234532.3426362,7869234.9823,324562.645";
|
|
double result;
|
|
char const *pointer = input.data();
|
|
char const *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
|
|
|
|
bool small() {
|
|
double result = -1;
|
|
std::string str = "3e-1000";
|
|
auto r = fast_float::from_chars(str.data(), str.data() + str.size(), result);
|
|
if (r.ec != std::errc::result_out_of_range) {
|
|
return false;
|
|
}
|
|
if (r.ptr != str.data() + 7) {
|
|
return false;
|
|
}
|
|
if (result != 0) {
|
|
return false;
|
|
}
|
|
printf("small values go to zero\n");
|
|
return true;
|
|
}
|
|
|
|
bool large() {
|
|
double result = -1;
|
|
std::string str = "3e1000";
|
|
auto r = fast_float::from_chars(str.data(), str.data() + str.size(), result);
|
|
if (r.ec != std::errc::result_out_of_range) {
|
|
return false;
|
|
}
|
|
if (r.ptr != str.data() + 6) {
|
|
return false;
|
|
}
|
|
if (result != std::numeric_limits<double>::infinity()) {
|
|
return false;
|
|
}
|
|
printf("large values go to infinity\n");
|
|
return true;
|
|
}
|
|
|
|
int main() {
|
|
std::string const 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 (!small()) {
|
|
printf("Bug\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
if (!large()) {
|
|
printf("Bug\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
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;
|
|
}
|