From acec6edc61c23ddf6cb2a121f488478a51958217 Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Mon, 27 Mar 2017 12:56:12 +0000 Subject: [PATCH] ADT: Add range helpers for pointer_ and pointee_iterator git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@298841 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/iterator.h | 19 +++++++++++++++++++ unittests/ADT/IteratorTest.cpp | 16 ++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/llvm/ADT/iterator.h b/include/llvm/ADT/iterator.h index 9a134e1557b..8f162da1b54 100644 --- a/include/llvm/ADT/iterator.h +++ b/include/llvm/ADT/iterator.h @@ -10,6 +10,7 @@ #ifndef LLVM_ADT_ITERATOR_H #define LLVM_ADT_ITERATOR_H +#include "llvm/ADT/iterator_range.h" #include #include #include @@ -290,6 +291,15 @@ struct pointee_iterator T &operator*() const { return **this->I; } }; +template ()))> +iterator_range> +make_pointee_range(RangeT &&Range) { + using PointeeIteratorT = pointee_iterator; + return make_range(PointeeIteratorT(std::begin(std::forward(Range))), + PointeeIteratorT(std::end(std::forward(Range)))); +} + template ())> class pointer_iterator @@ -307,6 +317,15 @@ public: const T &operator*() const { return Ptr = &*this->I; } }; +template ()))> +iterator_range> +make_pointer_range(RangeT &&Range) { + using PointerIteratorT = pointer_iterator; + return make_range(PointerIteratorT(std::begin(std::forward(Range))), + PointerIteratorT(std::end(std::forward(Range)))); +} + } // end namespace llvm #endif // LLVM_ADT_ITERATOR_H diff --git a/unittests/ADT/IteratorTest.cpp b/unittests/ADT/IteratorTest.cpp index 0edb98b9343..7f261824b49 100644 --- a/unittests/ADT/IteratorTest.cpp +++ b/unittests/ADT/IteratorTest.cpp @@ -118,6 +118,15 @@ TEST(PointeeIteratorTest, SmartPointer) { EXPECT_EQ(End, I); } +TEST(PointeeIteratorTest, Range) { + int A[] = {1, 2, 3, 4}; + SmallVector V{&A[0], &A[1], &A[2], &A[3]}; + + int I = 0; + for (int II : make_pointee_range(V)) + EXPECT_EQ(A[I++], II); +} + TEST(FilterIteratorTest, Lambda) { auto IsOdd = [](int N) { return N % 2 == 1; }; int A[] = {0, 1, 2, 3, 4, 5, 6}; @@ -211,6 +220,13 @@ TEST(PointerIterator, Const) { EXPECT_EQ(A + 4, std::next(*Begin, 4)); } +TEST(PointerIterator, Range) { + int A[] = {1, 2, 3, 4}; + int I = 0; + for (int *P : make_pointer_range(A)) + EXPECT_EQ(A + I++, P); +} + TEST(ZipIteratorTest, Basic) { using namespace std; const SmallVector pi{3, 1, 4, 1, 5, 9}; -- 2.40.0