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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
#include <iostream>
#include <sstream>
#include <cxxformat/cxxformat>
void numberTests()
{
using format::parseNumber;
static_assert(!parseNumber("", 0).first);
static_assert(!parseNumber("-", 0).first);
static_assert(parseNumber("1", 0).first == 1);
static_assert(parseNumber("10", 0).first == 10);
static_assert(parseNumber("10907", 0).first == 10907);
}
int main(int argc, char* argv[])
{
using namespace format::literals;
using format::format;
using format::format_to;
using format::format_nothrow_to;
if (argc == 2)
{
format_nothrow_to(argv[1], stdout, "Knirp", 's', argv[0], 42u, 1.337);
putchar('\n');
return 0;
}
format_to("Hallo %%du %1$s %s%c %s %u = %4$#x = %4$#X = %4$#o %f!\n", std::cout, "Knirp", 's', argv[0], 42u, 1.337);
assert(format("Hallo %%du %1$s %s%c %s %u = %4$#x = %4$#X = %4$#o %f!\n", "Knirp", 's', argv[0], 42u, 1.337) == "Hallo %%du %1$s %s%c %s %u = %4$#x = %4$#X = %4$#o %f!\n"_format("Knirp", 's', argv[0], 42u, 1.337));
"Hallo\n"_format_to(stdout);
format_to("Hallo\n", stdout);
"-%20s-\n"_format_to(stdout, "Hallo");
"-%'20s-\n"_format_to(stdout, R"(H\"all"o)");
"-%'-20s-\n"_format_to(stdout, R"(H\"all"o)");
"-%6s--%6s--%6u--%6u-\n"_format_to(stdout, true, false, true, false);
"-%'030f-\n"_format_to(stdout, 1'000'000.337);
"-%'030a-\n"_format_to(stdout, 1'000'000.337);
"-%'030g-\n"_format_to(stdout, 1'000'000.337);
"-%'030e-\n"_format_to(stdout, 1'000'000.337);
"-%'30f-\n"_format_to(stdout, 1'000'000.337);
"-%'20x-\n"_format_to(stdout, 1'000'000u);
"-%'20u-\n"_format_to(stdout, 1'000'000u);
"- %'19x-\n"_format_to(stdout, 1'000'000u);
"- %'19u-\n"_format_to(stdout, 1'000'000u);
"- %'018x-\n"_format_to(stdout, 1'000'000u);
"- %'018u-\n"_format_to(stdout, 1'000'000u);
"- %'18x-\n"_format_to(stdout, 1'000'000u);
"- %'18u-\n"_format_to(stdout, 1'000'000u);
"- %'019x-\n"_format_to(stdout, 1'000'000u);
"- %'019u-\n"_format_to(stdout, 1'000'000u);
"-%'020x-\n"_format_to(stdout, 1'000'000u);
"-%'020u-\n"_format_to(stdout, 1'000'000u);
"-%'20.10u-\n"_format_to(stdout, 1'000'000u);
"-%20g-\n"_format_to(stdout, 0x1.8p0);
"-%20.0a-\n"_format_to(stdout, 0.0);
"-%#+20.0a-\n"_format_to(stdout, 1.0);
"-%#+20.0e-\n"_format_to(stdout, 1.0);
"-%#+20.0f-\n"_format_to(stdout, 1.0);
"-%#+20.0g-\n"_format_to(stdout, 1.0);
"-%#+20.3g-\n"_format_to(stdout, 1.0);
"-%+20.0a-\n"_format_to(stdout, 1.0);
"-%+20.0e-\n"_format_to(stdout, 1.0);
"-%+20.0f-\n"_format_to(stdout, 1.0);
"-%+20.3g-\n"_format_to(stdout, 1.0);
"-%020.3e-\n"_format_to(stdout, 1.2);
"-%020.3f-\n"_format_to(stdout, 1.2);
"-%020.3g-\n"_format_to(stdout, 1.2);
"-%020.3a-\n"_format_to(stdout, 1.2);
"-%020.3a-\n"_format_to(stdout, -1.2);
"-%20.3a-\n"_format_to(stdout, -1.2);
"-%-20.3a-\n"_format_to(stdout, -1.2);
"-%+020.3a-\n"_format_to(stdout, -1.2);
"-%+020.3a-\n"_format_to(stdout, 1.2);
"-% 020.3a-\n"_format_to(stdout, 1.2);
"-%20.3e-%20.3e-\n"_format_to(stdout, 1.234567890123456789, 1.2);
"-%p-\n"_format_to(stdout, nullptr);
"-%p-\n"_format_to(stdout, argv);
"-%p-\n"_format_to(stdout, argv[0]);
"-%s-\n"_format_to(stdout, argv[0]);
"-%#05x-\n"_format_to(stdout, 10u);
"-%1$5.3s--%1$-5.3s-\n"_format_to(stdout, "Hallo");
"-%1$5.10s--%1$-5.10s-\n"_format_to(stdout, "Hallo");
"%1$d %1$-*3$d %1$d %2$d\n"_format_to(stdout, 1, 4, 10u);
"%1$u %*d %1$u %d\n"_format_to(stdout, 5u, 2, 3);
"%1$u %-*d %1$u %d\n"_format_to(stdout, 5u, 2, 3);
"%1$u %0*d %1$u %d\n"_format_to(stdout, 5u, 2, 3);
"%1$u %0-*d %1$u %d\n"_format_to(stdout, 5u, 2, 3);
"%1$u %-0*d %1$u %d\n"_format_to(stdout, 5u, 2, 3);
"%u % d % d %d\n"_format_to(stdout, 5u, 2, -2, 4);
"%u %+d %+d %d\n"_format_to(stdout, 5u, 2, -2, 4);
"%d %.0d %.d %0d\n"_format_to(stdout, 0, 0, 0, 1);
std::cout << "Hallo %%du %1$s %s%c %s %u = %4$#x = %4$#X = %4$#o %f!\n"_format("Knirp", 's', argv[0], 42u, 1.337) << std::flush;
"-%#09x-\n"_format_to(std::cout, 10u);
#define TEST(fmt, ...) do{ char* plain; asprintf(&plain, fmt, __VA_ARGS__); assert(std::string_view{plain} == operator""_format<fmt>()(__VA_ARGS__)); free(plain); }while(0)
TEST("%d", 1);
TEST("%1$d %1$-*3$d %1$d %2$d\n", 1, 2, 10u);
TEST("%d %.0d %.d %0d\n", 0, 0, 0, 1);
TEST("%1$a %1$A\n", 1.5);
TEST("%1$a %1$A\n", 0.0/0.0);
TEST("-%1$5.3s--%1$-5.3s-\n", "Hallo");
TEST("-%1$5.10s--%1$-5.10s-\n", "Hallo");
TEST("-%1$5c--%1$-5c-\n", 55);
TEST("-%#09.3x-", 10u);
TEST("-%#05x-\n", 10u);
TEST("-%#05o-\n", 10u);
TEST("-%.0o-\n", 0u);
TEST("-%.0x-\n", 0u);
TEST("-%.0X-\n", 0u);
TEST("-%#.0o-\n", 0u);
TEST("-%#.0x-\n", 0u);
TEST("-%#.0X-\n", 0u);
TEST("-%.0u-\n", 0u);
TEST("-%.0i-\n", 0);
TEST("-%.0d-\n", 0);
TEST("-%020.3e-\n", -1.2);
TEST("-%020.3f-\n", -1.2);
TEST("-%020.3g-\n", -1.2);
TEST("-%+020.3a-\n", 1.2);
TEST("-% 020.3a-\n", 1.2);
TEST("-% 20.3a-\n", 1.2);
TEST("-%+20.3a-\n", 1.2);
TEST("-% -20.3a-\n", 1.2);
TEST("-%0.0a-\n", 0.0);
TEST("-%#0.0e-\n", 0.0);
TEST("-%0.0f-\n", 0.0);
TEST("-%#020.3g-\n", -1.2);
TEST("-%+-20.3a-\n", 1.2);
TEST("-%#+20.3g-\n", 1.0);
// these might fail, because %p format is implementation defined, although POSIX seems to define it as %#x
TEST("-%p-\n", nullptr);
TEST("-%p-\n", argv);
TEST("-%p-\n", argv[0]);
#undef TEST
}
|