xtd 0.2.0
Loading...
Searching...
No Matches
generic_stream_output.hpp
Go to the documentation of this file.
1
4#pragma once
5#include <xtd/any>
6#include <xtd/optional>
7#include <array>
8#include <deque>
9#include <stdexcept>
10#include <functional>
11#include <forward_list>
12#include <iostream>
13#include <iomanip>
14#include <list>
15#include <map>
16#include <set>
17#include <system_error>
18#include <tuple>
19#include <typeindex>
20#include <type_traits>
21#include <unordered_map>
22#include <unordered_set>
23#include <utility>
24#include <valarray>
25#include <vector>
26
28extern std::unordered_map<std::type_index, std::function<std::string(xtd::any const&)>> __any_stringer__;
29
30/*
31template<class char_t, class char_traits_t, class type_t>
32std::basic_ostream<char_t, char_traits_t>& operator <<(std::basic_ostream<char_t, char_traits_t>& os, const type_t& value) {
33 size_t size = sizeof(value) > 32 ? 32 : sizeof(value);
34 os << sizeof(value) << std::basic_string<char_t> {'-', 'b', 'y', 't', 'e', ' ', 'o', 'b', 'j', 'e', 'c', 't', '<'};
35 for (size_t index = 0; index != size; index++)
36 os << (index != 0 ? (index % 2 == 0 ? ' ' : '-') : '\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;
37 os << (size < sizeof(value) ? std::basic_string<char_t> {'-', '.', '.', '.'} : std::basic_string<char_t> {}) << '>';
38 return os;
39}*/
40
41template<class char_t, class char_traits_t>
42inline std::basic_ostream<char_t, char_traits_t>& operator <<(std::basic_ostream<char_t, char_traits_t>& os, const std::exception& value) {
43 return os << "exception: " << value.what();
44}
45
46template < class char_t, class char_traits_t >
47inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, xtd::any value) {
48 auto it = __any_stringer__.find(std::type_index(value.type()));
49 if (it == __any_stringer__.cend()) return os << "(unregistered)";
50 return os << it->second(value);
51}
52
53template<class char_t, class char_traits_t, class value_t>
54inline std::basic_ostream<char_t, char_traits_t>& operator <<(std::basic_ostream<char_t, char_traits_t>& os, const std::optional<value_t>& value) {
55 if (!value.has_value()) return os << "(null)";
56 return os << '(' << value.value() << ')';
57}
58
59template<class char_t, class char_traits_t, class type1_t, class type2_t>
60inline std::basic_ostream<char_t, char_traits_t>& operator <<(std::basic_ostream<char_t, char_traits_t>& os, const std::pair<type1_t, type2_t>& value) {
61 return os << '(' << value.first << ',' << ' ' << value.second << ')';
62}
63
64template<class char_t, class char_traits_t, class type_t, unsigned n_t, unsigned last_t>
65struct __xtd_console_tuple_printer {
66 static void print(std::basic_ostream < char_t, char_traits_t >& os, const type_t& value) {
67 os << std::get < n_t > (value) << ',' << ' ';
68 __xtd_console_tuple_printer < char_t, char_traits_t, type_t, n_t + 1, last_t >::print(os, value);
69 }
70};
71
72template < class char_t, class char_traits_t, class type_t, unsigned n_t >
73struct __xtd_console_tuple_printer < char_t, char_traits_t, type_t, n_t, n_t > {
74 static void print(std::basic_ostream < char_t, char_traits_t >& os, const type_t& value) {
75 os << std::get < n_t > (value);
76 }
77};
78
79template < class char_t, class char_traits_t, class ...types_t >
80inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::tuple < types_t ... >& value) {
81 os << '(';
82 __xtd_console_tuple_printer < char_t, char_traits_t, std::tuple < types_t ...>, 0, sizeof...(types_t) - 1 >::print(os, value);
83 return os << ')';
84}
85
86/*
87template<class char_t, class char_traits_t, class ...args_t>
88inline std::basic_ostream<char_t, char_traits_t>& operator <<(std::basic_ostream<char_t, char_traits_t>& os, const std::variant<args_t ...>& value) {
89 std::visit([&](auto && t){
90 os << t;
91 }, value);
92 return os;
93}*/
94
95template < class char_t, class char_traits_t, class iterator_t >
96inline std::basic_ostream < char_t, char_traits_t >& __xtd_console_print_sequence_container(std::basic_ostream < char_t, char_traits_t >& os, const iterator_t& begin, const iterator_t& end) {
97 os << '[';
98 bool first = true;
99 for (iterator_t it = begin; it != end; ++it) {
100 if (!first) os << ',' << ' ';
101 os << *it;
102 first = false;
103 }
104 return os << ']';
105}
106
107template < class char_t, class char_traits_t, class type_t, size_t size_t >
108inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::array < type_t, size_t >& values) {
109 return __xtd_console_print_sequence_container(os, values.begin(), values.end());
110}
111
112template < class char_t, class char_traits_t, class type_t, class allocator_t = std::allocator < type_t>>
113inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::deque < type_t, allocator_t >& values) {
114 return __xtd_console_print_sequence_container(os, values.begin(), values.end());
115}
116
117template < class char_t, class char_traits_t, class type_t, class allocator_t = std::allocator < type_t>>
118inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::forward_list < type_t, allocator_t >& values) {
119 return __xtd_console_print_sequence_container(os, values.begin(), values.end());
120}
121
122template < class char_t, class char_traits_t, class type_t >
123inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::initializer_list < type_t >& values) {
124 return __xtd_console_print_sequence_container(os, values.begin(), values.end());
125}
126
127template < class char_t, class char_traits_t, class type_t, class allocator_t = std::allocator < type_t>>
128inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::list < type_t, allocator_t >& values) {
129 return __xtd_console_print_sequence_container(os, values.begin(), values.end());
130}
131
132template < class char_t, class char_traits_t, class type_t >
133inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::valarray < type_t >& values) {
134 return __xtd_console_print_sequence_container(os, std::begin(values), std::end(values));
135}
136
137template < class char_t, class char_traits_t, class type_t, class allocator_t = std::allocator < type_t>>
138inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::vector < type_t, allocator_t >& values) {
139 return __xtd_console_print_sequence_container(os, values.begin(), values.end());
140}
141
142template < class char_t, class char_traits_t, class iterator_t >
143inline std::basic_ostream < char_t, char_traits_t >& __xtd_console_print_associative_container(std::basic_ostream < char_t, char_traits_t >& os, const iterator_t& begin, const iterator_t& end) {
144 os << "{";
145 bool first = true;
146 for (iterator_t it = begin; it != end; ++it) {
147 if (!first) os << ", ";
148 os << *it;
149 first = false;
150 }
151 return os << "}";
152}
153
154template < class char_t, class char_traits_t, class key_t, class value_t, class compare_t = std::less < key_t>, class allocator_t = std::allocator<std::pair<const key_t, value_t >>>
155inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::map < key_t, value_t, compare_t, allocator_t >& values) {
156 return __xtd_console_print_associative_container(os, values.begin(), values.end());
157}
158
159template < class char_t, class char_traits_t, class key_t, class value_t, class compare_t = std::less < key_t>, class allocator_t = std::allocator<std::pair<const key_t, value_t >>>
160inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::multimap < key_t, value_t, compare_t, allocator_t >& values) {
161 return __xtd_console_print_associative_container(os, values.begin(), values.end());
162}
163
164template < class char_t, class char_traits_t, class key_t, class compare_t = std::less < key_t>, class allocator_t = std::allocator<key_t >>
165inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::multiset < key_t, compare_t, allocator_t >& values) {
166 return __xtd_console_print_associative_container(os, values.begin(), values.end());
167}
168
169template < class char_t, class char_traits_t, class key_t, class compare_t = std::less < key_t>, class allocator_t = std::allocator<key_t >>
170inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::set < key_t, compare_t, allocator_t >& values) {
171 return __xtd_console_print_associative_container(os, values.begin(), values.end());
172}
173
174template < class char_t, class char_traits_t, class key_t, class value_t, class pred_t = std::equal_to < key_t>, class allocator_t = std::allocator<std::pair<const key_t, value_t >>>
175inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::unordered_map < key_t, value_t, pred_t, allocator_t >& values) {
176 return __xtd_console_print_associative_container(os, values.begin(), values.end());
177}
178
179template < class char_t, class char_traits_t, class key_t, class value_t, class pred_t = std::equal_to < key_t>, class allocator_t = std::allocator<std::pair<const key_t, value_t >>>
180inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::unordered_multimap < key_t, value_t, pred_t, allocator_t >& values) {
181 return __xtd_console_print_associative_container(os, values.begin(), values.end());
182}
183
184template < class char_t, class char_traits_t, class key_t, class pred_t = std::equal_to < key_t>, class allocator_t = std::allocator<key_t >>
185std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::unordered_multiset < key_t, pred_t, allocator_t >& values) {
186 return __xtd_console_print_associative_container(os, values.begin(), values.end());
187}
188
189template < class char_t, class char_traits_t, class key_t, class pred_t = std::equal_to < key_t>, class allocator_t = std::allocator<key_t >>
190inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::unordered_set < key_t, pred_t, allocator_t >& values) {
191 return __xtd_console_print_associative_container(os, values.begin(), values.end());
192}
193
194template < class char_t, class char_traits_t >
195inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::error_category& value) {
196 return os << "(" << value.name() << ")";
197}
198
199template < class char_t, class char_traits_t >
200inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os, const std::error_code& value) {
201 return os << "(value = " << value.value() << "category= " << value.category().name() << ")";
202}
203
204namespace xtd {
205 class iformatable;
206 class istringable;
207}
208auto operator << (std::ostream& os, const xtd::iformatable& value) -> std::ostream&;
209auto operator << (std::ostream& os, const xtd::istringable& value) noexcept -> std::ostream&;
Provides functionality to format the value of an object into a string representation.
Definition iformatable.hpp:42
Provides a way to represent the current object as a string.
Definition istringable.hpp:23
std::any any
Represents the any alias on std::any.
Definition any.hpp:24
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