diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/ADT/STLExtras.h | 8 | ||||
| -rw-r--r-- | llvm/include/llvm/ADT/iterator_range.h | 34 |
2 files changed, 3 insertions, 39 deletions
diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h index 430707cbd79..274933bc520 100644 --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/include/llvm/ADT/STLExtras.h @@ -1573,14 +1573,6 @@ template <class Ptr> auto to_address(const Ptr &P) -> decltype(P.operator->()) { } template <class T> constexpr T *to_address(T *P) { return P; } -template <typename R> -auto index(R &&TheRange, - typename std::iterator_traits<detail::IterOfRange<R>>::difference_type N) - -> decltype(TheRange.begin()[N]) { - assert(N < TheRange.end() - TheRange.begin() && "Index out of range!"); - return TheRange.begin()[N]; -} - } // end namespace llvm #endif // LLVM_ADT_STLEXTRAS_H diff --git a/llvm/include/llvm/ADT/iterator_range.h b/llvm/include/llvm/ADT/iterator_range.h index 3bb9231441c..774c7c4e336 100644 --- a/llvm/include/llvm/ADT/iterator_range.h +++ b/llvm/include/llvm/ADT/iterator_range.h @@ -20,17 +20,9 @@ #include <iterator> #include <utility> -#include <cassert> namespace llvm { -template <typename T> -constexpr bool is_random_iterator() { - return std::is_same< - typename std::iterator_traits<T>::iterator_category, - std::random_access_iterator_tag>::value; -} - /// A range adaptor for a pair of iterators. /// /// This just wraps two iterators into a range-compatible interface. Nothing @@ -66,31 +58,11 @@ template <typename T> iterator_range<T> make_range(std::pair<T, T> p) { return iterator_range<T>(std::move(p.first), std::move(p.second)); } -/// Non-random-iterator version template <typename T> -auto drop_begin(T &&t, int n) -> - typename std::enable_if<!is_random_iterator<decltype(adl_begin(t))>(), - iterator_range<decltype(adl_begin(t))>>::type { - auto begin = adl_begin(t); - auto end = adl_end(t); - for (int i = 0; i < n; i++) { - assert(begin != end); - ++begin; - } - return make_range(begin, end); +iterator_range<decltype(adl_begin(std::declval<T>()))> drop_begin(T &&t, + int n) { + return make_range(std::next(adl_begin(t), n), adl_end(t)); } - -/// Optimized version for random iterators -template <typename T> -auto drop_begin(T &&t, int n) -> - typename std::enable_if<is_random_iterator<decltype(adl_begin(t))>(), - iterator_range<decltype(adl_begin(t))>>::type { - auto begin = adl_begin(t); - auto end = adl_end(t); - assert(end - begin >= n && "Dropping more elements than exist!"); - return make_range(std::next(begin, n), end); -} - } #endif |

