|
11 | 11 | #include <vector> |
12 | 12 |
|
13 | 13 | #include "llvm/ADT/ArrayRef.h" |
| 14 | +#include "llvm/ADT/iterator_range.h" |
14 | 15 | #include "llvm/ADT/StringRef.h" |
15 | 16 |
|
16 | 17 | namespace glow { |
17 | | -/// \brief A range adaptor for a pair of iterators. |
18 | | -/// |
19 | | -/// This just wraps two iterators into a range-compatible interface. Nothing |
20 | | -/// fancy at all. |
21 | | -template <typename IteratorT> class iterator_range { |
22 | | - IteratorT begin_iterator, end_iterator; |
23 | | - |
24 | | -public: |
25 | | - template <typename Container> |
26 | | - iterator_range(Container &&c) |
27 | | - : begin_iterator(c.begin()), end_iterator(c.end()) {} |
28 | | - iterator_range(IteratorT begin_iterator, IteratorT end_iterator) |
29 | | - : begin_iterator(std::move(begin_iterator)), |
30 | | - end_iterator(std::move(end_iterator)) {} |
31 | | - |
32 | | - IteratorT begin() const { return begin_iterator; } |
33 | | - IteratorT end() const { return end_iterator; } |
34 | | -}; |
35 | | - |
36 | | -/// \brief Convenience function for iterating over sub-ranges. |
37 | | -template <class T> iterator_range<T> make_range(T x, T y) { |
38 | | - return iterator_range<T>(std::move(x), std::move(y)); |
39 | | -} |
40 | | - |
41 | | -template <typename T> iterator_range<T> make_range(std::pair<T, T> p) { |
42 | | - return iterator_range<T>(std::move(p.first), std::move(p.second)); |
43 | | -} |
44 | | - |
45 | | -template <typename T> |
46 | | -iterator_range<decltype(begin(std::declval<T>()))> drop_begin(T &&t, int n) { |
47 | | - return make_range(std::next(begin(t), n), end(t)); |
48 | | -} |
| 18 | +using llvm::iterator_range; |
49 | 19 |
|
50 | 20 | using llvm::ArrayRef; |
51 | 21 |
|
|
0 commit comments