Back to home page

EIC code displayed by LXR

 
 

    


Warning, file /include/JANA/Services/JWiringService.h was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 // Copyright 2024, 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 #include <JANA/JService.h>
0007 #include <toml.hpp>
0008 #include <string>
0009 #include <map>
0010 #include <vector>
0011 #include <memory>
0012 
0013 namespace jana::services {
0014 
0015 
0016 class JWiringService : public JService {
0017 
0018 public:
0019     enum class Action { Add, Update, Remove };
0020     struct Wiring {
0021         Action action = Action::Update;
0022         std::string plugin_name;
0023         std::string type_name;
0024         std::string prefix;
0025         JEventLevel level = JEventLevel::None;
0026         std::vector<std::string> input_names;
0027         std::vector<JEventLevel> input_levels;
0028         std::vector<std::vector<std::string>> variadic_input_names;
0029         std::vector<JEventLevel> variadic_input_levels;
0030         std::vector<std::string> output_names;
0031         std::vector<JEventLevel> output_levels;
0032         std::vector<std::vector<std::string>> variadic_output_names;
0033         std::map<std::string, std::string> configs;
0034         bool is_used = false;
0035     };
0036 
0037     struct WiringSet {
0038         std::vector<std::string> include_file_names;
0039         std::vector<std::string> plugin_names;
0040         std::map<std::string,std::string> shared_parameters;
0041         std::map<std::string, std::unique_ptr<Wiring>> wirings;
0042         bool use_short_names=false;
0043     };
0044 
0045 private:
0046     Parameter<std::string> m_wirings_input_file {this, "wiring_file", "",
0047         "Path to TOML file containing wiring definitions"};
0048 
0049     WiringSet m_wiring_set;
0050     std::map<std::pair<std::string,std::string>, std::vector<std::string>> m_added_prefixes;
0051     std::vector<std::string> m_no_added_prefixes; // Because we can't use std::optional yet
0052 
0053 public:
0054     JWiringService();
0055     void Init() override;
0056 
0057     static WiringSet ParseWiringSet(const toml::table& toml);
0058     static WiringSet ParseWiringSetFromFilename(const std::string& filename);
0059 
0060     static void Overlay(Wiring& above, const Wiring& below);
0061     static void OverlayWiringSet(WiringSet& above, const WiringSet& below);
0062     static void OverlayAllIncludes(WiringSet& wiring_set);
0063 
0064     void ApplyWiringSet(WiringSet&& wiring_set);
0065 
0066     const std::map<std::string, std::string>& GetSharedParameters() const;
0067     const std::vector<std::string>& GetPluginNames() const { return m_wiring_set.plugin_names; }
0068     bool AreShortNamesUsed() const { return m_wiring_set.use_short_names; }
0069 
0070     Wiring* GetWiring(const std::string& prefix) const;
0071 
0072     const std::vector<std::string>& GetPrefixesForAddedInstances(const std::string& plugin_name, const std::string& type_name) const;
0073 
0074     const std::map<std::string, std::unique_ptr<Wiring>>& GetAllWirings() const { return m_wiring_set.wirings; }
0075 
0076     void CheckAllWiringsAreUsed();
0077 
0078 };
0079 
0080 } // namespace jana::services
0081