X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FADT%2Fiterator_range.h;h=3dd679bd9b79ee87a71bf543361b66eb3db9031f;hb=20c9ab5fe6a097a4f8f7da745dffa39d830d4d6e;hp=6248be90075225dbf0402ef3df1f9b63f77152e7;hpb=26abef7b5a3f239204a1ad605a88b99a1ef878c3;p=oota-llvm.git diff --git a/include/llvm/ADT/iterator_range.h b/include/llvm/ADT/iterator_range.h index 6248be90075..3dd679bd9b7 100644 --- a/include/llvm/ADT/iterator_range.h +++ b/include/llvm/ADT/iterator_range.h @@ -20,6 +20,7 @@ #define LLVM_ADT_ITERATOR_RANGE_H #include +#include namespace llvm { @@ -32,7 +33,12 @@ class iterator_range { IteratorT begin_iterator, end_iterator; public: - iterator_range() {} + //TODO: Add SFINAE to test that the Container's iterators match the range's + // iterators. + template + iterator_range(Container &&c) + //TODO: Consider ADL/non-member begin/end calls. + : begin_iterator(c.begin()), end_iterator(c.end()) {} iterator_range(IteratorT begin_iterator, IteratorT end_iterator) : begin_iterator(std::move(begin_iterator)), end_iterator(std::move(end_iterator)) {} @@ -41,6 +47,22 @@ public: IteratorT end() const { return end_iterator; } }; +/// \brief Convenience function for iterating over sub-ranges. +/// +/// This provides a bit of syntactic sugar to make using sub-ranges +/// in for loops a bit easier. Analogous to std::make_pair(). +template iterator_range make_range(T x, T y) { + return iterator_range(std::move(x), std::move(y)); +} + +template iterator_range make_range(std::pair p) { + return iterator_range(std::move(p.first), std::move(p.second)); +} + +template +iterator_range()))> drop_begin(T &&t, int n) { + return make_range(std::next(begin(t), n), end(t)); +} } #endif