void TestDetSet::inserting() { DSTV detsets(2); unsigned int ntot=0; for (unsigned int n=1;n<5;++n) { ntot+=n; unsigned int id=20+n; DST df = detsets.insert(id,n); CPPUNIT_ASSERT(detsets.size()==n); CPPUNIT_ASSERT(detsets.dataSize()==ntot); CPPUNIT_ASSERT(detsets.detsetSize(n-1)==n); CPPUNIT_ASSERT(df.size()==n); CPPUNIT_ASSERT(df.id()==id); std::copy(sv.begin(),sv.begin()+n,df.begin()); std::vector<DST::data_type> v1(n); std::vector<DST::data_type> v2(n); std::copy(detsets.m_data.begin()+ntot-n,detsets.m_data.begin()+ntot,v2.begin()); std::copy(sv.begin(),sv.begin()+n,v1.begin()); CPPUNIT_ASSERT(v1==v2); } // test error conditions try { detsets.insert(22,6); CPPUNIT_ASSERT("insert did not throw"==0); } catch (edm::Exception const & err) { CPPUNIT_ASSERT(err.categoryCode()==edm::errors::InvalidReference); } }
bool RegionInfo::isRegion(BasicBlock *entry, BasicBlock *exit) const { assert(entry && exit && "entry and exit must not be null!"); typedef DominanceFrontier::DomSetType DST; DST *entrySuccs = &DF->find(entry)->second; // Exit is the header of a loop that contains the entry. In this case, // the dominance frontier must only contain the exit. if (!DT->dominates(entry, exit)) { for (DST::iterator SI = entrySuccs->begin(), SE = entrySuccs->end(); SI != SE; ++SI) if (*SI != exit && *SI != entry) return false; return true; } DST *exitSuccs = &DF->find(exit)->second; // Do not allow edges leaving the region. for (DST::iterator SI = entrySuccs->begin(), SE = entrySuccs->end(); SI != SE; ++SI) { if (*SI == exit || *SI == entry) continue; if (exitSuccs->find(*SI) == exitSuccs->end()) return false; if (!isCommonDomFrontier(*SI, entry, exit)) return false; } // Do not allow edges pointing into the region. for (DST::iterator SI = exitSuccs->begin(), SE = exitSuccs->end(); SI != SE; ++SI) if (DT->properlyDominates(entry, *SI) && *SI != exit) return false; return true; }
void TestDetSet::toRangeMap() { DSTV detsets(2); for (unsigned int n=1;n<5;++n) { unsigned int id=20+n; FF ff(detsets,id); ff.resize(n); std::copy(sv.begin(),sv.begin()+n,ff.begin()); } { FF ff(detsets,31); ff.resize(2); std::copy(sv.begin(),sv.begin()+2,ff.begin()); } { FF ff(detsets,11); ff.resize(2); std::copy(sv.begin(),sv.begin()+2,ff.begin()); } { FF ff(detsets,34); ff.resize(4); std::copy(sv.begin(),sv.begin()+4,ff.begin()); } typedef edm::RangeMap<det_id_type, edm::OwnVector<B> > RM; edm::RangeMap<det_id_type, edm::OwnVector<B> > rm; try { edmNew::copy(detsets,rm); rm.post_insert(); std::vector<det_id_type> ids = rm.ids(); CPPUNIT_ASSERT(ids.size()==detsets.size()); CPPUNIT_ASSERT(rm.size()==detsets.dataSize()); for (int i=0; i<int(ids.size()); i++) { RM::range r = rm.get(ids[i]); DST df = *detsets.find(ids[i]); // DST df = *detsets.find(ids[i],true); CPPUNIT_ASSERT(static_cast<unsigned long>(r.second-r.first)==df.size()); CPPUNIT_ASSERT(std::equal(r.first,r.second,df.begin())); } } catch (edm::Exception const & err) { std::cout << err.what() << std::endl; CPPUNIT_ASSERT(err.what()==0); } }