Repository navigation
Expand file tree
/
Copy pathexample_charconv.cpp
More file actions
74 lines (62 loc) · 2.19 KB
/
Copy pathexample_charconv.cpp
File metadata and controls
74 lines (62 loc) · 2.19 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
#include <array>
#include <charconv>
#include <cstddef>
#include <iomanip>
#include <iostream>
#include <numbers>
#include <string_view>
#include <system_error>
#include <fltx/io.h>
#include <fltx/numbers.h>
using namespace bl;
using namespace bl::literals;
const char* errc_name(std::errc ec)
{
if (ec == std::errc{})
return "ok";
if (ec == std::errc::invalid_argument)
return "invalid_argument";
if (ec == std::errc::result_out_of_range)
return "result_out_of_range";
if (ec == std::errc::value_too_large)
return "value_too_large";
return "other";
}
template<std::size_t N>
std::string_view written_view(const std::array<char, N>& buffer, const char* end)
{
return { buffer.data(), static_cast<std::size_t>(end - buffer.data()) };
}
int main()
{
constexpr fqd value = std::numbers::pi_v<fqd> + 1_qd / 7_qd;
std::array<char, 160> buffer{};
const auto out = bl::to_chars(
buffer.data(),
buffer.data() + buffer.size(),
value,
std::chars_format::fixed,
48);
std::cout << "to_chars fixed status: " << errc_name(out.ec) << "\n";
std::cout << "text: " << written_view(buffer, out.ptr) << "\n\n";
fqd parsed{};
const auto in = bl::from_chars(
buffer.data(),
out.ptr,
parsed,
std::chars_format::fixed);
std::cout << "from_chars status: " << errc_name(in.ec) << "\n";
std::cout << std::setprecision(std::numeric_limits<fqd>::digits10);
std::cout << "parsed: " << parsed << "\n\n";
constexpr std::string_view packet = "6.02214076e23 mol";
fqd scanned{};
const auto scan = bl::from_chars(packet.data(), packet.data() + packet.size(), scanned);
std::cout << "scanned prefix: " << scanned << "\n";
std::cout << "consumed chars: " << (scan.ptr - packet.data()) << "\n";
std::cout << "remaining text: "
<< std::string_view{ scan.ptr, static_cast<std::size_t>(packet.data() + packet.size() - scan.ptr) }
<< "\n\n";
const auto strict = bl::try_parse<fqd>(packet);
std::cout << "try_parse whole packet status: " << errc_name(strict.ec) << "\n";
std::cout << "try_parse consumed chars: " << strict.consumed << "\n";
}