12#include <forward_list>
18#include <system_error>
22#include <unordered_map>
23#include <unordered_set>
29extern std::unordered_map<std::type_index, std::function<std::string(
xtd::any const&)>> __any_stringer__;
31template<
class char_t,
class char_traits_t>
32inline std::basic_ostream<char_t, char_traits_t>& operator <<(std::basic_ostream<char_t, char_traits_t>& os,
const std::exception& value) {
33 return os <<
"exception: " << value.what();
36template<
class char_t,
class char_traits_t,
class value_t>
37inline std::basic_ostream<char_t, char_traits_t>& operator <<(std::basic_ostream<char_t, char_traits_t>& os,
const std::optional<value_t>& value) {
39 if (!value.has_value())
return os <<
"(null)";
40 return os <<
'(' << value.value() <<
')';
41 }
else return os <<
"(unregistered)";
44template<
class char_t,
class char_traits_t,
class type1_t,
class type2_t>
45inline 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) {
46 return os <<
'(' << value.first <<
',' <<
' ' << value.second <<
')';
49template<
class char_t,
class char_traits_t,
class type_t,
unsigned n_t,
unsigned last_t>
50struct __xtd_console_tuple_printer {
51 static void print(std::basic_ostream < char_t, char_traits_t >& os,
const type_t& value) {
52 os << std::get < n_t > (value) <<
',' <<
' ';
53 __xtd_console_tuple_printer < char_t, char_traits_t, type_t, n_t + 1, last_t >::print(os, value);
57template <
class char_t,
class char_traits_t,
class type_t,
unsigned n_t >
58struct __xtd_console_tuple_printer < char_t, char_traits_t, type_t, n_t, n_t > {
59 static void print(std::basic_ostream < char_t, char_traits_t >& os,
const type_t& value) {
60 os << std::get < n_t > (value);
64template <
class char_t,
class char_traits_t,
class ...types_t >
65inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os,
const std::tuple < types_t ... >& value) {
67 __xtd_console_tuple_printer < char_t, char_traits_t, std::tuple < types_t ...>, 0,
sizeof...(types_t) - 1 >::print(os, value);
80template <
class char_t,
class char_traits_t,
class iterator_t >
81inline 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) {
84 for (iterator_t it = begin; it !=
end; ++it) {
85 if (!first) os <<
',' <<
' ';
92template <
class char_t,
class char_traits_t,
class type_t,
size_t size_t >
93inline 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) {
94 return __xtd_console_print_sequence_container(os, values.begin(), values.end());
97template <
class char_t,
class char_traits_t,
class type_t,
class allocator_t = std::allocator < type_t>>
98inline 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) {
99 return __xtd_console_print_sequence_container(os, values.begin(), values.end());
102template <
class char_t,
class char_traits_t,
class type_t,
class allocator_t = std::allocator < type_t>>
103inline 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) {
104 return __xtd_console_print_sequence_container(os, values.begin(), values.end());
107template <
class char_t,
class char_traits_t,
class type_t >
108inline 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) {
109 return __xtd_console_print_sequence_container(os, values.begin(), values.end());
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::list < type_t, allocator_t >& values) {
114 return __xtd_console_print_sequence_container(os, values.begin(), values.end());
117template <
class char_t,
class char_traits_t,
class type_t >
118inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os,
const std::valarray < type_t >& values) {
119 return __xtd_console_print_sequence_container(os, std::begin(values), std::end(values));
122template <
class char_t,
class char_traits_t,
class type_t,
class allocator_t = std::allocator < type_t>>
123inline 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) {
124 return __xtd_console_print_sequence_container(os, values.begin(), values.end());
127template <
class char_t,
class char_traits_t,
class iterator_t >
128inline 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) {
131 for (iterator_t it = begin; it !=
end; ++it) {
132 if (!first) os <<
", ";
139template <
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 >>>
140inline 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) {
141 return __xtd_console_print_associative_container(os, values.begin(), values.end());
144template <
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 >>>
145inline 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) {
146 return __xtd_console_print_associative_container(os, values.begin(), values.end());
149template <
class char_t,
class char_traits_t,
class key_t,
class compare_t = std::less < key_t>,
class allocator_t = std::allocator<key_t >>
150inline 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) {
151 return __xtd_console_print_associative_container(os, values.begin(), values.end());
154template <
class char_t,
class char_traits_t,
class key_t,
class compare_t = std::less < key_t>,
class allocator_t = std::allocator<key_t >>
155inline 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) {
156 return __xtd_console_print_associative_container(os, values.begin(), values.end());
159template <
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 >>>
160inline 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) {
161 return __xtd_console_print_associative_container(os, values.begin(), values.end());
164template <
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 >>>
165inline 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) {
166 return __xtd_console_print_associative_container(os, values.begin(), values.end());
169template <
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 >>
170std::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) {
171 return __xtd_console_print_associative_container(os, values.begin(), values.end());
174template <
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 >>
175inline 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) {
176 return __xtd_console_print_associative_container(os, values.begin(), values.end());
179template <
class char_t,
class char_traits_t >
180inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os,
const std::error_category& value) {
181 return os <<
"(" << value.name() <<
")";
184template <
class char_t,
class char_traits_t >
185inline std::basic_ostream < char_t, char_traits_t >& operator <<(std::basic_ostream < char_t, char_traits_t >& os,
const std::error_code& value) {
186 return os <<
"(value = " << value.value() <<
"category= " << value.category().name() <<
")";
191 template <
class type_t>
194auto operator << (std::ostream& os,
const xtd::iformatable& value) -> std::ostream&;
195template<
class type_t>
197 return os << value.to_string();
Contains xtd::any type and std::bad_any_cast exception.
Provides a way to represent the current object as a string.
Definition istringable.hpp:26
Concept stream_insertable.
Definition stream_insertable.hpp:26
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
Contains xtd::optional type.
Contains xtd::stream_insertable concept.