File indexing completed on 2024-04-06 12:12:12
0001
0002 #include "FWCore/Framework/interface/MergeableRunProductProcesses.h"
0003
0004 #include "DataFormats/Common/interface/WrapperBase.h"
0005 #include "DataFormats/Provenance/interface/BranchDescription.h"
0006 #include "DataFormats/Provenance/interface/ProductRegistry.h"
0007 #include "FWCore/Utilities/interface/getAnyPtr.h"
0008
0009 #include "TClass.h"
0010
0011 #include <memory>
0012 #include <set>
0013
0014 namespace edm {
0015
0016 MergeableRunProductProcesses::MergeableRunProductProcesses() {}
0017
0018 void MergeableRunProductProcesses::setProcessesWithMergeableRunProducts(ProductRegistry const& productRegistry) {
0019 TClass* wrapperBaseTClass = TypeWithDict::byName("edm::WrapperBase").getClass();
0020 std::set<std::string> processSet;
0021 for (auto const& prod : productRegistry.productList()) {
0022 BranchDescription const& desc = prod.second;
0023 if (desc.branchType() == InRun && !desc.produced() && desc.present()) {
0024 TClass* cp = desc.wrappedType().getClass();
0025 void* p = cp->New();
0026 int offset = cp->GetBaseClassOffset(wrapperBaseTClass);
0027 std::unique_ptr<WrapperBase> edp = getAnyPtr<WrapperBase>(p, offset);
0028 if (edp->isMergeable()) {
0029 processSet.insert(desc.processName());
0030 }
0031 }
0032 }
0033 processesWithMergeableRunProducts_.assign(processSet.begin(), processSet.end());
0034 }
0035 }