summaryrefslogtreecommitdiffstats
path: root/main.cpp
blob: 17a1f64ef072106792026a0feda567df8e17050d (plain)
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
}