File indexing completed on 2025-07-11 08:32:12
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 <class T, class ALLOC>
0043 std::ostream& operator<<( std::ostream& s, const std::vector<T, ALLOC>& v );
0044
0045
0046 template <class T, std::size_t N>
0047 std::ostream& operator<<( std::ostream& s, const std::array<T, N>& v );
0048
0049
0050 template <class T, class ALLOC>
0051 std::ostream& operator<<( std::ostream& s, const std::list<T, ALLOC>& l );
0052
0053
0054 template <class T1, class T2, class COMP, class ALLOC>
0055 std::ostream& operator<<( std::ostream& s, const std::map<T1, T2, COMP, ALLOC>& m );
0056
0057
0058 template <class K, class T, class M>
0059 std::ostream& operator<<( std::ostream& s, const GaudiUtils::Map<K, T, M>& m );
0060
0061
0062 template <class K, class T, class H, class M>
0063 std::ostream& operator<<( std::ostream& s, const GaudiUtils::HashMap<K, T, H, M>& m );
0064
0065 namespace details {
0066
0067 struct IdentityOutputter {
0068 template <typename T>
0069 std::ostream& operator()( std::ostream& os, T&& t ) const {
0070 return os << std::forward<T>( t );
0071 }
0072 };
0073
0074 template <typename Stream, typename Iterator, typename Separator, typename OutputElement = IdentityOutputter>
0075 Stream& ostream_joiner( Stream& os, Iterator first, Iterator last, Separator sep,
0076 OutputElement output = OutputElement{} ) {
0077 if ( first != last ) output( os, *first++ );
0078 while ( first != last ) output( os << sep, *first++ );
0079 return os;
0080 }
0081
0082 template <typename Stream, typename Container, typename Separator, typename OutputElement = IdentityOutputter>
0083 Stream& ostream_joiner( Stream& os, const Container& c, Separator sep, OutputElement output = OutputElement{} ) {
0084 using std::begin, std::end;
0085 return ostream_joiner( os, begin( c ), end( c ), sep, output );
0086 }
0087 }
0088
0089 template <class T1, class T2>
0090 std::ostream& operator<<( std::ostream& s, const std::pair<T1, T2>& p ) {
0091 return s << '(' << p.first << ", " << p.second << ')';
0092 }
0093
0094 template <class T, class ALLOC>
0095 std::ostream& operator<<( std::ostream& s, const std::vector<T, ALLOC>& v ) {
0096 return details::ostream_joiner( s << '[', v, ", " ) << ']';
0097 }
0098
0099 template <class T, std::size_t N>
0100 std::ostream& operator<<( std::ostream& s, const std::array<T, N>& v ) {
0101 return details::ostream_joiner( s << '[', v, ", " ) << ']';
0102 }
0103
0104 template <class T, class ALLOC>
0105 std::ostream& operator<<( std::ostream& s, const std::list<T, ALLOC>& l ) {
0106 return details::ostream_joiner( s << '[', l, ", " ) << ']';
0107 }
0108
0109 template <class T, class ALLOC>
0110 std::ostream& operator<<( std::ostream& s, const std::set<T, ALLOC>& l ) {
0111 return details::ostream_joiner( s << '[', l, ", " ) << ']';
0112 }
0113
0114 template <class T, class ALLOC>
0115 std::ostream& operator<<( std::ostream& s, const std::unordered_set<T, ALLOC>& l ) {
0116 auto ordered = std::set( l.begin(), l.end() );
0117 s << ordered;
0118 return s;
0119 }
0120
0121 template <class T1, class T2, class COMP, class ALLOC>
0122 std::ostream& operator<<( std::ostream& s, const std::map<T1, T2, COMP, ALLOC>& m ) {
0123 return details::ostream_joiner( s << "{", m, ", ",
0124 []( std::ostream& os, const std::pair<const T1, T2>& p ) -> std::ostream& {
0125 return os << p.first << ": " << p.second;
0126 } )
0127 << "}";
0128 }
0129
0130 template <class K, class T, class M>
0131 std::ostream& operator<<( std::ostream& s, const GaudiUtils::Map<K, T, M>& m ) {
0132
0133 return s << static_cast<const M&>( m );
0134 }
0135
0136
0137
0138 template <class K, class T, class H, class M>
0139 std::ostream& operator<<( std::ostream& s, const GaudiUtils::HashMap<K, T, H, M>& m ) {
0140
0141 return s << GaudiUtils::Map<K, T>( m.begin(), m.end() );
0142 }
0143
0144 }
0145
0146 #endif