CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EDConsumerBase.h
Go to the documentation of this file.
1 #ifndef FWCore_Framework_EDConsumerBase_h
2 #define FWCore_Framework_EDConsumerBase_h
3 // -*- C++ -*-
4 //
5 // Package: FWCore/Framework
6 // Class : EDConsumerBase
7 //
16 //
17 // Original Author: Chris Jones
18 // Created: Tue, 02 Apr 2013 21:35:53 GMT
19 //
20 
21 // system include files
22 #include <vector>
23 
24 // user include files
34 
35 
36 // forward declarations
37 
38 namespace edm {
39  class ProductHolderIndexHelper;
40  class ConsumesCollector;
41  template<typename T> class WillGetIfMatch;
42 
44  {
45 
46  public:
48  virtual ~EDConsumerBase();
49 
50  // ---------- const member functions ---------------------
52 
53  void itemsToGet(BranchType, std::vector<ProductHolderIndexAndSkipBit>&) const;
54  void itemsMayGet(BranchType, std::vector<ProductHolderIndexAndSkipBit>&) const;
55 
56  std::vector<ProductHolderIndexAndSkipBit> const& itemsToGetFromEvent() const { return itemsToGetFromEvent_; }
57 
60 
62  bool registeredToConsumeMany(TypeID const&, BranchType) const;
63  // ---------- static member functions --------------------
64 
65  // ---------- member functions ---------------------------
66  void updateLookup(BranchType iBranchType,
68 
69  struct Labels {
70  const char* module;
71  const char* productInstance;
72  const char* process;
73  };
74  void labelsForToken(EDGetToken iToken, Labels& oLabels) const;
75 
76  protected:
77  friend class ConsumesCollector;
78  template<typename T> friend class WillGetIfMatch;
81 
82  template <typename ProductType, BranchType B=InEvent>
84  TypeToGet tid=TypeToGet::make<ProductType>();
85  return EDGetTokenT<ProductType>{recordConsumes(B,tid, tag,true)};
86  }
87 
89  return EDGetToken{recordConsumes(InEvent, id, tag, true)};
90  }
91 
92  template <BranchType B>
94  return EDGetToken{recordConsumes(B, id, tag, true)};
95  }
96 
97  template <typename ProductType, BranchType B=InEvent>
99  TypeToGet tid=TypeToGet::make<ProductType>();
100  return EDGetTokenT<ProductType>{recordConsumes(B, tid, tag, false)};
101  }
102 
104  return mayConsume<InEvent>(id,tag);
105  }
106 
107  template <BranchType B>
109  return EDGetToken{recordConsumes(B,id,tag,false)};
110  }
111 
112  template <typename ProductType, BranchType B=InEvent>
113  void consumesMany() {
114  TypeToGet tid=TypeToGet::make<ProductType>();
115  consumesMany<B>(tid);
116  }
117 
118  void consumesMany(const TypeToGet& id) {
119  consumesMany<InEvent>(id);
120  }
121 
122  template <BranchType B>
123  void consumesMany(const TypeToGet& id) {
124  recordConsumes(B,id,edm::InputTag{},true);
125  }
126 
127  private:
128  EDConsumerBase(const EDConsumerBase&) = delete;
129 
130  const EDConsumerBase& operator=(const EDConsumerBase&) = delete;
131 
132  unsigned int recordConsumes(BranchType iBranch, TypeToGet const& iType, edm::InputTag const& iTag, bool iAlwaysGets);
133 
134  void throwTypeMismatch(edm::TypeID const&, EDGetToken) const;
136  void throwBadToken(edm::TypeID const& iType, EDGetToken iToken) const;
137  void throwConsumesCallAfterFrozen(TypeToGet const&, InputTag const&) const;
138 
139  // ---------- member data --------------------------------
140 
143  ProductHolderIndex iIndex,
144  bool skipCurrentProcess,
145  BranchType iBranch):
146  m_type(iID),m_index(iIndex, skipCurrentProcess), m_branchType(iBranch){}
150  };
151 
152  struct LabelPlacement {
153  LabelPlacement(unsigned int iStartOfModuleLabel,
154  unsigned short iDeltaToProductInstance,
155  unsigned short iDeltaToProcessName):
156  m_startOfModuleLabel(iStartOfModuleLabel),
157  m_deltaToProductInstance(iDeltaToProductInstance),
158  m_deltaToProcessName(iDeltaToProcessName) {}
159  unsigned int m_startOfModuleLabel;
160  unsigned short m_deltaToProductInstance;
161  unsigned short m_deltaToProcessName;
162  };
163 
164  //define the purpose of each 'column' in m_tokenInfo
167 
168  //m_tokenStartOfLabels holds the entries into this container
169  // for each of the 3 labels needed to id the data
170  std::vector<char> m_tokenLabels;
171 
172  std::vector<ProductHolderIndexAndSkipBit> itemsToGetFromEvent_;
173 
174  bool frozen_;
175  };
176 }
177 
178 #endif
ProductHolderIndexAndSkipBit m_index
const EDConsumerBase & operator=(const EDConsumerBase &)=delete
void updateLookup(BranchType iBranchType, ProductHolderIndexHelper const &)
void itemsToGet(BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
void itemsMayGet(BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
void consumesMany(const TypeToGet &id)
void throwTypeMismatch(edm::TypeID const &, EDGetToken) const
LabelPlacement(unsigned int iStartOfModuleLabel, unsigned short iDeltaToProductInstance, unsigned short iDeltaToProcessName)
void throwBadToken(edm::TypeID const &iType, EDGetToken iToken) const
std::vector< ProductHolderIndexAndSkipBit > const & itemsToGetFromEvent() const
ProductHolderIndexAndSkipBit indexFrom(EDGetToken, BranchType, TypeID const &) const
unsigned int ProductHolderIndex
void throwConsumesCallAfterFrozen(TypeToGet const &, InputTag const &) const
edm::SoATuple< TokenLookupInfo, bool, LabelPlacement, edm::KindOfType > m_tokenInfo
BranchType
Definition: BranchType.h:11
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
unsigned int recordConsumes(BranchType iBranch, TypeToGet const &iType, edm::InputTag const &iTag, bool iAlwaysGets)
void consumesMany(const TypeToGet &id)
EDGetToken mayConsume(const TypeToGet &id, edm::InputTag const &tag)
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
void throwBranchMismatch(BranchType, EDGetToken) const
EDGetToken mayConsume(const TypeToGet &id, edm::InputTag const &tag)
std::vector< char > m_tokenLabels
EDGetToken consumes(TypeToGet const &id, edm::InputTag const &tag)
bool registeredToConsumeMany(TypeID const &, BranchType) const
void labelsForToken(EDGetToken iToken, Labels &oLabels) const
TokenLookupInfo(edm::TypeID const &iID, ProductHolderIndex iIndex, bool skipCurrentProcess, BranchType iBranch)
bool registeredToConsume(ProductHolderIndex, bool, BranchType) const
std::vector< ProductHolderIndexAndSkipBit > itemsToGetFromEvent_
volatile std::atomic< bool > shutdown_flag false
EDGetTokenT< ProductType > mayConsume(edm::InputTag const &tag)
EDGetToken consumes(const TypeToGet &id, edm::InputTag const &tag)