The Gaudi Framework  master (37c0b60a)
ToStream.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 // ============================================================================
12 #ifndef GAUDIPROPERTYPARSERS_PARSERVALUETOSTREAM_H
13 #define GAUDIPROPERTYPARSERS_PARSERVALUETOSTREAM_H 1
14 // ============================================================================
15 // Include files
16 // ============================================================================
17 // STD & STL
18 // ============================================================================
19 #include <array>
20 #include <iomanip>
21 #include <iostream>
22 #include <list>
23 #include <map>
24 #include <set>
25 #include <sstream>
26 #include <string>
27 #include <unordered_set>
28 #include <vector>
29 // ============================================================================
30 // GaudiKernel
31 // ============================================================================
32 #include <GaudiKernel/HashMap.h>
33 #include <GaudiKernel/Map.h>
35 #include <GaudiKernel/VectorMap.h>
36 // ============================================================================
46 // ============================================================================
47 namespace Gaudi {
48  // ==========================================================================
49  namespace Utils {
50  // ========================================================================
56  template <class TYPE>
57  std::ostream& toStream( const TYPE& obj, std::ostream& s );
58  // ========================================================================
70  template <class ITERATOR>
71  inline std::ostream& toStream( ITERATOR first, // begin of the sequence
72  ITERATOR last, // end of the sequence
73  std::ostream& s, // the stream
74  const std::string& open, // opening
75  const std::string& close, // closing
76  const std::string& delim ); // delimiter
77  // ========================================================================
84  inline std::ostream& toStream( const std::string& obj, std::ostream& s ) { return s << std::quoted( obj, '\'' ); }
89  inline std::ostream& toStream( const bool obj, std::ostream& s ) { return s << ( obj ? "True" : "False" ); }
94  inline std::ostream& toStream( const float obj, std::ostream& s, const int prec = 6 ) {
95  const int p = static_cast<int>( s.precision() );
96  return s << std::setprecision( prec ) << obj << std::setprecision( p );
97  }
102  inline std::ostream& toStream( const double obj, std::ostream& s, const int prec = 8 ) {
103  const int p = static_cast<int>( s.precision() );
104  return s << std::setprecision( prec ) << obj << std::setprecision( p );
105  }
110  inline std::ostream& toStream( const long double obj, std::ostream& s, const int prec = 10 ) {
111  const int p = static_cast<int>( s.precision() );
112  return s << std::setprecision( prec ) << obj << std::setprecision( p );
113  }
114  // ========================================================================
122  template <class KTYPE, class VTYPE>
124  return toStream( obj.second, toStream( obj.first, s << "( " ) << " , " ) << " )";
125  }
126  // ========================================================================
133  template <class TYPE, class ALLOCATOR>
135  return toStream( obj.begin(), obj.end(), s, "[ ", " ]", " , " );
136  }
137  // ========================================================================
144  template <class TYPE, class ALLOCATOR>
146  return toStream( obj.begin(), obj.end(), s, "[ ", " ]", " , " );
147  }
148  // ========================================================================
155  template <class TYPE, class CMP, class ALLOCATOR>
157  return toStream( obj.begin(), obj.end(), s, "[ ", " ]", " , " );
158  }
159  // ========================================================================
163  template <class TYPE, class HASH, class CMP, class ALLOCATOR>
165  auto ordered = std::set( obj.begin(), obj.end() ); // ensure reproducible printout
166  return obj.empty() ? s << "set()" : toStream( ordered.begin(), ordered.end(), s, "{ ", " }", " , " );
167  }
168  // ========================================================================
176  template <class KTYPE, class VTYPE, class CMP, class ALLOCATOR>
179  return ostream_joiner( s << "{ ", obj, " , ",
181  return toStream( i.second, toStream( i.first, os ) << " : " );
182  } )
183  << " }";
184  }
185  // ========================================================================
194  template <class KTYPE, class VTYPE, class CMP, class ALLOCATOR>
197  return ostream_joiner( s << "{ ", obj, " , ",
199  return toStream( i.second, toStream( i.first, os ) << " : " );
200  } )
201  << " }";
202  }
203  // ========================================================================
212  template <class KTYPE, class VTYPE, class MAP>
215  return ostream_joiner( s << "{ ", obj, " , ",
217  return toStream( i.second, toStream( i.first, os ) << " : " );
218  } )
219  << " }";
220  }
221  // ========================================================================
230  template <class KTYPE, class VTYPE, class HASH, class MAP>
232  // Copy the hash map into a map to have it ordered by key.
233  return toStream( GaudiUtils::Map<KTYPE, VTYPE>{ obj.begin(), obj.end() }, s );
234  }
235  // ========================================================================
240  template <class TYPE, unsigned int N>
241  std::ostream& toStream( const TYPE ( &obj )[N], std::ostream& s ) {
242  if constexpr ( N == 1 ) {
243  return toStream( obj[0], s << "( " ) << " , )";
244  } else {
245  return toStream( obj, obj + N, s, "( ", " )", " , " );
246  }
247  }
248  // ========================================================================
253  template <class TYPE, std::size_t N>
255  if constexpr ( N == 1 ) {
256  return toStream( obj[0], s << "( " ) << " , )";
257  } else {
258  return toStream( begin( obj ), end( obj ), s, "( ", " )", " , " );
259  }
260  }
261  // ========================================================================
266  template <unsigned int N>
267  std::ostream& toStream( const char ( &obj )[N], std::ostream& s ) {
268  return toStream( std::string( obj, obj + N ), s );
269  }
270  // ========================================================================
275  inline std::ostream& toStream( const char* obj, std::ostream& s ) { return toStream( std::string( obj ), s ); }
276  // ========================================================================
282  template <class TYPE>
283  inline std::ostream& toStream( const TYPE& obj, std::ostream& s ) {
284  return s << obj;
285  }
286  // ========================================================================
298  template <class ITERATOR>
299  inline std::ostream& toStream( ITERATOR first, // begin of the sequence
300  ITERATOR last, // end of the sequence
301  std::ostream& s, // the stream
302  const std::string& open, // opening
303  const std::string& close, // closing
304  const std::string& delim ) // delimiter
305  {
306  using ref_t = typename std::iterator_traits<ITERATOR>::reference;
308  return ostream_joiner( s << open, first, last, delim,
309  []( std::ostream& os, ref_t i ) -> std::ostream& { return toStream( i, os ); } )
310  << close;
311  }
312  // ========================================================================
313  // helper function to print a tuple of any size
314  template <class Tuple, std::size_t N>
315  struct TuplePrinter {
316  static std::ostream& toStream( const Tuple& t, std::ostream& s ) {
318  return Gaudi::Utils::toStream( std::get<N - 1>( t ), s );
319  }
320  };
321 
322  template <class Tuple>
323  struct TuplePrinter<Tuple, 1> {
324  static std::ostream& toStream( const Tuple& t, std::ostream& s ) {
325  return Gaudi::Utils::toStream( std::get<0>( t ), s );
326  }
327  };
328 
335  template <typename... Args>
337  auto& out = TuplePrinter<decltype( tuple ), sizeof...( Args )>::toStream( tuple, s << " ( " );
338  if constexpr ( std::tuple_size_v<std::tuple<Args...>> == 1 ) { // this is a special case in Python
339  out << " ,";
340  }
341  return out << " ) ";
342  }
343 
344  // ========================================================================
352  template <class TYPE>
353  inline std::string toString( const TYPE& obj ) {
355  std::ios::fmtflags orig_flags = s.flags();
356  s.setf( std::ios::showpoint ); // to display correctly floats
357  toStream( obj, s );
358  s.flags( orig_flags );
359  return s.str();
360  }
361  // ========================================================================
362  } // namespace Utils
363  // ==========================================================================
364 } // end of namespace Gaudi
365 // ============================================================================
366 // The END
367 // ============================================================================
368 #endif
std::setprecision
T setprecision(T... args)
std::string
STL class.
IOTest.N
N
Definition: IOTest.py:112
std::list
STL class.
std::unordered_set
STL class.
std::pair
Gaudi::Utils::TuplePrinter
Definition: ToStream.h:315
gaudirun.s
string s
Definition: gaudirun.py:346
std::vector
STL class.
GaudiUtils::VectorMap
Definition: VectorMap.h:112
std::tuple
GaudiUtils::Map< K, T, std::unordered_map< K, T, Hash< K > > >::begin
iterator begin()
Definition: Map.h:139
Gaudi::Utils::TuplePrinter< Tuple, 1 >::toStream
static std::ostream & toStream(const Tuple &t, std::ostream &s)
Definition: ToStream.h:324
HashMap.h
bug_34121.t
t
Definition: bug_34121.py:31
VectorMap.h
Gaudi::Utils::begin
AttribStringParser::Iterator begin(const AttribStringParser &parser)
Definition: AttribStringParser.h:136
std::ostream
STL class.
std::iterator_traits
std::array
STL class.
GaudiUtils::Map
Definition: Map.h:91
Gaudi::Utils::end
AttribStringParser::Iterator end(const AttribStringParser &)
Definition: AttribStringParser.h:139
std::map
STL class.
Gaudi
This file provides a Grammar for the type Gaudi::Accumulators::Axis It allows to use that type from p...
Definition: __init__.py:1
GaudiUtils::Map< K, T, std::unordered_map< K, T, Hash< K > > >::end
iterator end()
Definition: Map.h:140
std::ostringstream
STL class.
Gaudi::Utils::toString
std::string toString(const TYPE &obj)
the generic implementation of the type conversion to the string
Definition: ToStream.h:353
std::vector::begin
T begin(T... args)
Gaudi::Utils::toStream
std::ostream & toStream(ITERATOR first, ITERATOR last, std::ostream &s, const std::string &open, const std::string &close, const std::string &delim)
the helper function to print the sequence
Definition: ToStream.h:299
std::unordered_set::empty
T empty(T... args)
SerializeSTL.h
std::vector::end
T end(T... args)
Map.h
GaudiUtils::HashMap
Definition: HashMap.h:83
Gaudi::Utils::TuplePrinter::toStream
static std::ostream & toStream(const Tuple &t, std::ostream &s)
Definition: ToStream.h:316
std::set
STL class.
GaudiUtils::details::ostream_joiner
Stream & ostream_joiner(Stream &os, Iterator first, Iterator last, Separator sep, OutputElement output=OutputElement{})
Definition: SerializeSTL.h:75
PrepareBase.out
out
Definition: PrepareBase.py:20