xtd 0.2.0
Loading...
Searching...
No Matches
generic_stream_output.hpp
Go to the documentation of this file.
1
4#pragma once
6#include "any.hpp"
7#include "optional.hpp"
8#include <array>
9#include <deque>
10#include <stdexcept>
11#include <functional>
12#include <forward_list>
13#include <iostream>
14#include <iomanip>
15#include <list>
16#include <map>
17#include <set>
18#include <system_error>
19#include <tuple>
20#include <typeindex>
21#include <type_traits>
22#include <unordered_map>
23#include <unordered_set>
24#include <utility>
25#include <valarray>
26#include <vector>
27
29extern std::unordered_map<std::type_index, std::function<std::string(xtd::any const&)>> __any_stringer__;
30
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();
34}
35
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)";
42}
43
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 << ')';
47}
48
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);
54 }
55};
56
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);
61 }
62};
63
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) {
66 os << '(';
67 __xtd_console_tuple_printer < char_t, char_traits_t, std::tuple < types_t ...>, 0, sizeof...(types_t) - 1 >::print(os, value);
68 return os << ')';
69}
70
71/*
72template<class char_t, class char_traits_t, class ...args_t>
73inline std::basic_ostream<char_t, char_traits_t>& operator <<(std::basic_ostream<char_t, char_traits_t>& os, const std::variant<args_t ...>& value) {
74 std::visit([&](auto && t){
75 os << t;
76 }, value);
77 return os;
78}*/
79
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) {
82 os << '[';
83 bool first = true;
84 for (iterator_t it = begin; it != end; ++it) {
85 if (!first) os << ',' << ' ';
86 os << *it;
87 first = false;
88 }
89 return os << ']';
90}
91
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());
95}
96
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());
100}
101
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());
105}
106
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());
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::list < 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 >
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));
120}
121
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());
125}
126
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) {
129 os << "{";
130 bool first = true;
131 for (iterator_t it = begin; it != end; ++it) {
132 if (!first) os << ", ";
133 os << *it;
134 first = false;
135 }
136 return os << "}";
137}
138
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());
142}
143
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());
147}
148
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());
152}
153
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());
157}
158
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());
162}
163
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());
167}
168
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());
172}
173
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());
177}
178
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() << ")";
182}
183
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() << ")";
187}
188
189namespace xtd {
190 class iformatable;
191 template <class type_t>
192 class istringable;
193}
194auto operator << (std::ostream& os, const xtd::iformatable& value) -> std::ostream&;
195template<class type_t>
196auto operator << (std::ostream& os, const xtd::istringable<type_t>& value) noexcept -> std::ostream& {
197 return os << value.to_string();
198}
Contains xtd::any type and std::bad_any_cast exception.
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: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.