-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathfrom_chars_float2.cpp
More file actions
114 lines (91 loc) · 4.37 KB
/
Copy pathfrom_chars_float2.cpp
File metadata and controls
114 lines (91 loc) · 4.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Copyright 2023 Peter Dimov
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#include <boost/charconv.hpp>
#include <boost/core/detail/splitmix64.hpp>
#include <boost/core/lightweight_test.hpp>
#include <cstdio>
static boost::detail::splitmix64 rng;
template<class T> void zero_extend_test()
{
int const N = 2048;
int const M = 16;
for( int i = 0; i < M; ++i )
{
char buffer[ static_cast<std::size_t>(N + 128) ];
{
unsigned long long v = static_cast<unsigned long long>( rng() );
std::snprintf( buffer, sizeof( buffer ), "%llu", v );
T ref;
auto r1 = boost::charconv::from_chars( buffer, buffer + std::strlen( buffer ), ref );
if( !BOOST_TEST_EQ( static_cast<int>(r1.ec), 0 ) )
{
std::fprintf( stderr, "Test failure for '%s': got error at position %ld\n", buffer, static_cast<long>( r1.ptr - buffer ) ); // LCOV_EXCL_LINE
}
else
{
for( int j = 1; j <= N; ++j )
{
std::snprintf( buffer, sizeof( buffer ), "%llu%se-%d", v, std::string( static_cast<std::size_t>(j), '0' ).c_str(), j );
T w;
auto r2 = boost::charconv::from_chars( buffer, buffer + std::strlen( buffer ), w );
if( !BOOST_TEST_EQ( static_cast<int>(r2.ec), 0 ) )
{
std::fprintf( stderr, "Test failure for '%s': expected '%.15g', got error at position %ld\n", buffer, ref, static_cast<long>( r1.ptr - buffer ) ); // LCOV_EXCL_LINE
}
else if( !BOOST_TEST_EQ( w, ref ) )
{
std::fprintf( stderr, "Test failure for '%s': expected '%.15g', got '%.15g'\n", buffer, ref, w ); // LCOV_EXCL_LINE
}
}
for( int j = 1; j <= N; ++j )
{
std::snprintf( buffer, sizeof( buffer ), "%llu0e-%s1", v, std::string( static_cast<std::size_t>(j), '0' ).c_str() );
T w;
auto r2 = boost::charconv::from_chars( buffer, buffer + std::strlen( buffer ), w );
if( !BOOST_TEST_EQ( static_cast<int>(r2.ec), 0 ) )
{
std::fprintf( stderr, "Test failure for '%s': expected '%.15g', got error at position %ld\n", buffer, ref, static_cast<long>( r1.ptr - buffer ) ); // LCOV_EXCL_LINE
}
else if( !BOOST_TEST_EQ( w, ref ) )
{
std::fprintf( stderr, "Test failure for '%s': expected '%.15g', got '%.15g'\n", buffer, ref, w ); // LCOV_EXCL_LINE
}
}
}
}
{
unsigned long long v = static_cast<unsigned long long>( rng() );
std::snprintf( buffer, sizeof( buffer ), "0.%llu", v );
T ref;
auto r1 = boost::charconv::from_chars( buffer, buffer + std::strlen( buffer ), ref );
if( !BOOST_TEST_EQ( static_cast<int>(r1.ec), 0 ) )
{
std::fprintf( stderr, "Test failure for '%s': got error at position %ld\n", buffer, static_cast<long>( r1.ptr - buffer ) ); // LCOV_EXCL_LINE
}
else
{
for( int j = 1; j <= N; ++j )
{
std::snprintf( buffer, sizeof( buffer ), "0.%s%llue%d", std::string( static_cast<std::size_t>(j), '0' ).c_str(), v, j );
T w;
auto r2 = boost::charconv::from_chars( buffer, buffer + std::strlen( buffer ), w );
if( !BOOST_TEST_EQ( static_cast<int>(r2.ec), 0 ) )
{
std::fprintf( stderr, "Test failure for '%s': expected '%.15g', got error at position %ld\n", buffer, ref, static_cast<long>( r1.ptr - buffer ) ); // LCOV_EXCL_LINE
}
else if( !BOOST_TEST_EQ( w, ref ) )
{
std::fprintf( stderr, "Test failure for '%s': expected '%.15g', got '%.15g'\n", buffer, ref, w ); // LCOV_EXCL_LINE
}
}
}
}
}
}
int main()
{
zero_extend_test<float>();
zero_extend_test<double>();
return boost::report_errors();
}