llvm-cov: Simplify CounterMappingRegion, pushing logic to its user

A single function in SourceCoverageDataManager was the only user of
some of the comparisons in CounterMappingRegion, and at this point we
know that only one file is relevant. This lets us use slightly simpler
logic directly in the client.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217745 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Justin Bogner 2014-09-15 03:41:01 +00:00
parent e610c324e1
commit baca001683
2 changed files with 17 additions and 18 deletions

View File

@ -164,30 +164,26 @@ struct CounterMappingRegion {
ColumnStart(ColumnStart), LineEnd(LineEnd), ColumnEnd(ColumnEnd),
Kind(Kind), HasCodeBefore(HasCodeBefore) {}
inline std::pair<unsigned, unsigned> startLoc() const {
return std::pair<unsigned, unsigned>(LineStart, ColumnStart);
}
inline std::pair<unsigned, unsigned> endLoc() const {
return std::pair<unsigned, unsigned>(LineEnd, ColumnEnd);
}
bool operator<(const CounterMappingRegion &Other) const {
if (FileID != Other.FileID)
return FileID < Other.FileID;
if (LineStart == Other.LineStart)
return ColumnStart < Other.ColumnStart;
return LineStart < Other.LineStart;
}
bool coversSameSource(const CounterMappingRegion &Other) const {
return FileID == Other.FileID &&
LineStart == Other.LineStart &&
ColumnStart == Other.ColumnStart &&
LineEnd == Other.LineEnd &&
ColumnEnd == Other.ColumnEnd;
return startLoc() < Other.startLoc();
}
bool contains(const CounterMappingRegion &Other) const {
if (FileID != Other.FileID)
return false;
if (LineStart > Other.LineStart ||
(LineStart == Other.LineStart && ColumnStart > Other.ColumnStart))
if (startLoc() > Other.startLoc())
return false;
if (LineEnd < Other.LineEnd ||
(LineEnd == Other.LineEnd && ColumnEnd < Other.ColumnEnd))
if (endLoc() < Other.endLoc())
return false;
return true;
}

View File

@ -26,13 +26,16 @@ ArrayRef<CountedRegion> SourceCoverageDataManager::getSourceRegions() {
if (Uniqued || Regions.size() <= 1)
return Regions;
// Sort.
std::sort(Regions.begin(), Regions.end());
// Sort the regions given that they're all in the same file at this point.
std::sort(Regions.begin(), Regions.end(),
[](const CountedRegion &LHS, const CountedRegion &RHS) {
return LHS.startLoc() < RHS.startLoc();
});
// Merge duplicate source ranges and sum their execution counts.
auto Prev = Regions.begin();
for (auto I = Prev + 1, E = Regions.end(); I != E; ++I) {
if (I->coversSameSource(*Prev)) {
if (I->startLoc() == Prev->startLoc() && I->endLoc() == Prev->endLoc()) {
Prev->ExecutionCount += I->ExecutionCount;
continue;
}