diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/include/llvm/ADT/STLExtras.h @@ -198,6 +198,15 @@ return adl_begin(RangeOrContainer) == adl_end(RangeOrContainer); } +/// Return a range covering \p RangeOrContainer with the first N elements +/// excluded. +template +auto drop_begin(T &&RangeOrContainer, size_t N) -> + iterator_range { + return make_range(std::next(adl_begin(RangeOrContainer), N), + adl_end(RangeOrContainer)); +} + // mapped_iterator - This is a simple iterator adapter that causes a function to // be applied whenever operator* is invoked on the iterator. diff --git a/llvm/include/llvm/ADT/iterator_range.h b/llvm/include/llvm/ADT/iterator_range.h --- a/llvm/include/llvm/ADT/iterator_range.h +++ b/llvm/include/llvm/ADT/iterator_range.h @@ -59,11 +59,6 @@ return iterator_range(std::move(p.first), std::move(p.second)); } -template -iterator_range()))> drop_begin(T &&t, - int n) { - return make_range(std::next(adl_begin(t), n), adl_end(t)); -} } #endif diff --git a/llvm/unittests/ADT/IteratorTest.cpp b/llvm/unittests/ADT/IteratorTest.cpp --- a/llvm/unittests/ADT/IteratorTest.cpp +++ b/llvm/unittests/ADT/IteratorTest.cpp @@ -449,17 +449,4 @@ EXPECT_EQ(std::distance(v2.begin(), v2.end()), size(v2)); } -TEST(IteratorRangeTest, DropBegin) { - SmallVector vec{0, 1, 2, 3, 4}; - - for (int n = 0; n < 5; ++n) { - int i = n; - for (auto &v : drop_begin(vec, n)) { - EXPECT_EQ(v, i); - i += 1; - } - EXPECT_EQ(i, 5); - } -} - } // anonymous namespace diff --git a/llvm/unittests/ADT/STLExtrasTest.cpp b/llvm/unittests/ADT/STLExtrasTest.cpp --- a/llvm/unittests/ADT/STLExtrasTest.cpp +++ b/llvm/unittests/ADT/STLExtrasTest.cpp @@ -380,6 +380,19 @@ EXPECT_FALSE(llvm::empty(R1)); } +TEST(STLExtrasTest, DropBeginTest) { + SmallVector vec{0, 1, 2, 3, 4}; + + for (int n = 0; n < 5; ++n) { + int i = n; + for (auto &v : drop_begin(vec, n)) { + EXPECT_EQ(v, i); + i += 1; + } + EXPECT_EQ(i, 5); + } +} + TEST(STLExtrasTest, EarlyIncrementTest) { std::list L = {1, 2, 3, 4};