File indexing completed on 2025-09-17 08:57:47
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #ifndef GAUDIKERNEL_SERIALIZESTL_H_
0023 #define GAUDIKERNEL_SERIALIZESTL_H_
0024
0025 #include <GaudiKernel/HashMap.h>
0026 #include <GaudiKernel/Map.h>
0027 #include <array>
0028 #include <list>
0029 #include <map>
0030 #include <ostream>
0031 #include <set>
0032 #include <unordered_set>
0033 #include <utility>
0034 #include <vector>
0035
0036 namespace GaudiUtils {
0037
0038 template <class T1, class T2>
0039 std::ostream& operator<<( std::ostream& s, const std::pair<T1, T2>& p );
0040
0041
0042 template <typename... Args>
0043 std::ostream& operator<<( std::ostream& s, const std::tuple<Args...>& tuple );
0044
0045
0046 template <class T, class ALLOC>
0047 std::ostream& operator<<( std::ostream& s, const std::vector<T, ALLOC>& v );
0048
0049
0050 template <class T, std::size_t N>
0051 std::ostream& operator<<( std::ostream& s, const std::array<T, N>& v );
0052
0053
0054 template <class T, class ALLOC>
0055 std::ostream& operator<<( std::ostream& s, const std::list<T, ALLOC>& l );
0056
0057
0058 template <class T, class ALLOC>
0059 std::ostream& operator<<( std::ostream& s, const std::set<T, ALLOC>& l );
0060
0061
0062 template <class T, class ALLOC>
0063 std::ostream& operator<<( std::ostream& s, const std::unordered_set<T, ALLOC>& l );
0064
0065
0066 template <class T1, class T2, class COMP, class ALLOC>
0067 std::ostream& operator<<( std::ostream& s, const std::map<T1, T2, COMP, ALLOC>& m );
0068
0069
0070 template <class K, class T, class M>
0071 std::ostream& operator<<( std::ostream& s, const GaudiUtils::Map<K, T, M>& m );
0072
0073
0074 template <class K, class T, class H, class M>
0075 std::ostream& operator<<( std::ostream& s, const GaudiUtils::HashMap<K, T, H, M>& m );
0076
0077 namespace details {
0078
0079 struct IdentityOutputter {
0080 template <typename T>
0081 std::ostream& operator()( std::ostream& os, T&& t ) const {
0082 return os << std::forward<T>( t );
0083 }
0084 };
0085
0086 template <typename Stream, typename Iterator, typename Separator, typename OutputElement = IdentityOutputter>
0087 Stream& ostream_joiner( Stream& os, Iterator first, Iterator last, Separator sep,
0088 OutputElement output = OutputElement{} ) {
0089 if ( first != last ) output( os, *first++ );
0090 while ( first != last ) output( os << sep, *first++ );
0091 return os;
0092 }
0093
0094 template <typename Stream, typename Container, typename Separator, typename OutputElement = IdentityOutputter>
0095 Stream& ostream_joiner( Stream& os, const Container& c, Separator sep, OutputElement output = OutputElement{} ) {
0096 using std::begin, std::end;
0097 return ostream_joiner( os, begin( c ), end( c ), sep, output );
0098 }
0099 }
0100
0101 template <class T1, class T2>
0102 std::ostream& operator<<( std::ostream& s, const std::pair<T1, T2>& p ) {
0103 return s << '(' << p.first << ", " << p.second << ')';
0104 }
0105
0106 template <typename... Args>
0107 std::ostream& operator<<( std::ostream& s, const std::tuple<Args...>& tup ) {
0108 return std::apply(
0109 [&s]( const auto&... a ) -> decltype( auto ) {
0110 unsigned n = sizeof...( a );
0111 if ( n == 1 ) n = 2;
0112 s << " (";
0113 ( ( s << " " << a << ( --n == 0 ? "" : "," ) ), ... );
0114 return s << " )";
0115 },
0116 tup );
0117 }
0118
0119 template <class T, class ALLOC>
0120 std::ostream& operator<<( std::ostream& s, const std::vector<T, ALLOC>& v ) {
0121 return details::ostream_joiner( s << '[', v, ", " ) << ']';
0122 }
0123
0124 template <class T, std::size_t N>
0125 std::ostream& operator<<( std::ostream& s, const std::array<T, N>& v ) {
0126 return details::ostream_joiner( s << '[', v, ", " ) << ']';
0127 }
0128
0129 template <class T, class ALLOC>
0130 std::ostream& operator<<( std::ostream& s, const std::list<T, ALLOC>& l ) {
0131 return details::ostream_joiner( s << '[', l, ", " ) << ']';
0132 }
0133
0134 template <class T, class ALLOC>
0135 std::ostream& operator<<( std::ostream& s, const std::set<T, ALLOC>& l ) {
0136 return details::ostream_joiner( s << '[', l, ", " ) << ']';
0137 }
0138
0139 template <class T, class ALLOC>
0140 std::ostream& operator<<( std::ostream& s, const std::unordered_set<T, ALLOC>& l ) {
0141 auto ordered = std::set( l.begin(), l.end() );
0142 s << ordered;
0143 return s;
0144 }
0145
0146 template <class T1, class T2, class COMP, class ALLOC>
0147 std::ostream& operator<<( std::ostream& s, const std::map<T1, T2, COMP, ALLOC>& m ) {
0148 return details::ostream_joiner( s << "{", m, ", ",
0149 []( std::ostream& os, const std::pair<const T1, T2>& p ) -> std::ostream& {
0150 return os << p.first << ": " << p.second;
0151 } )
0152 << "}";
0153 }
0154
0155 template <class K, class T, class M>
0156 std::ostream& operator<<( std::ostream& s, const GaudiUtils::Map<K, T, M>& m ) {
0157
0158 return s << static_cast<const M&>( m );
0159 }
0160
0161
0162
0163 template <class K, class T, class H, class M>
0164 std::ostream& operator<<( std::ostream& s, const GaudiUtils::HashMap<K, T, H, M>& m ) {
0165
0166 return s << GaudiUtils::Map<K, T>( m.begin(), m.end() );
0167 }
0168
0169 }
0170
0171 #endif