31 #include <unordered_set>
37 template <
class T1,
class T2>
38 std::ostream&
operator<<( std::ostream&
s,
const std::pair<T1, T2>& p );
41 template <
typename... Args>
42 std::ostream&
operator<<( std::ostream&
s,
const std::tuple<Args...>& tuple );
45 template <
class T,
class ALLOC>
46 std::ostream&
operator<<( std::ostream&
s,
const std::vector<T, ALLOC>&
v );
49 template <
class T, std::
size_t N>
50 std::ostream&
operator<<( std::ostream&
s,
const std::array<T, N>&
v );
53 template <
class T,
class ALLOC>
54 std::ostream&
operator<<( std::ostream&
s,
const std::list<T, ALLOC>&
l );
57 template <
class T,
class ALLOC>
58 std::ostream&
operator<<( std::ostream&
s,
const std::set<T, ALLOC>&
l );
61 template <
class T,
class ALLOC>
62 std::ostream&
operator<<( std::ostream&
s,
const std::unordered_set<T, ALLOC>&
l );
65 template <
class T1,
class T2,
class COMP,
class ALLOC>
66 std::ostream&
operator<<( std::ostream&
s,
const std::map<T1, T2, COMP, ALLOC>&
m );
69 template <
class K,
class T,
class M>
73 template <
class K,
class T,
class H,
class M>
81 return os << std::forward<T>(
t );
85 template <
typename Stream,
typename Iterator,
typename Separator,
typename OutputElement = IdentityOutputter>
87 OutputElement
output = OutputElement{} ) {
88 if ( first != last )
output( os, *first++ );
89 while ( first != last )
output( os << sep, *first++ );
93 template <
typename Stream,
typename Container,
typename Separator,
typename OutputElement = IdentityOutputter>
94 Stream&
ostream_joiner( Stream& os,
const Container&
c, Separator sep, OutputElement
output = OutputElement{} ) {
100 template <
class T1,
class T2>
101 std::ostream&
operator<<( std::ostream&
s,
const std::pair<T1, T2>& p ) {
102 return s <<
'(' << p.first <<
", " << p.second <<
')';
105 template <
typename... Args>
106 std::ostream&
operator<<( std::ostream&
s,
const std::tuple<Args...>& tup ) {
108 [&
s](
const auto&... a ) -> decltype(
auto ) {
109 unsigned n =
sizeof...( a );
112 ( (
s <<
" " << a << ( --
n == 0 ?
"" :
"," ) ), ... );
118 template <
class T,
class ALLOC>
119 std::ostream&
operator<<( std::ostream&
s,
const std::vector<T, ALLOC>&
v ) {
123 template <
class T, std::
size_t N>
124 std::ostream&
operator<<( std::ostream&
s,
const std::array<T, N>&
v ) {
128 template <
class T,
class ALLOC>
129 std::ostream&
operator<<( std::ostream&
s,
const std::list<T, ALLOC>&
l ) {
133 template <
class T,
class ALLOC>
134 std::ostream&
operator<<( std::ostream&
s,
const std::set<T, ALLOC>&
l ) {
138 template <
class T,
class ALLOC>
139 std::ostream&
operator<<( std::ostream&
s,
const std::unordered_set<T, ALLOC>&
l ) {
140 auto ordered = std::set(
l.begin(),
l.end() );
145 template <
class T1,
class T2,
class COMP,
class ALLOC>
146 std::ostream&
operator<<( std::ostream&
s,
const std::map<T1, T2, COMP, ALLOC>&
m ) {
148 []( std::ostream& os,
const std::pair<const T1, T2>& p ) -> std::ostream& {
149 return os << p.first <<
": " << p.second;
154 template <
class K,
class T,
class M>
157 return s << static_cast<const M&>(
m );
162 template <
class K,
class T,
class H,
class M>
165 return s << GaudiUtils::Map<K, T>(
m.begin(),
m.end() );