From 4d31fe8663c42ba58039c9a9aa3ac5cf2e028ff5 Mon Sep 17 00:00:00 2001 From: Nicholas Allegra Date: Thu, 26 Sep 2019 23:47:18 +0000 Subject: [PATCH] [Consumed][NFC] Refactor handleCall to take function argument list. Differential Revision: https://reviews.llvm.org/D67569 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@373034 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/STLExtras.h | 8 ++++++++ include/llvm/ADT/iterator_range.h | 34 ++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/include/llvm/ADT/STLExtras.h b/include/llvm/ADT/STLExtras.h index 274933bc520..430707cbd79 100644 --- a/include/llvm/ADT/STLExtras.h +++ b/include/llvm/ADT/STLExtras.h @@ -1573,6 +1573,14 @@ template auto to_address(const Ptr &P) -> decltype(P.operator->()) { } template constexpr T *to_address(T *P) { return P; } +template +auto index(R &&TheRange, + typename std::iterator_traits>::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/include/llvm/ADT/iterator_range.h b/include/llvm/ADT/iterator_range.h index 774c7c4e336..3bb9231441c 100644 --- a/include/llvm/ADT/iterator_range.h +++ b/include/llvm/ADT/iterator_range.h @@ -20,9 +20,17 @@ #include #include +#include namespace llvm { +template +constexpr bool is_random_iterator() { + return std::is_same< + typename std::iterator_traits::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 @@ -58,11 +66,31 @@ template iterator_range make_range(std::pair p) { return iterator_range(std::move(p.first), std::move(p.second)); } +/// Non-random-iterator version template -iterator_range()))> drop_begin(T &&t, - int n) { - return make_range(std::next(adl_begin(t), n), adl_end(t)); +auto drop_begin(T &&t, int n) -> + typename std::enable_if(), + iterator_range>::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); } + +/// Optimized version for random iterators +template +auto drop_begin(T &&t, int n) -> + typename std::enable_if(), + iterator_range>::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 -- 2.50.1