00001
00002 #include "art/Framework/Core/EDProducer.h"
00003 #include "art/Framework/Core/ModuleMacros.h"
00004 #include "art/Framework/Principal/Event.h"
00005 #include "art/Framework/Principal/Run.h"
00006 #include "fhiclcpp/ParameterSet.h"
00007 #include "messagefacility/MessageLogger/MessageLogger.h"
00008 #include "artdaq-core/Data/PackageBuildInfo.hh"
00009
00010 #include <iostream>
00011
00012
00013 namespace artdaq {
00014
00015 template <std::string* instanceName, typename... Pkgs>
00016 class BuildInfo : public art::EDProducer {
00017 public:
00018 explicit BuildInfo(fhicl::ParameterSet const & p);
00019 virtual ~BuildInfo() {}
00020
00021 void beginRun(art::Run & r) override;
00022 void produce(art::Event & e) override;
00023
00024 private:
00025
00026 std::unique_ptr< std::vector<PackageBuildInfo> > packages_;
00027 std::string instanceName_;
00028
00029 template <typename... Args>
00030 struct fill_packages;
00031
00032 template <typename Arg>
00033 struct fill_packages<Arg> {
00034 static void doit(std::vector<PackageBuildInfo>& packages) {
00035 packages.emplace_back( Arg::getPackageBuildInfo() );
00036 }
00037 };
00038
00039 template <typename Arg, typename... Args>
00040 struct fill_packages<Arg, Args...> {
00041 static void doit(std::vector<PackageBuildInfo>& packages) {
00042 packages.emplace_back( Arg::getPackageBuildInfo() );
00043 fill_packages<Args...>::doit(packages);
00044 }
00045 };
00046
00047 };
00048
00049 template <std::string* instanceName, typename... Pkgs>
00050 BuildInfo<instanceName, Pkgs...>::BuildInfo(fhicl::ParameterSet const & ps):
00051 packages_( new std::vector<PackageBuildInfo>() ),
00052 instanceName_(ps.get<std::string>( "instance_name", *instanceName ))
00053 {
00054
00055 fill_packages<Pkgs...>::doit(*packages_);
00056
00057 produces<std::vector<PackageBuildInfo>, art::InRun>(instanceName_);
00058
00059 }
00060
00061 template <std::string* instanceName, typename... Pkgs>
00062 void BuildInfo<instanceName, Pkgs...>::beginRun(art::Run &e) {
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 auto packages_deep_copy_ptr = std::unique_ptr<std::vector<PackageBuildInfo>>(
00076 new std::vector<PackageBuildInfo>(*packages_ ) );
00077
00078 e.put( std::move(packages_deep_copy_ptr), instanceName_ );
00079
00080 }
00081
00082 template <std::string* instanceName, typename... Pkgs>
00083 void BuildInfo<instanceName, Pkgs...>::produce(art::Event &)
00084 {
00085
00086 }
00087
00088
00089 }