libzypp  16.6.1
LogTools.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #ifndef ZYPP_BASE_LOGTOOLS_H
13 #define ZYPP_BASE_LOGTOOLS_H
14 
15 #include <iostream>
16 #include <string>
17 #include <vector>
18 #include <list>
19 #include <set>
20 #include <map>
21 
22 #include "zypp/base/Hash.h"
23 #include "zypp/base/Logger.h"
24 #include "zypp/base/Iterator.h"
25 #include "zypp/APIConfig.h"
26 
28 namespace zypp
29 {
30 
31  using std::endl;
32 
90  template<class TIterator>
91  std::ostream & dumpRange( std::ostream & str,
92  TIterator begin, TIterator end,
93  const std::string & intro = "{",
94  const std::string & pfx = "\n ",
95  const std::string & sep = "\n ",
96  const std::string & sfx = "\n",
97  const std::string & extro = "}" )
98  {
99  str << intro;
100  if ( begin != end )
101  {
102  str << pfx << *begin;
103  for ( ++begin; begin != end; ++begin )
104  str << sep << *begin;
105  str << sfx;
106  }
107  return str << extro;
108  }
109 
113  template<class TIterator>
114  std::ostream & dumpRangeLine( std::ostream & str,
115  TIterator begin, TIterator end )
116  { return dumpRange( str, begin, end, "(", "", ", ", "", ")" ); }
118  template<class TContainer>
119  std::ostream & dumpRangeLine( std::ostream & str, const TContainer & cont )
120  { return dumpRangeLine( str, cont.begin(), cont.end() ); }
121 
122 
124  namespace iomanip
125  {
130  template<class TIterator>
131  struct RangeLine
132  {
133  RangeLine( TIterator begin, TIterator end )
134  : _begin( begin )
135  , _end( end )
136  {}
137  TIterator _begin;
138  TIterator _end;
139  };
140 
142  template<class TIterator>
143  std::ostream & operator<<( std::ostream & str, const RangeLine<TIterator> & obj )
144  { return dumpRangeLine( str, obj._begin, obj._end ); }
145 
146  } // namespce iomanip
148 
156  template<class TIterator>
157  iomanip::RangeLine<TIterator> rangeLine( TIterator begin, TIterator end )
158  { return iomanip::RangeLine<TIterator>( begin, end ); }
160  template<class TContainer>
161  auto rangeLine( const TContainer & cont ) -> decltype( rangeLine( cont.begin(), cont.end() ) )
162  { return rangeLine( cont.begin(), cont.end() ); }
163 
164  template<class Tp>
165  std::ostream & operator<<( std::ostream & str, const std::vector<Tp> & obj )
166  { return dumpRange( str, obj.begin(), obj.end() ); }
167 
168  template<class Tp, class TCmp, class TAlloc>
169  std::ostream & operator<<( std::ostream & str, const std::set<Tp,TCmp,TAlloc> & obj )
170  { return dumpRange( str, obj.begin(), obj.end() ); }
171 
172  template<class Tp>
173  std::ostream & operator<<( std::ostream & str, const std::unordered_set<Tp> & obj )
174  { return dumpRange( str, obj.begin(), obj.end() ); }
175 
176  template<class Tp>
177  std::ostream & operator<<( std::ostream & str, const std::multiset<Tp> & obj )
178  { return dumpRange( str, obj.begin(), obj.end() ); }
179 
180  template<class Tp>
181  std::ostream & operator<<( std::ostream & str, const std::list<Tp> & obj )
182  { return dumpRange( str, obj.begin(), obj.end() ); }
183 
185  namespace _logtoolsdetail
186  {
187 
189  // mapEntry
191 
197  template<class TPair>
198  class MapEntry
199  {
200  public:
201  MapEntry( const TPair & pair_r )
202  : _pair( &pair_r )
203  {}
204 
205  const TPair & pair() const
206  { return *_pair; }
207 
208  private:
209  const TPair *const _pair;
210  };
211 
213  template<class TPair>
214  std::ostream & operator<<( std::ostream & str, const MapEntry<TPair> & obj )
215  {
216  return str << '[' << obj.pair().first << "] = " << obj.pair().second;
217  }
218 
220  template<class TPair>
221  MapEntry<TPair> mapEntry( const TPair & pair_r )
222  { return MapEntry<TPair>( pair_r ); }
223 
225  // dumpMap
227 
232  template<class TMap>
233  class DumpMap
234  {
235  public:
236  typedef TMap MapType;
237  typedef typename TMap::value_type PairType;
239 
240  struct Transformer : public std::unary_function<PairType, MapEntryType>
241  {
242  MapEntryType operator()( const PairType & pair_r ) const
243  { return mapEntry( pair_r ); }
244  };
245 
246  typedef transform_iterator<Transformer, typename MapType::const_iterator>
248 
249  public:
250  DumpMap( const TMap & map_r )
251  : _map( &map_r )
252  {}
253 
254  const TMap & map() const
255  { return *_map; }
256 
258  { return make_transform_iterator( map().begin(), Transformer() ); }
259 
261  { return make_transform_iterator( map().end(), Transformer() );}
262 
263  private:
264  const TMap *const _map;
265  };
266 
268  template<class TMap>
269  std::ostream & operator<<( std::ostream & str, const DumpMap<TMap> & obj )
270  { return dumpRange( str, obj.begin(), obj.end() ); }
271 
273  template<class TMap>
274  DumpMap<TMap> dumpMap( const TMap & map_r )
275  { return DumpMap<TMap>( map_r ); }
276 
278  // dumpKeys
280 
288  template<class TMap>
289  class DumpKeys
290  {
291  public:
293 
294  public:
295  DumpKeys( const TMap & map_r )
296  : _map( &map_r )
297  {}
298 
299  const TMap & map() const
300  { return *_map; }
301 
302  MapKey_const_iterator begin() const
303  { return make_map_key_begin( map() ); }
304 
305  MapKey_const_iterator end() const
306  { return make_map_key_end( map() ); }
307 
308  private:
309  const TMap *const _map;
310  };
311 
313  template<class TMap>
314  std::ostream & operator<<( std::ostream & str, const DumpKeys<TMap> & obj )
315  { return dumpRange( str, obj.begin(), obj.end() ); }
316 
318  template<class TMap>
319  DumpKeys<TMap> dumpKeys( const TMap & map_r )
320  { return DumpKeys<TMap>( map_r ); }
321 
323  // dumpValues
325 
333  template<class TMap>
335  {
336  public:
338 
339  public:
340  DumpValues( const TMap & map_r )
341  : _map( &map_r )
342  {}
343 
344  const TMap & map() const
345  { return *_map; }
346 
347  MapValue_const_iterator begin() const
348  { return make_map_value_begin( map() ); }
349 
350  MapValue_const_iterator end() const
351  { return make_map_value_end( map() ); }
352 
353  private:
354  const TMap *const _map;
355  };
356 
358  template<class TMap>
359  std::ostream & operator<<( std::ostream & str, const DumpValues<TMap> & obj )
360  { return dumpRange( str, obj.begin(), obj.end() ); }
361 
363  template<class TMap>
364  DumpValues<TMap> dumpValues( const TMap & map_r )
365  { return DumpValues<TMap>( map_r ); }
366 
368  } // namespace _logtoolsdetail
370 
371  // iomanipulator
372  using _logtoolsdetail::mapEntry; // std::pair as '[key] = value'
373  using _logtoolsdetail::dumpMap; // dumpRange '[key] = value'
374  using _logtoolsdetail::dumpKeys; // dumpRange keys
375  using _logtoolsdetail::dumpValues; // dumpRange values
376 
377  template<class TKey, class Tp>
378  std::ostream & operator<<( std::ostream & str, const std::map<TKey, Tp> & obj )
379  { return str << dumpMap( obj ); }
380 
381  template<class TKey, class Tp>
382  std::ostream & operator<<( std::ostream & str, const std::unordered_map<TKey, Tp> & obj )
383  { return str << dumpMap( obj ); }
384 
385  template<class TKey, class Tp>
386  std::ostream & operator<<( std::ostream & str, const std::multimap<TKey, Tp> & obj )
387  { return str << dumpMap( obj ); }
388 
398  inline std::ostream & operator<<( std::ostream & str, const std::basic_ios<char> & obj )
399  {
400  std::string ret( "[" );
401  ret += ( obj.good() ? 'g' : '_' );
402  ret += ( obj.eof() ? 'e' : '_' );
403  ret += ( obj.fail() ? 'F' : '_' );
404  ret += ( obj.bad() ? 'B' : '_' );
405  ret += "]";
406  return str << ret;
407  }
408 
410  // iomanipulator: str << dump(val) << ...
411  // calls: std::ostream & dumpOn( std::ostream & str, const Type & obj )
413 
414  namespace detail
415  {
416  template<class Tp>
417  struct Dump
418  {
419  Dump( const Tp & obj_r ) : _obj( obj_r ) {}
420  const Tp & _obj;
421  };
422 
423  template<class Tp>
424  std::ostream & operator<<( std::ostream & str, const Dump<Tp> & obj )
425  { return dumpOn( str, obj._obj ); }
426  }
427 
428  template<class Tp>
429  detail::Dump<Tp> dump( const Tp & obj_r )
430  { return detail::Dump<Tp>(obj_r); }
431 
432 
434 } // namespace zypp
436 #endif // ZYPP_BASE_LOGTOOLS_H
DumpKeys< TMap > dumpKeys(const TMap &map_r)
Definition: LogTools.h:319
MapKVIteratorTraits< TMap >::Value_const_iterator MapValue_const_iterator
Definition: LogTools.h:337
const TMap & map() const
Definition: LogTools.h:344
const Tp & _obj
Definition: LogTools.h:420
Dump(const Tp &obj_r)
Definition: LogTools.h:419
MapKey_const_iterator end() const
Definition: LogTools.h:305
std::ostream & dumpRange(std::ostream &str, TIterator begin, TIterator end, const std::string &intro="{", const std::string &pfx="\ ", const std::string &sep="\ ", const std::string &sfx="\, const std::string &extro="}")
Print range defined by iterators (multiline style).
Definition: LogTools.h:91
MapValue_const_iterator end() const
Definition: LogTools.h:350
TMap::value_type PairType
Definition: LogTools.h:237
String related utilities and Regular expression matching.
transform_iterator< GetPairSecond< typename MapType::value_type >, typename MapType::const_iterator > Value_const_iterator
The value iterator type.
Definition: Iterator.h:223
MapKVIteratorTraits< TMap >::Value_const_iterator make_map_value_begin(const TMap &map_r)
Convenience to create the value iterator from container::begin()
Definition: Iterator.h:238
std::map wrapper for stream output.
Definition: LogTools.h:233
MapKVIteratorTraits< TMap >::Key_const_iterator make_map_key_begin(const TMap &map_r)
Convenience to create the key iterator from container::begin()
Definition: Iterator.h:228
MapEntry(const TPair &pair_r)
Definition: LogTools.h:201
MapEntry< TPair > mapEntry(const TPair &pair_r)
Definition: LogTools.h:221
std::pair wrapper for std::map output.
Definition: LogTools.h:198
DumpValues(const TMap &map_r)
Definition: LogTools.h:340
const TMap *const _map
Definition: LogTools.h:264
iomanip::RangeLine< TIterator > rangeLine(TIterator begin, TIterator end)
Iomanip printing dumpRangeLine style.
Definition: LogTools.h:157
Provides API related macros.
const TPair *const _pair
Definition: LogTools.h:209
MapKVIteratorTraits< TMap >::Key_const_iterator make_map_key_end(const TMap &map_r)
Convenience to create the key iterator from container::end()
Definition: Iterator.h:233
std::ostream & dumpOn(std::ostream &str, const Capability &obj)
Definition: Capability.cc:444
std::map wrapper for stream output of keys.
Definition: LogTools.h:289
MapValue_const_iterator begin() const
Definition: LogTools.h:347
DumpMap< TMap > dumpMap(const TMap &map_r)
Definition: LogTools.h:274
MapEntryType operator()(const PairType &pair_r) const
Definition: LogTools.h:242
MapKey_const_iterator begin() const
Definition: LogTools.h:302
MapEntry_const_iterator end() const
Definition: LogTools.h:260
MapKVIteratorTraits< TMap >::Value_const_iterator make_map_value_end(const TMap &map_r)
Convenience to create the value iterator from container::end()
Definition: Iterator.h:243
transform_iterator< Transformer, typename MapType::const_iterator > MapEntry_const_iterator
Definition: LogTools.h:247
MapKVIteratorTraits< TMap >::Key_const_iterator MapKey_const_iterator
Definition: LogTools.h:292
transform_iterator< GetPairFirst< typename MapType::value_type >, typename MapType::const_iterator > Key_const_iterator
The key iterator type.
Definition: Iterator.h:218
DumpValues< TMap > dumpValues(const TMap &map_r)
Definition: LogTools.h:364
DumpKeys(const TMap &map_r)
Definition: LogTools.h:295
const TMap & map() const
Definition: LogTools.h:254
const TPair & pair() const
Definition: LogTools.h:205
const TMap & map() const
Definition: LogTools.h:299
const TMap *const _map
Definition: LogTools.h:309
std::ostream & dumpRangeLine(std::ostream &str, TIterator begin, TIterator end)
Print range defined by iterators (single line style).
Definition: LogTools.h:114
RangeLine(TIterator begin, TIterator end)
Definition: LogTools.h:133
std::map wrapper for stream output of values.
Definition: LogTools.h:334
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
DumpMap(const TMap &map_r)
Definition: LogTools.h:250
detail::Dump< Tp > dump(const Tp &obj_r)
Definition: LogTools.h:429
MapEntry_const_iterator begin() const
Definition: LogTools.h:257
MapEntry< PairType > MapEntryType
Definition: LogTools.h:238