diff options
author | Justin Bogner <mail@justinbogner.com> | 2017-03-27 12:56:12 +0000 |
---|---|---|
committer | Justin Bogner <mail@justinbogner.com> | 2017-03-27 12:56:12 +0000 |
commit | 8444d106d58dc8c81ea894eb5d7f29983ae6dfaf (patch) | |
tree | f81b03067197d5d3cbae0c5d455e15e9d89e6bb4 /llvm | |
parent | 89d5f9391a365920e753d809e28434cec180d5ec (diff) | |
download | bcm5719-llvm-8444d106d58dc8c81ea894eb5d7f29983ae6dfaf.tar.gz bcm5719-llvm-8444d106d58dc8c81ea894eb5d7f29983ae6dfaf.zip |
ADT: Add range helpers for pointer_ and pointee_iterator
llvm-svn: 298841
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/ADT/iterator.h | 19 | ||||
-rw-r--r-- | llvm/unittests/ADT/IteratorTest.cpp | 16 |
2 files changed, 35 insertions, 0 deletions
diff --git a/llvm/include/llvm/ADT/iterator.h b/llvm/include/llvm/ADT/iterator.h index 9a134e1557b..8f162da1b54 100644 --- a/llvm/include/llvm/ADT/iterator.h +++ b/llvm/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 <cstddef> #include <iterator> #include <type_traits> @@ -290,6 +291,15 @@ struct pointee_iterator T &operator*() const { return **this->I; } }; +template <typename RangeT, typename WrappedIteratorT = + decltype(std::begin(std::declval<RangeT>()))> +iterator_range<pointee_iterator<WrappedIteratorT>> +make_pointee_range(RangeT &&Range) { + using PointeeIteratorT = pointee_iterator<WrappedIteratorT>; + return make_range(PointeeIteratorT(std::begin(std::forward<RangeT>(Range))), + PointeeIteratorT(std::end(std::forward<RangeT>(Range)))); +} + template <typename WrappedIteratorT, typename T = decltype(&*std::declval<WrappedIteratorT>())> class pointer_iterator @@ -307,6 +317,15 @@ public: const T &operator*() const { return Ptr = &*this->I; } }; +template <typename RangeT, typename WrappedIteratorT = + decltype(std::begin(std::declval<RangeT>()))> +iterator_range<pointer_iterator<WrappedIteratorT>> +make_pointer_range(RangeT &&Range) { + using PointerIteratorT = pointer_iterator<WrappedIteratorT>; + return make_range(PointerIteratorT(std::begin(std::forward<RangeT>(Range))), + PointerIteratorT(std::end(std::forward<RangeT>(Range)))); +} + } // end namespace llvm #endif // LLVM_ADT_ITERATOR_H diff --git a/llvm/unittests/ADT/IteratorTest.cpp b/llvm/unittests/ADT/IteratorTest.cpp index 0edb98b9343..7f261824b49 100644 --- a/llvm/unittests/ADT/IteratorTest.cpp +++ b/llvm/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<int *, 4> 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<unsigned, 6> pi{3, 1, 4, 1, 5, 9}; |