CMS 3D CMS Logo

implementors.h
Go to the documentation of this file.
1 #ifndef FWCore_Framework_one_implementors_h
2 #define FWCore_Framework_one_implementors_h
3 // -*- C++ -*-
4 //
5 // Package: FWCore/Framework
6 // Class : implementors
7 //
16 //
17 // Original Author: Chris Jones
18 // Created: Thu, 09 May 2013 18:40:17 GMT
19 //
20 
21 // system include files
22 #include <cstddef>
23 #include <memory>
24 #include <set>
25 #include <string>
26 #include <tuple>
27 #include <utility>
28 
29 // user include files
46 
47 // forward declarations
48 
49 namespace edm {
51  class WaitingTaskHolder;
52  class ServiceWeakToken;
53  class ActivityRegistry;
54 
55  namespace one {
56  namespace impl {
57  template <bool V>
59 
60  template <>
62  edm::SerialTaskQueue* queue() { return &queue_; }
64  };
65 
66  template <>
68  edm::SerialTaskQueue* queue() { return nullptr; }
69  };
70 
71  template <typename T>
72  class SharedResourcesUser : public virtual T {
73  public:
74  template <typename... Args>
75  SharedResourcesUser(Args... args) : T(args...) {}
78 
79  ~SharedResourcesUser() override {}
80 
81  protected:
82  void usesResource(std::string const& iName);
83  void usesResource();
84 
85  private:
87  std::set<std::string> resourceNames_;
88  };
89 
90  template <typename T>
91  class RunWatcher : public virtual T {
92  public:
93  RunWatcher() = default;
94  RunWatcher(RunWatcher const&) = delete;
95  RunWatcher& operator=(RunWatcher const&) = delete;
96  ~RunWatcher() noexcept(false) override{};
97 
98  private:
99  void doBeginRun_(Run const& rp, EventSetup const& c) final;
100  void doEndRun_(Run const& rp, EventSetup const& c) final;
101 
102  virtual void beginRun(edm::Run const&, edm::EventSetup const&) = 0;
103  virtual void endRun(edm::Run const&, edm::EventSetup const&) = 0;
104  };
105 
106  template <typename T>
107  class LuminosityBlockWatcher : public virtual T {
108  public:
109  LuminosityBlockWatcher() = default;
112  ~LuminosityBlockWatcher() noexcept(false) override{};
113 
114  private:
115  void doBeginLuminosityBlock_(LuminosityBlock const& rp, EventSetup const& c) final;
116  void doEndLuminosityBlock_(LuminosityBlock const& rp, EventSetup const& c) final;
117 
118  virtual void beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) = 0;
119  virtual void endLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) = 0;
120  };
121 
122  template <typename T>
123  class WatchProcessBlock : public virtual T {
124  public:
125  WatchProcessBlock() = default;
126  WatchProcessBlock(WatchProcessBlock const&) = delete;
128  ~WatchProcessBlock() noexcept(false) override {}
129 
130  private:
131  void doBeginProcessBlock_(ProcessBlock const&) final;
132  void doEndProcessBlock_(ProcessBlock const&) final;
133 
134  virtual void beginProcessBlock(ProcessBlock const&) {}
135  virtual void endProcessBlock(ProcessBlock const&) {}
136  };
137 
138  template <typename T>
139  class BeginProcessBlockProducer : public virtual T {
140  public:
141  BeginProcessBlockProducer() = default;
144  ~BeginProcessBlockProducer() noexcept(false) override{};
145 
146  private:
148 
149  virtual void beginProcessBlockProduce(edm::ProcessBlock&) = 0;
150  };
151 
152  template <typename T>
153  class EndProcessBlockProducer : public virtual T {
154  public:
155  EndProcessBlockProducer() = default;
158  ~EndProcessBlockProducer() noexcept(false) override{};
159 
160  private:
162 
163  virtual void endProcessBlockProduce(edm::ProcessBlock&) = 0;
164  };
165 
166  template <typename T>
167  class BeginRunProducer : public virtual T {
168  public:
169  BeginRunProducer() = default;
170  BeginRunProducer(BeginRunProducer const&) = delete;
171  BeginRunProducer& operator=(BeginRunProducer const&) = delete;
172  ~BeginRunProducer() noexcept(false) override{};
173 
174  private:
175  void doBeginRunProduce_(Run& rp, EventSetup const& c) final;
176 
177  virtual void beginRunProduce(edm::Run&, edm::EventSetup const&) = 0;
178  };
179 
180  template <typename T>
181  class EndRunProducer : public virtual T {
182  public:
183  EndRunProducer() = default;
184  EndRunProducer(EndRunProducer const&) = delete;
185  EndRunProducer& operator=(EndRunProducer const&) = delete;
186  ~EndRunProducer() noexcept(false) override{};
187 
188  private:
189  void doEndRunProduce_(Run& rp, EventSetup const& c) final;
190 
191  virtual void endRunProduce(edm::Run&, edm::EventSetup const&) = 0;
192  };
193 
194  template <typename T>
195  class BeginLuminosityBlockProducer : public virtual T {
196  public:
197  BeginLuminosityBlockProducer() = default;
200  ~BeginLuminosityBlockProducer() noexcept(false) override{};
201 
202  private:
204 
206  };
207 
208  template <typename T>
209  class EndLuminosityBlockProducer : public virtual T {
210  public:
211  EndLuminosityBlockProducer() = default;
214  ~EndLuminosityBlockProducer() noexcept(false) override{};
215 
216  private:
217  void doEndLuminosityBlockProduce_(LuminosityBlock& lbp, EventSetup const& c) final;
218 
220  };
221 
222  template <typename T, typename... CacheTypes>
223  class InputProcessBlockCacheHolder : public virtual T {
224  public:
225  InputProcessBlockCacheHolder() = default;
229 
230  std::tuple<CacheHandle<CacheTypes>...> processBlockCaches(Event const& event) const {
231  return cacheImpl_.processBlockCaches(event);
232  }
233 
234  template <std::size_t ICacheType, typename DataType, typename Func>
236  cacheImpl_.template registerProcessBlockCacheFiller<ICacheType, DataType, Func>(token,
237  std::forward<Func>(func));
238  }
239 
240  template <typename CacheType, typename DataType, typename Func>
242  cacheImpl_.template registerProcessBlockCacheFiller<CacheType, DataType, Func>(token,
243  std::forward<Func>(func));
244  }
245 
246  // This is intended for use by Framework unit tests only
247  unsigned int cacheSize() const { return cacheImpl_.cacheSize(); }
248 
249  private:
250  void doSelectInputProcessBlocks(ProductRegistry const& productRegistry,
251  ProcessBlockHelperBase const& processBlockHelperBase) final {
252  cacheImpl_.selectInputProcessBlocks(productRegistry, processBlockHelperBase, *this);
253  }
254 
255  void doAccessInputProcessBlock_(ProcessBlock const& pb) final {
256  cacheImpl_.accessInputProcessBlock(pb);
258  }
259 
260  // Alternate method to access ProcessBlocks without using the caches
261  // Mostly intended for unit testing, but might have other uses...
262  virtual void accessInputProcessBlock(ProcessBlock const&) {}
263 
264  void clearInputProcessBlockCaches() final { cacheImpl_.clearCaches(); }
265 
267  };
268 
269  template <typename T, typename C>
270  class RunCacheHolder : public virtual T {
271  public:
272  RunCacheHolder() = default;
273  RunCacheHolder(RunCacheHolder<T, C> const&) = delete;
275  ~RunCacheHolder() noexcept(false) override{};
276 
277  protected:
278  void preallocRuns(unsigned int iNRuns) final { caches_.reset(new std::shared_ptr<C>[iNRuns]); }
279 
280  C* runCache(edm::RunIndex iID) { return caches_[iID].get(); }
281  C const* runCache(edm::RunIndex iID) const { return caches_[iID].get(); }
282 
283  private:
284  void doBeginRun_(Run const& rp, EventSetup const& c) final { caches_[rp.index()] = globalBeginRun(rp, c); }
285  void doEndRun_(Run const& rp, EventSetup const& c) final {
286  globalEndRun(rp, c);
287  caches_[rp.index()].reset();
288  }
289 
290  virtual std::shared_ptr<C> globalBeginRun(edm::Run const&, edm::EventSetup const&) const = 0;
291  virtual void globalEndRun(edm::Run const&, edm::EventSetup const&) = 0;
292 
293  std::unique_ptr<std::shared_ptr<C>[]> caches_;
294  };
295 
296  template <typename T, typename C>
297  class LuminosityBlockCacheHolder : public virtual T {
298  public:
299  LuminosityBlockCacheHolder() = default;
302  ~LuminosityBlockCacheHolder() noexcept(false) override{};
303 
304  protected:
305  void preallocLumis(unsigned int iNLumis) final { caches_.reset(new std::shared_ptr<C>[iNLumis]); }
306 
307  C const* luminosityBlockCache(edm::LuminosityBlockIndex iID) const { return caches_[iID].get(); }
309 
310  private:
311  void doBeginLuminosityBlock_(LuminosityBlock const& lp, EventSetup const& c) final {
312  caches_[lp.index()] = globalBeginLuminosityBlock(lp, c);
313  }
314  void doEndLuminosityBlock_(LuminosityBlock const& lp, EventSetup const& c) final {
316  caches_[lp.index()].reset();
317  }
318 
319  virtual std::shared_ptr<C> globalBeginLuminosityBlock(edm::LuminosityBlock const&,
320  edm::EventSetup const&) const = 0;
321  virtual void globalEndLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) = 0;
322  std::unique_ptr<std::shared_ptr<C>[]> caches_;
323  };
324 
325  template <typename T>
326  class Accumulator : public virtual T {
327  public:
328  Accumulator() = default;
329  Accumulator(Accumulator const&) = delete;
330  Accumulator& operator=(Accumulator const&) = delete;
331  ~Accumulator() noexcept(false) override{};
332 
333  private:
334  bool hasAccumulator() const override { return true; }
335 
336  void produce(Event& ev, EventSetup const& es) final { accumulate(ev, es); }
337 
338  virtual void accumulate(Event const& ev, EventSetup const& es) = 0;
339  };
340 
341  template <typename T>
342  class Transformer : public virtual T, private TransformerBase {
343  public:
344  Transformer() = default;
345  Transformer(Transformer const&) = delete;
346  Transformer& operator=(Transformer const&) = delete;
347  ~Transformer() noexcept(false) override{};
348 
349  template <typename G, typename F>
351  F&& iF,
352  std::string productInstance = std::string()) {
353  registerTransform(edm::EDPutTokenT<G>(iSetter), std::forward<F>(iF), std::move(productInstance));
354  }
355 
356  template <typename G, typename F>
357  void registerTransform(edm::EDPutTokenT<G> iToken, F iF, std::string productInstance = std::string()) {
358  using ReturnTypeT = decltype(iF(std::declval<G>()));
359  TypeID returnType(typeid(ReturnTypeT));
361  EDPutToken(iToken),
362  returnType,
363  std::move(productInstance),
364  [f = std::move(iF)](edm::WrapperBase const& iGotProduct) {
365  return std::make_unique<edm::Wrapper<ReturnTypeT>>(
367  f(*static_cast<edm::Wrapper<G> const&>(iGotProduct).product()));
368  });
369  }
370 
371  template <typename G, typename P, typename F>
373  P iPre,
374  F iF,
375  std::string productInstance = std::string()) {
376  using CacheTypeT = decltype(iPre(std::declval<G>(), WaitingTaskWithArenaHolder()));
377  using ReturnTypeT = decltype(iF(std::declval<CacheTypeT>()));
378  TypeID returnType(typeid(ReturnTypeT));
380  *this,
381  EDPutToken(iToken),
382  returnType,
383  std::move(productInstance),
384  [p = std::move(iPre)](edm::WrapperBase const& iGotProduct, WaitingTaskWithArenaHolder iHolder) {
385  return std::any(p(*static_cast<edm::Wrapper<G> const&>(iGotProduct).product(), std::move(iHolder)));
386  },
387  [f = std::move(iF)](std::any const& iCache) {
388  auto cache = std::any_cast<CacheTypeT>(iCache);
389  return std::make_unique<edm::Wrapper<ReturnTypeT>>(WrapperBase::Emplace{}, f(cache));
390  });
391  }
392 
393  private:
394  size_t transformIndex_(edm::BranchDescription const& iBranch) const final {
395  return TransformerBase::findMatchingIndex(*this, iBranch);
396  }
397  ProductResolverIndex transformPrefetch_(std::size_t iIndex) const final {
398  return TransformerBase::prefetchImp(iIndex);
399  }
401  std::size_t iIndex,
403  edm::ActivityRegistry* iAct,
404  ServiceWeakToken const& iToken) const final {
405  return TransformerBase::transformImpAsync(std::move(iTask), iIndex, iAct, *this, iEvent);
406  }
407  void extendUpdateLookup(BranchType iBranchType, ProductResolverIndexHelper const& iHelper) override {
408  if (iBranchType == InEvent) {
409  TransformerBase::extendUpdateLookup(*this, this->moduleDescription(), iHelper);
410  }
411  }
412  };
413  } // namespace impl
414  } // namespace one
415 } // namespace edm
416 
417 #endif
std::unique_ptr< std::shared_ptr< C >[]> caches_
Definition: implementors.h:322
void produce(Event &ev, EventSetup const &es) final
Definition: implementors.h:336
unsigned int ProductResolverIndex
void doBeginProcessBlockProduce_(ProcessBlock &) final
virtual void beginProcessBlock(ProcessBlock const &)
Definition: implementors.h:134
void doEndRun_(Run const &rp, EventSetup const &c) final
virtual void endRunProduce(edm::Run &, edm::EventSetup const &)=0
virtual void endRun(edm::Run const &, edm::EventSetup const &)=0
bool any(const std::vector< T > &v, const T &what)
Definition: ECalSD.cc:36
~EndProcessBlockProducer() noexcept(false) override
Definition: implementors.h:158
SharedResourcesUser & operator=(SharedResourcesUser const &)=delete
LuminosityBlockWatcher & operator=(LuminosityBlockWatcher const &)=delete
C const * luminosityBlockCache(edm::LuminosityBlockIndex iID) const
Definition: implementors.h:307
virtual void endProcessBlock(ProcessBlock const &)
Definition: implementors.h:135
virtual void accessInputProcessBlock(ProcessBlock const &)
Definition: implementors.h:262
~WatchProcessBlock() noexcept(false) override
Definition: implementors.h:128
BeginRunProducer & operator=(BeginRunProducer const &)=delete
void doEndRun_(Run const &rp, EventSetup const &c) final
Definition: implementors.h:285
LuminosityBlockCacheHolder< T, C > & operator=(LuminosityBlockCacheHolder< T, C > const &)=delete
RunWatcher & operator=(RunWatcher const &)=delete
BeginProcessBlockProducer & operator=(BeginProcessBlockProducer const &)=delete
~Accumulator() noexcept(false) override
Definition: implementors.h:331
void preallocRuns(unsigned int iNRuns) final
Definition: implementors.h:278
ProductResolverIndex prefetchImp(std::size_t iIndex) const
BranchType
Definition: BranchType.h:11
virtual void accumulate(Event const &ev, EventSetup const &es)=0
void transformAsync_(WaitingTaskHolder iTask, std::size_t iIndex, edm::EventForTransformer &iEvent, edm::ActivityRegistry *iAct, ServiceWeakToken const &iToken) const final
Definition: implementors.h:400
void extendUpdateLookup(BranchType iBranchType, ProductResolverIndexHelper const &iHelper) override
Definition: implementors.h:407
void doSelectInputProcessBlocks(ProductRegistry const &productRegistry, ProcessBlockHelperBase const &processBlockHelperBase) final
Definition: implementors.h:250
void transformImpAsync(WaitingTaskHolder iTask, std::size_t iIndex, edm::ActivityRegistry *iAct, ProducerBase const &iBase, edm::EventForTransformer &) const
C * runCache(edm::RunIndex iID)
Definition: implementors.h:280
int iEvent
Definition: GenABIO.cc:224
void doBeginLuminosityBlock_(LuminosityBlock const &rp, EventSetup const &c) final
void doBeginRunProduce_(Run &rp, EventSetup const &c) final
edm::impl::InputProcessBlockCacheImpl< CacheTypes... > cacheImpl_
Definition: implementors.h:266
BeginLuminosityBlockProducer & operator=(BeginLuminosityBlockProducer const &)=delete
void registerProcessBlockCacheFiller(EDGetTokenT< DataType > const &token, Func &&func)
Definition: implementors.h:235
~EndRunProducer() noexcept(false) override
Definition: implementors.h:186
edm::TypeWithDict returnType(const edm::FunctionWithDict &)
Definition: returnType.cc:16
void doBeginProcessBlock_(ProcessBlock const &) final
virtual void beginLuminosityBlockProduce(edm::LuminosityBlock &, edm::EventSetup const &)=0
void extendUpdateLookup(ProducerBase const &, ModuleDescription const &iModuleDesc, ProductResolverIndexHelper const &iHelper)
void doEndLuminosityBlock_(LuminosityBlock const &lp, EventSetup const &c) final
Definition: implementors.h:314
virtual void endProcessBlockProduce(edm::ProcessBlock &)=0
void doAccessInputProcessBlock_(ProcessBlock const &pb) final
Definition: implementors.h:255
virtual void endLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &)=0
double f[11][100]
~LuminosityBlockWatcher() noexcept(false) override
Definition: implementors.h:112
~LuminosityBlockCacheHolder() noexcept(false) override
Definition: implementors.h:302
~Transformer() noexcept(false) override
Definition: implementors.h:347
void doBeginRun_(Run const &rp, EventSetup const &c) final
ProductResolverIndex transformPrefetch_(std::size_t iIndex) const final
Definition: implementors.h:397
EndProcessBlockProducer & operator=(EndProcessBlockProducer const &)=delete
SharedResourcesAcquirer createAcquirer() override
void doEndLuminosityBlockProduce_(LuminosityBlock &lbp, EventSetup const &c) final
virtual void beginLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &)=0
EndRunProducer & operator=(EndRunProducer const &)=delete
EndLuminosityBlockProducer & operator=(EndLuminosityBlockProducer const &)=delete
~EndLuminosityBlockProducer() noexcept(false) override
Definition: implementors.h:214
void registerTransformAsyncImp(ProducerBase &, EDPutToken, const TypeID &id, std::string instanceName, PreTransformFunction, TransformFunction)
void preallocLumis(unsigned int iNLumis) final
Definition: implementors.h:305
virtual void beginRunProduce(edm::Run &, edm::EventSetup const &)=0
void registerTransform(ProductRegistryHelper::BranchAliasSetterT< G > iSetter, F &&iF, std::string productInstance=std::string())
Definition: implementors.h:350
bool hasAccumulator() const override
Definition: implementors.h:334
std::set< std::string > resourceNames_
Definition: implementors.h:87
std::pair< OmniClusterRef, TrackingParticleRef > P
virtual void beginProcessBlockProduce(edm::ProcessBlock &)=0
void doBeginRun_(Run const &rp, EventSetup const &c) final
Definition: implementors.h:284
void doEndLuminosityBlock_(LuminosityBlock const &rp, EventSetup const &c) final
C * luminosityBlockCache(edm::LuminosityBlockIndex iID)
Definition: implementors.h:308
~BeginLuminosityBlockProducer() noexcept(false) override
Definition: implementors.h:200
~BeginRunProducer() noexcept(false) override
Definition: implementors.h:172
C const * runCache(edm::RunIndex iID) const
Definition: implementors.h:281
virtual void globalEndLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &)=0
virtual void beginRun(edm::Run const &, edm::EventSetup const &)=0
void doEndProcessBlock_(ProcessBlock const &) final
HLT enums.
RunCacheHolder< T, C > & operator=(RunCacheHolder< T, C > const &)=delete
void doEndRunProduce_(Run &rp, EventSetup const &c) final
Accumulator & operator=(Accumulator const &)=delete
virtual std::shared_ptr< C > globalBeginLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) const =0
void doEndProcessBlockProduce_(ProcessBlock &) final
def cache(function)
Definition: utilities.py:3
~RunWatcher() noexcept(false) override
Definition: implementors.h:96
void doBeginLuminosityBlockProduce_(LuminosityBlock &lbp, EventSetup const &c) final
virtual void endLuminosityBlockProduce(edm::LuminosityBlock &, edm::EventSetup const &)=0
InputProcessBlockCacheHolder & operator=(InputProcessBlockCacheHolder const &)=delete
std::unique_ptr< std::shared_ptr< C >[]> caches_
Definition: implementors.h:293
virtual void globalEndRun(edm::Run const &, edm::EventSetup const &)=0
void registerTransformImp(ProducerBase &, EDPutToken, const TypeID &id, std::string instanceName, TransformFunction)
WatchProcessBlock & operator=(WatchProcessBlock const &)=delete
~BeginProcessBlockProducer() noexcept(false) override
Definition: implementors.h:144
std::tuple< CacheHandle< CacheTypes >... > processBlockCaches(Event const &event) const
Definition: implementors.h:230
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
Definition: blowfish.cc:163
void registerTransformAsync(edm::EDPutTokenT< G > iToken, P iPre, F iF, std::string productInstance=std::string())
Definition: implementors.h:372
long double T
void registerTransform(edm::EDPutTokenT< G > iToken, F iF, std::string productInstance=std::string())
Definition: implementors.h:357
Transformer & operator=(Transformer const &)=delete
virtual std::shared_ptr< C > globalBeginRun(edm::Run const &, edm::EventSetup const &) const =0
void doBeginLuminosityBlock_(LuminosityBlock const &lp, EventSetup const &c) final
Definition: implementors.h:311
def move(src, dest)
Definition: eostools.py:511
size_t transformIndex_(edm::BranchDescription const &iBranch) const final
Definition: implementors.h:394
Definition: event.py:1
Definition: Run.h:45
~RunCacheHolder() noexcept(false) override
Definition: implementors.h:275
std::size_t findMatchingIndex(ProducerBase const &iBase, edm::BranchDescription const &) const