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
>
34
#include <
GaudiKernel/SerializeSTL.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>
123
inline
std::ostream
&
toStream
(
const
std::pair<KTYPE, VTYPE>
& obj,
std::ostream
&
s
) {
124
return
toStream
( obj.second,
toStream
( obj.first,
s
<<
"( "
) <<
" , "
) <<
" )"
;
125
}
126
// ========================================================================
133
template
<
class
TYPE,
class
ALLOCATOR>
134
inline
std::ostream
&
toStream
(
const
std::vector<TYPE, ALLOCATOR>
& obj,
std::ostream
&
s
) {
135
return
toStream
( obj.
begin
(), obj.
end
(),
s
,
"[ "
,
" ]"
,
" , "
);
136
}
137
// ========================================================================
144
template
<
class
TYPE,
class
ALLOCATOR>
145
inline
std::ostream
&
toStream
(
const
std::list<TYPE, ALLOCATOR>
& obj,
std::ostream
&
s
) {
146
return
toStream
( obj.
begin
(), obj.
end
(),
s
,
"[ "
,
" ]"
,
" , "
);
147
}
148
// ========================================================================
155
template
<
class
TYPE,
class
CMP,
class
ALLOCATOR>
156
inline
std::ostream
&
toStream
(
const
std::set<TYPE, CMP, ALLOCATOR>
& obj,
std::ostream
&
s
) {
157
return
toStream
( obj.
begin
(), obj.
end
(),
s
,
"[ "
,
" ]"
,
" , "
);
158
}
159
// ========================================================================
163
template
<
class
TYPE,
class
HASH,
class
CMP,
class
ALLOCATOR>
164
inline
std::ostream
&
toStream
(
const
std::unordered_set<TYPE, HASH, CMP, ALLOCATOR>
& obj,
std::ostream
&
s
) {
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>
177
inline
std::ostream
&
toStream
(
const
std::map<KTYPE, VTYPE, CMP, ALLOCATOR>
& obj,
std::ostream
&
s
) {
178
using
GaudiUtils::details::ostream_joiner
;
179
return
ostream_joiner
(
s
<<
"{ "
, obj,
" , "
,
180
[](
std::ostream
& os,
const
std::pair<const KTYPE, VTYPE>
& i ) ->
std::ostream
& {
181
return
toStream
( i.second,
toStream
( i.first, os ) <<
" : "
);
182
} )
183
<<
" }"
;
184
}
185
// ========================================================================
194
template
<
class
KTYPE,
class
VTYPE,
class
CMP,
class
ALLOCATOR>
195
inline
std::ostream
&
toStream
(
const
GaudiUtils::VectorMap<KTYPE, VTYPE, CMP, ALLOCATOR>
& obj,
std::ostream
&
s
) {
196
using
GaudiUtils::details::ostream_joiner
;
197
return
ostream_joiner
(
s
<<
"{ "
, obj,
" , "
,
198
[](
std::ostream
& os,
const
std::pair<const KTYPE, VTYPE>
& i ) ->
std::ostream
& {
199
return
toStream
( i.second,
toStream
( i.first, os ) <<
" : "
);
200
} )
201
<<
" }"
;
202
}
203
// ========================================================================
212
template
<
class
KTYPE,
class
VTYPE,
class
MAP>
213
inline
std::ostream
&
toStream
(
const
GaudiUtils::Map<KTYPE, VTYPE, MAP>
& obj,
std::ostream
&
s
) {
214
using
GaudiUtils::details::ostream_joiner
;
215
return
ostream_joiner
(
s
<<
"{ "
, obj,
" , "
,
216
[](
std::ostream
& os,
const
std::pair<const KTYPE, VTYPE>
& i ) ->
std::ostream
& {
217
return
toStream
( i.second,
toStream
( i.first, os ) <<
" : "
);
218
} )
219
<<
" }"
;
220
}
221
// ========================================================================
230
template
<
class
KTYPE,
class
VTYPE,
class
HASH,
class
MAP>
231
inline
std::ostream
&
toStream
(
const
GaudiUtils::HashMap<KTYPE, VTYPE, HASH, MAP>
& obj,
std::ostream
&
s
) {
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>
254
std::ostream
&
toStream
(
const
std::array<TYPE, N>
& obj,
std::ostream
&
s
) {
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
;
307
using
GaudiUtils::details::ostream_joiner
;
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
) {
317
TuplePrinter<Tuple, N - 1>::toStream
(
t
,
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>
336
inline
std::ostream
&
toStream
(
const
std::tuple<Args...>
& tuple,
std::ostream
&
s
) {
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 ) {
354
std::ostringstream
s
;
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
GaudiKernel
include
GaudiKernel
ToStream.h
Generated on Thu Dec 19 2024 15:35:02 for The Gaudi Framework by
1.8.18