]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/20_util/to_chars/1.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 20_util / to_chars / 1.cc
1 // Copyright (C) 2017-2024 Free Software Foundation, Inc.
2 //
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
7 // any later version.
8
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
17
18 // { dg-do run { target c++14 } }
19 // { dg-require-string-conversions "" }
20
21 #include <charconv>
22 #if __cplusplus >= 201703L
23 # include <string_view>
24 using std::string_view;
25 #else
26 // <charconv> is supported in C++14 as a GNU extension
27 # include <string>
28 using string_view = std::string;
29 #endif
30
31 template<typename I>
32 bool
33 check_to_chars(I val, string_view expected, int base = 0)
34 {
35 // Space for minus sign, 64 binary digits, final '*', and null terminator:
36 char buf[67] = "******************************************************************";
37 std::to_chars_result r = base == 0
38 ? std::to_chars(buf, buf+sizeof(buf), val)
39 : std::to_chars(buf, buf+sizeof(buf), val, base);
40 return r.ec == std::errc{} && *r.ptr == '*' && string_view(buf, r.ptr - buf) == expected;
41 }
42
43 #include <string>
44 #include <climits>
45 #include <testsuite_hooks.h>
46
47 // Using default base 10
48 void
49 test01()
50 {
51 VERIFY( check_to_chars<char>(0, "0") );
52 VERIFY( check_to_chars<signed char>(0, "0") );
53 VERIFY( check_to_chars<unsigned char>(0, "0") );
54 VERIFY( check_to_chars<signed short>(0, "0") );
55 VERIFY( check_to_chars<unsigned short>(0, "0") );
56 VERIFY( check_to_chars<signed int>(0, "0") );
57 VERIFY( check_to_chars<unsigned int>(0, "0") );
58 VERIFY( check_to_chars<signed long>(0, "0") );
59 VERIFY( check_to_chars<unsigned long>(0, "0") );
60 VERIFY( check_to_chars<signed long long>(0, "0") );
61 VERIFY( check_to_chars<unsigned long long>(0, "0") );
62
63 VERIFY( check_to_chars<char>(1, "1") );
64 VERIFY( check_to_chars<signed char>(1, "1") );
65 VERIFY( check_to_chars<unsigned char>(1, "1") );
66 VERIFY( check_to_chars<signed short>(1, "1") );
67 VERIFY( check_to_chars<unsigned short>(1, "1") );
68 VERIFY( check_to_chars<signed int>(1, "1") );
69 VERIFY( check_to_chars<unsigned int>(1, "1") );
70 VERIFY( check_to_chars<signed long>(1, "1") );
71 VERIFY( check_to_chars<unsigned long>(1, "1") );
72 VERIFY( check_to_chars<signed long long>(1, "1") );
73 VERIFY( check_to_chars<unsigned long long>(1, "1") );
74
75 VERIFY( check_to_chars<char>(123, "123") );
76 VERIFY( check_to_chars<signed char>(123, "123") );
77 VERIFY( check_to_chars<unsigned char>(123, "123") );
78 VERIFY( check_to_chars<signed short>(123, "123") );
79 VERIFY( check_to_chars<unsigned short>(123, "123") );
80 VERIFY( check_to_chars<signed int>(123, "123") );
81 VERIFY( check_to_chars<unsigned int>(123, "123") );
82 VERIFY( check_to_chars<signed long>(123, "123") );
83 VERIFY( check_to_chars<unsigned long>(123, "123") );
84 VERIFY( check_to_chars<signed long long>(123, "123") );
85 VERIFY( check_to_chars<unsigned long long>(123, "123") );
86
87 if (std::is_signed<char>::value)
88 VERIFY( check_to_chars<char>(-79, "-79") );
89 VERIFY( check_to_chars<signed char>(-79, "-79") );
90 VERIFY( check_to_chars<signed short>(-79, "-79") );
91 VERIFY( check_to_chars<signed int>(-79, "-79") );
92 VERIFY( check_to_chars<signed long>(-79, "-79") );
93 VERIFY( check_to_chars<signed long long>(-79, "-79") );
94
95 using std::to_string;
96
97 VERIFY( check_to_chars<char>(CHAR_MAX, to_string(CHAR_MAX)) );
98 VERIFY( check_to_chars<signed char>(SCHAR_MAX, to_string(SCHAR_MAX)) );
99 VERIFY( check_to_chars<unsigned char>(UCHAR_MAX, to_string(UCHAR_MAX)) );
100 VERIFY( check_to_chars<signed short>(SHRT_MAX, to_string(SHRT_MAX)) );
101 VERIFY( check_to_chars<unsigned short>(USHRT_MAX, to_string(USHRT_MAX)) );
102 VERIFY( check_to_chars<signed int>(INT_MAX, to_string(INT_MAX)) );
103 VERIFY( check_to_chars<unsigned int>(UINT_MAX, to_string(UINT_MAX)) );
104 VERIFY( check_to_chars<signed long>(LONG_MAX, to_string(LONG_MAX)) );
105 VERIFY( check_to_chars<unsigned long>(ULONG_MAX, to_string(ULONG_MAX)) );
106 VERIFY( check_to_chars<signed long long>(LLONG_MAX, to_string(LLONG_MAX)) );
107 VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX, to_string(ULLONG_MAX)) );
108
109 VERIFY( check_to_chars<char>(CHAR_MIN, to_string(CHAR_MIN)) );
110 VERIFY( check_to_chars<signed char>(SCHAR_MIN, to_string(SCHAR_MIN)) );
111 VERIFY( check_to_chars<signed short>(SHRT_MIN, to_string(SHRT_MIN)) );
112 VERIFY( check_to_chars<signed int>(INT_MIN, to_string(INT_MIN)) );
113 VERIFY( check_to_chars<signed long>(LONG_MIN, to_string(LONG_MIN)) );
114 VERIFY( check_to_chars<signed long long>(LLONG_MIN, to_string(LLONG_MIN)) );
115
116 VERIFY( check_to_chars<char>(CHAR_MAX/2, to_string(CHAR_MAX/2)) );
117 VERIFY( check_to_chars<signed char>(SCHAR_MAX/2, to_string(SCHAR_MAX/2)) );
118 VERIFY( check_to_chars<unsigned char>(UCHAR_MAX/2, to_string(UCHAR_MAX/2)) );
119 VERIFY( check_to_chars<signed short>(SHRT_MAX/2, to_string(SHRT_MAX/2)) );
120 VERIFY( check_to_chars<unsigned short>(USHRT_MAX/2, to_string(USHRT_MAX/2)) );
121 VERIFY( check_to_chars<signed int>(INT_MAX/2, to_string(INT_MAX/2)) );
122 VERIFY( check_to_chars<unsigned int>(UINT_MAX/2, to_string(UINT_MAX/2)) );
123 VERIFY( check_to_chars<signed long>(LONG_MAX/2, to_string(LONG_MAX/2)) );
124 VERIFY( check_to_chars<unsigned long>(ULONG_MAX/2, to_string(ULONG_MAX/2)) );
125 VERIFY( check_to_chars<signed long long>(LLONG_MAX/2, to_string(LLONG_MAX/2)) );
126 VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX/2, to_string(ULLONG_MAX/2)) );
127 }
128
129 // Using explicit base 10
130 void
131 test02()
132 {
133 VERIFY( check_to_chars<char>(0, "0", 10) );
134 VERIFY( check_to_chars<signed char>(0, "0", 10) );
135 VERIFY( check_to_chars<unsigned char>(0, "0", 10) );
136 VERIFY( check_to_chars<signed short>(0, "0", 10) );
137 VERIFY( check_to_chars<unsigned short>(0, "0", 10) );
138 VERIFY( check_to_chars<signed int>(0, "0", 10) );
139 VERIFY( check_to_chars<unsigned int>(0, "0", 10) );
140 VERIFY( check_to_chars<signed long>(0, "0", 10) );
141 VERIFY( check_to_chars<unsigned long>(0, "0", 10) );
142 VERIFY( check_to_chars<signed long long>(0, "0", 10) );
143 VERIFY( check_to_chars<unsigned long long>(0, "0", 10) );
144
145 VERIFY( check_to_chars<char>(1, "1", 10) );
146 VERIFY( check_to_chars<signed char>(1, "1", 10) );
147 VERIFY( check_to_chars<unsigned char>(1, "1", 10) );
148 VERIFY( check_to_chars<signed short>(1, "1", 10) );
149 VERIFY( check_to_chars<unsigned short>(1, "1", 10) );
150 VERIFY( check_to_chars<signed int>(1, "1", 10) );
151 VERIFY( check_to_chars<unsigned int>(1, "1", 10) );
152 VERIFY( check_to_chars<signed long>(1, "1", 10) );
153 VERIFY( check_to_chars<unsigned long>(1, "1", 10) );
154 VERIFY( check_to_chars<signed long long>(1, "1", 10) );
155 VERIFY( check_to_chars<unsigned long long>(1, "1", 10) );
156
157 VERIFY( check_to_chars<char>(123, "123", 10) );
158 VERIFY( check_to_chars<signed char>(123, "123", 10) );
159 VERIFY( check_to_chars<unsigned char>(123, "123", 10) );
160 VERIFY( check_to_chars<signed short>(123, "123", 10) );
161 VERIFY( check_to_chars<unsigned short>(123, "123", 10) );
162 VERIFY( check_to_chars<signed int>(123, "123", 10) );
163 VERIFY( check_to_chars<unsigned int>(123, "123", 10) );
164 VERIFY( check_to_chars<signed long>(123, "123", 10) );
165 VERIFY( check_to_chars<unsigned long>(123, "123", 10) );
166 VERIFY( check_to_chars<signed long long>(123, "123", 10) );
167 VERIFY( check_to_chars<unsigned long long>(123, "123", 10) );
168
169 if (std::is_signed<char>::value)
170 VERIFY( check_to_chars<char>(-79, "-79", 10) );
171 VERIFY( check_to_chars<signed char>(-79, "-79", 10) );
172 VERIFY( check_to_chars<signed short>(-79, "-79", 10) );
173 VERIFY( check_to_chars<signed int>(-79, "-79", 10) );
174 VERIFY( check_to_chars<signed long>(-79, "-79", 10) );
175 VERIFY( check_to_chars<signed long long>(-79, "-79", 10) );
176
177 using std::to_string;
178
179 VERIFY( check_to_chars<char>(CHAR_MAX, to_string(CHAR_MAX), 10) );
180 VERIFY( check_to_chars<signed char>(SCHAR_MAX, to_string(SCHAR_MAX), 10) );
181 VERIFY( check_to_chars<unsigned char>(UCHAR_MAX, to_string(UCHAR_MAX), 10) );
182 VERIFY( check_to_chars<signed short>(SHRT_MAX, to_string(SHRT_MAX), 10) );
183 VERIFY( check_to_chars<unsigned short>(USHRT_MAX, to_string(USHRT_MAX), 10) );
184 VERIFY( check_to_chars<signed int>(INT_MAX, to_string(INT_MAX), 10) );
185 VERIFY( check_to_chars<unsigned int>(UINT_MAX, to_string(UINT_MAX), 10) );
186 VERIFY( check_to_chars<signed long>(LONG_MAX, to_string(LONG_MAX), 10) );
187 VERIFY( check_to_chars<unsigned long>(ULONG_MAX, to_string(ULONG_MAX), 10) );
188 VERIFY( check_to_chars<signed long long>(LLONG_MAX, to_string(LLONG_MAX), 10) );
189 VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX, to_string(ULLONG_MAX), 10) );
190
191 VERIFY( check_to_chars<char>(CHAR_MIN, to_string(CHAR_MIN), 10) );
192 VERIFY( check_to_chars<signed char>(SCHAR_MIN, to_string(SCHAR_MIN), 10) );
193 VERIFY( check_to_chars<signed short>(SHRT_MIN, to_string(SHRT_MIN), 10) );
194 VERIFY( check_to_chars<signed int>(INT_MIN, to_string(INT_MIN), 10) );
195 VERIFY( check_to_chars<signed long>(LONG_MIN, to_string(LONG_MIN), 10) );
196 VERIFY( check_to_chars<signed long long>(LLONG_MIN, to_string(LLONG_MIN), 10) );
197
198 VERIFY( check_to_chars<char>(CHAR_MAX/2, to_string(CHAR_MAX/2), 10) );
199 VERIFY( check_to_chars<signed char>(SCHAR_MAX/2, to_string(SCHAR_MAX/2), 10) );
200 VERIFY( check_to_chars<unsigned char>(UCHAR_MAX/2, to_string(UCHAR_MAX/2), 10) );
201 VERIFY( check_to_chars<signed short>(SHRT_MAX/2, to_string(SHRT_MAX/2), 10) );
202 VERIFY( check_to_chars<unsigned short>(USHRT_MAX/2, to_string(USHRT_MAX/2), 10) );
203 VERIFY( check_to_chars<signed int>(INT_MAX/2, to_string(INT_MAX/2), 10) );
204 VERIFY( check_to_chars<unsigned int>(UINT_MAX/2, to_string(UINT_MAX/2), 10) );
205 VERIFY( check_to_chars<signed long>(LONG_MAX/2, to_string(LONG_MAX/2), 10) );
206 VERIFY( check_to_chars<unsigned long>(ULONG_MAX/2, to_string(ULONG_MAX/2), 10) );
207 VERIFY( check_to_chars<signed long long>(LLONG_MAX/2, to_string(LLONG_MAX/2), 10) );
208 VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX/2, to_string(ULLONG_MAX/2), 10) );
209 }
210
211 // Using all bases
212 void
213 test03()
214 {
215 // -2017 in all bases from [2,36]
216 const char* str2017[37] = { nullptr, nullptr,
217 "-11111100001",
218 "-2202201",
219 "-133201",
220 "-31032",
221 "-13201",
222 "-5611",
223 "-3741",
224 "-2681",
225 "-2017",
226 "-1574",
227 "-1201",
228 "-bc2",
229 "-a41",
230 "-8e7",
231 "-7e1",
232 "-6gb",
233 "-641",
234 "-5b3",
235 "-50h",
236 "-4c1",
237 "-43f",
238 "-3ig",
239 "-3c1",
240 "-35h",
241 "-2pf",
242 "-2kj",
243 "-2g1",
244 "-2bg",
245 "-277",
246 "-232",
247 "-1v1",
248 "-1s4",
249 "-1pb",
250 "-1mm",
251 "-1k1"
252 };
253 // -12345 in all bases from [2,36]
254 const char* str12345[37] = { nullptr, nullptr,
255 "-11000000111001",
256 "-121221020",
257 "-3000321",
258 "-343340",
259 "-133053",
260 "-50664",
261 "-30071",
262 "-17836",
263 "-12345",
264 "-9303",
265 "-7189",
266 "-5808",
267 "-46db",
268 "-39d0",
269 "-3039",
270 "-28c3",
271 "-221f",
272 "-1f3e",
273 "-1ah5",
274 "-16ki",
275 "-13b3",
276 "-107h",
277 "-la9",
278 "-jik",
279 "-i6l",
280 "-gp6",
281 "-fkp",
282 "-ejk",
283 "-dlf",
284 "-cq7",
285 "-c1p",
286 "-bb3",
287 "-an3",
288 "-a2p",
289 "-9ix"
290 };
291 // -23456 in all bases from [2,36]
292 const char* str23456[37] = { nullptr, nullptr,
293 "-101101110100000",
294 "-1012011202",
295 "-11232200",
296 "-1222311",
297 "-300332",
298 "-125246",
299 "-55640",
300 "-35152",
301 "-23456",
302 "-16694",
303 "-116a8",
304 "-a8a4",
305 "-8796",
306 "-6e3b",
307 "-5ba0",
308 "-4d2d",
309 "-4072",
310 "-37ia",
311 "-2icg",
312 "-2b3k",
313 "-24a4",
314 "-1l7j",
315 "-1gh8",
316 "-1cd6",
317 "-18i4",
318 "-154k",
319 "-11pk",
320 "-rpo",
321 "-q1q",
322 "-ock",
323 "-mt0",
324 "-lhq",
325 "-k9u",
326 "-j56",
327 "-i3k"
328 };
329 // INT_MIN in all bases from [2,36]
330 const char* strINT_MIN[37] = { nullptr, nullptr,
331 "-10000000000000000000000000000000",
332 "-12112122212110202102",
333 "-2000000000000000",
334 "-13344223434043",
335 "-553032005532",
336 "-104134211162",
337 "-20000000000",
338 "-5478773672",
339 "-2147483648",
340 "-a02220282",
341 "-4bb2308a8",
342 "-282ba4aab",
343 "-1652ca932",
344 "-c87e66b8",
345 "-80000000",
346 "-53g7f549",
347 "-3928g3h2",
348 "-27c57h33",
349 "-1db1f928",
350 "-140h2d92",
351 "-ikf5bf2",
352 "-ebelf96",
353 "-b5gge58",
354 "-8jmdnkn",
355 "-6oj8ioo",
356 "-5ehnckb",
357 "-4clm98g",
358 "-3hk7988",
359 "-2sb6cs8",
360 "-2d09uc2",
361 "-2000000",
362 "-1lsqtl2",
363 "-1d8xqrq",
364 "-15v22un",
365 "-zik0zk"
366 };
367
368 for (int base = 2; base <= 36; ++base)
369 {
370 VERIFY( check_to_chars<char>(0, "0", base) );
371 VERIFY( check_to_chars<signed char>(0, "0", base) );
372 VERIFY( check_to_chars<unsigned char>(0, "0", base) );
373 VERIFY( check_to_chars<signed short>(0, "0", base) );
374 VERIFY( check_to_chars<unsigned short>(0, "0", base) );
375 VERIFY( check_to_chars<signed int>(0, "0", base) );
376 VERIFY( check_to_chars<unsigned int>(0, "0", base) );
377 VERIFY( check_to_chars<signed long>(0, "0", base) );
378 VERIFY( check_to_chars<unsigned long>(0, "0", base) );
379 VERIFY( check_to_chars<signed long long>(0, "0", base) );
380 VERIFY( check_to_chars<unsigned long long>(0, "0", base) );
381
382 VERIFY( check_to_chars<char>(1, "1", base) );
383 VERIFY( check_to_chars<signed char>(1, "1", base) );
384 VERIFY( check_to_chars<unsigned char>(1, "1", base) );
385 VERIFY( check_to_chars<signed short>(1, "1", base) );
386 VERIFY( check_to_chars<unsigned short>(1, "1", base) );
387 VERIFY( check_to_chars<signed int>(1, "1", base) );
388 VERIFY( check_to_chars<unsigned int>(1, "1", base) );
389 VERIFY( check_to_chars<signed long>(1, "1", base) );
390 VERIFY( check_to_chars<unsigned long>(1, "1", base) );
391 VERIFY( check_to_chars<signed long long>(1, "1", base) );
392 VERIFY( check_to_chars<unsigned long long>(1, "1", base) );
393
394 if (std::is_signed<char>::value)
395 VERIFY( check_to_chars<char>(-1, "-1", base) );
396 VERIFY( check_to_chars<signed char>(-1, "-1", base) );
397 VERIFY( check_to_chars<signed short>(-1, "-1", base) );
398 VERIFY( check_to_chars<signed int>(-1, "-1", base) );
399 VERIFY( check_to_chars<signed long>(-1, "-1", base) );
400 VERIFY( check_to_chars<signed long long>(-1, "-1", base) );
401
402 if (base > 2)
403 {
404 VERIFY( check_to_chars<char>(2, "2", base) );
405 VERIFY( check_to_chars<signed char>(2, "2", base) );
406 VERIFY( check_to_chars<unsigned char>(2, "2", base) );
407 VERIFY( check_to_chars<signed short>(2, "2", base) );
408 VERIFY( check_to_chars<unsigned short>(2, "2", base) );
409 VERIFY( check_to_chars<signed int>(2, "2", base) );
410 VERIFY( check_to_chars<unsigned int>(2, "2", base) );
411 VERIFY( check_to_chars<signed long>(2, "2", base) );
412 VERIFY( check_to_chars<unsigned long>(2, "2", base) );
413 VERIFY( check_to_chars<signed long long>(2, "2", base) );
414 VERIFY( check_to_chars<unsigned long long>(2, "2", base) );
415
416 if (std::is_signed<char>::value)
417 VERIFY( check_to_chars<char>(-2, "-2", base) );
418 VERIFY( check_to_chars<signed char>(-2, "-2", base) );
419 VERIFY( check_to_chars<signed short>(-2, "-2", base) );
420 VERIFY( check_to_chars<signed int>(-2, "-2", base) );
421 VERIFY( check_to_chars<signed long>(-2, "-2", base) );
422 VERIFY( check_to_chars<signed long long>(-2, "-2", base) );
423 }
424
425 VERIFY( check_to_chars(2017u, str2017[base]+1, base) );
426 VERIFY( check_to_chars(2017, str2017[base]+1, base) );
427 VERIFY( check_to_chars(-2017, str2017[base], base) );
428 VERIFY( check_to_chars(12345u, str12345[base]+1, base) );
429 VERIFY( check_to_chars(12345, str12345[base]+1, base) );
430 VERIFY( check_to_chars(-12345, str12345[base], base) );
431 VERIFY( check_to_chars(23456u, str23456[base]+1, base) );
432 VERIFY( check_to_chars(23456, str23456[base]+1, base) );
433 VERIFY( check_to_chars(-23456, str23456[base], base) );
434 VERIFY( check_to_chars(INT_MAX + 1ull, strINT_MIN[base]+1, base) );
435 VERIFY( check_to_chars(INT_MAX + 1ll, strINT_MIN[base]+1, base) );
436 VERIFY( check_to_chars(INT_MIN, strINT_MIN[base], base) );
437 }
438
439 VERIFY( check_to_chars(1155, "xx", 34) );
440 VERIFY( check_to_chars(1224, "yy", 35) );
441 VERIFY( check_to_chars(1295, "zz", 36) );
442 }
443
444 #include <sstream>
445 #include <ios>
446
447 // base 8
448 void
449 test04()
450 {
451 auto to_string = [](auto val) {
452 std::ostringstream ss;
453 ss << std::oct;
454 if (val < 0)
455 ss << '-' << (~val + 1ull);
456 else if (sizeof(val) == 1)
457 ss << (int)val;
458 else
459 ss << val;
460 return ss.str();
461 };
462
463 VERIFY( check_to_chars<char>(123, to_string(123), 8) );
464 VERIFY( check_to_chars<signed char>(123, to_string(123), 8) );
465 VERIFY( check_to_chars<unsigned char>(123, to_string(123), 8) );
466 VERIFY( check_to_chars<signed short>(123, to_string(123), 8) );
467 VERIFY( check_to_chars<unsigned short>(123, to_string(123), 8) );
468 VERIFY( check_to_chars<signed int>(123, to_string(123), 8) );
469 VERIFY( check_to_chars<unsigned int>(123, to_string(123), 8) );
470 VERIFY( check_to_chars<signed long>(123, to_string(123), 8) );
471 VERIFY( check_to_chars<unsigned long>(123, to_string(123), 8) );
472 VERIFY( check_to_chars<signed long long>(123, to_string(123), 8) );
473 VERIFY( check_to_chars<unsigned long long>(123, to_string(123), 8) );
474
475 if (std::is_signed<char>::value)
476 VERIFY( check_to_chars<char>(-79, to_string(-79), 8) );
477 VERIFY( check_to_chars<signed char>(-79, to_string(-79), 8) );
478 VERIFY( check_to_chars<signed short>(-79, to_string(-79), 8) );
479 VERIFY( check_to_chars<signed int>(-79, to_string(-79), 8) );
480 VERIFY( check_to_chars<signed long>(-79, to_string(-79), 8) );
481 VERIFY( check_to_chars<signed long long>(-79, to_string(-79), 8) );
482
483 VERIFY( check_to_chars<char>(CHAR_MAX, to_string(CHAR_MAX), 8) );
484 VERIFY( check_to_chars<signed char>(SCHAR_MAX, to_string(SCHAR_MAX), 8) );
485 VERIFY( check_to_chars<unsigned char>(UCHAR_MAX, to_string(UCHAR_MAX), 8) );
486 VERIFY( check_to_chars<signed short>(SHRT_MAX, to_string(SHRT_MAX), 8) );
487 VERIFY( check_to_chars<unsigned short>(USHRT_MAX, to_string(USHRT_MAX), 8) );
488 VERIFY( check_to_chars<signed int>(INT_MAX, to_string(INT_MAX), 8) );
489 VERIFY( check_to_chars<unsigned int>(UINT_MAX, to_string(UINT_MAX), 8) );
490 VERIFY( check_to_chars<signed long>(LONG_MAX, to_string(LONG_MAX), 8) );
491 VERIFY( check_to_chars<unsigned long>(ULONG_MAX, to_string(ULONG_MAX), 8) );
492 VERIFY( check_to_chars<signed long long>(LLONG_MAX, to_string(LLONG_MAX), 8) );
493 VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX, to_string(ULLONG_MAX), 8) );
494
495 VERIFY( check_to_chars<char>(CHAR_MIN, to_string(CHAR_MIN), 8) );
496 VERIFY( check_to_chars<signed char>(SCHAR_MIN, to_string(SCHAR_MIN), 8) );
497 VERIFY( check_to_chars<signed short>(SHRT_MIN, to_string(SHRT_MIN), 8) );
498 VERIFY( check_to_chars<signed int>(INT_MIN, to_string(INT_MIN), 8) );
499 VERIFY( check_to_chars<signed long>(LONG_MIN, to_string(LONG_MIN), 8) );
500 VERIFY( check_to_chars<signed long long>(LLONG_MIN, to_string(LLONG_MIN), 8) );
501
502 VERIFY( check_to_chars<char>(CHAR_MAX/2, to_string(CHAR_MAX/2), 8) );
503 VERIFY( check_to_chars<signed char>(SCHAR_MAX/2, to_string(SCHAR_MAX/2), 8) );
504 VERIFY( check_to_chars<unsigned char>(UCHAR_MAX/2, to_string(UCHAR_MAX/2), 8) );
505 VERIFY( check_to_chars<signed short>(SHRT_MAX/2, to_string(SHRT_MAX/2), 8) );
506 VERIFY( check_to_chars<unsigned short>(USHRT_MAX/2, to_string(USHRT_MAX/2), 8) );
507 VERIFY( check_to_chars<signed int>(INT_MAX/2, to_string(INT_MAX/2), 8) );
508 VERIFY( check_to_chars<unsigned int>(UINT_MAX/2, to_string(UINT_MAX/2), 8) );
509 VERIFY( check_to_chars<signed long>(LONG_MAX/2, to_string(LONG_MAX/2), 8) );
510 VERIFY( check_to_chars<unsigned long>(ULONG_MAX/2, to_string(ULONG_MAX/2), 8) );
511 VERIFY( check_to_chars<signed long long>(LLONG_MAX/2, to_string(LLONG_MAX/2), 8) );
512 VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX/2, to_string(ULLONG_MAX/2), 8) );
513 }
514
515 // base 16
516 void
517 test05()
518 {
519 auto to_string = [](auto val) {
520 std::ostringstream ss;
521 ss << std::hex;
522 if (val < 0)
523 ss << '-' << (~val + 1ull);
524 else if (sizeof(val) == 1)
525 ss << (int)val;
526 else
527 ss << val;
528 return ss.str();
529 };
530
531 VERIFY( check_to_chars<char>(123, to_string(123), 16) );
532 VERIFY( check_to_chars<signed char>(123, to_string(123), 16) );
533 VERIFY( check_to_chars<unsigned char>(123, to_string(123), 16) );
534 VERIFY( check_to_chars<signed short>(123, to_string(123), 16) );
535 VERIFY( check_to_chars<unsigned short>(123, to_string(123), 16) );
536 VERIFY( check_to_chars<signed int>(123, to_string(123), 16) );
537 VERIFY( check_to_chars<unsigned int>(123, to_string(123), 16) );
538 VERIFY( check_to_chars<signed long>(123, to_string(123), 16) );
539 VERIFY( check_to_chars<unsigned long>(123, to_string(123), 16) );
540 VERIFY( check_to_chars<signed long long>(123, to_string(123), 16) );
541 VERIFY( check_to_chars<unsigned long long>(123, to_string(123), 16) );
542
543 if (std::is_signed<char>::value)
544 VERIFY( check_to_chars<char>(-79, to_string(-79), 16) );
545 VERIFY( check_to_chars<signed char>(-79, to_string(-79), 16) );
546 VERIFY( check_to_chars<signed short>(-79, to_string(-79), 16) );
547 VERIFY( check_to_chars<signed int>(-79, to_string(-79), 16) );
548 VERIFY( check_to_chars<signed long>(-79, to_string(-79), 16) );
549 VERIFY( check_to_chars<signed long long>(-79, to_string(-79), 16) );
550
551 VERIFY( check_to_chars<char>(CHAR_MAX, to_string(CHAR_MAX), 16) );
552 VERIFY( check_to_chars<signed char>(SCHAR_MAX, to_string(SCHAR_MAX), 16) );
553 VERIFY( check_to_chars<unsigned char>(UCHAR_MAX, to_string(UCHAR_MAX), 16) );
554 VERIFY( check_to_chars<signed short>(SHRT_MAX, to_string(SHRT_MAX), 16) );
555 VERIFY( check_to_chars<unsigned short>(USHRT_MAX, to_string(USHRT_MAX), 16) );
556 VERIFY( check_to_chars<signed int>(INT_MAX, to_string(INT_MAX), 16) );
557 VERIFY( check_to_chars<unsigned int>(UINT_MAX, to_string(UINT_MAX), 16) );
558 VERIFY( check_to_chars<signed long>(LONG_MAX, to_string(LONG_MAX), 16) );
559 VERIFY( check_to_chars<unsigned long>(ULONG_MAX, to_string(ULONG_MAX), 16) );
560 VERIFY( check_to_chars<signed long long>(LLONG_MAX, to_string(LLONG_MAX), 16) );
561 VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX, to_string(ULLONG_MAX), 16) );
562
563 VERIFY( check_to_chars<char>(CHAR_MIN, to_string(CHAR_MIN), 16) );
564 VERIFY( check_to_chars<signed char>(SCHAR_MIN, to_string(SCHAR_MIN), 16) );
565 VERIFY( check_to_chars<signed short>(SHRT_MIN, to_string(SHRT_MIN), 16) );
566 VERIFY( check_to_chars<signed int>(INT_MIN, to_string(INT_MIN), 16) );
567 VERIFY( check_to_chars<signed long>(LONG_MIN, to_string(LONG_MIN), 16) );
568 VERIFY( check_to_chars<signed long long>(LLONG_MIN, to_string(LLONG_MIN), 16) );
569
570 VERIFY( check_to_chars<char>(CHAR_MAX/2, to_string(CHAR_MAX/2), 16) );
571 VERIFY( check_to_chars<signed char>(SCHAR_MAX/2, to_string(SCHAR_MAX/2), 16) );
572 VERIFY( check_to_chars<unsigned char>(UCHAR_MAX/2, to_string(UCHAR_MAX/2), 16) );
573 VERIFY( check_to_chars<signed short>(SHRT_MAX/2, to_string(SHRT_MAX/2), 16) );
574 VERIFY( check_to_chars<unsigned short>(USHRT_MAX/2, to_string(USHRT_MAX/2), 16) );
575 VERIFY( check_to_chars<signed int>(INT_MAX/2, to_string(INT_MAX/2), 16) );
576 VERIFY( check_to_chars<unsigned int>(UINT_MAX/2, to_string(UINT_MAX/2), 16) );
577 VERIFY( check_to_chars<signed long>(LONG_MAX/2, to_string(LONG_MAX/2), 16) );
578 VERIFY( check_to_chars<unsigned long>(ULONG_MAX/2, to_string(ULONG_MAX/2), 16) );
579 VERIFY( check_to_chars<signed long long>(LLONG_MAX/2, to_string(LLONG_MAX/2), 16) );
580 VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX/2, to_string(ULLONG_MAX/2), 16) );
581 }
582
583 #include <bitset>
584
585 // base 2
586 void
587 test06()
588 {
589 auto to_string = [](auto val) {
590 std::string s, sign;
591 if (val < 0)
592 {
593 auto absval = ~val + 1ull;
594 s = std::bitset<sizeof(absval) * CHAR_BIT>(absval).to_string();
595 sign = '-';
596 }
597 else
598 s = std::bitset<sizeof(val) * CHAR_BIT>(val).to_string();
599 auto pos = s.find_first_not_of("0");
600 if (pos == std::string::npos)
601 s.resize(1);
602 else
603 s.erase(0, pos);
604 return sign + s;
605 };
606
607 VERIFY( check_to_chars<char>(123, to_string(123), 2) );
608 VERIFY( check_to_chars<signed char>(123, to_string(123), 2) );
609 VERIFY( check_to_chars<unsigned char>(123, to_string(123), 2) );
610 VERIFY( check_to_chars<signed short>(123, to_string(123), 2) );
611 VERIFY( check_to_chars<unsigned short>(123, to_string(123), 2) );
612 VERIFY( check_to_chars<signed int>(123, to_string(123), 2) );
613 VERIFY( check_to_chars<unsigned int>(123, to_string(123), 2) );
614 VERIFY( check_to_chars<signed long>(123, to_string(123), 2) );
615 VERIFY( check_to_chars<unsigned long>(123, to_string(123), 2) );
616 VERIFY( check_to_chars<signed long long>(123, to_string(123), 2) );
617 VERIFY( check_to_chars<unsigned long long>(123, to_string(123), 2) );
618
619 if (std::is_signed<char>::value)
620 VERIFY( check_to_chars<char>(-79, to_string(-79), 2) );
621 VERIFY( check_to_chars<signed char>(-79, to_string(-79), 2) );
622 VERIFY( check_to_chars<signed short>(-79, to_string(-79), 2) );
623 VERIFY( check_to_chars<signed int>(-79, to_string(-79), 2) );
624 VERIFY( check_to_chars<signed long>(-79, to_string(-79), 2) );
625 VERIFY( check_to_chars<signed long long>(-79, to_string(-79), 2) );
626
627 VERIFY( check_to_chars<char>(CHAR_MAX, to_string(CHAR_MAX), 2) );
628 VERIFY( check_to_chars<signed char>(SCHAR_MAX, to_string(SCHAR_MAX), 2) );
629 VERIFY( check_to_chars<unsigned char>(UCHAR_MAX, to_string(UCHAR_MAX), 2) );
630 VERIFY( check_to_chars<signed short>(SHRT_MAX, to_string(SHRT_MAX), 2) );
631 VERIFY( check_to_chars<unsigned short>(USHRT_MAX, to_string(USHRT_MAX), 2) );
632 VERIFY( check_to_chars<signed int>(INT_MAX, to_string(INT_MAX), 2) );
633 VERIFY( check_to_chars<unsigned int>(UINT_MAX, to_string(UINT_MAX), 2) );
634 VERIFY( check_to_chars<signed long>(LONG_MAX, to_string(LONG_MAX), 2) );
635 VERIFY( check_to_chars<unsigned long>(ULONG_MAX, to_string(ULONG_MAX), 2) );
636 VERIFY( check_to_chars<signed long long>(LLONG_MAX, to_string(LLONG_MAX), 2) );
637 VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX, to_string(ULLONG_MAX), 2) );
638
639 VERIFY( check_to_chars<char>(CHAR_MIN, to_string(CHAR_MIN), 2) );
640 VERIFY( check_to_chars<signed char>(SCHAR_MIN, to_string(SCHAR_MIN), 2) );
641 VERIFY( check_to_chars<signed short>(SHRT_MIN, to_string(SHRT_MIN), 2) );
642 VERIFY( check_to_chars<signed int>(INT_MIN, to_string(INT_MIN), 2) );
643 VERIFY( check_to_chars<signed long>(LONG_MIN, to_string(LONG_MIN), 2) );
644 VERIFY( check_to_chars<signed long long>(LLONG_MIN, to_string(LLONG_MIN), 2) );
645
646 VERIFY( check_to_chars<char>(CHAR_MAX/2, to_string(CHAR_MAX/2), 2) );
647 VERIFY( check_to_chars<signed char>(SCHAR_MAX/2, to_string(SCHAR_MAX/2), 2) );
648 VERIFY( check_to_chars<unsigned char>(UCHAR_MAX/2, to_string(UCHAR_MAX/2), 2) );
649 VERIFY( check_to_chars<signed short>(SHRT_MAX/2, to_string(SHRT_MAX/2), 2) );
650 VERIFY( check_to_chars<unsigned short>(USHRT_MAX/2, to_string(USHRT_MAX/2), 2) );
651 VERIFY( check_to_chars<signed int>(INT_MAX/2, to_string(INT_MAX/2), 2) );
652 VERIFY( check_to_chars<unsigned int>(UINT_MAX/2, to_string(UINT_MAX/2), 2) );
653 VERIFY( check_to_chars<signed long>(LONG_MAX/2, to_string(LONG_MAX/2), 2) );
654 VERIFY( check_to_chars<unsigned long>(ULONG_MAX/2, to_string(ULONG_MAX/2), 2) );
655 VERIFY( check_to_chars<signed long long>(LLONG_MAX/2, to_string(LLONG_MAX/2), 2) );
656 VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX/2, to_string(ULLONG_MAX/2), 2) );
657 }
658
659 int
660 main()
661 {
662 test01();
663 test02();
664 test03();
665 test04();
666 test05();
667 test06();
668 }