File indexing completed on 2025-04-30 22:24:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #include <algorithm>
0015 #include <cassert>
0016
0017
0018 #include "FWCore/Framework/interface/ESProductResolverFactoryProducer.h"
0019 #include "FWCore/Framework/interface/ESProductResolverFactoryBase.h"
0020 #include "FWCore/Framework/interface/ESModuleProducesInfo.h"
0021
0022 #include "FWCore/Framework/interface/ESProductResolver.h"
0023
0024 #include "FWCore/Utilities/interface/Exception.h"
0025
0026 using namespace edm::eventsetup;
0027 namespace edm {
0028
0029 using Record2Factories = std::multimap<EventSetupRecordKey, FactoryInfo>;
0030
0031 ESProductResolverFactoryProducer::ESProductResolverFactoryProducer() : record2Factories_() {}
0032
0033 ESProductResolverFactoryProducer::~ESProductResolverFactoryProducer() noexcept(false) {}
0034
0035 std::vector<ESModuleProducesInfo> ESProductResolverFactoryProducer::producesInfo() const {
0036 std::vector<ESModuleProducesInfo> producesInfo;
0037 for (auto const& it : record2Factories_) {
0038 producesInfo.emplace_back(it.first, it.second.key_, it.second.factory_->produceMethodID());
0039 }
0040 return producesInfo;
0041 }
0042
0043 ESProductResolverProvider::KeyedResolversVector ESProductResolverFactoryProducer::registerResolvers(
0044 const EventSetupRecordKey& iRecord, unsigned int iovIndex) {
0045 KeyedResolversVector keyedResolversVector;
0046 using Iterator = Record2Factories::iterator;
0047 std::pair<Iterator, Iterator> range = record2Factories_.equal_range(iRecord);
0048 for (Iterator it = range.first; it != range.second; ++it) {
0049 std::shared_ptr<ESProductResolver> resolver(it->second.factory_->makeResolver(iovIndex).release());
0050 if (nullptr != resolver.get()) {
0051 keyedResolversVector.emplace_back((*it).second.key_, resolver);
0052 }
0053 }
0054 return keyedResolversVector;
0055 }
0056
0057 void ESProductResolverFactoryProducer::registerFactoryWithKey(const EventSetupRecordKey& iRecord,
0058 std::unique_ptr<ESProductResolverFactoryBase> iFactory,
0059 const std::string& iLabel) {
0060 if (nullptr == iFactory.get()) {
0061 assert(false && "Factor pointer was null");
0062 ::exit(1);
0063 }
0064
0065 usingRecordWithKey(iRecord);
0066
0067 std::shared_ptr<ESProductResolverFactoryBase> temp(iFactory.release());
0068 FactoryInfo info(temp->makeKey(iLabel), temp);
0069
0070
0071 std::pair<Record2Factories::const_iterator, Record2Factories::const_iterator> range =
0072 record2Factories_.equal_range(iRecord);
0073 if (range.second !=
0074 std::find_if(range.first, range.second, [&info](const auto& r2f) { return r2f.second.key_ == info.key_; })) {
0075 throw cms::Exception("IdenticalProducts")
0076 << "Producer has been asked to produce " << info.key_.type().name() << " \"" << info.key_.name().value()
0077 << "\" multiple times.\n Please modify the code.";
0078 }
0079
0080 record2Factories_.insert(Record2Factories::value_type(iRecord, std::move(info)));
0081 }
0082
0083 }