From a5afae3a31db2f68e692e2f199da962f9e3ceb04 Mon Sep 17 00:00:00 2001 From: Justin Lebar Date: Mon, 10 Oct 2016 16:26:03 +0000 Subject: [PATCH] [ADT] Add make_pointe{e,r}_iterator. Reviewers: timshen Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D25418 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@283765 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/iterator.h | 10 ++++++++ unittests/ADT/IteratorTest.cpp | 45 +++++++++++++++++++--------------- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/include/llvm/ADT/iterator.h b/include/llvm/ADT/iterator.h index 30b8ac1dafb..eced5eab523 100644 --- a/include/llvm/ADT/iterator.h +++ b/include/llvm/ADT/iterator.h @@ -256,6 +256,11 @@ struct pointee_iterator T &operator*() const { return **this->I; } }; +template +pointee_iterator make_pointee_iterator(WrappedIteratorT &&I) { + return pointee_iterator(std::forward(I)); +} + template ())> class pointer_iterator @@ -273,6 +278,11 @@ public: const T &operator*() const { return Ptr = &*this->I; } }; +template +pointer_iterator make_pointer_iterator(WrappedIteratorT &&I) { + return pointer_iterator(std::forward(I)); } +} // namespace llvm + #endif diff --git a/unittests/ADT/IteratorTest.cpp b/unittests/ADT/IteratorTest.cpp index 4f1d81d487d..4f8110b153c 100644 --- a/unittests/ADT/IteratorTest.cpp +++ b/unittests/ADT/IteratorTest.cpp @@ -42,19 +42,20 @@ TEST(PointeeIteratorTest, Basic) { V.push_back(&arr[2]); V.push_back(&arr[3]); - typedef pointee_iterator::const_iterator> test_iterator; - - test_iterator Begin, End; - Begin = V.begin(); - End = test_iterator(V.end()); - - test_iterator I = Begin; + auto Begin = make_pointee_iterator(V.begin()); + auto End = make_pointee_iterator(V.end()); + static_assert( + std::is_same::iterator>>::value, + "Wrong type returned by make_pointee_iterator"); + + auto I = Begin; for (int i = 0; i < 4; ++i) { EXPECT_EQ(*V[i], *I); EXPECT_EQ(I, Begin + i); EXPECT_EQ(I, std::next(Begin, i)); - test_iterator J = Begin; + auto J = Begin; J += i; EXPECT_EQ(I, J); EXPECT_EQ(*V[i], Begin[i]); @@ -69,7 +70,7 @@ TEST(PointeeIteratorTest, Basic) { EXPECT_EQ(i, std::distance(Begin, I)); EXPECT_EQ(Begin, I - i); - test_iterator K = I++; + auto K = I++; EXPECT_EQ(K, std::prev(I)); } EXPECT_EQ(End, I); @@ -82,20 +83,21 @@ TEST(PointeeIteratorTest, SmartPointer) { V.push_back(make_unique(3)); V.push_back(make_unique(4)); - typedef pointee_iterator< - SmallVectorImpl>::const_iterator> test_iterator; - - test_iterator Begin, End; - Begin = V.begin(); - End = test_iterator(V.end()); + auto Begin = make_pointee_iterator(V.begin()); + auto End = make_pointee_iterator(V.end()); + static_assert( + std::is_same>::iterator>>::value, + "Wrong type returned by make_pointee_iterator"); - test_iterator I = Begin; + auto I = Begin; for (int i = 0; i < 4; ++i) { EXPECT_EQ(*V[i], *I); EXPECT_EQ(I, Begin + i); EXPECT_EQ(I, std::next(Begin, i)); - test_iterator J = Begin; + auto J = Begin; J += i; EXPECT_EQ(I, J); EXPECT_EQ(*V[i], Begin[i]); @@ -110,7 +112,7 @@ TEST(PointeeIteratorTest, SmartPointer) { EXPECT_EQ(i, std::distance(Begin, I)); EXPECT_EQ(Begin, I - i); - test_iterator K = I++; + auto K = I++; EXPECT_EQ(K, std::prev(I)); } EXPECT_EQ(End, I); @@ -187,7 +189,10 @@ TEST(FilterIteratorTest, InputIterator) { TEST(PointerIterator, Basic) { int A[] = {1, 2, 3, 4}; - pointer_iterator Begin(std::begin(A)), End(std::end(A)); + auto Begin = make_pointer_iterator(std::begin(A)); + auto End = make_pointer_iterator(std::end(A)); + static_assert(std::is_same>::value, + "Wrong type returned by make_pointer_iterator"); EXPECT_EQ(A, *Begin); ++Begin; EXPECT_EQ(A + 1, *Begin); @@ -201,7 +206,7 @@ TEST(PointerIterator, Basic) { TEST(PointerIterator, Const) { int A[] = {1, 2, 3, 4}; - const pointer_iterator Begin(std::begin(A)); + auto Begin = make_pointer_iterator(std::begin(A)); EXPECT_EQ(A, *Begin); EXPECT_EQ(A + 1, std::next(*Begin, 1)); EXPECT_EQ(A + 2, std::next(*Begin, 2)); -- 2.49.0