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 
113  char const*
115  if (i >= numberOfMatches_) {
117  << "ProductHolderIndexHelper::Matches::processName - Argument is out of range.\n";
118  }
119  unsigned int startInProcessNames = productHolderIndexHelper_->indexAndNames_[startInIndexAndNames_ + i].startInProcessNames();
120  return &productHolderIndexHelper_->processNames_[startInProcessNames];
121  }
122 
123  char const*
125  if (i >= numberOfMatches_) {
127  << "ProductHolderIndexHelper::Matches::moduleLabel - Argument is out of range.\n";
128  }
129  unsigned int start = productHolderIndexHelper_->indexAndNames_[startInIndexAndNames_ + i].startInBigNamesContainer();
130  return &productHolderIndexHelper_->bigNamesContainer_[start];
131  }
132 
135  TypeID const& typeID,
136  char const* moduleLabel,
137  char const* instance) const {
138 
139  unsigned int startInIndexAndNames = indexToIndexAndNames(kindOfType,
140  typeID,
141  moduleLabel,
142  instance,
143  0);
144  unsigned int numberOfMatches = 1;
145 
146  if (startInIndexAndNames == std::numeric_limits<unsigned int>::max()) {
147  numberOfMatches = 0;
148  } else {
149  auto vSize = indexAndNames_.size();
150  for (unsigned int j = startInIndexAndNames + 1U;
151  j < vSize && (indexAndNames_[j].startInProcessNames() != 0U);
152  ++j) {
153  ++numberOfMatches;
154  }
155  }
156  return Matches(this, startInIndexAndNames, numberOfMatches);
157  }
158 
161  TypeID const& typeID) const {
162 
163  unsigned int startInIndexAndNames = std::numeric_limits<unsigned int>::max();
164  unsigned int numberOfMatches = 0;
165 
166  // Look for the type and check to see if it found it
167  unsigned iType = indexToType(kindOfType, typeID);
169 
170  // Get the range of entries with a matching TypeID
171  Range const& range = ranges_[iType];
172 
173  startInIndexAndNames = range.begin();
174  numberOfMatches = range.end() - range.begin();
175  }
176  return Matches(this, startInIndexAndNames, numberOfMatches);
177  }
178 
181  char const* moduleLabel,
182  char const* instance,
183  char const* process,
184  TypeID const& containedTypeID) {
185  if (!items_) {
187  << "ProductHolderIndexHelper::insert - Attempt to insert more elements after frozen.\n";
188  }
189 
190  if (process == 0 || *process == '\0') {
192  << "ProductHolderIndexHelper::insert - Empty process.\n";
193  }
194 
195  // Throw if this has already been inserted
196  Item item(PRODUCT_TYPE, typeID, moduleLabel, instance, process, 0);
197  std::set<Item>::iterator iter = items_->find(item);
198  if (iter != items_->end()) {
200  << "ProductHolderIndexHelper::insert - Attempt to insert duplicate entry.\n";
201  }
202 
203  // Put in an entry for the product
205  unsigned int savedProductIndex = nextIndexValue_;
206  ++nextIndexValue_;
207  items_->insert(item);
208 
209  // Put in an entry for the product with an empty process name
210  // if it is not already there
211  item.clearProcess();
212  iter = items_->find(item);
213  if (iter == items_->end()) {
215  ++nextIndexValue_;
216  items_->insert(item);
217  }
218 
219  // Now put in entries for a contained class if this is a
220  // recognized container.
221  if(containedTypeID != TypeID(typeid(void)) && containedTypeID != TypeID()) {
222  TypeWithDict containedType(containedTypeID.typeInfo());
223 
224  Item containedItem(ELEMENT_TYPE, containedTypeID, moduleLabel, instance, process, savedProductIndex);
225  iter = items_->find(containedItem);
226  if (iter != items_->end()) {
227  containedItem.setIndex(ProductHolderIndexAmbiguous);
228  items_->erase(iter);
229  }
230  items_->insert(containedItem);
231 
232  containedItem.clearProcess();
233  iter = items_->find(containedItem);
234  if (iter == items_->end()) {
235  containedItem.setIndex(nextIndexValue_);
236  ++nextIndexValue_;
237  items_->insert(containedItem);
238  }
239 
240  // Repeat this for all public base classes of the contained type
241  std::vector<TypeWithDict> baseTypes;
242  public_base_classes(containedType, baseTypes);
243 
244  for(TypeWithDict const& baseType : baseTypes) {
245 
246  TypeID baseTypeID(baseType.typeInfo());
247  Item baseItem(ELEMENT_TYPE, baseTypeID, moduleLabel, instance, process, savedProductIndex);
248  iter = items_->find(baseItem);
249  if (iter != items_->end()) {
250  baseItem.setIndex(ProductHolderIndexAmbiguous);
251  items_->erase(iter);
252  }
253  items_->insert(baseItem);
254 
255  baseItem.clearProcess();
256  iter = items_->find(baseItem);
257  if (iter == items_->end()) {
258  baseItem.setIndex(nextIndexValue_);
259  ++nextIndexValue_;
260  items_->insert(baseItem);
261  }
262  }
263  }
264  return savedProductIndex;
265  }
266 
268 
269  if (!items_) return;
270 
271  // Make a first pass and count things so we
272  // can reserve memory in the vectors. Also
273  // fill processItems_ on the first pass.
274  bool iFirstThisType = true;
275  bool beginElementsWasSet = false;
276  TypeID previousTypeID;
277  KindOfType previousKindOfType = PRODUCT_TYPE;
278  std::string previousModuleLabel;
279  std::string previousInstance;
280  unsigned int iCountTypes = 0;
281  unsigned int iCountCharacters = 0;
282  for (auto const& item : *items_) {
283 
284  if (iFirstThisType || item.typeID() != previousTypeID || item.kindOfType() != previousKindOfType) {
285  ++iCountTypes;
286  iFirstThisType = true;
287 
288  if (!beginElementsWasSet) {
289  if (item.kindOfType() == ELEMENT_TYPE) {
290  beginElementsWasSet = true;
291  } else {
292  beginElements_ = iCountTypes;
293  }
294  }
295  }
296 
297  processItems_->insert(item.process());
298 
299  if (iFirstThisType ||
300  item.moduleLabel() != previousModuleLabel ||
301  item.instance() != previousInstance) {
302  iCountCharacters += item.moduleLabel().size();
303  iCountCharacters += item.instance().size();
304  iCountCharacters += 2;
305  }
306 
307  iFirstThisType = false;
308  previousTypeID = item.typeID();
309  previousKindOfType = item.kindOfType();
310  previousModuleLabel = item.moduleLabel();
311  previousInstance = item.instance();
312  }
313 
314  // Size and fill the process name vector
315  unsigned int processNamesSize = 0;
316  for (auto const& processItem : *processItems_) {
317  processNamesSize += processItem.size();
318  ++processNamesSize;
319  }
320  processNames_.reserve(processNamesSize);
321  for (auto const& processItem : *processItems_) {
322  for (auto const& c : processItem) {
323  processNames_.push_back(c);
324  }
325  processNames_.push_back('\0');
326  lookupProcessNames_.push_back(processItem);
327  }
328 
329  // Reserve memory in the vectors
330  sortedTypeIDs_.reserve(iCountTypes);
331  ranges_.reserve(iCountTypes);
332  indexAndNames_.reserve(items_->size());
333  bigNamesContainer_.reserve(iCountCharacters);
334 
335  // Second pass. Really fill the vectors this time.
336  bool iFirstType = true;
337  iFirstThisType = true;
338  previousTypeID = TypeID();
339  unsigned int iCount = 0;
340  unsigned int iBeginning = 0;
341  iCountCharacters = 0;
342  unsigned int previousCharacterCount = 0;
343  if (!items_->empty()) {
344  for (auto const& item : *items_) {
345 
346  if (iFirstThisType || item.typeID() != previousTypeID || item.kindOfType() != previousKindOfType) {
347  iFirstThisType = true;
348  sortedTypeIDs_.push_back(item.typeID());
349  if (iFirstType) {
350  iFirstType = false;
351  } else {
352  ranges_.push_back(Range(iBeginning, iCount));
353  }
354  iBeginning = iCount;
355  }
356  ++iCount;
357 
358  if (iFirstThisType ||
359  item.moduleLabel() != previousModuleLabel ||
360  item.instance() != previousInstance) {
361 
362  unsigned int labelSize = item.moduleLabel().size();
363  for (unsigned int j = 0; j < labelSize; ++j) {
364  bigNamesContainer_.push_back(item.moduleLabel()[j]);
365  }
366  bigNamesContainer_.push_back('\0');
367 
368  unsigned int instanceSize = item.instance().size();
369  for (unsigned int j = 0; j < instanceSize; ++j) {
370  bigNamesContainer_.push_back(item.instance()[j]);
371  }
372  bigNamesContainer_.push_back('\0');
373 
374  previousCharacterCount = iCountCharacters;
375 
376  iCountCharacters += labelSize;
377  iCountCharacters += instanceSize;
378  iCountCharacters += 2;
379  }
380 
381  unsigned int processStart = processIndex(item.process().c_str());
382  if (processStart == std::numeric_limits<unsigned int>::max()) {
384  << "ProductHolderIndexHelper::setFrozen - Process not found in processNames_.\n";
385  }
386  indexAndNames_.emplace_back(item.index(), previousCharacterCount, processStart);
387 
388  iFirstThisType = false;
389  previousTypeID = item.typeID();
390  previousKindOfType = item.kindOfType();
391  previousModuleLabel = item.moduleLabel();
392  previousInstance = item.instance();
393  }
394  ranges_.push_back(Range(iBeginning, iCount));
395  }
396 
397  // Some sanity checks to protect against out of bounds vector accesses
398  // These should only fail if there is a bug. If profiling ever shows
399  // them to be expensive one might delete them.
400  sanityCheck();
401 
402  // Cleanup, do not need the temporary containers anymore
403  items_.reset();
404  processItems_.reset();
405  }
406 
407  std::vector<std::string> const& ProductHolderIndexHelper::lookupProcessNames() const {
408  if (items_) {
410  << "ProductHolderIndexHelper::lookupProcessNames - Attempt to access names before frozen.\n";
411  }
412  return lookupProcessNames_;
413  }
414 
415  unsigned int
417  TypeID const& typeID,
418  char const* moduleLabel,
419  char const* instance,
420  char const* process) const {
421 
422  // Look for the type and check to see if it found it
423  unsigned iType = indexToType(kindOfType, typeID);
425 
426  unsigned startProcess = 0;
427  if (process) {
428  startProcess = processIndex(process);
429  if (startProcess == std::numeric_limits<unsigned int>::max()) {
431  }
432  }
433 
434  ProductHolderIndexHelper::Range const& range = ranges_[iType];
435  unsigned int begin = range.begin();
436  unsigned int end = range.end();
437 
438  while (begin < end) {
439 
440  unsigned int midpoint = begin + ((end - begin) / 2);
441  char const* namePtr = &bigNamesContainer_[indexAndNames_[midpoint].startInBigNamesContainer()];
442 
443  // Compare the module label
444  char const* label = moduleLabel;
445  while (*namePtr && (*namePtr == *label)) {
446  ++namePtr; ++label;
447  }
448  if (*namePtr == *label) { // true only if both are at the '\0' at the end of the C string
449  ++namePtr; // move to the next C string
450 
451  // Compare the instance name
452  char const* instanceName = instance;
453  while (*namePtr && (*namePtr == *instanceName)) {
454  ++namePtr; ++instanceName;
455  }
456  if (*namePtr == *instanceName) {
457 
458  // Compare the process name
459  if (startProcess == indexAndNames_[midpoint].startInProcessNames()) {
460  return midpoint;
461  } else {
462  if (indexAndNames_[midpoint].startInProcessNames() > startProcess) {
463  while (true) {
464  --midpoint;
465  if (indexAndNames_[midpoint].startInProcessNames() == startProcess) {
466  return midpoint;
467  }
468  if (indexAndNames_[midpoint].startInProcessNames() == 0) break;
469  }
470  } else {
471  while (true) {
472  ++midpoint;
473  if (midpoint == indexAndNames_.size()) break;
474  if (indexAndNames_[midpoint].startInProcessNames() == 0) break;
475  if (indexAndNames_[midpoint].startInProcessNames() == startProcess) {
476  return midpoint;
477  }
478  }
479  }
480  break;
481  }
482  } else if (*namePtr < *instanceName) {
483  if (begin == midpoint) break;
484  begin = midpoint;
485  } else {
486  end = midpoint;
487  }
488  } else if (*namePtr < *label) {
489  if (begin == midpoint) break;
490  begin = midpoint;
491  } else {
492  end = midpoint;
493  }
494  } // end while (begin < end)
495  }
497  }
498 
499  unsigned int
501  TypeID const& typeID) const {
502 
503  unsigned int beginType = 0;
504  unsigned int endType = beginElements_;
505  if (kindOfType == ELEMENT_TYPE) {
506  beginType = beginElements_;
507  endType = sortedTypeIDs_.size();
508  }
509 
510  while (beginType < endType) {
511  unsigned int midpointType = beginType + ((endType - beginType) / 2);
512  if (sortedTypeIDs_[midpointType] == typeID) {
513  return midpointType; // Found it
514  } else if (sortedTypeIDs_[midpointType] < typeID) {
515  if (beginType == midpointType) break;
516  beginType = midpointType;
517  } else {
518  endType = midpointType;
519  }
520  }
521  return std::numeric_limits<unsigned int>::max(); // Failed to find it
522  }
523 
524  unsigned int ProductHolderIndexHelper::processIndex(char const* process) const {
525 
526  char const* ptr = &processNames_[0];
527  char const* begin = ptr;
528  while (true) {
529  char const* p = process;
530  char const* beginName = ptr;
531  while (*ptr && (*ptr == *p)) {
532  ++ptr; ++p;
533  }
534  if (*ptr == *p) {
535  return beginName - begin;
536  }
537  while (*ptr) {
538  ++ptr;
539  }
540  ++ptr;
541  if (static_cast<unsigned>(ptr - begin) >= processNames_.size()) {
543  }
544  }
545  return 0;
546  }
547 
549  bool sanityChecksPass = true;
550  if (sortedTypeIDs_.size() != ranges_.size()) sanityChecksPass = false;
551 
552  unsigned int previousEnd = 0;
553  for ( auto const& range : ranges_) {
554  if (range.begin() != previousEnd) sanityChecksPass = false;
555  if (range.begin() >= range.end()) sanityChecksPass = false;
556  previousEnd = range.end();
557  }
558  if (previousEnd != indexAndNames_.size()) sanityChecksPass = false;
559 
560 
561  unsigned maxStart = 0;
562  unsigned maxStartProcess = 0;
563  for (auto const& indexAndName : indexAndNames_) {
564  if (indexAndName.index() >= nextIndexValue_ && indexAndName.index() != ProductHolderIndexAmbiguous) sanityChecksPass = false;
565 
566  if (indexAndName.startInBigNamesContainer() >= bigNamesContainer_.size()) sanityChecksPass = false;
567  if (indexAndName.startInProcessNames() >= processNames_.size()) sanityChecksPass = false;
568 
569  if (indexAndName.startInBigNamesContainer() > maxStart) maxStart = indexAndName.startInBigNamesContainer();
570  if (indexAndName.startInProcessNames() > maxStartProcess) maxStartProcess = indexAndName.startInProcessNames();
571  }
572 
573  if (!indexAndNames_.empty()) {
574  if (bigNamesContainer_.back() != '\0') sanityChecksPass = false;
575  if (processNames_.back() != '\0') sanityChecksPass = false;
576  if (maxStart >= bigNamesContainer_.size()) sanityChecksPass = false;
577  unsigned int countZeroes = 0;
578  for (unsigned j = maxStart; j < bigNamesContainer_.size(); ++j) {
579  if (bigNamesContainer_[j] == '\0') {
580  ++countZeroes;
581  }
582  }
583  if (countZeroes != 2) sanityChecksPass = false;
584  if (maxStartProcess >= processNames_.size()) sanityChecksPass = false;
585  countZeroes = 0;
586  for (unsigned j = maxStartProcess; j < processNames_.size(); ++j) {
587  if (processNames_[j] == '\0') {
588  ++countZeroes;
589  }
590  }
591  if (countZeroes != 1) sanityChecksPass = false;
592  }
593 
594  if (!sanityChecksPass) {
596  << "ProductHolderIndexHelper::setFrozen - Detected illegal state.\n";
597  }
598  }
599 
601  TypeID const& typeID,
602  std::string const& moduleLabel,
603  std::string const& instance,
604  std::string const& process,
606  kindOfType_(kindOfType),
607  typeID_(typeID),
608  moduleLabel_(moduleLabel),
609  instance_(instance),
610  process_(process),
611  index_(index) {
612  }
613 
614  bool
616  if (kindOfType_ < right.kindOfType_) return true;
617  if (kindOfType_ > right.kindOfType_) return false;
618  if (typeID_ < right.typeID_) return true;
619  if (typeID_ > right.typeID_) return false;
620  if (moduleLabel_ < right.moduleLabel_) return true;
621  if (moduleLabel_ > right.moduleLabel_) return false;
622  if (instance_ < right.instance_) return true;
623  if (instance_ > right.instance_) return false;
624  return process_ < right.process_;
625  }
626 
627  void ProductHolderIndexHelper::print(std::ostream& os) const {
628 
629  os << "\n******* Dump ProductHolderIndexHelper *************************\n";
630 
631  os << "\nnextIndexValue_ = " << nextIndexValue_ << "\n";
632  os << "beginElements_ = " << beginElements_ << "\n";
633 
634  os << "\n******* sortedTypeIDs_ \n";
635  for (auto const& i : sortedTypeIDs_) {
636  os << i << "\n";
637  }
638  os << "******* ranges_ \n";
639  for (auto const& i : ranges_) {
640  os << i.begin() << " " << i.end() << "\n";
641  }
642  os << "******* indexAndNames_ \n";
643  for (auto const& i : indexAndNames_) {
644  os << i.index() << " " << i.startInBigNamesContainer() << " ";
645  char const* ptr = &bigNamesContainer_[i.startInBigNamesContainer()];
646  while (*ptr) {
647  os << *ptr;
648  ++ptr;
649  }
650  ++ptr;
651  os << " ";
652  while (*ptr) {
653  os << *ptr;
654  ++ptr;
655  }
656  os << " " << i.startInProcessNames() << " ";
657  ptr = &processNames_[i.startInProcessNames()];
658  while (*ptr) {
659  os << *ptr;
660  ++ptr;
661  }
662  os << "\n";
663  }
664  os << "******* bigNamesContainer_ \n";
665  for (auto i : bigNamesContainer_) {
666  if (i == '\0') os << '\\' << '0';
667  else os << i;
668  }
669  if (!bigNamesContainer_.empty()) os << "\n";
670  os << "******* processNames_ \n";
671  for (auto i : processNames_) {
672  if (i == '\0') os << '\\' << '0';
673  else os << i;
674  }
675  if (!processNames_.empty()) os << "\n";
676  if (items_) {
677  os << "******* items_ \n";
678  for (auto const& item : *items_) {
679  std:: cout << item.kindOfType() << " " << item.moduleLabel() << " " << item.instance() << " " << item.process() << " " << item.index() << " " << item.typeID() << "\n";
680  }
681  }
682  if (processItems_) {
683  os << "******* processItems_ \n";
684  for (auto const& item : *processItems_) {
685  os << item << "\n";
686  }
687  }
688  os << "sortedTypeIDs_.size() = " << sortedTypeIDs_.size() << "\n";
689  os << "indexAndNames_.size() = " << indexAndNames_.size() << "\n";
690  os << "bigNamesContainer_.size() = " << bigNamesContainer_.size() << "\n";
691  os << "processNames_.size() = " << processNames_.size() << "\n";
692  os << "\n";
693  }
694 }
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
tuple start
Check for commandline option errors.
Definition: dqm_diff.py:58
std::unique_ptr< std::set< std::string > > processItems_
TypeID getContainedTypeFromWrapper(TypeID const &wrappedtypeID, std::string const &className)
char const * moduleLabel(unsigned int i) const
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_
char const * processName(unsigned int i) const
void print(std::ostream &os) const
unsigned int ProductHolderIndex
const std::type_info & typeInfo() const
Definition: TypeIDBase.h:58
std::vector< std::string > lookupProcessNames_
static TypeWithDict byName(std::string const &name)
Definition: TypeWithDict.cc:60
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
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