File indexing completed on 2025-04-30 22:24:12
0001 #include "FWCore/Framework/interface/DataKey.h"
0002 #include "FWCore/Framework/interface/ESProductResolverProvider.h"
0003 #include "FWCore/Framework/interface/ESProductResolverTemplate.h"
0004 #include "FWCore/Framework/interface/ESProducer.h"
0005 #include "FWCore/Framework/interface/ESProductHost.h"
0006 #include "FWCore/Framework/interface/ESModuleProducesInfo.h"
0007 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0008 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0010 #include "FWCore/Integration/interface/ESTestData.h"
0011 #include "FWCore/Integration/interface/ESTestRecords.h"
0012 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0013 #include "FWCore/Framework/interface/ModuleFactory.h"
0014 #include "FWCore/Utilities/interface/Exception.h"
0015 #include "FWCore/Utilities/interface/ReusableObjectHolder.h"
0016
0017 #include <memory>
0018 #include <vector>
0019
0020 namespace edmtest {
0021
0022 class ESTestProducerA : public edm::ESProducer {
0023 public:
0024 ESTestProducerA(edm::ParameterSet const&);
0025 std::unique_ptr<ESTestDataA> produce(ESTestRecordA const&);
0026
0027 private:
0028 int value_;
0029 };
0030
0031 ESTestProducerA::ESTestProducerA(edm::ParameterSet const&) : value_(0) { setWhatProduced(this); }
0032
0033 std::unique_ptr<ESTestDataA> ESTestProducerA::produce(ESTestRecordA const& rec) {
0034 ++value_;
0035 return std::make_unique<ESTestDataA>(value_);
0036 }
0037
0038
0039
0040
0041 class ESTestProducerBUsingHost : public edm::ESProducer {
0042 public:
0043 ESTestProducerBUsingHost(edm::ParameterSet const&);
0044
0045 std::shared_ptr<ESTestDataB> produce(ESTestRecordB const&);
0046
0047 private:
0048 using HostType = edm::ESProductHost<ESTestDataB,
0049 ESTestRecordC,
0050 ESTestRecordD,
0051 ESTestRecordE,
0052 ESTestRecordF,
0053 ESTestRecordG,
0054 ESTestRecordH>;
0055
0056 edm::ReusableObjectHolder<HostType> holder_;
0057 };
0058
0059 ESTestProducerBUsingHost::ESTestProducerBUsingHost(edm::ParameterSet const&) { setWhatProduced(this); }
0060
0061 std::shared_ptr<ESTestDataB> ESTestProducerBUsingHost::produce(ESTestRecordB const& record) {
0062 auto host = holder_.makeOrGet([]() { return new HostType(100, 1000); });
0063
0064
0065 if (host->numberOfRecordTypes() != 6 || host->index<ESTestRecordC>() != 0 || host->index<ESTestRecordD>() != 1 ||
0066 host->index<ESTestRecordE>() != 2 || host->index<ESTestRecordF>() != 3 || host->index<ESTestRecordG>() != 4 ||
0067 host->index<ESTestRecordH>() != 5) {
0068 throw cms::Exception("TestError") << "Either function numberOfRecordTypes or index returns incorrect value";
0069 }
0070
0071 host->ifRecordChanges<ESTestRecordC>(record, [h = host.get()](auto const& rec) { ++h->value(); });
0072
0073 ++host->value();
0074 return host;
0075 }
0076
0077
0078
0079 class TestESProductResolverTemplateJ : public edm::eventsetup::ESProductResolverTemplate<ESTestRecordJ, ESTestDataJ> {
0080 public:
0081 TestESProductResolverTemplateJ(std::vector<unsigned int> const* expectedCacheIds)
0082 : testDataJ_(1), expectedCacheIds_(expectedCacheIds) {}
0083
0084 private:
0085 const ESTestDataJ* make(const ESTestRecordJ& record, const edm::eventsetup::DataKey& key) override {
0086 ESTestRecordK recordK = record.getRecord<ESTestRecordK>();
0087
0088
0089
0090 if (index_ < expectedCacheIds_->size() && recordK.cacheIdentifier() != expectedCacheIds_->at(index_)) {
0091 throw cms::Exception("TestError") << "TestESProductResolverTemplateJ::make, unexpected cacheIdentifier";
0092 }
0093 ++index_;
0094 return &testDataJ_;
0095 }
0096
0097 void invalidateCache() override {}
0098 void const* getAfterPrefetchImpl() const override { return &testDataJ_; }
0099
0100 ESTestDataJ testDataJ_;
0101 std::vector<unsigned> const* expectedCacheIds_;
0102 unsigned int index_ = 0;
0103 };
0104
0105 class ESTestESProductResolverProviderJ : public edm::eventsetup::ESProductResolverProvider {
0106 public:
0107 ESTestESProductResolverProviderJ(edm::ParameterSet const&);
0108
0109 static void fillDescriptions(edm::ConfigurationDescriptions&);
0110
0111 std::vector<edm::eventsetup::ESModuleProducesInfo> producesInfo() const override;
0112
0113 private:
0114 KeyedResolversVector registerResolvers(const edm::eventsetup::EventSetupRecordKey&, unsigned int iovIndex) override;
0115
0116 std::vector<std::shared_ptr<TestESProductResolverTemplateJ>> resolvers_;
0117 std::vector<unsigned> expectedCacheIds_;
0118 };
0119
0120 ESTestESProductResolverProviderJ::ESTestESProductResolverProviderJ(edm::ParameterSet const& pset)
0121 : expectedCacheIds_(pset.getUntrackedParameter<std::vector<unsigned int>>("expectedCacheIds")) {
0122 usingRecord<ESTestRecordJ>();
0123 }
0124
0125 void ESTestESProductResolverProviderJ::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0126 edm::ParameterSetDescription desc;
0127 std::vector<unsigned int> emptyDefaultVector;
0128 desc.addUntracked<std::vector<unsigned int>>("expectedCacheIds", emptyDefaultVector);
0129 descriptions.addDefault(desc);
0130 }
0131
0132 edm::eventsetup::ESProductResolverProvider::KeyedResolversVector ESTestESProductResolverProviderJ::registerResolvers(
0133 const edm::eventsetup::EventSetupRecordKey& iRecord, unsigned int iovIndex) {
0134 KeyedResolversVector keyedResolversVector;
0135 while (iovIndex >= resolvers_.size()) {
0136 resolvers_.push_back(std::make_shared<TestESProductResolverTemplateJ>(&expectedCacheIds_));
0137 }
0138 edm::eventsetup::DataKey dataKey(edm::eventsetup::DataKey::makeTypeTag<ESTestDataJ>(), "");
0139 keyedResolversVector.emplace_back(dataKey, resolvers_[iovIndex]);
0140 return keyedResolversVector;
0141 }
0142
0143 std::vector<edm::eventsetup::ESModuleProducesInfo> ESTestESProductResolverProviderJ::producesInfo() const {
0144 std::vector<edm::eventsetup::ESModuleProducesInfo> producesInfo;
0145 producesInfo.emplace_back(edm::eventsetup::EventSetupRecordKey::makeKey<ESTestRecordJ>(),
0146 edm::eventsetup::DataKey(edm::eventsetup::DataKey::makeTypeTag<ESTestDataJ>(), ""),
0147 0);
0148 return producesInfo;
0149 }
0150 }
0151
0152 namespace edm::test {
0153 namespace other {
0154 class ESTestProducerA : public edm::ESProducer {
0155 public:
0156 ESTestProducerA(edm::ParameterSet const& pset) : value_(pset.getParameter<int>("valueOther")) {
0157 setWhatProduced(this);
0158 }
0159 std::optional<edmtest::ESTestDataA> produce(ESTestRecordA const& rec) {
0160 ++value_;
0161 return edmtest::ESTestDataA(value_);
0162 }
0163
0164 private:
0165 int value_;
0166 };
0167 }
0168 namespace cpu {
0169 class ESTestProducerA : public edm::ESProducer {
0170 public:
0171 ESTestProducerA(edm::ParameterSet const& pset) : value_(pset.getParameter<int>("valueCpu")) {
0172 setWhatProduced(this);
0173 }
0174 std::optional<edmtest::ESTestDataA> produce(ESTestRecordA const& rec) {
0175 ++value_;
0176 return edmtest::ESTestDataA(value_);
0177 }
0178
0179 private:
0180 int value_;
0181 };
0182 }
0183 }
0184
0185 using namespace edmtest;
0186 DEFINE_FWK_EVENTSETUP_MODULE(ESTestProducerA);
0187 DEFINE_FWK_EVENTSETUP_MODULE(ESTestProducerBUsingHost);
0188 DEFINE_FWK_EVENTSETUP_MODULE(ESTestESProductResolverProviderJ);
0189 DEFINE_FWK_EVENTSETUP_MODULE(edm::test::other::ESTestProducerA);
0190 DEFINE_FWK_EVENTSETUP_MODULE(edm::test::cpu::ESTestProducerA);