From 1890a65ca17504cab4032d3c8cc0c4c568d44717 Mon Sep 17 00:00:00 2001 From: Nathan James Date: Tue, 21 Jul 2020 09:55:14 +0100 Subject: [PATCH] [ADT] use is_base_of inplace of is_same for random_access_iterator_tag checks Replace `std::is_same` with `std::is_base_of` in STLExtra algos. This doesn't have too much impact on LLVM internally as no structs derive from it. However external projects embedding LLVM may use `std::contiguous_iterator_tag` which should be considered by these algorithms. As well as any other potential tags people want to define derived from `std::random_access_iterator_tag` Reviewed By: dblaikie Differential Revision: https://reviews.llvm.org/D84141 --- llvm/include/llvm/ADT/STLExtras.h | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h index 953cf8aeae2..2e7a0971747 100644 --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/include/llvm/ADT/STLExtras.h @@ -1462,10 +1462,11 @@ inline void sort(Container &&C, Compare Comp) { /// which is only enabled when the operation is O(1). template auto size(R &&Range, - std::enable_if_t::iterator_category, - std::random_access_iterator_tag>::value, - void> * = nullptr) { + std::enable_if_t< + std::is_base_of::iterator_category>::value, + void> * = nullptr) { return std::distance(Range.begin(), Range.end()); } @@ -1902,16 +1903,16 @@ decltype(auto) apply_tuple(F &&f, Tuple &&t) { /// Return true if the sequence [Begin, End) has exactly N items. Runs in O(N) /// time. Not meant for use with random-access iterators. /// Can optionally take a predicate to filter lazily some items. -template()) &)> +template ()) &)> bool hasNItems( IterTy &&Begin, IterTy &&End, unsigned N, Pred &&ShouldBeCounted = [](const decltype(*std::declval()) &) { return true; }, std::enable_if_t< - !std::is_same>::iterator_category, - std::random_access_iterator_tag>::value, + !std::is_base_of>::iterator_category>::value, void> * = nullptr) { for (; N; ++Begin) { if (Begin == End) @@ -1927,16 +1928,16 @@ bool hasNItems( /// Return true if the sequence [Begin, End) has N or more items. Runs in O(N) /// time. Not meant for use with random-access iterators. /// Can optionally take a predicate to lazily filter some items. -template()) &)> +template ()) &)> bool hasNItemsOrMore( IterTy &&Begin, IterTy &&End, unsigned N, Pred &&ShouldBeCounted = [](const decltype(*std::declval()) &) { return true; }, std::enable_if_t< - !std::is_same>::iterator_category, - std::random_access_iterator_tag>::value, + !std::is_base_of>::iterator_category>::value, void> * = nullptr) { for (; N; ++Begin) { if (Begin == End) -- 2.11.0