Index: include/llvm/ADT/iterator.h =================================================================== --- include/llvm/ADT/iterator.h +++ include/llvm/ADT/iterator.h @@ -256,6 +256,19 @@ T &operator*() const { return **this->I; } }; +template ())> +struct pointer_iterator + : iterator_adaptor_base, + WrappedIteratorT, T> { + pointer_iterator() {} + + explicit pointer_iterator(WrappedIteratorT u) + : pointer_iterator::iterator_adaptor_base(std::move(u)) {} + + T operator*() const { return &*this->I; } +}; + } #endif Index: unittests/Support/IteratorTest.cpp =================================================================== --- unittests/Support/IteratorTest.cpp +++ unittests/Support/IteratorTest.cpp @@ -185,4 +185,18 @@ EXPECT_EQ((SmallVector{1, 3, 5}), Actual); } +TEST(PointerIterator, Basic) { + int A[] = {1, 2, 3, 4}; + pointer_iterator Begin(std::begin(A)), End(std::end(A)); + EXPECT_EQ(A, *Begin); + ++Begin; + EXPECT_EQ(A + 1, *Begin); + ++Begin; + EXPECT_EQ(A + 2, *Begin); + ++Begin; + EXPECT_EQ(A + 3, *Begin); + ++Begin; + EXPECT_EQ(Begin, End); +} + } // anonymous namespace