File indexing completed on 2025-12-16 10:18:59
0001
0002
0003
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::vector<std::string>> variadic_input_names = {};
0024 std::vector<JEventLevel> variadic_input_levels = {};
0025 std::vector<std::string> output_names = {};
0026 std::vector<std::vector<std::string>> variadic_output_names = {};
0027 FactoryConfigType configs = {};
0028 };
0029
0030 public:
0031
0032 explicit JOmniFactoryGeneratorT() = default;
0033
0034 explicit JOmniFactoryGeneratorT(std::string tag,
0035 std::vector<std::string> input_names,
0036 std::vector<std::string> output_names,
0037 FactoryConfigType configs) {
0038 m_typed_wirings.push_back({.tag=tag,
0039 .input_names=input_names,
0040 .output_names=output_names,
0041 .configs=configs
0042 });
0043 };
0044
0045 explicit JOmniFactoryGeneratorT(std::string tag,
0046 std::vector<std::string> input_names,
0047 std::vector<std::string> output_names) {
0048 m_typed_wirings.push_back({.tag=tag,
0049 .input_names=input_names,
0050 .output_names=output_names
0051 });
0052
0053 }
0054
0055 explicit JOmniFactoryGeneratorT(TypedWiring&& wiring) {
0056 m_typed_wirings.push_back(std::move(wiring));
0057 }
0058
0059
0060 void AddWiring(std::string tag,
0061 std::vector<std::string> input_names,
0062 std::vector<std::string> output_names,
0063 FactoryConfigType configs={}) {
0064
0065 m_typed_wirings.push_back({.tag=tag,
0066 .input_names=input_names,
0067 .output_names=output_names,
0068 .configs=configs
0069 });
0070 }
0071
0072
0073 void AddWiring(TypedWiring wiring) {
0074 m_typed_wirings.push_back(wiring);
0075 }
0076
0077 void GenerateFactories(JFactorySet *factory_set) override {
0078
0079 if (m_typed_wirings.size() == 0) {
0080 FactoryT *factory = new FactoryT;
0081 factory->SetApplication(GetApplication());
0082 factory->SetPluginName(this->GetPluginName());
0083 factory->SetTypeName(JTypeInfo::demangle<FactoryT>());
0084 factory->SetLogger(GetApplication()->template GetService<JParameterManager>()->GetLogger(factory->GetPrefix()));
0085 factory_set->Add(factory);
0086 }
0087
0088 for (const auto& wiring : m_typed_wirings) {
0089
0090 FactoryT *factory = new FactoryT;
0091 factory->SetApplication(GetApplication());
0092 factory->SetPluginName(this->GetPluginName());
0093 factory->SetTypeName(JTypeInfo::demangle<FactoryT>());
0094 factory->config() = wiring.configs;
0095
0096
0097
0098
0099 factory->PreInit(wiring.tag, wiring.level, wiring.input_names, wiring.input_levels,
0100 wiring.variadic_input_names, wiring.variadic_input_levels,
0101 wiring.output_names, wiring.variadic_output_names);
0102
0103
0104 factory_set->Add(factory);
0105 }
0106 }
0107
0108 private:
0109 std::vector<TypedWiring> m_typed_wirings;
0110 };
0111
0112 }
0113 using jana::components::JOmniFactoryGeneratorT;