File indexing completed on 2024-08-22 04:57:37
0001 #ifndef FWCore_Framework_ProcessBlock_h
0002 #define FWCore_Framework_ProcessBlock_h
0003
0004
0005
0006
0007
0008
0009
0010 #include "DataFormats/Common/interface/Handle.h"
0011 #include "DataFormats/Common/interface/Wrapper.h"
0012 #include "DataFormats/Common/interface/WrapperBase.h"
0013 #include "FWCore/Framework/interface/PrincipalGetAdapter.h"
0014 #include "FWCore/Utilities/interface/EDGetToken.h"
0015 #include "FWCore/Utilities/interface/EDPutToken.h"
0016 #include "FWCore/Utilities/interface/ProductResolverIndex.h"
0017 #include "FWCore/Utilities/interface/propagate_const.h"
0018
0019 #include <memory>
0020 #include <type_traits>
0021 #include <utility>
0022 #include <vector>
0023
0024 namespace edm {
0025
0026 class ModuleCallingContext;
0027 class ModuleDescription;
0028 class ProcessBlockPrincipal;
0029 class ProducerBase;
0030
0031 namespace stream {
0032 template <typename T>
0033 class ProducingModuleAdaptorBase;
0034 }
0035
0036 class ProcessBlock {
0037 public:
0038 ProcessBlock(ProcessBlockPrincipal const&, ModuleDescription const&, ModuleCallingContext const*, bool isAtEnd);
0039
0040 template <typename PROD>
0041 bool getByToken(EDGetToken token, Handle<PROD>& result) const;
0042
0043 template <typename PROD>
0044 bool getByToken(EDGetTokenT<PROD> token, Handle<PROD>& result) const;
0045
0046 template <typename PROD>
0047 Handle<PROD> getHandle(EDGetTokenT<PROD> token) const;
0048
0049 template <typename PROD>
0050 PROD const& get(EDGetTokenT<PROD> token) const noexcept(false);
0051
0052
0053 void setConsumer(EDConsumerBase const* iConsumer) { provRecorder_.setConsumer(iConsumer); }
0054
0055 void setProducer(ProducerBase const* iProducer);
0056
0057
0058
0059
0060
0061
0062
0063 using CacheIdentifier_t = unsigned long;
0064 CacheIdentifier_t cacheIdentifier() const;
0065
0066 template <typename PROD>
0067 void put(EDPutTokenT<PROD> token, std::unique_ptr<PROD> product);
0068
0069 template <typename PROD>
0070 void put(EDPutToken token, std::unique_ptr<PROD> product);
0071
0072 template <typename PROD, typename... Args>
0073 void emplace(EDPutTokenT<PROD> token, Args&&... args);
0074
0075 template <typename PROD, typename... Args>
0076 void emplace(EDPutToken token, Args&&... args);
0077
0078 ModuleCallingContext const* moduleCallingContext() const { return moduleCallingContext_; }
0079
0080 std::string const& processName() const;
0081
0082 private:
0083 ProcessBlockPrincipal const& processBlockPrincipal() const;
0084
0085 template <typename PROD>
0086 void putImpl(EDPutToken::value_type token, std::unique_ptr<PROD> product);
0087
0088 template <typename PROD, typename... Args>
0089 void emplaceImpl(EDPutToken::value_type token, Args&&... args);
0090
0091 friend class ProducerBase;
0092 template <typename T>
0093 friend class stream::ProducingModuleAdaptorBase;
0094
0095 void commit_(std::vector<edm::ProductResolverIndex> const& iShouldPut);
0096
0097 using ProductPtrVec = std::vector<edm::propagate_const<std::unique_ptr<WrapperBase>>>;
0098 ProductPtrVec& putProducts() { return putProducts_; }
0099 ProductPtrVec const& putProducts() const { return putProducts_; }
0100
0101 PrincipalGetAdapter provRecorder_;
0102 ProductPtrVec putProducts_;
0103 ModuleCallingContext const* moduleCallingContext_;
0104 };
0105
0106 template <typename PROD>
0107 bool ProcessBlock::getByToken(EDGetToken token, Handle<PROD>& result) const {
0108 result.clear();
0109 BasicHandle bh = provRecorder_.getByToken_(TypeID(typeid(PROD)), PRODUCT_TYPE, token, moduleCallingContext_);
0110 result = convert_handle<PROD>(std::move(bh));
0111 if (result.failedToGet()) {
0112 return false;
0113 }
0114 return true;
0115 }
0116
0117 template <typename PROD>
0118 bool ProcessBlock::getByToken(EDGetTokenT<PROD> token, Handle<PROD>& result) const {
0119 result.clear();
0120 BasicHandle bh = provRecorder_.getByToken_(TypeID(typeid(PROD)), PRODUCT_TYPE, token, moduleCallingContext_);
0121 result = convert_handle<PROD>(std::move(bh));
0122 if (result.failedToGet()) {
0123 return false;
0124 }
0125 return true;
0126 }
0127
0128 template <typename PROD>
0129 Handle<PROD> ProcessBlock::getHandle(EDGetTokenT<PROD> token) const {
0130 BasicHandle bh = provRecorder_.getByToken_(TypeID(typeid(PROD)), PRODUCT_TYPE, token, moduleCallingContext_);
0131 return convert_handle<PROD>(std::move(bh));
0132 }
0133
0134 template <typename PROD>
0135 PROD const& ProcessBlock::get(EDGetTokenT<PROD> token) const noexcept(false) {
0136 BasicHandle bh = provRecorder_.getByToken_(TypeID(typeid(PROD)), PRODUCT_TYPE, token, moduleCallingContext_);
0137 return *convert_handle<PROD>(std::move(bh));
0138 }
0139
0140 template <typename PROD>
0141 void ProcessBlock::put(EDPutTokenT<PROD> token, std::unique_ptr<PROD> product) {
0142 if (UNLIKELY(product.get() == 0)) {
0143 TypeID typeID(typeid(PROD));
0144 principal_get_adapter_detail::throwOnPutOfNullProduct(
0145 "ProcessBlock", typeID, provRecorder_.productInstanceLabel(token));
0146 }
0147 if (UNLIKELY(token.isUninitialized())) {
0148 principal_get_adapter_detail::throwOnPutOfUninitializedToken("ProcessBlock", typeid(PROD));
0149 }
0150 putImpl(token.index(), std::move(product));
0151 }
0152
0153 template <typename PROD>
0154 void ProcessBlock::put(EDPutToken token, std::unique_ptr<PROD> product) {
0155 if (UNLIKELY(product.get() == 0)) {
0156 TypeID typeID(typeid(PROD));
0157 principal_get_adapter_detail::throwOnPutOfNullProduct(
0158 "ProcessBlock", typeID, provRecorder_.productInstanceLabel(token));
0159 }
0160 if (UNLIKELY(token.isUninitialized())) {
0161 principal_get_adapter_detail::throwOnPutOfUninitializedToken("ProcessBlock", typeid(PROD));
0162 }
0163 if (UNLIKELY(provRecorder_.getTypeIDForPutTokenIndex(token.index()) != TypeID{typeid(PROD)})) {
0164 principal_get_adapter_detail::throwOnPutOfWrongType(typeid(PROD),
0165 provRecorder_.getTypeIDForPutTokenIndex(token.index()));
0166 }
0167 putImpl(token.index(), std::move(product));
0168 }
0169
0170 template <typename PROD, typename... Args>
0171 void ProcessBlock::emplace(EDPutTokenT<PROD> token, Args&&... args) {
0172 if (UNLIKELY(token.isUninitialized())) {
0173 principal_get_adapter_detail::throwOnPutOfUninitializedToken("ProcessBlock", typeid(PROD));
0174 }
0175 emplaceImpl<PROD>(token.index(), std::forward<Args>(args)...);
0176 }
0177
0178 template <typename PROD, typename... Args>
0179 void ProcessBlock::emplace(EDPutToken token, Args&&... args) {
0180 if (UNLIKELY(token.isUninitialized())) {
0181 principal_get_adapter_detail::throwOnPutOfUninitializedToken("ProcessBlock", typeid(PROD));
0182 }
0183 if (UNLIKELY(provRecorder_.getTypeIDForPutTokenIndex(token.index()) != TypeID{typeid(PROD)})) {
0184 principal_get_adapter_detail::throwOnPutOfWrongType(typeid(PROD),
0185 provRecorder_.getTypeIDForPutTokenIndex(token.index()));
0186 }
0187 emplaceImpl<PROD>(token.index(), std::forward<Args>(args)...);
0188 }
0189
0190 template <typename PROD>
0191 void ProcessBlock::putImpl(EDPutToken::value_type index, std::unique_ptr<PROD> product) {
0192
0193
0194 detail::do_post_insert_if_available(*product.get());
0195
0196 assert(index < putProducts().size());
0197
0198 std::unique_ptr<Wrapper<PROD>> wp(new Wrapper<PROD>(std::move(product)));
0199 putProducts()[index] = std::move(wp);
0200 }
0201
0202 template <typename PROD, typename... Args>
0203 void ProcessBlock::emplaceImpl(EDPutToken::value_type index, Args&&... args) {
0204 assert(index < putProducts().size());
0205
0206 std::unique_ptr<Wrapper<PROD>> wp(new Wrapper<PROD>(WrapperBase::Emplace{}, std::forward<Args>(args)...));
0207
0208
0209
0210 detail::do_post_insert_if_available(wp->bareProduct());
0211
0212 putProducts()[index] = std::move(wp);
0213 }
0214
0215 template <typename T>
0216 T const& get(ProcessBlock const& processBlock, EDGetToken const& token) {
0217 Handle<T> handle;
0218 processBlock.getByToken(token, handle);
0219
0220 return *handle.product();
0221 }
0222
0223 template <typename T>
0224 T const& get(ProcessBlock const& processBlock, EDGetTokenT<T> const& token) {
0225 Handle<T> handle;
0226 processBlock.getByToken(token, handle);
0227
0228 return *handle.product();
0229 }
0230
0231 }
0232 #endif