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.
76 lines
2.7 KiB
C++
76 lines
2.7 KiB
C++
/*
|
|
* Exercise the Fortran conversion option.
|
|
*/
|
|
#include <cstdlib>
|
|
#include <iostream>
|
|
#include <vector>
|
|
#include "fast_float/fast_float.h"
|
|
|
|
int main_readme() {
|
|
std::string const input = "1d+4";
|
|
double result;
|
|
fast_float::parse_options options{
|
|
fast_float::chars_format::fortran |
|
|
fast_float::chars_format::allow_leading_plus};
|
|
auto answer = fast_float::from_chars_advanced(
|
|
input.data(), input.data() + input.size(), result, options);
|
|
if ((answer.ec != std::errc()) || ((result != 10000))) {
|
|
std::cerr << "parsing failure\n" << result << "\n";
|
|
return EXIT_FAILURE;
|
|
}
|
|
std::cout << "parsed the number " << result << std::endl;
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
int main() {
|
|
std::vector<double> const expected{10000, 1000, 100, 10, 1,
|
|
.1, .01, .001, .0001};
|
|
std::vector<std::string> const fmt1{"1+4", "1+3", "1+2", "1+1", "1+0",
|
|
"1-1", "1-2", "1-3", "1-4"};
|
|
std::vector<std::string> const fmt2{"1d+4", "1d+3", "1d+2", "1d+1", "1d+0",
|
|
"1d-1", "1d-2", "1d-3", "1d-4"};
|
|
std::vector<std::string> const fmt3{"+1+4", "+1+3", "+1+2", "+1+1", "+1+0",
|
|
"+1-1", "+1-2", "+1-3", "+1-4"};
|
|
fast_float::parse_options const options{
|
|
fast_float::chars_format::fortran |
|
|
fast_float::chars_format::allow_leading_plus};
|
|
|
|
for (auto const &f : fmt1) {
|
|
auto d{std::distance(&fmt1[0], &f)};
|
|
double result;
|
|
auto answer{fast_float::from_chars_advanced(f.data(), f.data() + f.size(),
|
|
result, options)};
|
|
if (answer.ec != std::errc() || result != expected[std::size_t(d)]) {
|
|
std::cerr << "parsing failure on " << f << std::endl;
|
|
return EXIT_FAILURE;
|
|
}
|
|
}
|
|
|
|
for (auto const &f : fmt2) {
|
|
auto d{std::distance(&fmt2[0], &f)};
|
|
double result;
|
|
auto answer{fast_float::from_chars_advanced(f.data(), f.data() + f.size(),
|
|
result, options)};
|
|
if (answer.ec != std::errc() || result != expected[std::size_t(d)]) {
|
|
std::cerr << "parsing failure on " << f << std::endl;
|
|
return EXIT_FAILURE;
|
|
}
|
|
}
|
|
|
|
for (auto const &f : fmt3) {
|
|
auto d{std::distance(&fmt3[0], &f)};
|
|
double result;
|
|
auto answer{fast_float::from_chars_advanced(f.data(), f.data() + f.size(),
|
|
result, options)};
|
|
if (answer.ec != std::errc() || result != expected[std::size_t(d)]) {
|
|
std::cerr << "parsing failure on " << f << std::endl;
|
|
return EXIT_FAILURE;
|
|
}
|
|
}
|
|
if (main_readme() != EXIT_SUCCESS) {
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|