xtd 0.2.0
__default_insert_basic_ostream_operator.hpp
Go to the documentation of this file.
1
4#pragma once
6#if !defined(__XTD_TUNIT_INTERNAL__)
7#error "Do not include this file: Internal use only"
8#endif
10
11#include <array>
12#include <cstdint>
13#include <deque>
14#include <exception>
15#include <forward_list>
16#include <initializer_list>
17#include <iomanip>
18#include <iostream>
19#include <list>
20#include <map>
21#include <set>
22#include <stdexcept>
23#include <string>
24#include <sstream>
25#include <type_traits>
26#include <tuple>
27#include <unordered_map>
28#include <unordered_set>
29#include <utility>
30#include <vector>
31#include <xtd/optional>
32#include <xtd/target_id>
33#include <xtd/string>
34
36template<class type_t> struct __tunit_is_printable : std::false_type {};
37template<> struct __tunit_is_printable<bool> : std::true_type {};
38template<> struct __tunit_is_printable<char> : std::true_type {};
39template<> struct __tunit_is_printable<signed char> : std::true_type {};
40template<> struct __tunit_is_printable<unsigned char> : std::true_type {};
41template<> struct __tunit_is_printable<wchar_t> : std::true_type {};
42template<> struct __tunit_is_printable<xtd::char8> : std::true_type {};
43template<> struct __tunit_is_printable<xtd::char16> : std::true_type {};
44template<> struct __tunit_is_printable<xtd::char32> : std::true_type {};
45template<> struct __tunit_is_printable<short> : std::true_type {};
46template<> struct __tunit_is_printable<unsigned short> : std::true_type {};
47template<> struct __tunit_is_printable<int> : std::true_type {};
48template<> struct __tunit_is_printable<unsigned int> : std::true_type {};
49template<> struct __tunit_is_printable<long> : std::true_type {};
50template<> struct __tunit_is_printable<unsigned long> : std::true_type {};
51template<> struct __tunit_is_printable<long long> : std::true_type {};
52template<> struct __tunit_is_printable<unsigned long long> : std::true_type {};
53template<> struct __tunit_is_printable<const char*> : std::true_type {};
54template<> struct __tunit_is_printable<const wchar_t*> : std::true_type {};
55template<> struct __tunit_is_printable<float> : std::true_type {};
56template<> struct __tunit_is_printable<double> : std::true_type {};
57template<> struct __tunit_is_printable<long double> : std::true_type {};
58template<> struct __tunit_is_printable<std::string> : std::true_type {};
59template<> struct __tunit_is_printable<xtd::string> : std::true_type {};
60template<> struct __tunit_is_printable<std::u8string> : std::true_type {};
61template<> struct __tunit_is_printable<std::u16string> : std::true_type {};
62template<> struct __tunit_is_printable<std::u32string> : std::true_type {};
63template<> struct __tunit_is_printable<std::wstring> : std::true_type {};
64
65template<class char_t, class char_traits_t, class value_t>
66static void __tunit_print_value(std::basic_ostream<char_t, char_traits_t>& os, const value_t& value, std::true_type) {
67 os.operator << (value);
68}
69
70template<class char_t, class char_traits_t, class value_t>
71static void __tunit_print_value(std::basic_ostream<char_t, char_traits_t>& os, value_t* value, std::true_type) {
72 os.operator << (value);
73}
74
75template<class char_t, class char_traits_t, class value_t>
76static void __tunit_print_value(std::basic_ostream<char_t, char_traits_t>& os, const value_t* value, std::true_type) {
77 os.operator << (value);
78}
79
80template<class char_t, class char_traits_t, class value_t>
81static void __tunit_print_value(std::basic_ostream<char_t, char_traits_t>& os, const value_t& value, std::false_type) {
82 size_t size = sizeof(value) > 32 ? 32 : sizeof(value);
83 os << size << "-byte object <";
84 for (size_t index = 0; index != size; index++)
85 os << (index != 0 ? (index % 2 == 0 ? " " : "-") : "") << std::hex << std::setiosflags(std::ios_base::uppercase) << std::setw(2) << std::setfill('0') << static_cast<int>(reinterpret_cast<const unsigned char*>(&value)[index]) << std::resetiosflags(std::ios_base::dec) << std::dec;
86 os << (size < sizeof(value) ? "-..." : "") << ">";
87}
88
89template<class char_t, class char_traits_t, class value_t>
90static void __print(std::basic_ostream<char_t, char_traits_t>& os, const value_t& value) {
91 __tunit_print_value(os, value, __tunit_is_printable<value_t>());
92}
93
94template<class char_t, class char_traits_t, class value_t>
95static void __print(std::basic_ostream<char_t, char_traits_t>& os, value_t* value) {
96 __tunit_print_value(os, value, __tunit_is_printable<value_t>());
97}
98
99template<class char_t, class char_traits_t, class value_t>
100static void __print(std::basic_ostream<char_t, char_traits_t>& os, const value_t* value) {
101 __tunit_print_value(os, value, __tunit_is_printable<value_t>());
102}
103
104template<class char_t, class char_traits_t, class value_t>
105struct __tunit_value_printer {
106 static void print(std::basic_ostream<char_t, char_traits_t>& os, const value_t*& value) {
107 __print(os, value);
108 }
109 static void print(std::basic_ostream<char_t, char_traits_t>& os, const value_t* const& value) {
110 __print(os, value);
111 }
112 static void print(std::basic_ostream<char_t, char_traits_t>& os, const value_t& value) {
113 __print(os, value);
114 }
115};
116
117template<class char_t, class char_traits_t>
118struct __tunit_value_printer<char_t, char_traits_t, std::exception> {
119 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::exception& value) {
120 os << "exception: " << value.what();
121 }
122};
123
124template<class char_t, class char_traits_t, class value_t>
125struct __tunit_value_printer<char_t, char_traits_t, std::optional<value_t>> {
126 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::optional<value_t>& value) {
127 if (!value.has_value())
128 os << "(null)";
129 else {
130 os << "(";
131 __tunit_value_printer<char_t, char_traits_t, value_t>::print(os, value.value());
132 os << ")";
133 }
134 }
135};
136
137template<class char_t, class char_traits_t>
138struct __tunit_value_printer<char_t, char_traits_t, std::string> {
139 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::string& value) {
140 os << std::quoted(value);
141 }
142};
143
144template<class char_t, class char_traits_t>
145struct __tunit_value_printer<char_t, char_traits_t, xtd::string> {
146 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::string& value) {
147 os << std::quoted(value);
148 }
149};
150
151template<class char_t, class char_traits_t>
152struct __tunit_value_printer<char_t, char_traits_t, std::u8string> {
153 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::u8string& value) {
154 __tunit_value_printer<char_t, char_traits_t, xtd::char8>::print(os, value.c_str());
155 }
156};
157
158template<class char_t, class char_traits_t>
159struct __tunit_value_printer<char_t, char_traits_t, std::u16string> {
160 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::u16string& value) {
161 __tunit_value_printer<char_t, char_traits_t, xtd::char16>::print(os, value.c_str());
162 }
163};
164
165template<class char_t, class char_traits_t>
166struct __tunit_value_printer<char_t, char_traits_t, std::u32string> {
167 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::u32string& value) {
168 __tunit_value_printer<char_t, char_traits_t, xtd::char32>::print(os, value.c_str());
169 }
170};
171
172template<class char_t, class char_traits_t>
173struct __tunit_value_printer<char_t, char_traits_t, std::wstring> {
174 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::wstring& value) {
175 __tunit_value_printer<char_t, char_traits_t, wchar_t>::print(os, value.c_str());
176 }
177};
178
179template<class char_t, class char_traits_t>
180struct __tunit_value_printer<char_t, char_traits_t, const char*> {
181 static void print(std::basic_ostream<char_t, char_traits_t>& os, const char* const& value) {
182 os << std::quoted(value);
183 }
184
185 static void print(std::basic_ostream<char_t, char_traits_t>& os, const char*& value) {
186 os << std::quoted(value);
187 }
188
189 static void print(std::basic_ostream<char_t, char_traits_t>& os, char value) {
190 os << value;
191 }
192};
193
194template<class char_t, class char_traits_t>
195struct __tunit_value_printer<char_t, char_traits_t, char> {
196 static void print(std::basic_ostream<char_t, char_traits_t>& os, const char* const& value) {
197 os << std::quoted(value);
198 }
199
200 static void print(std::basic_ostream<char_t, char_traits_t>& os, const char*& value) {
201 os << std::quoted(value);
202 }
203
204 static void print(std::basic_ostream<char_t, char_traits_t>& os, char value) {
205 os << value;
206 }
207};
208
209template<class char_t, class char_traits_t>
210struct __tunit_value_printer<char_t, char_traits_t, const xtd::char8*> {
211 static void print(std::basic_ostream<char_t, char_traits_t>& os, const xtd::char8* const& value) {
212 os << "\"";
213 for (size_t index = 0; value[index] != '\0'; index++)
214 __tunit_value_printer<char_t, char_traits_t, xtd::char8>::print(os, value[index]);
215 os << "\"";
216 }
217
218 static void print(std::basic_ostream<char_t, char_traits_t>& os, const xtd::char8*& value) {
219 os << "\"";
220 for (size_t index = 0; value[index] != '\0'; index++)
221 __tunit_value_printer<char_t, char_traits_t, xtd::char8>::print(os, value[index]);
222 os << "\"";
223 }
224
225 static void print(std::basic_ostream<char_t, char_traits_t>& os, xtd::char8 value) {
226 if (value <= char(0xFF))
227 os << static_cast<char>(value);
228 else
229 os << "\\x" << std::hex << static_cast<int>(value);
230 }
231};
232
233template<class char_t, class char_traits_t>
234struct __tunit_value_printer<char_t, char_traits_t, xtd::char8> {
235 static void print(std::basic_ostream<char_t, char_traits_t>& os, const xtd::char8* const& value) {
236 os << "\"";
237 for (size_t index = 0; value[index] != '\0'; index++)
238 __tunit_value_printer<char_t, char_traits_t, xtd::char8>::print(os, value[index]);
239 os << "\"";
240 }
241
242 static void print(std::basic_ostream<char_t, char_traits_t>& os, const xtd::char8*& value) {
243 os << "\"";
244 for (size_t index = 0; value[index] != '\0'; index++)
245 __tunit_value_printer<char_t, char_traits_t, xtd::char8>::print(os, value[index]);
246 os << "\"";
247 }
248
249 static void print(std::basic_ostream<char_t, char_traits_t>& os, xtd::char8 value) {
250 os << static_cast<char>(value);
251 }
252};
253
254template<class char_t, class char_traits_t>
255struct __tunit_value_printer<char_t, char_traits_t, const xtd::char16*> {
256 static void print(std::basic_ostream<char_t, char_traits_t>& os, const xtd::char16* const& value) {
257 os << "\"";
258 for (size_t index = 0; value[index] != '\0'; index++)
259 __tunit_value_printer<char_t, char_traits_t, xtd::char16>::print(os, value[index]);
260 os << "\"";
261 }
262
263 static void print(std::basic_ostream<char_t, char_traits_t>& os, const xtd::char16*& value) {
264 os << "\"";
265 for (size_t index = 0; value[index] != L'\0'; index++)
266 __tunit_value_printer<char_t, char_traits_t, xtd::char16>::print(os, value[index]);
267 os << "\"";
268 }
269
270 static void print(std::basic_ostream<char_t, char_traits_t>& os, xtd::char16 value) {
271 if (value <= 0xFF)
272 os << static_cast<char>(value);
273 else
274 os << "\\x" << std::hex << static_cast<int>(value);
275 }
276};
277
278template<class char_t, class char_traits_t>
279struct __tunit_value_printer<char_t, char_traits_t, xtd::char16> {
280 static void print(std::basic_ostream<char_t, char_traits_t>& os, const xtd::char16* const& value) {
281 os << "\"";
282 for (size_t index = 0; value[index] != L'\0'; index++)
283 __tunit_value_printer<char_t, char_traits_t, xtd::char16>::print(os, value[index]);
284 os << "\"";
285 }
286
287 static void print(std::basic_ostream<char_t, char_traits_t>& os, const xtd::char16*& value) {
288 os << "\"";
289 for (size_t index = 0; value[index] != L'\0'; index++)
290 __tunit_value_printer<char_t, char_traits_t, xtd::char16>::print(os, value[index]);
291 os << "\"";
292 }
293
294 static void print(std::basic_ostream<char_t, char_traits_t>& os, xtd::char16 value) {
295 if (value <= 0xFF)
296 os << static_cast<char>(value);
297 else
298 os << "\\x" << std::hex << static_cast<int>(value);
299 }
300};
301
302template<class char_t, class char_traits_t>
303struct __tunit_value_printer<char_t, char_traits_t, const xtd::char32*> {
304 static void print(std::basic_ostream<char_t, char_traits_t>& os, const xtd::char32* const& value) {
305 os << "\"";
306 for (size_t index = 0; value[index] != L'\0'; index++)
307 __tunit_value_printer<char_t, char_traits_t, xtd::char32>::print(os, value[index]);
308 os << "\"";
309 }
310
311 static void print(std::basic_ostream<char_t, char_traits_t>& os, const xtd::char32*& value) {
312 os << "\"";
313 for (size_t index = 0; value[index] != L'\0'; index++)
314 __tunit_value_printer<char_t, char_traits_t, xtd::char32>::print(os, value[index]);
315 os << "\"";
316 }
317
318 static void print(std::basic_ostream<char_t, char_traits_t>& os, xtd::char32 value) {
319 if (value <= 0xFF)
320 os << static_cast<char>(value);
321 else
322 os << "\\x" << std::hex << static_cast<int>(value);
323 }
324};
325
326template<class char_t, class char_traits_t>
327struct __tunit_value_printer<char_t, char_traits_t, xtd::char32> {
328 static void print(std::basic_ostream<char_t, char_traits_t>& os, const xtd::char32* const& value) {
329 os << "\"";
330 for (size_t index = 0; value[index] != L'\0'; index++)
331 __tunit_value_printer<char_t, char_traits_t, xtd::char32>::print(os, value[index]);
332 os << "\"";
333 }
334
335 static void print(std::basic_ostream<char_t, char_traits_t>& os, const xtd::char32*& value) {
336 os << "\"";
337 for (size_t index = 0; value[index] != L'\0'; index++)
338 __tunit_value_printer<char_t, char_traits_t, xtd::char32>::print(os, value[index]);
339 os << "\"";
340 }
341
342 static void print(std::basic_ostream<char_t, char_traits_t>& os, xtd::char32 value) {
343 if (value <= 0xFF)
344 os << static_cast<char>(value);
345 else
346 os << "\\x" << std::hex << static_cast<int>(value);
347 }
348};
349
350template<class char_t, class char_traits_t>
351struct __tunit_value_printer<char_t, char_traits_t, const wchar_t*> {
352 static void print(std::basic_ostream<char_t, char_traits_t>& os, const wchar_t* const& value) {
353 os << "\"";
354 for (size_t index = 0; value[index] != L'\0'; index++)
355 __tunit_value_printer<char_t, char_traits_t, wchar_t>::print(os, value[index]);
356 os << "\"";
357 }
358
359 static void print(std::basic_ostream<char_t, char_traits_t>& os, const wchar_t*& value) {
360 os << "\"";
361 for (size_t index = 0; value[index] != L'\0'; index++)
362 __tunit_value_printer<char_t, char_traits_t, wchar_t>::print(os, value[index]);
363 os << "\"";
364 }
365
366 static void print(std::basic_ostream<char_t, char_traits_t>& os, wchar_t value) {
367 if (value <= 0xFF)
368 os << static_cast<char>(value);
369 else
370 os << "\\x" << std::hex << static_cast<int>(value);
371 }
372};
373
374template<class char_t, class char_traits_t>
375struct __tunit_value_printer<char_t, char_traits_t, wchar_t> {
376 static void print(std::basic_ostream<char_t, char_traits_t>& os, const wchar_t* const& value) {
377 os << "\"";
378 for (size_t index = 0; value[index] != L'\0'; index++)
379 __tunit_value_printer<char_t, char_traits_t, wchar_t>::print(os, value[index]);
380 os << "\"";
381 }
382
383 static void print(std::basic_ostream<char_t, char_traits_t>& os, const wchar_t*& value) {
384 os << "\"";
385 for (size_t index = 0; value[index] != L'\0'; index++)
386 __tunit_value_printer<char_t, char_traits_t, wchar_t>::print(os, value[index]);
387 os << "\"";
388 }
389
390 static void print(std::basic_ostream<char_t, char_traits_t>& os, wchar_t value) {
391 if (value <= 0xFF)
392 os << static_cast<char>(value);
393 else
394 os << "\\x" << std::hex << static_cast<int>(value);
395 }
396};
397
398template<class char_t, class char_traits_t, class type1_t, class type2_t>
399struct __tunit_value_printer<char_t, char_traits_t, std::pair<type1_t, type2_t>> {
400 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::pair<type1_t, type2_t>& value) {
401 os << "(";
402 __tunit_value_printer<char_t, char_traits_t, type1_t>::print(os, value.first);
403 os << ", ";
404 __tunit_value_printer<char_t, char_traits_t, type2_t>::print(os, value.second);
405 os << ")";
406 }
407};
408
409template<class char_t, class char_traits_t, class type_t, unsigned N, unsigned Last>
410struct __tuple_printer {
411 static void print(std::basic_ostream<char_t, char_traits_t>& os, const type_t& value) {
412 __tunit_value_printer<char_t, char_traits_t, typename std::tuple_element<N, type_t>::type>::print(os, std::get<N>(value));
413 os << ", ";
414 __tuple_printer < char_t, char_traits_t, type_t, N + 1, Last >::print(os, value);
415 }
416};
417
418template<class char_t, class char_traits_t, class type_t, unsigned N>
419struct __tuple_printer<char_t, char_traits_t, type_t, N, N> {
420 static void print(std::basic_ostream<char_t, char_traits_t>& os, const type_t& value) {
421 __tunit_value_printer<char_t, char_traits_t, typename std::tuple_element<N, type_t>::type>::print(os, std::get<N>(value));
422 }
423};
424
425template<class char_t, class char_traits_t, class ...types_t>
426struct __tunit_value_printer<char_t, char_traits_t, std::tuple<types_t ...>> {
427 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::tuple<types_t ...>& value) {
428 os << "(";
429 __tuple_printer < char_t, char_traits_t, std::tuple<types_t ...>, 0, sizeof...(types_t) - 1 >::print(os, value);
430 os << ")";
431 }
432};
433
434template<class char_t, class char_traits_t>
435struct __tunit_value_printer<char_t, char_traits_t, std::tuple<>> {
436 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::tuple<>&) {
437 os << "()";
438 }
439};
440
441template<class char_t, class char_traits_t, class iterator_t>
442std::basic_ostream<char_t, char_traits_t>& __print_sequence_container(std::basic_ostream<char_t, char_traits_t>& os, const iterator_t& begin, const iterator_t& end) {
443 os << "[";
444 bool first = true;
445 for (iterator_t it = begin; it != end; ++it) {
446 if (!first) os << ", ";
447 __tunit_value_printer<char_t, char_traits_t, typename std::iterator_traits<iterator_t>::value_type>::print(os, *it);
448 first = false;
449 }
450 return os << "]";
451}
452
453template<class char_t, class char_traits_t, class value_t, size_t Size>
454struct __tunit_value_printer<char_t, char_traits_t, std::array<value_t, Size>> {
455 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::array<value_t, Size>& values) {
456 __print_sequence_container(os, values.begin(), values.end());
457 }
458};
459
460template<class char_t, class char_traits_t, class value_t>
461struct __tunit_value_printer<char_t, char_traits_t, std::deque<value_t>> {
462 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::deque<value_t>& values) {
463 __print_sequence_container(os, values.begin(), values.end());
464 }
465};
466
467template<class char_t, class char_traits_t, class value_t>
468struct __tunit_value_printer<char_t, char_traits_t, std::forward_list<value_t>> {
469 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::forward_list<value_t>& values) {
470 __print_sequence_container(os, values.begin(), values.end());
471 }
472};
473
474template<class char_t, class char_traits_t, class value_t>
475struct __tunit_value_printer<char_t, char_traits_t, std::list<value_t>> {
476 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::list<value_t>& values) {
477 __print_sequence_container(os, values.begin(), values.end());
478 }
479};
480
481template<class char_t, class char_traits_t, class value_t>
482struct __tunit_value_printer<char_t, char_traits_t, std::initializer_list<value_t>> {
483 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::initializer_list<value_t>& values) {
484 __print_sequence_container(os, values.begin(), values.end());
485 }
486};
487
488template<class char_t, class char_traits_t, class value_t>
489struct __tunit_value_printer<char_t, char_traits_t, std::vector<value_t>> {
490 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::vector<value_t>& values) {
491 __print_sequence_container(os, values.begin(), values.end());
492 }
493};
494
495template<class char_t, class char_traits_t, class iterator_t>
496std::basic_ostream<char_t, char_traits_t>& __print_associative_container(std::basic_ostream<char_t, char_traits_t>& os, const iterator_t& begin, const iterator_t& end) {
497 os << "{";
498 bool first = true;
499 for (iterator_t it = begin; it != end; ++it) {
500 if (!first) os << ", ";
501 __tunit_value_printer<char_t, char_traits_t, typename std::iterator_traits<iterator_t>::value_type>::print(os, *it);
502 first = false;
503 }
504 return os << "}";
505}
506
507template<class char_t, class char_traits_t, class key_t, class value_t>
508struct __tunit_value_printer<char_t, char_traits_t, std::map<key_t, value_t>> {
509 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::map<key_t, value_t>& values) {
510 __print_associative_container(os, values.begin(), values.end());
511 }
512};
513
514template<class char_t, class char_traits_t, class key_t, class value_t>
515struct __tunit_value_printer<char_t, char_traits_t, std::multimap<key_t, value_t>> {
516 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::multimap<key_t, value_t>& values) {
517 __print_associative_container(os, values.begin(), values.end());
518 }
519};
520
521template<class char_t, class char_traits_t, class value_t>
522struct __tunit_value_printer<char_t, char_traits_t, std::multiset<value_t>> {
523 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::multiset<value_t>& values) {
524 __print_associative_container(os, values.begin(), values.end());
525 }
526};
527
528template<class char_t, class char_traits_t, class value_t>
529struct __tunit_value_printer<char_t, char_traits_t, std::set<value_t>> {
530 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::set<value_t>& values) {
531 __print_associative_container(os, values.begin(), values.end());
532 }
533};
534
535template<class char_t, class char_traits_t, class key_t, class value_t>
536struct __tunit_value_printer<char_t, char_traits_t, std::unordered_map<key_t, value_t>> {
537 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::unordered_map<key_t, value_t>& values) {
538 __print_associative_container(os, values.begin(), values.end());
539 }
540};
541
542template<class char_t, class char_traits_t, class key_t, class value_t>
543struct __tunit_value_printer<char_t, char_traits_t, std::unordered_multimap<key_t, value_t>> {
544 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::unordered_multimap<key_t, value_t>& values) {
545 __print_associative_container(os, values.begin(), values.end());
546 }
547};
548
549template<class char_t, class char_traits_t, class value_t>
550struct __tunit_value_printer<char_t, char_traits_t, std::unordered_multiset<value_t>> {
551 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::unordered_multiset<value_t>& values) {
552 __print_associative_container(os, values.begin(), values.end());
553 }
554};
555
556template<class char_t, class char_traits_t, class value_t>
557struct __tunit_value_printer<char_t, char_traits_t, std::unordered_set<value_t>> {
558 static void print(std::basic_ostream<char_t, char_traits_t>& os, const std::unordered_set<value_t>& values) {
559 __print_associative_container(os, values.begin(), values.end());
560 }
561};
562
563#if __XTD_CURRENT_TARGET_ID__ == __XTD_TARGET_ID_TEST_APPLICATION__
564template<class char_t, class char_traits_t, class type_t>
565std::basic_ostream<char_t, char_traits_t>& operator <<(std::basic_ostream<char_t, char_traits_t>& os, const type_t& value) {
566 __tunit_value_printer<char_t, char_traits_t, type_t>::print(os, value);
567 return os;
568}
569
570template<class char_t, class char_traits_t, class type_t>
571std::basic_ostream<char_t, char_traits_t>& operator <<(std::basic_ostream<char_t, char_traits_t>& os, const type_t* value) {
572 __tunit_value_printer<char_t, char_traits_t, type_t>::print(os, value);
573 return os;
574}
575
576template<class char_t, class char_traits_t, class type_t>
577std::basic_ostream<char_t, char_traits_t>& operator <<(std::basic_ostream<char_t, char_traits_t>& os, type_t* value) {
578 __tunit_value_printer<char_t, char_traits_t, type_t>::print(os, value);
579 return os;
580}
581#endif
582
583inline std::string __tunit_codepoint_to_string(xtd::char32 codepoint) {
584 std::string result;
585 if (codepoint < 0x80)
586 result.push_back(static_cast<char>(codepoint));
587 else if (codepoint < 0x800) {
588 result.push_back(static_cast<char>((codepoint >> 6) | 0xc0));
589 result.push_back(static_cast<char>((codepoint & 0x3f) | 0x80));
590 } else if (codepoint < 0x10000) {
591 result.push_back(static_cast<char>((codepoint >> 12) | 0xe0));
592 result.push_back(static_cast<char>(((codepoint >> 6) & 0x3f) | 0x80));
593 result.push_back(static_cast<char>((codepoint & 0x3f) | 0x80));
594 } else {
595 result.push_back(static_cast<char>((codepoint >> 18) | 0xf0));
596 result.push_back(static_cast<char>(((codepoint >> 12) & 0x3f) | 0x80));
597 result.push_back(static_cast<char>(((codepoint >> 6) & 0x3f) | 0x80));
598 result.push_back(static_cast<char>((codepoint & 0x3f) | 0x80));
599 }
600 return result;
601}
602
603inline xtd::string __tunit_to_string(const xtd::char8& value) {
604 std::stringstream ss;
605 ss << std::quoted(__tunit_codepoint_to_string(value));
606 return ss.str();
607}
608
609inline xtd::string __tunit_to_string(const xtd::char16& value) {
610 std::stringstream ss;
611 ss << std::quoted(__tunit_codepoint_to_string(value));
612 return ss.str();
613}
614
615inline xtd::string __tunit_to_string(const xtd::char32& value) {
616 std::stringstream ss;
617 ss << std::quoted(__tunit_codepoint_to_string(value));
618 return ss.str();
619}
620
621inline xtd::string __tunit_to_string(const wchar_t& value) {
622 std::stringstream ss;
623 ss << std::quoted(__tunit_codepoint_to_string(value));
624 return ss.str();
625}
626
627inline xtd::string __tunit_to_string(const std::string& value) {
628 std::stringstream ss;
629 ss << std::quoted(value);
630 return ss.str();
631}
632
633inline xtd::string __tunit_to_string(const xtd::string& value) {
634 std::stringstream ss;
635 ss << std::quoted(value.chars());
636 return ss.str();
637}
638
639inline xtd::string __tunit_to_string(const std::u8string& value) {
640 std::stringstream ss;
641 ss << std::quoted(value);
642 return ss.str();
643}
644
645inline xtd::string __tunit_to_string(const std::u16string& value) {
646 std::string result;
647 result += "\"";
648 for (auto codepoint : value)
649 result += __tunit_codepoint_to_string(codepoint);
650 result += "\"";
651 return result;
652}
653
654inline xtd::string __tunit_to_string(const std::u32string& value) {
655 std::string result;
656 result += "\"";
657 for (auto codepoint : value)
658 result += __tunit_codepoint_to_string(codepoint);
659 result += "\"";
660 return result;
661}
662
663inline xtd::string __tunit_to_string(const std::wstring& value) {
664 std::string result;
665 result += "\"";
666 for (auto codepoint : value)
667 result += __tunit_codepoint_to_string(codepoint);
668 result += "\"";
669 return result;
670}
671
672inline xtd::string __tunit_to_string(const void* value) {
673 std::stringstream ss;
674 ss << "\"" << reinterpret_cast<xtd::intptr>(value) << "\"";
675 return ss.str();
676}
677
678inline xtd::string __tunit_to_string(void* value) {
679 std::stringstream ss;
680 ss << "\"" << reinterpret_cast<xtd::intptr>(value) << "\"";
681 return ss.str();
682}
683
684inline xtd::string __tunit_to_string(const char* value) {
685 std::stringstream ss;
686 ss << std::quoted(value);
687 return ss.str();
688}
689
690inline xtd::string __tunit_to_string(const xtd::char8* value) {
691 return __tunit_to_string(std::u8string(value));
692}
693
694inline xtd::string __tunit_to_string(const xtd::char16* value) {
695 return __tunit_to_string(std::u16string(value));
696}
697
698inline xtd::string __tunit_to_string(const xtd::char32* value) {
699 return __tunit_to_string(std::u32string(value));
700}
701
702inline xtd::string __tunit_to_string(const wchar_t* value) {
703 return __tunit_to_string(std::wstring(value));
704}
705
706template<class value_t>
707inline xtd::string __tunit_to_string(const value_t& value) {
708 std::stringstream ss;
709 ss << value;
710 return ss.str();
711}
712
713template<class value_t>
714inline xtd::string __tunit_to_string(const value_t* value) {
715 std::stringstream ss;
716 ss << reinterpret_cast<xtd::intptr>(value);
717 return ss.str();
718}
719
720template<class value_t>
721inline xtd::string __tunit_to_string(value_t* value) {
722 std::stringstream ss;
723 ss << reinterpret_cast<xtd::intptr>(value);
724 return ss.str();
725}
xtd::basic_string< xtd::char8 > u8string
Represents text as a sequence of UTF-8 code units.
Definition __string_definitions.hpp:76
xtd::basic_string< xtd::char32 > u32string
Represents text as a sequence of UTF-32 code units.
Definition __string_definitions.hpp:65
xtd::basic_string< char > string
Represents text as a sequence of UTF-8 code units.
Definition __string_definitions.hpp:43
xtd::basic_string< xtd::char16 > u16string
Represents text as a sequence of UTF-16 code units.
Definition __string_definitions.hpp:54
xtd::basic_string< xtd::wchar > wstring
Represents text as a sequence of UTF-16 code unit on Windows or UTF-32 code unit on non-Windows syste...
Definition __string_definitions.hpp:87
size_t size
Represents a size of any object in bytes.
Definition size.hpp:23
char8_t char8
Represents a 8-bit unicode character.
Definition char8.hpp:26
intmax_t intptr
Represent a pointer or a handle.
Definition intptr.hpp:23
char16_t char16
Represents a 16-bit unicode character.
Definition char16.hpp:26
std::optional< type_t > optional
Represents the optional alias on std::optional.
Definition optional.hpp:25
char32_t char32
Represents a 32-bit unicode character.
Definition char32.hpp:23
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition abstract_object.hpp:8
read_only_span< type_t, count > first() const
Obtains a subspan consisting of the first count elements of the sequence.
Definition read_only_span.hpp:282
const_iterator end() const
Returns an iterator to the end.
Definition read_only_span.hpp:213
void print(FILE *file, arg_t &&value)
Writes the text representation of the specified value to the file output stream.
Definition print.hpp:19