return slice(0, size() - N);
}
+ /// \brief Keep the first \p N elements of the array.
+ LLVM_ATTRIBUTE_UNUSED_RESULT
+ ArrayRef<T> keep_front(size_t N = 1) const {
+ if (N >= size())
+ return *this;
+ return drop_back(size() - N);
+ }
+
+ /// \brief Keep the last \p N elements of the array.
+ LLVM_ATTRIBUTE_UNUSED_RESULT
+ ArrayRef<T> keep_back(size_t N = 1) const {
+ if (N >= size())
+ return *this;
+ return drop_front(size() - N);
+ }
+
/// @}
/// @name Operator Overloads
/// @{
return slice(0, this->size() - N);
}
+ /// \brief Drop everything but the first \p N elements of the array.
+ LLVM_ATTRIBUTE_UNUSED_RESULT
+ MutableArrayRef<T> keep_front(size_t N = 1) const {
+ if (N >= this->size())
+ return *this;
+ return drop_back(size() - N);
+ }
+
+ /// \brief Drop everything but the last \p N elements of the array.
+ LLVM_ATTRIBUTE_UNUSED_RESULT
+ MutableArrayRef<T> keep_back(size_t N = 1) const {
+ if (N >= this->size())
+ return *this;
+ return drop_front(size() - N);
+ }
+
/// @}
/// @name Operator Overloads
/// @{
return StringRef(Data + Start, std::min(N, Length - Start));
}
+ /// Return a StringRef equal to 'this' but with only the first \p N
+ /// elements remaining. If \p N is greater than the length of the
+ /// string, the entire string is returned.
+ LLVM_ATTRIBUTE_ALWAYS_INLINE
+ LLVM_ATTRIBUTE_UNUSED_RESULT
+ StringRef take_front(size_t N = 1) const {
+ if (N >= size())
+ return *this;
+ return drop_back(size() - N);
+ }
+
+ /// Return a StringRef equal to 'this' but with only the first \p N
+ /// elements remaining. If \p N is greater than the length of the
+ /// string, the entire string is returned.
+ LLVM_ATTRIBUTE_ALWAYS_INLINE
+ LLVM_ATTRIBUTE_UNUSED_RESULT
+ StringRef take_back(size_t N = 1) const {
+ if (N >= size())
+ return *this;
+ return drop_front(size() - N);
+ }
+
/// Return a StringRef equal to 'this' but with the first \p N elements
/// dropped.
LLVM_ATTRIBUTE_ALWAYS_INLINE
EXPECT_EQ(1U, AR3.drop_front(AR3.size() - 1).size());
}
+TEST(ArrayRefTest, KeepBack) {
+ static const int TheNumbers[] = {4, 8, 15, 16, 23, 42};
+ ArrayRef<int> AR1(TheNumbers);
+ ArrayRef<int> AR2(AR1.end() - 1, 1);
+ EXPECT_TRUE(AR1.keep_back().equals(AR2));
+}
+
+TEST(ArrayRefTest, KeepFront) {
+ static const int TheNumbers[] = {4, 8, 15, 16, 23, 42};
+ ArrayRef<int> AR1(TheNumbers);
+ ArrayRef<int> AR2(AR1.data(), 2);
+ EXPECT_TRUE(AR1.keep_front(2).equals(AR2));
+}
+
TEST(ArrayRefTest, Equals) {
static const int A1[] = {1, 2, 3, 4, 5, 6, 7, 8};
ArrayRef<int> AR1(A1);
EXPECT_NE(Str2.data(), Str2c.data());
}
+TEST(StringRefTest, Drop) {
+ StringRef Test("StringRefTest::Drop");
+
+ StringRef Dropped = Test.drop_front(5);
+ EXPECT_EQ(Dropped, "gRefTest::Drop");
+
+ Dropped = Test.drop_back(5);
+ EXPECT_EQ(Dropped, "StringRefTest:");
+
+ Dropped = Test.drop_front(0);
+ EXPECT_EQ(Dropped, Test);
+
+ Dropped = Test.drop_back(0);
+ EXPECT_EQ(Dropped, Test);
+
+ Dropped = Test.drop_front(Test.size());
+ EXPECT_TRUE(Dropped.empty());
+
+ Dropped = Test.drop_back(Test.size());
+ EXPECT_TRUE(Dropped.empty());
+}
+
+TEST(StringRefTest, Take) {
+ StringRef Test("StringRefTest::Take");
+
+ StringRef Taken = Test.take_front(5);
+ EXPECT_EQ(Taken, "Strin");
+
+ Taken = Test.take_back(5);
+ EXPECT_EQ(Taken, ":Take");
+
+ Taken = Test.take_front(Test.size());
+ EXPECT_EQ(Taken, Test);
+
+ Taken = Test.take_back(Test.size());
+ EXPECT_EQ(Taken, Test);
+
+ Taken = Test.take_front(0);
+ EXPECT_TRUE(Taken.empty());
+
+ Taken = Test.take_back(0);
+ EXPECT_TRUE(Taken.empty());
+}
} // end anonymous namespace