lamppp
Loading...
Searching...
No Matches
stream.hpp
1#include <iostream>
2#include <vector>
3#include <deque>
4#include <map>
5#include <unordered_map>
6#include <set>
7#include <unordered_set>
8#include <tuple>
9
10template <typename T>
11std::ostream& operator<<(std::ostream& out, const std::vector<T>& vec) {
12 if (vec.empty()) {
13 out << "[]";
14 return out;
15 }
16 out << '[';
17 for (size_t i = 0; i < vec.size() - 1; i++) {
18 out << vec[i] << ", ";
19 }
20 return out << vec.back() << ']';
21}
22
23template <typename T1, typename T2>
24std::ostream& operator<<(std::ostream& out, const std::pair<T1, T2>& pair) {
25 return out << '(' << pair.first << ", " << pair.second << ')';
26}
27
28template <typename T>
29std::ostream& operator<<(std::ostream& out, const std::deque<T>& deq) {
30 if (deq.empty()) {
31 out << "[]";
32 return out;
33 }
34 out << '[';
35 for (int i = 0; i < deq.size() - 1; i++) {
36 out << deq[i] << ", ";
37 }
38 return out << deq.back() << ']';
39}
40
41template <typename T1, typename T2>
42std::ostream& operator<<(std::ostream& out, const std::unordered_map<T1, T2>& map) {
43 out << '{';
44 for (auto it = map.begin(); it != map.end(); it++) {
45 std::pair<T1, T2> element = *it;
46 out << element.first << ": " << element.second;
47 if (std::next(it) != map.end()) {
48 out << ", ";
49 }
50 }
51 return out << '}';
52}
53
54template <typename T1, typename T2>
55std::ostream& operator<<(std::ostream& out, const std::map<T1, T2>& map) {
56 out << '{';
57 for (auto it = map.begin(); it != map.end(); it++) {
58 std::pair<T1, T2> element = *it;
59 out << element.first << ": " << element.second;
60 if (std::next(it) != map.end()) {
61 out << ", ";
62 }
63 }
64 return out << '}';
65}
66
67template <typename T>
68std::ostream& operator<<(std::ostream& out, const std::unordered_set<T>& set) {
69 out << '{';
70 for (auto it = set.begin(); it != set.end(); it++) {
71 T element = *it;
72 out << element;
73 if (std::next(it) != set.end()) {
74 out << ", ";
75 }
76 }
77 return out << '}';
78}
79
80template <typename T>
81std::ostream& operator<<(std::ostream& out, const std::multiset<T>& set) {
82 out << '{';
83 for (auto it = set.begin(); it != set.end(); it++) {
84 T element = *it;
85 out << element;
86 if (std::next(it) != set.end()) {
87 out << ", ";
88 }
89 }
90 return out << '}';
91}
92
93template <typename T>
94std::ostream& operator<<(std::ostream& out, const std::unordered_multiset<T>& set) {
95 out << '{';
96 for (auto it = set.begin(); it != set.end(); it++) {
97 T element = *it;
98 out << element;
99 if (std::next(it) != set.end()) {
100 out << ", ";
101 }
102 }
103 return out << '}';
104}
105
106template <typename T>
107std::ostream& operator<<(std::ostream& out, const std::set<T>& set) {
108 out << '{';
109 for (auto it = set.begin(); it != set.end(); it++) {
110 T element = *it;
111 out << element;
112 if (std::next(it) != set.end()) {
113 out << ", ";
114 }
115 }
116 return out << '}';
117}
118
119// Source: https://stackoverflow.com/a/31116392/12128483
120template<typename Type, unsigned N, unsigned Last>
122 static void print(std::ostream& out, const Type& value) {
123 out << std::get<N>(value) << ", ";
125 }
126};
127
128template<typename Type, unsigned N>
129struct TuplePrinter<Type, N, N> {
130 static void print(std::ostream& out, const Type& value) {
131 out << std::get<N>(value);
132 }
133};
134
135template<typename... Types>
136std::ostream& operator<<(std::ostream& out, const std::tuple<Types...>& value) {
137 out << '(';
138 TuplePrinter<std::tuple<Types...>, 0, sizeof...(Types) - 1>::print(out, value);
139 return out << ')';
140}
141
Definition stream.hpp:121