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