The Gaudi Framework  master (181af51f)
Loading...
Searching...
No Matches
MakeAndConsume.cpp
Go to the documentation of this file.
1/***********************************************************************************\
2* (c) Copyright 1998-2025 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#include <Gaudi/Accumulators.h>
19#include <GaudiKernel/AlgTool.h>
21#include <GaudiKernel/IBinder.h>
24#include <cmath>
25#include <numeric>
26#include <optional>
27
28namespace Gaudi::TestSuite {
29
30 struct IMyTool : extend_interfaces<IAlgTool> {
32 virtual void operator()() const = 0;
33 };
34
35 struct MyExampleTool : extends<AlgTool, IMyTool> {
36 using extends::extends;
37 void operator()() const override { always() << m_message.value() << endmsg; }
38 Gaudi::Property<std::string> m_message{ this, "Message", "Boring Default Message" };
39 };
40 DECLARE_COMPONENT( MyExampleTool )
41
42 struct MyConsumerTool final : Gaudi::Functional::ToolBinder<Gaudi::Interface::Bind::Box<IMyTool>( const int& )> {
43 MyConsumerTool( std::string type, std::string name, const IInterface* parent )
44 : ToolBinder{ std::move( type ), std::move( name ), parent, KeyValue{ "MyInt", "/Event/MyInt" },
45 construct<BoundInstance>( this ) } {}
46
47 class BoundInstance final : public Gaudi::Interface::Bind::Stub<IMyTool> {
49 int i;
50
51 public:
52 BoundInstance( MyConsumerTool const* parent, const int& i ) : parent{ parent }, i{ i } {}
53 void operator()() const override {
54 parent->always() << "BoundInstance - got: " << i << " from " << parent->inputLocation<int>() << endmsg;
55 }
56 };
57 };
58 DECLARE_COMPONENT( MyConsumerTool )
59
61
62 struct ToolConsumer final : Gaudi::Functional::Consumer<void( IMyTool const& ), BaseClass_t> {
63 ToolConsumer( const std::string& name, ISvcLocator* svcLoc )
64 : Consumer( name, svcLoc, KeyValue{ "MyTool", "MyExampleTool" } ) {}
65
66 void operator()( IMyTool const& tool ) const override { tool(); }
67 };
68 DECLARE_COMPONENT( ToolConsumer )
69
70 struct CountingConsumer final : Gaudi::Functional::Consumer<void(), BaseClass_t> {
71 using Gaudi::Functional::Consumer<void(), BaseClass_t>::Consumer;
72 mutable Gaudi::Accumulators::MsgCounter<MSG::ERROR> m_err{ this, "This is not an error...", 3 };
73 mutable Gaudi::Accumulators::MsgCounter<MSG::WARNING> m_warn{ this, "This is not a warning...", 2 };
74 mutable Gaudi::Accumulators::MsgCounter<MSG::INFO> m_info{ this, "This is not info...", 1 };
75
76 void operator()() const override {
77 always() << "CountingConsumer: incrementing \"This is not an error\" twice" << endmsg;
78 ++m_err;
79 m_err += true;
80 m_err += false; // should do nothing...
81 always() << "CountingConsumer: incrementing \"This is not a warning\" twice" << endmsg;
82 ++m_warn;
83 m_warn += true;
84 m_warn += false; // should do nothing...
85 always() << "CountingConsumer: incrementing \"This is not info\" twice" << endmsg;
86 ++m_info;
87 m_info += true;
88 m_info += false; // should do nothing...
89 }
90 };
91 DECLARE_COMPONENT( CountingConsumer )
92
93 struct IntDataProducer final : Gaudi::Functional::Producer<int(), BaseClass_t> {
94
95 IntDataProducer( const std::string& name, ISvcLocator* svcLoc )
96 : Producer( name, svcLoc, KeyValue( "OutputLocation", "/Event/MyInt" ) ) {}
97
98 int operator()() const override {
99 info() << "executing IntDataProducer, storing " << m_value.value() << " into " << outputLocation() << endmsg;
100 return m_value;
101 }
102
103 Gaudi::Property<int> m_value{ this, "Value", 7, "The integer value to produce." };
104 };
105
106 DECLARE_COMPONENT( IntDataProducer )
107
108 struct VectorDataProducer final : Gaudi::Functional::Producer<std::vector<int>(), BaseClass_t> {
109
110 Gaudi::Property<std::vector<int>> m_data{ this, "Data", { 3, 3, 3, 3 } };
111
112 VectorDataProducer( const std::string& name, ISvcLocator* svcLoc )
113 : Producer( name, svcLoc, KeyValue( "OutputLocation", "/Event/MyVector" ) ) {}
114
115 std::vector<int> operator()() const override {
116 info() << "executing VectorDataProducer, storing " << m_data.value() << " into " << outputLocation() << endmsg;
117 return m_data;
118 }
119 };
120
121 DECLARE_COMPONENT( VectorDataProducer )
122
125
126 KeyedDataProducer( const std::string& name, ISvcLocator* svcLoc )
127 : Producer( name, svcLoc, KeyValue( "OutputLocation", "/Event/MyKeyed" ) ) {}
128
129 int_container operator()() const override {
130 int_container container;
131 auto a = new KeyedObject<int>{ 4 };
132 container.add( a );
133 auto b = new KeyedObject<int>{ 5 };
134 container.add( b );
135 info() << "executing KeyedDataProducer, storing [4,5] into " << outputLocation() << endmsg;
136 return container;
137 }
138 };
139
140 DECLARE_COMPONENT( KeyedDataProducer )
141
142 struct IntDataConsumer final : Gaudi::Functional::Consumer<void( const int& ), BaseClass_t> {
143
144 IntDataConsumer( const std::string& name, ISvcLocator* svcLoc )
145 : Consumer( name, svcLoc, KeyValue( "InputLocation", "/Event/MyInt" ) ) {}
146
147 void operator()( const int& input ) const override {
148 info() << "executing IntDataConsumer, consuming " << input << " from " << inputLocation() << endmsg;
149 }
150 };
151
152 DECLARE_COMPONENT( IntDataConsumer )
153
154 struct IntToFloatData final : Gaudi::Functional::Transformer<float( const int& ), BaseClass_t> {
155
156 IntToFloatData( const std::string& name, ISvcLocator* svcLoc )
157 : Transformer( name, svcLoc, KeyValue( "InputLocation", "/Event/MyInt" ),
158 KeyValue( "OutputLocation", "/Event/MyFloat" ) ) {}
159
160 float operator()( const int& input ) const override {
161 info() << "Converting: " << input << " from " << inputLocation() << " and storing it into " << outputLocation()
162 << endmsg;
163 return input;
164 }
165 };
166
167 DECLARE_COMPONENT( IntToFloatData )
168
169 struct IntFloatToFloatData final : Gaudi::Functional::Transformer<float( const int&, const float& ), BaseClass_t> {
170
171 IntFloatToFloatData( const std::string& name, ISvcLocator* svcLoc )
172 : Transformer( name, svcLoc,
173 { KeyValue( "InputLocation", "/Event/MyInt" ), KeyValue{ "OtherInput", "/Event/MyOtherFloat" } },
174 KeyValue( "OutputLocation", "/Event/OtherFloat" ) ) {}
175
176 float operator()( const int& in1, const float& in2 ) const override {
177 info() << "Converting: " << in1 << " from " << inputLocation<int>() << " and " << in2 << " from "
178 << inputLocation<float>() << " and storing it into " << outputLocation() << endmsg;
179 return in1 + in2;
180 }
181 };
182
183 DECLARE_COMPONENT( IntFloatToFloatData )
184
186 : Gaudi::Functional::MultiTransformer<std::tuple<float, float>( const int&, const int& ), BaseClass_t> {
187 IntIntToFloatFloatData( const std::string& name, ISvcLocator* svcLoc )
188 : MultiTransformer( name, svcLoc,
189 { KeyValue( "InputLocation1", { "/Event/MyInt" } ),
190 KeyValue( "InputLocation2", { "/Event/MyOtherInt" } ) },
191 { KeyValue( "OutputLocation1", { "/Event/MyMultiFloat1" } ),
192 KeyValue( "OutputLocation2", { "/Event/MyMultiFloat2" } ) } ) {}
193
194 std::tuple<float, float> operator()( const int& input1, const int& input2 ) const override {
195 info() << "Number of inputs : " << inputLocationSize() << ", number of outputs : " << outputLocationSize()
196 << endmsg;
197 info() << "Converting " << input1 << " from " << inputLocation<0>() << " and " << input2 << " from "
198 << inputLocation<1>() << endmsg;
199 info() << "Storing results into " << outputLocation<0>() << " and " << outputLocation<1>() << endmsg;
200 return std::tuple<float, float>{ input1, input2 };
201 }
202 };
203
204 DECLARE_COMPONENT( IntIntToFloatFloatData )
205
206
209 : public Gaudi::Functional::MergingTransformer<
210 std::vector<int>( const Gaudi::Functional::vector_of_const_<std::vector<int>>& ), BaseClass_t> {
211
212 IntVectorsToIntVector( const std::string& name, ISvcLocator* svcLoc )
213 : MergingTransformer( name, svcLoc, { "InputLocations", {} },
214 { "OutputLocation", "/Event/MyConcatenatedIntVector" } ) {}
215
216 std::vector<int>
217 operator()( const Gaudi::Functional::vector_of_const_<std::vector<int>>& intVectors ) const override {
218 // Create a vector and pre-allocate enough space for the number of integers we have
219 auto nelements = std::accumulate( intVectors.begin(), intVectors.end(), 0,
220 []( const auto a, const auto b ) { return a + b.size(); } );
221 std::vector<int> out;
222 out.reserve( nelements );
223 // Concatenate the input vectors to form the output
224 for ( auto& intVector : intVectors ) {
225 info() << "Concatening vector " << intVector << endmsg;
226 out.insert( out.end(), intVector.begin(), intVector.end() );
227 // intVector.clear(); // should not be possible!!! and does indeed not compile ;-)
228 }
229 info() << "Storing output vector " << out << " to " << outputLocation() << endmsg;
230 return out;
231 }
232 };
233
234 DECLARE_COMPONENT( IntVectorsToIntVector )
235
237 : public Gaudi::Functional::MergingTransformer<
238 std::vector<int>( const Gaudi::Functional::vector_of_const_<std::vector<int>*>& ), BaseClass_t> {
239
240 PIntVectorsToIntVector( const std::string& name, ISvcLocator* svcLoc )
241 : MergingTransformer( name, svcLoc, { "InputLocations", {} },
242 { "OutputLocation", "/Event/MyConcatenatedIntVector" } ) {}
243
244 std::vector<int>
245 operator()( const Gaudi::Functional::vector_of_const_<std::vector<int>*>& intVectors ) const override {
246 // Create a vector and pre-allocate enough space for the number of integers we have
247 auto nelements = std::accumulate( intVectors.begin(), intVectors.end(), 0,
248 []( const auto a, const auto b ) { return a + ( b ? b->size() : 0 ); } );
249 std::vector<int> out;
250 out.reserve( nelements );
251 // Concatenate the input vectors to form the output
252 for ( auto& intVector : intVectors ) {
253 info() << "Concatening vector " << intVector << endmsg;
254 if ( intVector ) {
255 out.insert( out.end(), intVector->begin(), intVector->end() );
256 // intVector->clear(); // should not be possible!!! and does indeed not compile ;-)
257 }
258 }
259 info() << "Storing output vector " << out << " to " << outputLocation() << endmsg;
260 return out;
261 }
262 };
263
264 DECLARE_COMPONENT( PIntVectorsToIntVector )
265
266 struct FloatDataConsumer final : Gaudi::Functional::Consumer<void( const float& ), BaseClass_t> {
267
268 FloatDataConsumer( const std::string& name, ISvcLocator* svcLoc )
269 : Consumer( name, svcLoc, KeyValue( "InputLocation", "/Event/MyFloat" ) ) {}
270
271 void operator()( const float& input ) const override {
272 info() << "executing FloatDataConsumer: " << input << endmsg;
273 }
274 };
275
276 DECLARE_COMPONENT( FloatDataConsumer )
277
278 struct ContextConsumer final : Gaudi::Functional::Consumer<void( const EventContext& ), BaseClass_t> {
279
280 using Gaudi::Functional::Consumer<void( const EventContext& ), BaseClass_t>::Consumer;
281
282 void operator()( const EventContext& ctx ) const override {
283 info() << "executing ContextConsumer, got " << ctx << endmsg;
284 }
285 };
286
287 DECLARE_COMPONENT( ContextConsumer )
288
289 struct ContextTransformer final : Gaudi::Functional::Transformer<int( const EventContext& ), BaseClass_t> {
290
291 ContextTransformer( const std::string& name, ISvcLocator* svcLoc )
292 : Transformer( name, svcLoc, KeyValue{ "OutputLoc", "/Event/SomeOtherInt" } ) {}
293
294 int operator()( const EventContext& ctx ) const override {
295 info() << "executing ContextConsumer, got " << ctx << endmsg;
296 return 9;
297 }
298 };
299
300 DECLARE_COMPONENT( ContextTransformer )
301
302 struct ContextIntConsumer final : Gaudi::Functional::Consumer<void( const EventContext&, const int& ), BaseClass_t> {
303
304 ContextIntConsumer( const std::string& name, ISvcLocator* svcLoc )
305 : Consumer( name, svcLoc, KeyValue( "InputLocation", "/Event/MyInt" ) ) {}
306
307 void operator()( const EventContext& ctx, const int& i ) const override {
308 info() << "executing ContextIntConsumer, got context = " << ctx << ", int = " << i << endmsg;
309 }
310 };
311
312 DECLARE_COMPONENT( ContextIntConsumer )
313
314 struct VectorDoubleProducer final : Gaudi::Functional::Producer<std::vector<double>(), BaseClass_t> {
315
316 VectorDoubleProducer( const std::string& name, ISvcLocator* svcLoc )
317 : Producer( name, svcLoc, KeyValue( "OutputLocation", "/Event/MyVectorOfDoubles" ) ) {}
318
319 std::vector<double> operator()() const override {
320 info() << "storing vector<double> into " << outputLocation() << endmsg;
321 return { 12.34, 56.78, 90.12, 34.56, 78.90 };
322 }
323 };
324
325 DECLARE_COMPONENT( VectorDoubleProducer )
326
327 struct FrExpTransformer final
328 : Gaudi::Functional::MultiScalarTransformer<
329 FrExpTransformer, std::tuple<std::vector<double>, std::vector<int>>( const std::vector<double>& ),
330 BaseClass_t> {
331 FrExpTransformer( const std::string& name, ISvcLocator* svcLoc )
332 : MultiScalarTransformer( name, svcLoc, KeyValue{ "InputDoubles", { "/Event/MyVectorOfDoubles" } },
333 { KeyValue{ "OutputFractions", { "/Event/MyVectorOfFractions" } },
334 KeyValue{ "OutputIntegers", { "/Event/MyVectorOfIntegers" } } } ) {}
335
336 using MultiScalarTransformer::operator();
337
338 std::tuple<double, int> operator()( const double& d ) const {
339 int i;
340 double frac = std::frexp( d, &i );
341 info() << "Converting " << d << " -> " << frac << ", " << i << endmsg;
342 return { frac, i };
343 }
344 };
345 DECLARE_COMPONENT( FrExpTransformer )
346
348 : Gaudi::Functional::MultiScalarTransformer<
349 OptFrExpTransformer, std::tuple<std::vector<double>, std::vector<int>>( const std::vector<double>& ),
350 BaseClass_t> {
351 OptFrExpTransformer( const std::string& name, ISvcLocator* svcLoc )
352 : MultiScalarTransformer( name, svcLoc, KeyValue{ "InputDoubles", { "/Event/MyVectorOfDoubles" } },
353 { KeyValue{ "OutputFractions", { "/Event/OptMyVectorOfFractions" } },
354 KeyValue{ "OutputIntegers", { "/Event/OptMyVectorOfIntegers" } } } ) {}
355
356 using MultiScalarTransformer::operator();
357
358 std::optional<std::tuple<double, int>> operator()( const double& d ) const {
359 if ( d < 30. ) {
360 info() << "Skipping " << d << endmsg;
361 return {};
362 }
363 int i;
364 double frac = std::frexp( d, &i );
365 info() << "Converting " << d << " -> " << frac << ", " << i << endmsg;
366 return std::make_tuple( frac, i );
367 }
368 };
369 DECLARE_COMPONENT( OptFrExpTransformer )
370
371 struct LdExpTransformer final
372 : Gaudi::Functional::ScalarTransformer<
373 LdExpTransformer, std::vector<double>( const std::vector<double>&, const std::vector<int>& ), BaseClass_t> {
374 LdExpTransformer( const std::string& name, ISvcLocator* svcLoc )
375 : ScalarTransformer( name, svcLoc,
376 { KeyValue{ "InputFractions", { "/Event/MyVectorOfFractions" } },
377 KeyValue{ "InputIntegers", { "/Event/MyVectorOfIntegers" } } },
378 { KeyValue{ "OutputDoubles", { "/Event/MyNewVectorOfDoubles" } } } ) {}
379
380 using ScalarTransformer::operator();
381
382 double operator()( double frac, int i ) const {
383 double d = std::ldexp( frac, i );
384 info() << "Converting " << i << ", " << frac << " -> " << d << endmsg;
385 return d;
386 }
387 };
388 DECLARE_COMPONENT( LdExpTransformer )
389
391 : Gaudi::Functional::ScalarTransformer<OptLdExpTransformer,
392 std::vector<double>( const std::vector<double>&, const std::vector<int>& ),
393 BaseClass_t> {
394 OptLdExpTransformer( const std::string& name, ISvcLocator* svcLoc )
395 : ScalarTransformer( name, svcLoc,
396 { KeyValue{ "InputFractions", { "/Event/MyVectorOfFractions" } },
397 KeyValue{ "InputIntegers", { "/Event/MyVectorOfIntegers" } } },
398 { KeyValue{ "OutputDoubles", { "/Event/MyOptVectorOfDoubles" } } } ) {}
399
400 using ScalarTransformer::operator();
401
402 std::optional<double> operator()( const double& frac, const int& i ) const {
403 double d = std::ldexp( frac, i );
404 if ( i > 6 ) {
405 info() << "Skipping " << d << endmsg;
406 return {};
407 }
408 info() << "Converting " << i << ", " << frac << " -> " << d << endmsg;
409 return d;
410 }
411 };
412 DECLARE_COMPONENT( OptLdExpTransformer )
413
414 struct VoidConsumer final : Gaudi::Functional::Consumer<void(), BaseClass_t> {
415
416 using Consumer::Consumer;
417
418 void operator()() const override { info() << "executing VoidConsumer" << endmsg; }
419 };
420
421 DECLARE_COMPONENT( VoidConsumer )
422
423 struct S : public KeyedObject<int> {
425 int a;
426 using ConstVector = std::vector<S const*>;
429 };
430
431 struct SDataProducer final : Gaudi::Functional::Producer<S::Container(), BaseClass_t> {
432
433 SDataProducer( const std::string& name, ISvcLocator* svcLoc )
434 : Producer( name, svcLoc, KeyValue( "OutputLocation", "/Event/MyS" ) ) {}
435
436 S::Container operator()() const override {
437 S::Container out{};
438 for ( int i = 0; i < j; ++i ) out.insert( new S{} );
439 info() << "storing KeyedContainer of size " << out.size() << " into " << outputLocation() << endmsg;
440 return out;
441 }
442 Gaudi::Property<int> j{ this, "j", 5 };
443 };
444
445 DECLARE_COMPONENT( SDataProducer )
446
448 : public Gaudi::Functional::MergingTransformer<
449 std::vector<int>( const Gaudi::Functional::vector_of_const_<Gaudi::Range_<std::vector<S const*>>>& ),
450 BaseClass_t> {
451
452 SRangesToIntVector( const std::string& name, ISvcLocator* svcLoc )
453 : MergingTransformer( name, svcLoc, { "InputRanges", {} },
454 { "OutputLocation", "/Event/MyConcatenatedIntFromSVector" } ) {}
455
456 std::vector<int> operator()(
457 const Gaudi::Functional::vector_of_const_<Gaudi::Range_<std::vector<S const*>>>& SVectors ) const override {
458 std::vector<int> out;
459 // Concatenate the input vectors to form the output
460 for ( const auto& SVector : SVectors ) {
461 info() << "Concatening range of size " << SVector.size() << endmsg;
462 for ( auto* s : SVector ) { out.push_back( s->a ); }
463 }
464 info() << "Storing output vector " << out << " to " << outputLocation() << endmsg;
465 return out;
466 }
467 };
468 DECLARE_COMPONENT( SRangesToIntVector )
469
471 : public Gaudi::Functional::MergingTransformer<void( const Gaudi::Functional::vector_of_const_<
472 std::optional<Gaudi::NamedRange_<std::vector<S const*>>>>& ),
473 BaseClass_t> {
474
475 OptionalSRangesMerger( const std::string& name, ISvcLocator* svcLoc )
476 : MergingTransformer( name, svcLoc, { "InputRanges", {} } ) {}
477
478 void
479 operator()( const Gaudi::Functional::vector_of_const_<std::optional<Gaudi::NamedRange_<std::vector<S const*>>>>&
480 OptSVectors ) const override {
481 // Loop over the optional ranges checking if the opt has a value
482 for ( const auto& OptSVector : OptSVectors ) {
483 if ( OptSVector.has_value() ) {
484 auto SVector = OptSVector.value();
485 info() << "Consuming vector of size: " << SVector.size() << endmsg;
486 } else {
487 info() << "Skipping empty optional range" << endmsg;
488 }
489 }
490 }
491 };
492 DECLARE_COMPONENT( OptionalSRangesMerger )
493
494 struct IntVectorsMerger final
495 : public Gaudi::Functional::MergingTransformer<
496 void( const Gaudi::Functional::vector_of_const_<std::vector<int>>& ), BaseClass_t> {
497
498 IntVectorsMerger( const std::string& name, ISvcLocator* svcLoc )
499 : MergingTransformer( name, svcLoc, { "InputLocations", {} } ) {}
500
501 void operator()( const Gaudi::Functional::vector_of_const_<std::vector<int>>& intVectors ) const override {
502 // Create a vector and pre-allocate enough space for the number of integers we have
503 auto nelements = std::accumulate( intVectors.begin(), intVectors.end(), 0,
504 []( const auto a, const auto b ) { return a + b.size(); } );
505 info() << "sum of input sizes: " << nelements << endmsg;
506 // Concatenate the input vectors to form the output
507 for ( const auto& intVector : intVectors ) { info() << "Consuming vector " << intVector << endmsg; }
508 }
509 };
510
511 DECLARE_COMPONENT( IntVectorsMerger )
512
514 : public Gaudi::Functional::MergingConsumer<void( Gaudi::Functional::vector_of_const_<std::vector<int>> const& ),
515 BaseClass_t> {
516 using Base =
519
520 IntVectorsMergingConsumer( const std::string& name, ISvcLocator* svcLoc )
521 : Base( name, svcLoc, { "InputLocations", {} } ) {}
522
523 void operator()( Gaudi::Functional::vector_of_const_<std::vector<int>> const& intVectors ) const override {
524 // Create a vector and pre-allocate enough space for the number of integers we have
525 auto nelements = std::accumulate( intVectors.begin(), intVectors.end(), 0,
526 []( const auto a, const auto b ) { return a + b.size(); } );
527 info() << "sum of input sizes: " << nelements << endmsg;
528 // Concatenate the input vectors to form the output
529 for ( const auto& intVector : intVectors ) { info() << "Consuming vector " << intVector << endmsg; }
530 }
531 };
532
533 DECLARE_COMPONENT( IntVectorsMergingConsumer )
534
535 struct MyData {
536 using ConstVector = std::vector<const MyData*>;
537 };
539
541
542 RangeProducer( const std::string& name, ISvcLocator* pSvcLocator )
543 : Producer( name, pSvcLocator, KeyValue{ "TrackLocation", "" } ){};
544
545 MyDataRange operator()() const override { return {}; }
546 };
547 DECLARE_COMPONENT( RangeProducer )
548
549
551 struct TwoDMerger final : public Gaudi::Functional::MergingMultiTransformer<
552 std::tuple<std::vector<int>, std::vector<double>>(
553 const Gaudi::Functional::vector_of_const_<std::vector<int>>&,
554 const Gaudi::Functional::vector_of_const_<std::vector<double>>& ),
555 BaseClass_t> {
556
557 TwoDMerger( const std::string& name, ISvcLocator* svcLoc )
558 : MergingMultiTransformer{ name,
559 svcLoc,
560 { KeyValues{ "InputInts", {} }, KeyValues{ "InputDoubles", {} } },
561 { KeyValue{ "OutputInts", "/Event/MySummedInts" },
562 KeyValue{ "OutputDoubles", "/Event/MySummedDoubles" } } } {}
563
564 std::tuple<std::vector<int>, std::vector<double>>
565 operator()( const Gaudi::Functional::vector_of_const_<std::vector<int>>& intVectors,
566 const Gaudi::Functional::vector_of_const_<std::vector<double>>& doubleVectors ) const override {
567 auto r = std::tuple{ std::vector<int>{}, std::vector<double>{} };
568 auto& [is, ds] = r;
569 std::transform( begin( intVectors ), end( intVectors ), std::back_inserter( is ),
570 []( const std::vector<int>& vi ) { return std::accumulate( begin( vi ), end( vi ), 0 ); } );
571 always() << " accumulated: " << is << endmsg;
572 std::transform( begin( doubleVectors ), end( doubleVectors ), std::back_inserter( ds ),
573 []( const std::vector<double>& vd ) { return std::accumulate( begin( vd ), end( vd ), 0. ); } );
574 always() << " accumulated: " << ds << endmsg;
575 return r;
576 }
577 };
578
579 DECLARE_COMPONENT( TwoDMerger )
580
581 struct Foo {
582 int i;
583
584 Foo( int i ) : i{ i } {}
585 Foo( Foo&& ) = delete;
586 Foo& operator=( Foo&& ) = delete;
587 Foo( const Foo& ) = delete;
588 Foo& operator=( const Foo& ) = delete;
589 ~Foo(){};
590 };
591
592 struct ShrdPtrProducer final : Gaudi::Functional::Producer<std::shared_ptr<Foo>(), BaseClass_t> {
593
594 ShrdPtrProducer( const std::string& name, ISvcLocator* svcLoc )
595 : Producer( name, svcLoc, KeyValue( "OutputLocation", "/Event/MySharedFoo" ) ) {}
596
597 std::shared_ptr<Foo> operator()() const override {
598 auto foo = std::make_shared<Foo>( m_value.value() );
599 info() << "executing ShrdPtrProducer, storing shared_ptr<Foo> with payload at " << foo.get() << " and value "
600 << foo->i << " into " << outputLocation() << endmsg;
601 return foo;
602 }
603
604 Gaudi::Property<int> m_value{ this, "Value", 7, "The integer value to produce." };
605 };
606
607 DECLARE_COMPONENT( ShrdPtrProducer )
608
609 struct ShrdPtrConsumer final : Gaudi::Functional::Consumer<void( std::shared_ptr<Foo> const& ), BaseClass_t> {
610
611 ShrdPtrConsumer( const std::string& name, ISvcLocator* svcLoc )
612 : Consumer( name, svcLoc, KeyValue( "InputLocation", "/Event/MySharedFoo" ) ) {}
613
614 void operator()( const std::shared_ptr<Foo>& foo ) const override {
615 info() << "executing ShrdPtrConsumer, got shared_ptr<Foo> with payload at " << foo.get() << " with value "
616 << foo->i << " from " << inputLocation() << endmsg;
617 }
618 };
619
620 DECLARE_COMPONENT( ShrdPtrConsumer )
621
622
625 struct IntVectorsToInts final
626 : public Gaudi::Functional::SplittingMergingTransformer<
627 std::vector<int>( const Gaudi::Functional::vector_of_const_<std::vector<int>>& ), BaseClass_t> {
628
630
631 IntVectorsToInts( const std::string& name, ISvcLocator* svcLoc )
632 : SplittingMergingTransformer( name, svcLoc, { "InputLocations", {} }, { "OutputLocations", {} } ) {}
633
634 std::vector<int>
635 operator()( const Gaudi::Functional::vector_of_const_<std::vector<int>>& intVectors ) const override {
636 int l = 0;
637 for ( const auto& iv : intVectors ) { info() << "loaded " << iv << " from " << inputLocation( l++ ) << endmsg; }
638 std::vector<int> out( outputLocationSize(), 0 );
639 for ( const auto& [l, r] : m_mapping.value() ) {
640 out[l] = std::accumulate( intVectors.at( r ).begin(), intVectors.at( r ).end(), out[l] );
641 }
642 l = 0;
643 for ( const auto& o : out ) { info() << "storing " << o << " in " << outputLocation( l++ ) << endmsg; }
644 return out;
645 }
646 };
647 DECLARE_COMPONENT( IntVectorsToInts )
648
649 struct Eventually {
650 Gaudi::Algorithm const* parent = nullptr;
651 void ( *action )( Gaudi::Algorithm const* ) = nullptr;
652 Eventually( Gaudi::Algorithm const* p, void ( *a )( Gaudi::Algorithm const* ) ) : parent{ p }, action{ a } {}
653 Eventually( Eventually const& ) = delete;
654 Eventually& operator=( Eventually const& ) = delete;
656 : parent{ std::exchange( other.parent, nullptr ) }, action{ std::exchange( other.action, nullptr ) } {}
658 parent = std::exchange( other.parent, nullptr );
659 action = std::exchange( other.action, nullptr );
660 return *this;
661 }
663 if ( action ) action( parent );
664 }
665 };
666
667 struct OpaqueProducer final
669 Eventually(),
670 Gaudi::Functional::Traits::use_<BaseClass_t, Gaudi::Functional::Traits::WriteOpaqueFor<Eventually>>> {
671
672 OpaqueProducer( const std::string& name, ISvcLocator* svcLoc )
673 : Producer( name, svcLoc, KeyValue( "OutputLocation", "/Event/Eventually" ) ) {}
674
675 Eventually operator()() const override {
676 always() << "creating Eventually" << endmsg;
677 return Eventually{ this, []( Gaudi::Algorithm const* me ) {
678 me->always() << "My Eventually is about to be destroyed" << endmsg;
679 } };
680 }
681 };
682
683 DECLARE_COMPONENT( OpaqueProducer )
684
685 static_assert( std::ranges::forward_range<Gaudi::Functional::vector_of_const_<void*>> );
686 static_assert( std::ranges::forward_range<Gaudi::Functional::vector_of_const_<int>> );
687 static_assert( std::ranges::forward_range<Gaudi::Functional::vector_of_const_<std::vector<int>*>> );
688 static_assert( std::ranges::forward_range<Gaudi::Functional::vector_of_const_<std::vector<int>>> );
689 static_assert( std::same_as<typename Gaudi::Functional::vector_of_const_<std::vector<int>*>::value_type,
690 std::vector<int> const*> );
691 static_assert( std::same_as<typename Gaudi::Functional::vector_of_const_<std::vector<int>>::value_type,
692 std::vector<int> const> );
693 static_assert(
694 std::same_as<typename Gaudi::Functional::vector_of_const_<Gaudi::Range_<std::vector<void*>>>::value_type,
696
697} // namespace Gaudi::TestSuite
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition MsgStream.h:198
#define DECLARE_COMPONENT(type)
MsgStream & always() const
shortcut for the method msgStream(MSG::ALWAYS)
This class represents an entry point to all the event specific data.
Base class from which all concrete algorithm classes should be derived.
Definition Algorithm.h:87
Implementation of property with value of concrete type.
Definition PropertyFwd.h:27
Useful class for representation of "sequence" of the objects through the range of valid iterators.
Definition Range.h:81
BoundInstance(MyConsumerTool const *parent, const int &i)
Definition of the basic interface.
Definition IInterface.h:225
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition ISvcLocator.h:42
template class KeyedContainer, KeyedContainer.h
long add(ContainedObject *pObject) override
ObjectContainerBase overload: Add an object to the container.
Definition of the templated KeyedObject class.
Definition KeyedObject.h:37
KeyedObject()=default
Standard Constructor. The object key is preset to the invalid value.
Very simple class to represent the container of objects which are not owned by this container.
Base class used to extend a class implementing other interfaces.
Definition extends.h:19
STL class.
details::Consumer< Signature, Traits_, details::isLegacy< Traits_ > > Consumer
Definition Consumer.h:69
details::MergingTransformer< Signature, Traits_, details::isLegacy< Traits_ > > MergingConsumer
details::Producer< Signature, Traits_, details::isLegacy< Traits_ > > Producer
Definition Producer.h:37
Gaudi::Range_< MyData::ConstVector > MyDataRange
KeyedContainer< KeyedObject< int >, Containers::HashMap > int_container
Gaudi::Functional::Traits::BaseClass_t< Gaudi::Algorithm > BaseClass_t
This file provides a Grammar for the type Gaudi::Accumulators::Axis It allows to use that type from p...
Definition __init__.py:1
STL namespace.
void operator()(const EventContext &ctx) const override
void operator()(const EventContext &ctx, const int &i) const override
ContextIntConsumer(const std::string &name, ISvcLocator *svcLoc)
int operator()(const EventContext &ctx) const override
ContextTransformer(const std::string &name, ISvcLocator *svcLoc)
Gaudi::Accumulators::MsgCounter< MSG::INFO > m_info
Gaudi::Accumulators::MsgCounter< MSG::ERROR > m_err
Gaudi::Accumulators::MsgCounter< MSG::WARNING > m_warn
Eventually & operator=(Eventually const &)=delete
void(* action)(Gaudi::Algorithm const *)
Eventually(Gaudi::Algorithm const *p, void(*a)(Gaudi::Algorithm const *))
Eventually(Eventually const &)=delete
Eventually & operator=(Eventually &&other)
Gaudi::Algorithm const * parent
void operator()(const float &input) const override
FloatDataConsumer(const std::string &name, ISvcLocator *svcLoc)
Foo(Foo &&)=delete
Foo & operator=(Foo &&)=delete
Foo & operator=(const Foo &)=delete
Foo(const Foo &)=delete
FrExpTransformer(const std::string &name, ISvcLocator *svcLoc)
std::tuple< double, int > operator()(const double &d) const
DeclareInterfaceID(IMyTool, 1, 0)
virtual void operator()() const =0
IntDataConsumer(const std::string &name, ISvcLocator *svcLoc)
void operator()(const int &input) const override
IntDataProducer(const std::string &name, ISvcLocator *svcLoc)
float operator()(const int &in1, const float &in2) const override
IntFloatToFloatData(const std::string &name, ISvcLocator *svcLoc)
IntIntToFloatFloatData(const std::string &name, ISvcLocator *svcLoc)
std::tuple< float, float > operator()(const int &input1, const int &input2) const override
IntToFloatData(const std::string &name, ISvcLocator *svcLoc)
float operator()(const int &input) const override
IntVectorsMerger(const std::string &name, ISvcLocator *svcLoc)
void operator()(const Gaudi::Functional::vector_of_const_< std::vector< int > > &intVectors) const override
Gaudi::Functional::MergingConsumer< void(Gaudi::Functional::vector_of_const_< std::vector< int > > const &), BaseClass_t > Base
void operator()(Gaudi::Functional::vector_of_const_< std::vector< int > > const &intVectors) const override
IntVectorsMergingConsumer(const std::string &name, ISvcLocator *svcLoc)
IntVectorsToIntVector(const std::string &name, ISvcLocator *svcLoc)
std::vector< int > operator()(const Gaudi::Functional::vector_of_const_< std::vector< int > > &intVectors) const override
IntVectorsToInts(const std::string &name, ISvcLocator *svcLoc)
std::vector< int > operator()(const Gaudi::Functional::vector_of_const_< std::vector< int > > &intVectors) const override
Gaudi::Property< std::vector< std::pair< int, int > > > m_mapping
KeyedDataProducer(const std::string &name, ISvcLocator *svcLoc)
int_container operator()() const override
LdExpTransformer(const std::string &name, ISvcLocator *svcLoc)
double operator()(double frac, int i) const
MyConsumerTool(std::string type, std::string name, const IInterface *parent)
std::vector< const MyData * > ConstVector
void operator()() const override
Gaudi::Property< std::string > m_message
OpaqueProducer(const std::string &name, ISvcLocator *svcLoc)
Eventually operator()() const override
std::optional< std::tuple< double, int > > operator()(const double &d) const
OptFrExpTransformer(const std::string &name, ISvcLocator *svcLoc)
OptLdExpTransformer(const std::string &name, ISvcLocator *svcLoc)
std::optional< double > operator()(const double &frac, const int &i) const
void operator()(const Gaudi::Functional::vector_of_const_< std::optional< Gaudi::NamedRange_< std::vector< S const * > > > > &OptSVectors) const override
OptionalSRangesMerger(const std::string &name, ISvcLocator *svcLoc)
std::vector< int > operator()(const Gaudi::Functional::vector_of_const_< std::vector< int > * > &intVectors) const override
PIntVectorsToIntVector(const std::string &name, ISvcLocator *svcLoc)
MyDataRange operator()() const override
RangeProducer(const std::string &name, ISvcLocator *pSvcLocator)
SDataProducer(const std::string &name, ISvcLocator *svcLoc)
S::Container operator()() const override
KeyedObject()=default
Standard Constructor. The object key is preset to the invalid value.
KeyedContainer< S, Containers::HashMap > Container
SharedObjectsContainer< S > Selection
std::vector< S const * > ConstVector
std::vector< int > operator()(const Gaudi::Functional::vector_of_const_< Gaudi::Range_< std::vector< S const * > > > &SVectors) const override
SRangesToIntVector(const std::string &name, ISvcLocator *svcLoc)
ShrdPtrConsumer(const std::string &name, ISvcLocator *svcLoc)
void operator()(const std::shared_ptr< Foo > &foo) const override
ShrdPtrProducer(const std::string &name, ISvcLocator *svcLoc)
std::shared_ptr< Foo > operator()() const override
ToolConsumer(const std::string &name, ISvcLocator *svcLoc)
void operator()(IMyTool const &tool) const override
TwoDMerger(const std::string &name, ISvcLocator *svcLoc)
std::tuple< std::vector< int >, std::vector< double > > operator()(const Gaudi::Functional::vector_of_const_< std::vector< int > > &intVectors, const Gaudi::Functional::vector_of_const_< std::vector< double > > &doubleVectors) const override
VectorDataProducer(const std::string &name, ISvcLocator *svcLoc)
std::vector< int > operator()() const override
Gaudi::Property< std::vector< int > > m_data
std::vector< double > operator()() const override
VectorDoubleProducer(const std::string &name, ISvcLocator *svcLoc)
void operator()() const override
Base class to be used to extend an interface.