CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ProductHolderIndexHelper.cc
Go to the documentation of this file.
1 
9 
10 #include <TClass.h>
11 
12 #include <cassert>
13 #include <iostream>
14 #include <limits>
15 
16 namespace edm {
17 
18  namespace productholderindexhelper {
19  TypeID
20  getContainedTypeFromWrapper(TypeID const& wrappedTypeID, std::string const& className) {
21  static int const vtcOffset = TClass::GetClass("edm::WrapperBase")->GetBaseClassOffset(TClass::GetClass("edm::ViewTypeChecker"));
22  static TClass const* const wbClass = TClass::GetClass("edm::WrapperBase");
23  static std::string const refVector("edm::RefVector<");
24  static std::string const refToBaseVector("edm::RefToBaseVector<");
25  static std::string const ptrVector("edm::PtrVector<");
26  static size_t const rvsize = refVector.size();
27  static size_t const rtbvsize = refToBaseVector.size();
28  static size_t const pvsize = ptrVector.size();
29  bool mayBeRefVector = (className.substr(0, rvsize) == refVector)
30  || (className.substr(0, rtbvsize) == refToBaseVector)
31  || (className.substr(0, pvsize) == ptrVector);
32  TClass* cl = TClass::GetClass(wrappedTypeID.className().c_str());
33  if(cl == nullptr) {
34  return TypeID(typeid(void));
35  }
36  void* p = cl->New();
37  int offset = cl->GetBaseClassOffset(wbClass) + vtcOffset;;
38  std::unique_ptr<ViewTypeChecker> checker = getAnyPtr<ViewTypeChecker>(p, offset);
39  if(mayBeRefVector) {
40  std::type_info const& ti = checker->memberTypeInfo();
41  if(ti != typeid(void)) {
42  return TypeID(ti);
43  }
44  }
45  return TypeID(checker->valueTypeInfo());
46  }
47 
48  TypeID
49  getContainedType(TypeID const& typeID) {
50  std::string className = typeID.className();
51  TypeWithDict const wrappedType = TypeWithDict::byName(wrappedClassName(className));
52  TypeID const wrappedTypeID = TypeID(wrappedType.typeInfo());
53  return getContainedTypeFromWrapper(wrappedTypeID, className);
54  }
55  }
56 
58  nextIndexValue_(0),
59  beginElements_(0),
60  items_(new std::set<ProductHolderIndexHelper::Item>),
61  processItems_(new std::set<std::string>) {
62  }
63 
66  TypeID const& typeID,
67  char const* moduleLabel,
68  char const* instance,
69  char const* process) const {
70 
71  unsigned int iToIndexAndNames = indexToIndexAndNames(kindOfType,
72  typeID,
73  moduleLabel,
74  instance,
75  process);
76 
77  if (iToIndexAndNames == std::numeric_limits<unsigned int>::max()) {
79  }
80  return indexAndNames_[iToIndexAndNames].index();
81  }
82 
84  unsigned int startInIndexAndNames,
85  unsigned int numberOfMatches) :
86  productHolderIndexHelper_(productHolderIndexHelper),
87  startInIndexAndNames_(startInIndexAndNames),
88  numberOfMatches_(numberOfMatches) {
89  if (numberOfMatches != 0 && startInIndexAndNames_ + numberOfMatches_ > productHolderIndexHelper_->indexAndNames_.size()) {
91  << "ProductHolderIndexHelper::Matches::Matches - Arguments exceed vector bounds.\n";
92  }
93  }
94 
97  if (i >= numberOfMatches_) {
99  << "ProductHolderIndexHelper::Matches::index - Argument is out of range.\n";
100  }
101  return productHolderIndexHelper_->indexAndNames_[startInIndexAndNames_ + i].index();
102  }
103 
104  bool
106  if (i >= numberOfMatches_) {
108  << "ProductHolderIndexHelper::Matches::isFullyResolved - Argument is out of range.\n";
109  }
110  return (productHolderIndexHelper_->indexAndNames_[startInIndexAndNames_ + i].startInProcessNames() != 0U);
111  }
112 
115  TypeID const& typeID,
116  char const* moduleLabel,
117  char const* instance) const {
118 
119  unsigned int startInIndexAndNames = indexToIndexAndNames(kindOfType,
120  typeID,
121  moduleLabel,
122  instance,
123  0);
124  unsigned int numberOfMatches = 1;
125 
126  if (startInIndexAndNames == std::numeric_limits<unsigned int>::max()) {
127  numberOfMatches = 0;
128  } else {
129  auto vSize = indexAndNames_.size();
130  for (unsigned int j = startInIndexAndNames + 1U;
131  j < vSize && (indexAndNames_[j].startInProcessNames() != 0U);
132  ++j) {
133  ++numberOfMatches;
134  }
135  }
136  return Matches(this, startInIndexAndNames, numberOfMatches);
137  }
138 
141  TypeID const& typeID) const {
142 
143  unsigned int startInIndexAndNames = std::numeric_limits<unsigned int>::max();
144  unsigned int numberOfMatches = 0;
145 
146  // Look for the type and check to see if it found it
147  unsigned iType = indexToType(kindOfType, typeID);
149 
150  // Get the range of entries with a matching TypeID
151  Range const& range = ranges_[iType];
152 
153  startInIndexAndNames = range.begin();
154  numberOfMatches = range.end() - range.begin();
155  }
156  return Matches(this, startInIndexAndNames, numberOfMatches);
157  }
158 
161  char const* moduleLabel,
162  char const* instance,
163  char const* process,
164  TypeID const& containedTypeID) {
165  if (!items_) {
167  << "ProductHolderIndexHelper::insert - Attempt to insert more elements after frozen.\n";
168  }
169 
170  if (process == 0 || *process == '\0') {
172  << "ProductHolderIndexHelper::insert - Empty process.\n";
173  }
174 
175  // Throw if this has already been inserted
176  Item item(PRODUCT_TYPE, typeID, moduleLabel, instance, process, 0);
177  std::set<Item>::iterator iter = items_->find(item);
178  if (iter != items_->end()) {
180  << "ProductHolderIndexHelper::insert - Attempt to insert duplicate entry.\n";
181  }
182 
183  // Put in an entry for the product
185  unsigned int savedProductIndex = nextIndexValue_;
186  ++nextIndexValue_;
187  items_->insert(item);
188 
189  // Put in an entry for the product with an empty process name
190  // if it is not already there
191  item.clearProcess();
192  iter = items_->find(item);
193  if (iter == items_->end()) {
195  ++nextIndexValue_;
196  items_->insert(item);
197  }
198 
199  // Now put in entries for a contained class if this is a
200  // recognized container.
201  if(containedTypeID != TypeID(typeid(void)) && containedTypeID != TypeID()) {
202  TypeWithDict containedType(containedTypeID.typeInfo());
203 
204  Item containedItem(ELEMENT_TYPE, containedTypeID, moduleLabel, instance, process, savedProductIndex);
205  iter = items_->find(containedItem);
206  if (iter != items_->end()) {
207  containedItem.setIndex(ProductHolderIndexAmbiguous);
208  items_->erase(iter);
209  }
210  items_->insert(containedItem);
211 
212  containedItem.clearProcess();
213  iter = items_->find(containedItem);
214  if (iter == items_->end()) {
215  containedItem.setIndex(nextIndexValue_);
216  ++nextIndexValue_;
217  items_->insert(containedItem);
218  }
219 
220  // Repeat this for all public base classes of the contained type
221  std::vector<TypeWithDict> baseTypes;
222  public_base_classes(containedType, baseTypes);
223 
224  for(TypeWithDict const& baseType : baseTypes) {
225 
226  TypeID baseTypeID(baseType.typeInfo());
227  Item baseItem(ELEMENT_TYPE, baseTypeID, moduleLabel, instance, process, savedProductIndex);
228  iter = items_->find(baseItem);
229  if (iter != items_->end()) {
230  baseItem.setIndex(ProductHolderIndexAmbiguous);
231  items_->erase(iter);
232  }
233  items_->insert(baseItem);
234 
235  baseItem.clearProcess();
236  iter = items_->find(baseItem);
237  if (iter == items_->end()) {
238  baseItem.setIndex(nextIndexValue_);
239  ++nextIndexValue_;
240  items_->insert(baseItem);
241  }
242  }
243  }
244  return savedProductIndex;
245  }
246 
248 
249  if (!items_) return;
250 
251  // Make a first pass and count things so we
252  // can reserve memory in the vectors. Also
253  // fill processItems_ on the first pass.
254  bool iFirstThisType = true;
255  bool beginElementsWasSet = false;
256  TypeID previousTypeID;
257  KindOfType previousKindOfType = PRODUCT_TYPE;
258  std::string previousModuleLabel;
259  std::string previousInstance;
260  unsigned int iCountTypes = 0;
261  unsigned int iCountCharacters = 0;
262  for (auto const& item : *items_) {
263 
264  if (iFirstThisType || item.typeID() != previousTypeID || item.kindOfType() != previousKindOfType) {
265  ++iCountTypes;
266  iFirstThisType = true;
267 
268  if (!beginElementsWasSet) {
269  if (item.kindOfType() == ELEMENT_TYPE) {
270  beginElementsWasSet = true;
271  } else {
272  beginElements_ = iCountTypes;
273  }
274  }
275  }
276 
277  processItems_->insert(item.process());
278 
279  if (iFirstThisType ||
280  item.moduleLabel() != previousModuleLabel ||
281  item.instance() != previousInstance) {
282  iCountCharacters += item.moduleLabel().size();
283  iCountCharacters += item.instance().size();
284  iCountCharacters += 2;
285  }
286 
287  iFirstThisType = false;
288  previousTypeID = item.typeID();
289  previousKindOfType = item.kindOfType();
290  previousModuleLabel = item.moduleLabel();
291  previousInstance = item.instance();
292  }
293 
294  // Size and fill the process name vector
295  unsigned int processNamesSize = 0;
296  for (auto const& processItem : *processItems_) {
297  processNamesSize += processItem.size();
298  ++processNamesSize;
299  }
300  processNames_.reserve(processNamesSize);
301  for (auto const& processItem : *processItems_) {
302  for (auto const& c : processItem) {
303  processNames_.push_back(c);
304  }
305  processNames_.push_back('\0');
306  lookupProcessNames_.push_back(processItem);
307  }
308 
309  // Reserve memory in the vectors
310  sortedTypeIDs_.reserve(iCountTypes);
311  ranges_.reserve(iCountTypes);
312  indexAndNames_.reserve(items_->size());
313  bigNamesContainer_.reserve(iCountCharacters);
314 
315  // Second pass. Really fill the vectors this time.
316  bool iFirstType = true;
317  iFirstThisType = true;
318  previousTypeID = TypeID();
319  unsigned int iCount = 0;
320  unsigned int iBeginning = 0;
321  iCountCharacters = 0;
322  unsigned int previousCharacterCount = 0;
323  if (!items_->empty()) {
324  for (auto const& item : *items_) {
325 
326  if (iFirstThisType || item.typeID() != previousTypeID || item.kindOfType() != previousKindOfType) {
327  iFirstThisType = true;
328  sortedTypeIDs_.push_back(item.typeID());
329  if (iFirstType) {
330  iFirstType = false;
331  } else {
332  ranges_.push_back(Range(iBeginning, iCount));
333  }
334  iBeginning = iCount;
335  }
336  ++iCount;
337 
338  if (iFirstThisType ||
339  item.moduleLabel() != previousModuleLabel ||
340  item.instance() != previousInstance) {
341 
342  unsigned int labelSize = item.moduleLabel().size();
343  for (unsigned int j = 0; j < labelSize; ++j) {
344  bigNamesContainer_.push_back(item.moduleLabel()[j]);
345  }
346  bigNamesContainer_.push_back('\0');
347 
348  unsigned int instanceSize = item.instance().size();
349  for (unsigned int j = 0; j < instanceSize; ++j) {
350  bigNamesContainer_.push_back(item.instance()[j]);
351  }
352  bigNamesContainer_.push_back('\0');
353 
354  previousCharacterCount = iCountCharacters;
355 
356  iCountCharacters += labelSize;
357  iCountCharacters += instanceSize;
358  iCountCharacters += 2;
359  }
360 
361  unsigned int processStart = processIndex(item.process().c_str());
362  if (processStart == std::numeric_limits<unsigned int>::max()) {
364  << "ProductHolderIndexHelper::setFrozen - Process not found in processNames_.\n";
365  }
366  indexAndNames_.emplace_back(item.index(), previousCharacterCount, processStart);
367 
368  iFirstThisType = false;
369  previousTypeID = item.typeID();
370  previousKindOfType = item.kindOfType();
371  previousModuleLabel = item.moduleLabel();
372  previousInstance = item.instance();
373  }
374  ranges_.push_back(Range(iBeginning, iCount));
375  }
376 
377  // Some sanity checks to protect against out of bounds vector accesses
378  // These should only fail if there is a bug. If profiling ever shows
379  // them to be expensive one might delete them.
380  sanityCheck();
381 
382  // Cleanup, do not need the temporary containers anymore
383  items_.reset();
384  processItems_.reset();
385  }
386 
387  std::vector<std::string> const& ProductHolderIndexHelper::lookupProcessNames() const {
388  if (items_) {
390  << "ProductHolderIndexHelper::lookupProcessNames - Attempt to access names before frozen.\n";
391  }
392  return lookupProcessNames_;
393  }
394 
395  unsigned int
397  TypeID const& typeID,
398  char const* moduleLabel,
399  char const* instance,
400  char const* process) const {
401 
402  // Look for the type and check to see if it found it
403  unsigned iType = indexToType(kindOfType, typeID);
405 
406  unsigned startProcess = 0;
407  if (process) {
408  startProcess = processIndex(process);
409  if (startProcess == std::numeric_limits<unsigned int>::max()) {
411  }
412  }
413 
414  ProductHolderIndexHelper::Range const& range = ranges_[iType];
415  unsigned int begin = range.begin();
416  unsigned int end = range.end();
417 
418  while (begin < end) {
419 
420  unsigned int midpoint = begin + ((end - begin) / 2);
421  char const* namePtr = &bigNamesContainer_[indexAndNames_[midpoint].startInBigNamesContainer()];
422 
423  // Compare the module label
424  char const* label = moduleLabel;
425  while (*namePtr && (*namePtr == *label)) {
426  ++namePtr; ++label;
427  }
428  if (*namePtr == *label) { // true only if both are at the '\0' at the end of the C string
429  ++namePtr; // move to the next C string
430 
431  // Compare the instance name
432  char const* instanceName = instance;
433  while (*namePtr && (*namePtr == *instanceName)) {
434  ++namePtr; ++instanceName;
435  }
436  if (*namePtr == *instanceName) {
437 
438  // Compare the process name
439  if (startProcess == indexAndNames_[midpoint].startInProcessNames()) {
440  return midpoint;
441  } else {
442  if (indexAndNames_[midpoint].startInProcessNames() > startProcess) {
443  while (true) {
444  --midpoint;
445  if (indexAndNames_[midpoint].startInProcessNames() == startProcess) {
446  return midpoint;
447  }
448  if (indexAndNames_[midpoint].startInProcessNames() == 0) break;
449  }
450  } else {
451  while (true) {
452  ++midpoint;
453  if (midpoint == indexAndNames_.size()) break;
454  if (indexAndNames_[midpoint].startInProcessNames() == 0) break;
455  if (indexAndNames_[midpoint].startInProcessNames() == startProcess) {
456  return midpoint;
457  }
458  }
459  }
460  break;
461  }
462  } else if (*namePtr < *instanceName) {
463  if (begin == midpoint) break;
464  begin = midpoint;
465  } else {
466  end = midpoint;
467  }
468  } else if (*namePtr < *label) {
469  if (begin == midpoint) break;
470  begin = midpoint;
471  } else {
472  end = midpoint;
473  }
474  } // end while (begin < end)
475  }
477  }
478 
479  unsigned int
481  TypeID const& typeID) const {
482 
483  unsigned int beginType = 0;
484  unsigned int endType = beginElements_;
485  if (kindOfType == ELEMENT_TYPE) {
486  beginType = beginElements_;
487  endType = sortedTypeIDs_.size();
488  }
489 
490  while (beginType < endType) {
491  unsigned int midpointType = beginType + ((endType - beginType) / 2);
492  if (sortedTypeIDs_[midpointType] == typeID) {
493  return midpointType; // Found it
494  } else if (sortedTypeIDs_[midpointType] < typeID) {
495  if (beginType == midpointType) break;
496  beginType = midpointType;
497  } else {
498  endType = midpointType;
499  }
500  }
501  return std::numeric_limits<unsigned int>::max(); // Failed to find it
502  }
503 
504  unsigned int ProductHolderIndexHelper::processIndex(char const* process) const {
505 
506  char const* ptr = &processNames_[0];
507  char const* begin = ptr;
508  while (true) {
509  char const* p = process;
510  char const* beginName = ptr;
511  while (*ptr && (*ptr == *p)) {
512  ++ptr; ++p;
513  }
514  if (*ptr == *p) {
515  return beginName - begin;
516  }
517  while (*ptr) {
518  ++ptr;
519  }
520  ++ptr;
521  if (static_cast<unsigned>(ptr - begin) >= processNames_.size()) {
523  }
524  }
525  return 0;
526  }
527 
529  bool sanityChecksPass = true;
530  if (sortedTypeIDs_.size() != ranges_.size()) sanityChecksPass = false;
531 
532  unsigned int previousEnd = 0;
533  for ( auto const& range : ranges_) {
534  if (range.begin() != previousEnd) sanityChecksPass = false;
535  if (range.begin() >= range.end()) sanityChecksPass = false;
536  previousEnd = range.end();
537  }
538  if (previousEnd != indexAndNames_.size()) sanityChecksPass = false;
539 
540 
541  unsigned maxStart = 0;
542  unsigned maxStartProcess = 0;
543  for (auto const& indexAndName : indexAndNames_) {
544  if (indexAndName.index() >= nextIndexValue_ && indexAndName.index() != ProductHolderIndexAmbiguous) sanityChecksPass = false;
545 
546  if (indexAndName.startInBigNamesContainer() >= bigNamesContainer_.size()) sanityChecksPass = false;
547  if (indexAndName.startInProcessNames() >= processNames_.size()) sanityChecksPass = false;
548 
549  if (indexAndName.startInBigNamesContainer() > maxStart) maxStart = indexAndName.startInBigNamesContainer();
550  if (indexAndName.startInProcessNames() > maxStartProcess) maxStartProcess = indexAndName.startInProcessNames();
551  }
552 
553  if (!indexAndNames_.empty()) {
554  if (bigNamesContainer_.back() != '\0') sanityChecksPass = false;
555  if (processNames_.back() != '\0') sanityChecksPass = false;
556  if (maxStart >= bigNamesContainer_.size()) sanityChecksPass = false;
557  unsigned int countZeroes = 0;
558  for (unsigned j = maxStart; j < bigNamesContainer_.size(); ++j) {
559  if (bigNamesContainer_[j] == '\0') {
560  ++countZeroes;
561  }
562  }
563  if (countZeroes != 2) sanityChecksPass = false;
564  if (maxStartProcess >= processNames_.size()) sanityChecksPass = false;
565  countZeroes = 0;
566  for (unsigned j = maxStartProcess; j < processNames_.size(); ++j) {
567  if (processNames_[j] == '\0') {
568  ++countZeroes;
569  }
570  }
571  if (countZeroes != 1) sanityChecksPass = false;
572  }
573 
574  if (!sanityChecksPass) {
576  << "ProductHolderIndexHelper::setFrozen - Detected illegal state.\n";
577  }
578  }
579 
581  TypeID const& typeID,
582  std::string const& moduleLabel,
583  std::string const& instance,
584  std::string const& process,
586  kindOfType_(kindOfType),
587  typeID_(typeID),
588  moduleLabel_(moduleLabel),
589  instance_(instance),
590  process_(process),
591  index_(index) {
592  }
593 
594  bool
596  if (kindOfType_ < right.kindOfType_) return true;
597  if (kindOfType_ > right.kindOfType_) return false;
598  if (typeID_ < right.typeID_) return true;
599  if (typeID_ > right.typeID_) return false;
600  if (moduleLabel_ < right.moduleLabel_) return true;
601  if (moduleLabel_ > right.moduleLabel_) return false;
602  if (instance_ < right.instance_) return true;
603  if (instance_ > right.instance_) return false;
604  return process_ < right.process_;
605  }
606 
607  void ProductHolderIndexHelper::print(std::ostream& os) const {
608 
609  os << "\n******* Dump ProductHolderIndexHelper *************************\n";
610 
611  os << "\nnextIndexValue_ = " << nextIndexValue_ << "\n";
612  os << "beginElements_ = " << beginElements_ << "\n";
613 
614  os << "\n******* sortedTypeIDs_ \n";
615  for (auto const& i : sortedTypeIDs_) {
616  os << i << "\n";
617  }
618  os << "******* ranges_ \n";
619  for (auto const& i : ranges_) {
620  os << i.begin() << " " << i.end() << "\n";
621  }
622  os << "******* indexAndNames_ \n";
623  for (auto const& i : indexAndNames_) {
624  os << i.index() << " " << i.startInBigNamesContainer() << " ";
625  char const* ptr = &bigNamesContainer_[i.startInBigNamesContainer()];
626  while (*ptr) {
627  os << *ptr;
628  ++ptr;
629  }
630  ++ptr;
631  os << " ";
632  while (*ptr) {
633  os << *ptr;
634  ++ptr;
635  }
636  os << " " << i.startInProcessNames() << " ";
637  ptr = &processNames_[i.startInProcessNames()];
638  while (*ptr) {
639  os << *ptr;
640  ++ptr;
641  }
642  os << "\n";
643  }
644  os << "******* bigNamesContainer_ \n";
645  for (auto i : bigNamesContainer_) {
646  if (i == '\0') os << '\\' << '0';
647  else os << i;
648  }
649  if (!bigNamesContainer_.empty()) os << "\n";
650  os << "******* processNames_ \n";
651  for (auto i : processNames_) {
652  if (i == '\0') os << '\\' << '0';
653  else os << i;
654  }
655  if (!processNames_.empty()) os << "\n";
656  if (items_) {
657  os << "******* items_ \n";
658  for (auto const& item : *items_) {
659  std:: cout << item.kindOfType() << " " << item.moduleLabel() << " " << item.instance() << " " << item.process() << " " << item.index() << " " << item.typeID() << "\n";
660  }
661  }
662  if (processItems_) {
663  os << "******* processItems_ \n";
664  for (auto const& item : *processItems_) {
665  os << item << "\n";
666  }
667  }
668  os << "sortedTypeIDs_.size() = " << sortedTypeIDs_.size() << "\n";
669  os << "indexAndNames_.size() = " << indexAndNames_.size() << "\n";
670  os << "bigNamesContainer_.size() = " << bigNamesContainer_.size() << "\n";
671  os << "processNames_.size() = " << processNames_.size() << "\n";
672  os << "\n";
673  }
674 }
Matches relatedIndexes(KindOfType kindOfType, TypeID const &typeID, char const *moduleLabel, char const *instance) const
TypeID getContainedType(TypeID const &typeID)
int i
Definition: DBlmapReader.cc:9
static TypeWithDict byName(std::string const &className)
std::unique_ptr< std::set< std::string > > processItems_
TypeID getContainedTypeFromWrapper(TypeID const &wrappedtypeID, std::string const &className)
static PFTauRenderPlugin instance
ProductHolderIndexHelper const * productHolderIndexHelper_
ProductHolderIndex index(KindOfType kindOfType, TypeID const &typeID, char const *moduleLabel, char const *instance, char const *process=0) const
std::vector< IndexAndNames > indexAndNames_
void print(std::ostream &os) const
unsigned int ProductHolderIndex
const std::type_info & typeInfo() const
Definition: TypeIDBase.h:58
std::vector< std::string > lookupProcessNames_
void public_base_classes(TypeWithDict const &type, std::vector< TypeWithDict > &baseTypes)
Matches(ProductHolderIndexHelper const *productHolderIndexHelper, unsigned int startInIndexAndNames, unsigned int numberOfMatches)
std::unique_ptr< std::set< Item > > items_
bool operator<(Item const &right) const
int j
Definition: DBlmapReader.cc:9
unsigned int indexToType(KindOfType kindOfType, TypeID const &typeID) const
ProductHolderIndex index(unsigned int i) const
std::type_info const & typeInfo() const
unsigned int processIndex(char const *process) const
#define end
Definition: vmac.h:37
unsigned int offset(bool)
PixelRecoRange< float > Range
std::string wrappedClassName(std::string const &iFullName)
#define begin
Definition: vmac.h:30
ProductHolderIndex insert(TypeID const &typeID, char const *moduleLabel, char const *instance, char const *process, TypeID const &containedTypeID)
std::string const & className() const
Definition: TypeID.cc:46
std::vector< std::string > const & lookupProcessNames() const
tuple cout
Definition: gather_cfg.py:121
Item(KindOfType kindOfType, TypeID const &typeID, std::string const &moduleLabel, std::string const &instance, std::string const &process, ProductHolderIndex index)
tuple process
Definition: LaserDQM_cfg.py:3
moduleLabel_(iConfig.getParameter< string >("@module_label"))
std::string className(const T &t)
Definition: ClassName.h:30
unsigned int indexToIndexAndNames(KindOfType kindOfType, TypeID const &typeID, char const *moduleLabel, char const *instance, char const *process) const