diff options
author | Tim Shen <timshen91@gmail.com> | 2016-08-19 21:04:45 +0000 |
---|---|---|
committer | Tim Shen <timshen91@gmail.com> | 2016-08-19 21:04:45 +0000 |
commit | cf03add8c06621549d0f71879d371be2b42fc341 (patch) | |
tree | bde637a8be79207537a117369c094a9af415578c | |
parent | e62b54ed2aa8631ef023a199c0ab5174a18953b1 (diff) | |
download | bcm5719-llvm-cf03add8c06621549d0f71879d371be2b42fc341.tar.gz bcm5719-llvm-cf03add8c06621549d0f71879d371be2b42fc341.zip |
[ADT] add pointer_iterator, the opposite of pointee_iterator
Differential Revision: https://reviews.llvm.org/D23703
llvm-svn: 279323
-rw-r--r-- | llvm/include/llvm/ADT/iterator.h | 17 | ||||
-rw-r--r-- | llvm/unittests/Support/IteratorTest.cpp | 24 |
2 files changed, 41 insertions, 0 deletions
diff --git a/llvm/include/llvm/ADT/iterator.h b/llvm/include/llvm/ADT/iterator.h index 0bd28d5c6cd..30b8ac1dafb 100644 --- a/llvm/include/llvm/ADT/iterator.h +++ b/llvm/include/llvm/ADT/iterator.h @@ -256,6 +256,23 @@ struct pointee_iterator T &operator*() const { return **this->I; } }; +template <typename WrappedIteratorT, + typename T = decltype(&*std::declval<WrappedIteratorT>())> +class pointer_iterator + : public iterator_adaptor_base<pointer_iterator<WrappedIteratorT>, + WrappedIteratorT, T> { + mutable T Ptr; + +public: + pointer_iterator() {} + + explicit pointer_iterator(WrappedIteratorT u) + : pointer_iterator::iterator_adaptor_base(std::move(u)) {} + + T &operator*() { return Ptr = &*this->I; } + const T &operator*() const { return Ptr = &*this->I; } +}; + } #endif diff --git a/llvm/unittests/Support/IteratorTest.cpp b/llvm/unittests/Support/IteratorTest.cpp index 63dfa2a9d01..4f1d81d487d 100644 --- a/llvm/unittests/Support/IteratorTest.cpp +++ b/llvm/unittests/Support/IteratorTest.cpp @@ -185,4 +185,28 @@ TEST(FilterIteratorTest, InputIterator) { EXPECT_EQ((SmallVector<int, 3>{1, 3, 5}), Actual); } +TEST(PointerIterator, Basic) { + int A[] = {1, 2, 3, 4}; + pointer_iterator<int *> 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); +} + +TEST(PointerIterator, Const) { + int A[] = {1, 2, 3, 4}; + const pointer_iterator<int *> Begin(std::begin(A)); + EXPECT_EQ(A, *Begin); + EXPECT_EQ(A + 1, std::next(*Begin, 1)); + EXPECT_EQ(A + 2, std::next(*Begin, 2)); + EXPECT_EQ(A + 3, std::next(*Begin, 3)); + EXPECT_EQ(A + 4, std::next(*Begin, 4)); +} + } // anonymous namespace |