Index: llvm/include/llvm/ADT/iterator.h =================================================================== --- llvm/include/llvm/ADT/iterator.h +++ llvm/include/llvm/ADT/iterator.h @@ -256,6 +256,11 @@ 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 @@ 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 Index: llvm/unittests/ADT/IteratorTest.cpp =================================================================== --- llvm/unittests/ADT/IteratorTest.cpp +++ llvm/unittests/ADT/IteratorTest.cpp @@ -42,19 +42,20 @@ V.push_back(&arr[2]); V.push_back(&arr[3]); - typedef pointee_iterator::const_iterator> test_iterator; + 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 Begin, End; - Begin = V.begin(); - End = test_iterator(V.end()); - - 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]); @@ -69,7 +70,7 @@ 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 @@ V.push_back(make_unique(3)); V.push_back(make_unique(4)); - typedef pointee_iterator< - SmallVectorImpl>::const_iterator> test_iterator; + 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 Begin, End; - Begin = V.begin(); - End = test_iterator(V.end()); - - 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 @@ 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(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, 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));