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;
}
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;
}