File indexing completed on 2025-07-14 08:56:10
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::string> output_names = {};
0024 FactoryConfigType configs = {};
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
0085
0086
0087 factory->PreInit(wiring.tag, wiring.level, wiring.input_names, wiring.input_levels, wiring.output_names);
0088
0089
0090 factory_set->Add(factory);
0091 }
0092 }
0093
0094 private:
0095 std::vector<TypedWiring> m_typed_wirings;
0096 };
0097
0098 }
0099 using jana::components::JOmniFactoryGeneratorT;