Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-04-30 22:24:07

0001 // -*- C++ -*-
0002 //
0003 // Package:     Framework
0004 // Class  :     ESProductResolverFactoryProducer
0005 //
0006 // Implementation:
0007 //     <Notes on implementation>
0008 //
0009 // Author:      Chris Jones
0010 // Created:     Thu Apr  7 21:36:15 CDT 2005
0011 //
0012 
0013 // system include files
0014 #include <algorithm>
0015 #include <cassert>
0016 
0017 // user include files
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     //has this already been registered?
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 }  // namespace edm