1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/base/LogTools.h
12 #ifndef ZYPP_BASE_LOGTOOLS_H
13 #define ZYPP_BASE_LOGTOOLS_H
21 #include "zypp/base/Logger.h"
22 #include "zypp/base/Iterator.h"
23 #include "zypp/base/Deprecated.h"
25 ///////////////////////////////////////////////////////////////////
27 { /////////////////////////////////////////////////////////////////
29 /** Print range defined by iterators (multiline style).
31 * intro [ pfx ITEM [ { sep ITEM }+ ] sfx ] extro
34 * The defaults print the range enclosed in \c {}, one item per
35 * line indented by 2 spaces.
41 * {} // on empty range
44 * A comma separated list enclosed in \c () would be:
46 * dumpRange( stream, begin, end, "(", "", ", ", "", ")" );
48 * dumpRangeLine( stream, begin, end );
51 * \note Some special handling is required for printing std::maps.
52 * Therefore iomaipulators \ref dumpMap, \ref dumpKeys and \ref dumpValues
55 * std::map<string,int> m;
60 * dumpRange( DBG, dumpMap(m).begin(), dumpMap(m).end() ) << endl;
66 * dumpRange( DBG, dumpKeys(m).begin(), dumpKeys(m).end() ) << endl;
72 * dumpRange( DBG, dumpValues(m).begin(), dumpValues(m).end() ) << endl;
78 * dumpRangeLine( DBG, dumpMap(m).begin(), dumpMap(m).end() ) << endl;
79 * // ([a] = 1, [b] = 2, [c] = 3)
80 * dumpRangeLine( DBG, dumpKeys(m).begin(), dumpKeys(m).end() ) << endl;
82 * dumpRangeLine( DBG, dumpValues(m).begin(), dumpValues(m).end() ) << endl;
86 template<class _Iterator>
87 std::ostream & dumpRange( std::ostream & str,
88 _Iterator begin, _Iterator end,
89 const std::string & intro = "{",
90 const std::string & pfx = "\n ",
91 const std::string & sep = "\n ",
92 const std::string & sfx = "\n",
93 const std::string & extro = "}" )
99 for ( ++begin; begin != end; ++begin )
100 str << sep << *begin;
106 /** Print range defined by iterators (single line style).
109 template<class _Iterator>
110 std::ostream & dumpRangeLine( std::ostream & str,
111 _Iterator begin, _Iterator end )
112 { return dumpRange( str, begin, end, "(", "", ", ", "", ")" ); }
116 std::ostream & operator<<( std::ostream & str, const std::vector<_Tp> & obj )
117 { return dumpRange( str, obj.begin(), obj.end() ); }
120 std::ostream & operator<<( std::ostream & str, const std::set<_Tp> & obj )
121 { return dumpRange( str, obj.begin(), obj.end() ); }
124 std::ostream & operator<<( std::ostream & str, const std::list<_Tp> & obj )
125 { return dumpRange( str, obj.begin(), obj.end() ); }
127 ///////////////////////////////////////////////////////////////////
128 namespace _logtoolsdetail
129 { /////////////////////////////////////////////////////////////////
131 ///////////////////////////////////////////////////////////////////
133 ///////////////////////////////////////////////////////////////////
135 /** std::pair wrapper for std::map output.
136 * Just because we want a special output format for std::pair
137 * used in a std::map. The mapped std::pair is printed as
138 * <tt>[key] = value</tt>.
140 template<class _Pair>
144 MapEntry( const _Pair & pair_r )
148 const _Pair & pair() const
152 const _Pair *const _pair;
155 /** \relates MapEntry Stream output. */
156 template<class _Pair>
157 std::ostream & operator<<( std::ostream & str, const MapEntry<_Pair> & obj )
159 return str << '[' << obj.pair().first << "] = " << obj.pair().second;
162 /** \relates MapEntry Convenience function to create MapEntry from std::pair. */
163 template<class _Pair>
164 MapEntry<_Pair> mapEntry( const _Pair & pair_r )
165 { return MapEntry<_Pair>( pair_r ); }
167 ///////////////////////////////////////////////////////////////////
169 ///////////////////////////////////////////////////////////////////
171 /** std::map wrapper for stream output.
172 * Uses a transform_iterator to wrap the std::pair into MapEntry.
179 typedef _Map MapType;
180 typedef typename _Map::value_type PairType;
181 typedef MapEntry<PairType> MapEntryType;
183 struct Transformer : public std::unary_function<PairType, MapEntryType>
185 MapEntryType operator()( const PairType & pair_r ) const
186 { return mapEntry( pair_r ); }
189 typedef transform_iterator<Transformer, typename MapType::const_iterator>
190 MapEntry_const_iterator;
193 DumpMap( const _Map & map_r )
197 const _Map & map() const
200 MapEntry_const_iterator begin() const
201 { return make_transform_iterator( map().begin(), Transformer() ); }
203 MapEntry_const_iterator end() const
204 { return make_transform_iterator( map().end(), Transformer() );}
206 /** \deprecated Use begin. */
207 ZYPP_DEPRECATED MapEntry_const_iterator map_begin() const
208 { return make_transform_iterator( map().begin(), Transformer() ); }
210 /** \deprecated Use end. */
211 ZYPP_DEPRECATED MapEntry_const_iterator map_end() const
212 { return make_transform_iterator( map().end(), Transformer() );}
215 const _Map *const _map;
218 /** \relates DumpMap Stream output. */
220 std::ostream & operator<<( std::ostream & str, const DumpMap<_Map> & obj )
221 { return dumpRange( str, obj.begin(), obj.end() ); }
223 /** \relates DumpMap Convenience function to create DumpMap from std::map. */
225 DumpMap<_Map> dumpMap( const _Map & map_r )
226 { return DumpMap<_Map>( map_r ); }
228 ///////////////////////////////////////////////////////////////////
230 ///////////////////////////////////////////////////////////////////
232 /** std::map wrapper for stream output of keys.
233 * Uses MapKVIterator iterate and write the key values.
235 * std::map<...> mymap;
236 * std::cout << dumpKeys(mymap) << std::endl;
243 typedef typename MapKVIteratorTraits<_Map>::Key_const_iterator MapKey_const_iterator;
246 DumpKeys( const _Map & map_r )
250 const _Map & map() const
253 MapKey_const_iterator begin() const
254 { return make_map_key_begin( map() ); }
256 MapKey_const_iterator end() const
257 { return make_map_key_end( map() ); }
260 const _Map *const _map;
263 /** \relates DumpKeys Stream output. */
265 std::ostream & operator<<( std::ostream & str, const DumpKeys<_Map> & obj )
266 { return dumpRange( str, obj.begin(), obj.end() ); }
268 /** \relates DumpKeys Convenience function to create DumpKeys from std::map. */
270 DumpKeys<_Map> dumpKeys( const _Map & map_r )
271 { return DumpKeys<_Map>( map_r ); }
273 ///////////////////////////////////////////////////////////////////
275 ///////////////////////////////////////////////////////////////////
277 /** std::map wrapper for stream output of values.
278 * Uses MapKVIterator iterate and write the values.
280 * std::map<...> mymap;
281 * std::cout << dumpValues(mymap) << std::endl;
288 typedef typename MapKVIteratorTraits<_Map>::Value_const_iterator MapValue_const_iterator;
291 DumpValues( const _Map & map_r )
295 const _Map & map() const
298 MapValue_const_iterator begin() const
299 { return make_map_value_begin( map() ); }
301 MapValue_const_iterator end() const
302 { return make_map_value_end( map() ); }
305 const _Map *const _map;
308 /** \relates DumpValues Stream output. */
310 std::ostream & operator<<( std::ostream & str, const DumpValues<_Map> & obj )
311 { return dumpRange( str, obj.begin(), obj.end() ); }
313 /** \relates DumpValues Convenience function to create DumpValues from std::map. */
315 DumpValues<_Map> dumpValues( const _Map & map_r )
316 { return DumpValues<_Map>( map_r ); }
318 /////////////////////////////////////////////////////////////////
319 } // namespace _logtoolsdetail
320 ///////////////////////////////////////////////////////////////////
323 using _logtoolsdetail::mapEntry; // std::pair as '[key] = value'
324 using _logtoolsdetail::dumpMap; // dumpRange '[key] = value'
325 using _logtoolsdetail::dumpKeys; // dumpRange keys
326 using _logtoolsdetail::dumpValues; // dumpRange values
328 template<class _Key, class _Tp>
329 std::ostream & operator<<( std::ostream & str, const std::map<_Key, _Tp> & obj )
330 { return str << dumpMap( obj ); }
332 /** Print stream status bits.
333 * Prints the values of a streams \c good, \c eof, \c failed and \c bad bit.
337 * [_eF_] - eof and fail bit set
338 * [__FB] - fail and bad bit set
341 inline std::ostream & operator<<( std::ostream & str, const std::basic_ios<char> & obj )
343 std::string ret( "[" );
344 ret += ( obj.good() ? 'g' : '_' );
345 ret += ( obj.eof() ? 'e' : '_' );
346 ret += ( obj.fail() ? 'F' : '_' );
347 ret += ( obj.bad() ? 'B' : '_' );
352 /////////////////////////////////////////////////////////////////
354 ///////////////////////////////////////////////////////////////////
355 #endif // ZYPP_BASE_LOGTOOLS_H