From dce2347f6da405bad7f44d31edeb3a6f3ea30e43 Mon Sep 17 00:00:00 2001 From: Manuel Klimek Date: Fri, 19 Jul 2013 12:12:36 +0000 Subject: [PATCH] Adds overlapsWith and contains predicates on tooling::Range. Patch by Guillaume Papin. llvm-svn: 186670 --- clang/include/clang/Tooling/Refactoring.h | 19 +++++++++++++++++++ clang/unittests/Tooling/RefactoringTest.cpp | 15 +++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/clang/include/clang/Tooling/Refactoring.h b/clang/include/clang/Tooling/Refactoring.h index 0eaef95d37bd..3b1710583672 100644 --- a/clang/include/clang/Tooling/Refactoring.h +++ b/clang/include/clang/Tooling/Refactoring.h @@ -38,8 +38,27 @@ public: Range() : Offset(0), Length(0) {} Range(unsigned Offset, unsigned Length) : Offset(Offset), Length(Length) {} + /// \brief Accessors. + /// @{ unsigned getOffset() const { return Offset; } unsigned getLength() const { return Length; } + /// @} + + /// \name Range Predicates + /// @{ + /// \brief Whether this range overlaps with \p RHS or not. + bool overlapsWith(Range RHS) const { + if ((Offset + Length) <= RHS.Offset || Offset >= (RHS.Offset + RHS.Length)) + return false; + return true; + } + + /// \brief Whether this range contains \p RHS or not. + bool contains(Range RHS) const { + return RHS.Offset >= Offset && + (RHS.Offset + RHS.Length) <= (Offset + Length); + } + /// @} private: unsigned Offset; diff --git a/clang/unittests/Tooling/RefactoringTest.cpp b/clang/unittests/Tooling/RefactoringTest.cpp index f8d10d286eda..5741e5d22279 100644 --- a/clang/unittests/Tooling/RefactoringTest.cpp +++ b/clang/unittests/Tooling/RefactoringTest.cpp @@ -332,5 +332,20 @@ TEST(Replacement, TemplatedFunctionCall) { expectReplacementAt(CallToF.Replace, "input.cc", 43, 8); } +TEST(Range, overlaps) { + EXPECT_TRUE(Range(10, 10).overlapsWith(Range(0, 11))); + EXPECT_TRUE(Range(0, 11).overlapsWith(Range(10, 10))); + EXPECT_FALSE(Range(10, 10).overlapsWith(Range(0, 10))); + EXPECT_FALSE(Range(0, 10).overlapsWith(Range(10, 10))); + EXPECT_TRUE(Range(0, 10).overlapsWith(Range(2, 6))); +} + +TEST(Range, contains) { + EXPECT_TRUE(Range(0, 10).contains(Range(0, 10))); + EXPECT_TRUE(Range(0, 10).contains(Range(2, 6))); + EXPECT_FALSE(Range(2, 6).contains(Range(0, 10))); + EXPECT_FALSE(Range(0, 10).contains(Range(0, 11))); +} + } // end namespace tooling } // end namespace clang