22 #ifndef GAUDIKERNEL_SERIALIZESTL_H_
23 #define GAUDIKERNEL_SERIALIZESTL_H_
32 #include <unordered_set>
38 template <
class T1,
class T2>
39 std::ostream&
operator<<( std::ostream&
s,
const std::pair<T1, T2>& p );
42 template <
typename... Args>
43 std::ostream&
operator<<( std::ostream&
s,
const std::tuple<Args...>& tuple );
46 template <
class T,
class ALLOC>
47 std::ostream&
operator<<( std::ostream&
s,
const std::vector<T, ALLOC>&
v );
50 template <
class T, std::
size_t N>
51 std::ostream&
operator<<( std::ostream&
s,
const std::array<T, N>&
v );
54 template <
class T,
class ALLOC>
55 std::ostream&
operator<<( std::ostream&
s,
const std::list<T, ALLOC>&
l );
58 template <
class T,
class ALLOC>
59 std::ostream&
operator<<( std::ostream&
s,
const std::set<T, ALLOC>&
l );
62 template <
class T,
class ALLOC>
63 std::ostream&
operator<<( std::ostream&
s,
const std::unordered_set<T, ALLOC>&
l );
66 template <
class T1,
class T2,
class COMP,
class ALLOC>
67 std::ostream&
operator<<( std::ostream&
s,
const std::map<T1, T2, COMP, ALLOC>&
m );
70 template <
class K,
class T,
class M>
74 template <
class K,
class T,
class H,
class M>
82 return os << std::forward<T>(
t );
86 template <
typename Stream,
typename Iterator,
typename Separator,
typename OutputElement = IdentityOutputter>
88 OutputElement
output = OutputElement{} ) {
89 if ( first != last )
output( os, *first++ );
90 while ( first != last )
output( os << sep, *first++ );
94 template <
typename Stream,
typename Container,
typename Separator,
typename OutputElement = IdentityOutputter>
95 Stream&
ostream_joiner( Stream& os,
const Container&
c, Separator sep, OutputElement
output = OutputElement{} ) {
101 template <
class T1,
class T2>
102 std::ostream&
operator<<( std::ostream&
s,
const std::pair<T1, T2>& p ) {
103 return s <<
'(' << p.first <<
", " << p.second <<
')';
106 template <
typename... Args>
107 std::ostream&
operator<<( std::ostream&
s,
const std::tuple<Args...>& tup ) {
109 [&
s](
const auto&... a ) -> decltype(
auto ) {
110 unsigned n =
sizeof...( a );
113 ( (
s <<
" " << a << ( --
n == 0 ?
"" :
"," ) ), ... );
119 template <
class T,
class ALLOC>
120 std::ostream&
operator<<( std::ostream&
s,
const std::vector<T, ALLOC>&
v ) {
124 template <
class T, std::
size_t N>
125 std::ostream&
operator<<( std::ostream&
s,
const std::array<T, N>&
v ) {
129 template <
class T,
class ALLOC>
130 std::ostream&
operator<<( std::ostream&
s,
const std::list<T, ALLOC>&
l ) {
134 template <
class T,
class ALLOC>
135 std::ostream&
operator<<( std::ostream&
s,
const std::set<T, ALLOC>&
l ) {
139 template <
class T,
class ALLOC>
140 std::ostream&
operator<<( std::ostream&
s,
const std::unordered_set<T, ALLOC>&
l ) {
141 auto ordered = std::set(
l.begin(),
l.end() );
146 template <
class T1,
class T2,
class COMP,
class ALLOC>
147 std::ostream&
operator<<( std::ostream&
s,
const std::map<T1, T2, COMP, ALLOC>&
m ) {
149 []( std::ostream& os,
const std::pair<const T1, T2>& p ) -> std::ostream& {
150 return os << p.first <<
": " << p.second;
155 template <
class K,
class T,
class M>
158 return s << static_cast<const M&>(
m );
163 template <
class K,
class T,
class H,
class M>
166 return s << GaudiUtils::Map<K, T>(
m.begin(),
m.end() );