Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-07-14 08:56:10

0001 // Copyright 2023, Jefferson Science Associates, LLC.
0002 // Subject to the terms in the LICENSE file found in the top-level directory.
0003 // Created by Nathan Brei
0004 
0005 #pragma once
0006 
0007 #include <JANA/JFactorySet.h>
0008 #include <JANA/JFactoryGenerator.h>
0009 #include <vector>
0010 
0011 namespace jana::components {
0012 
0013 template<class FactoryT>
0014 class JOmniFactoryGeneratorT : public JFactoryGenerator {
0015 public:
0016     using FactoryConfigType = typename FactoryT::ConfigType;
0017 
0018     struct TypedWiring {
0019         std::string tag = "";
0020         JEventLevel level = JEventLevel::PhysicsEvent;
0021         std::vector<std::string> input_names = {};
0022         std::vector<JEventLevel> input_levels = {};
0023         std::vector<std::string> output_names = {};
0024         FactoryConfigType configs = {}; /// Must be copyable!
0025     };
0026 
0027 public:
0028 
0029     explicit JOmniFactoryGeneratorT() = default;
0030 
0031     explicit JOmniFactoryGeneratorT(std::string tag,
0032                                     std::vector<std::string> input_names,
0033                                     std::vector<std::string> output_names,
0034                                     FactoryConfigType configs) {
0035         m_typed_wirings.push_back({.tag=tag,
0036                                    .input_names=input_names,
0037                                    .output_names=output_names,
0038                                    .configs=configs
0039                                   });
0040     };
0041 
0042     explicit JOmniFactoryGeneratorT(std::string tag,
0043                                     std::vector<std::string> input_names,
0044                                     std::vector<std::string> output_names) {
0045         m_typed_wirings.push_back({.tag=tag,
0046                                    .input_names=input_names,
0047                                    .output_names=output_names
0048                                   });
0049 
0050     }
0051 
0052     explicit JOmniFactoryGeneratorT(TypedWiring&& wiring) {
0053         m_typed_wirings.push_back(std::move(wiring));
0054     }
0055 
0056 
0057     void AddWiring(std::string tag,
0058                    std::vector<std::string> input_names,
0059                    std::vector<std::string> output_names,
0060                    FactoryConfigType configs={}) {
0061 
0062         m_typed_wirings.push_back({.tag=tag,
0063                                    .input_names=input_names,
0064                                    .output_names=output_names,
0065                                    .configs=configs
0066                                   });
0067     }
0068 
0069 
0070     void AddWiring(TypedWiring wiring) {
0071         m_typed_wirings.push_back(wiring);
0072     }
0073 
0074     void GenerateFactories(JFactorySet *factory_set) override {
0075 
0076         for (const auto& wiring : m_typed_wirings) {
0077 
0078             FactoryT *factory = new FactoryT;
0079             factory->SetApplication(GetApplication());
0080             factory->SetPluginName(this->GetPluginName());
0081             factory->SetTypeName(JTypeInfo::demangle<FactoryT>());
0082             factory->config() = wiring.configs;
0083 
0084             // Set up all of the wiring prereqs so that Init() can do its thing
0085             // Specifically, it needs valid input/output tags, a valid logger, and
0086             // valid default values in its Config object
0087             factory->PreInit(wiring.tag, wiring.level, wiring.input_names, wiring.input_levels, wiring.output_names);
0088 
0089             // Factory is ready
0090             factory_set->Add(factory);
0091         }
0092     }
0093 
0094 private:
0095     std::vector<TypedWiring> m_typed_wirings;
0096 };
0097 
0098 } // namespace jana::components
0099 using jana::components::JOmniFactoryGeneratorT;