@@ -232,60 +232,44 @@ namespace edm {
232232
233233 // Put in an entry for the product with an empty process name
234234 // if it is not already there
235- item.clearProcess ();
236- iter = items_->find (item);
237- if (iter == items_->end ()) {
238- item.setIndex (ProductResolverIndexInitializing);
239- items_->insert (item);
240- // add entry for skipCurrentProcess
241- item.setSkipCurrentProcess ();
242- item.setIndex (ProductResolverIndexInitializing);
243- items_->insert (item);
244- }
235+ auto insertNoProcessCase = [](Item& item, std::set<Item>& container) {
236+ item.clearProcess ();
237+ auto iter = container.find (item);
238+ if (iter == container.end ()) {
239+ item.setIndex (ProductResolverIndexInitializing);
240+ container.insert (item);
241+ // add entry for skipCurrentProcess
242+ item.setSkipCurrentProcess ();
243+ item.setIndex (ProductResolverIndexInitializing);
244+ container.insert (item);
245+ }
246+ };
247+ insertNoProcessCase (item, *items_);
245248
246249 // Now put in entries for a contained class if this is a
247250 // recognized container.
248251 if (containedTypeID != TypeID (typeid (void )) && containedTypeID != TypeID ()) {
249252 TypeWithDict containedType (containedTypeID.typeInfo ());
250253
251- Item containedItem (ELEMENT_TYPE, containedTypeID, moduleLabel, instance, process, savedProductIndex);
252- iter = items_->find (containedItem);
253- if (iter != items_->end ()) {
254- containedItem.setIndex (ProductResolverIndexAmbiguous);
255- items_->erase (iter);
256- }
257- items_->insert (containedItem);
254+ auto insertAndCheckForAmbiguous = [](Item& item, std::set<Item>& container) {
255+ auto iter = container.find (item);
256+ if (iter != container.end ()) {
257+ item.setIndex (ProductResolverIndexAmbiguous);
258+ container.erase (iter);
259+ }
260+ container.insert (item);
261+ };
258262
259- containedItem.clearProcess ();
260- iter = items_->find (containedItem);
261- if (iter == items_->end ()) {
262- containedItem.setIndex (ProductResolverIndexInitializing);
263- items_->insert (containedItem);
264- containedItem.setSkipCurrentProcess ();
265- containedItem.setIndex (ProductResolverIndexInitializing);
266- items_->insert (containedItem);
267- }
263+ Item containedItem (ELEMENT_TYPE, containedTypeID, moduleLabel, instance, process, savedProductIndex);
264+ insertAndCheckForAmbiguous (containedItem, *items_);
265+ insertNoProcessCase (containedItem, *items_);
268266
269267 // Repeat this for all public base classes of the contained type
270268 if (baseTypesOfContainedType) {
271269 for (TypeID const & baseTypeID : *baseTypesOfContainedType) {
272270 Item baseItem (ELEMENT_TYPE, baseTypeID, moduleLabel, instance, process, savedProductIndex);
273- iter = items_->find (baseItem);
274- if (iter != items_->end ()) {
275- baseItem.setIndex (ProductResolverIndexAmbiguous);
276- items_->erase (iter);
277- }
278- items_->insert (baseItem);
279-
280- baseItem.clearProcess ();
281- iter = items_->find (baseItem);
282- if (iter == items_->end ()) {
283- baseItem.setIndex (ProductResolverIndexInitializing);
284- items_->insert (baseItem);
285- baseItem.setSkipCurrentProcess ();
286- baseItem.setIndex (ProductResolverIndexInitializing);
287- items_->insert (baseItem);
288- }
271+ insertAndCheckForAmbiguous (baseItem, *items_);
272+ insertNoProcessCase (baseItem, *items_);
289273 }
290274 }
291275 }
@@ -312,54 +296,65 @@ namespace edm {
312296 std::vector<edm::ProductResolverIndexHelper::IndexAndNames>::iterator itEnd,
313297 std::vector<std::string> const & orderedProcessNames,
314298 std::vector<char > const & processNames) {
299+ /* The order of the iterators should be
300+ 0 : the empty process name case -> ''
301+ 1 : the skip current process case -> '#'
302+ 2+: the cases with a specific process name*/
315303 using IndexAndNames = edm::ProductResolverIndexHelper::IndexAndNames;
316304 assert (itEnd - itBegin > 2 );
317- assert (itBegin->startInProcessNames () == 0U );
318- assert ((itBegin + 1 )->startInProcessNames () == 1U );
319- assert (processNames[(itBegin + 1 )->startInProcessNames ()] == ' #' );
320- assert (itBegin->index () == edm::ProductResolverIndexInitializing);
321- assert ((itBegin + 1 )->index () == edm::ProductResolverIndexInitializing);
305+ const auto itNoProcess = itBegin;
306+ const auto itSkipCurrentProcess = itBegin + 1 ;
307+ const auto itFirstWithSetProcess = itBegin + 2 ;
308+ assert (itNoProcess->startInProcessNames () == 0U );
309+ assert (itSkipCurrentProcess->startInProcessNames () == 1U );
310+ assert (processNames[itSkipCurrentProcess->startInProcessNames ()] == ' #' );
311+ assert (itNoProcess->index () == edm::ProductResolverIndexInitializing);
312+ assert (itSkipCurrentProcess->index () == edm::ProductResolverIndexInitializing);
322313 if (itEnd - itBegin == 3 ) {
323314 // only have one actual process
324- *itBegin =
325- IndexAndNames ((itBegin + 2 )->index (), itBegin->startInBigNamesContainer (), itBegin->startInProcessNames ());
315+ *itNoProcess = IndexAndNames (itFirstWithSetProcess->index (),
316+ itNoProcess->startInBigNamesContainer (),
317+ itNoProcess->startInProcessNames ());
326318 // Now handle skipCurrentProcess
327- if (orderedProcessNames[0 ] == &processNames[(itBegin + 2 ) ->startInProcessNames ()]) {
319+ if (orderedProcessNames[0 ] == &processNames[itFirstWithSetProcess ->startInProcessNames ()]) {
328320 // the one process is the current process
329- *(itBegin + 1 ) = IndexAndNames (ProductResolverIndexInvalid,
330- (itBegin + 1 ) ->startInBigNamesContainer (),
331- (itBegin + 1 ) ->startInProcessNames ());
321+ *itSkipCurrentProcess = IndexAndNames (ProductResolverIndexInvalid,
322+ itSkipCurrentProcess ->startInBigNamesContainer (),
323+ itSkipCurrentProcess ->startInProcessNames ());
332324 } else {
333- *(itBegin + 1 ) = IndexAndNames (
334- (itBegin + 2 )->index (), (itBegin + 1 )->startInBigNamesContainer (), (itBegin + 1 )->startInProcessNames ());
325+ *itSkipCurrentProcess = IndexAndNames (itFirstWithSetProcess->index (),
326+ itSkipCurrentProcess->startInBigNamesContainer (),
327+ itSkipCurrentProcess->startInProcessNames ());
335328 }
336329 } else {
337330 bool foundFirstMatch = false ;
338331 for (auto const & proc : orderedProcessNames) {
339- auto it = itBegin + 2 ;
332+ auto it = itFirstWithSetProcess ;
340333 while (it != itEnd && proc != &processNames[it->startInProcessNames ()]) {
341334 ++it;
342335 }
343336 if (it != itEnd) {
344337 if (not foundFirstMatch) {
345338 foundFirstMatch = true ;
346339 // found a process that matches
347- *itBegin =
348- IndexAndNames ( it->index (), itBegin ->startInBigNamesContainer (), itBegin ->startInProcessNames ());
340+ *itNoProcess = IndexAndNames (
341+ it->index (), itNoProcess ->startInBigNamesContainer (), itNoProcess ->startInProcessNames ());
349342 // Now handle skipCurrentProcess
350343 if (proc != orderedProcessNames[0 ]) {
351- *(itBegin + 1 ) = IndexAndNames (
352- it->index (), (itBegin + 1 )->startInBigNamesContainer (), (itBegin + 1 )->startInProcessNames ());
344+ *itSkipCurrentProcess = IndexAndNames (it->index (),
345+ itSkipCurrentProcess->startInBigNamesContainer (),
346+ itSkipCurrentProcess->startInProcessNames ());
353347 break ;
354348 } else {
355349 // this process is the current process
356- *(itBegin + 1 ) = IndexAndNames (ProductResolverIndexInvalid,
357- (itBegin + 1 ) ->startInBigNamesContainer (),
358- (itBegin + 1 ) ->startInProcessNames ());
350+ *itSkipCurrentProcess = IndexAndNames (ProductResolverIndexInvalid,
351+ itSkipCurrentProcess ->startInBigNamesContainer (),
352+ itSkipCurrentProcess ->startInProcessNames ());
359353 }
360354 } else {
361- *(itBegin + 1 ) = IndexAndNames (
362- it->index (), (itBegin + 1 )->startInBigNamesContainer (), (itBegin + 1 )->startInProcessNames ());
355+ *itSkipCurrentProcess = IndexAndNames (it->index (),
356+ itSkipCurrentProcess->startInBigNamesContainer (),
357+ itSkipCurrentProcess->startInProcessNames ());
363358 break ;
364359 }
365360 }
0 commit comments