[NFC] Add filters to hasNItems and hasNItemsOrMore

Reviewers: lebedev.ri, jdoerfert

Reviewed By: jdoerfert

Subscribers: jdoerfert, dexonsmith, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D74967
This commit is contained in:
Tyker 2020-03-12 00:35:27 +01:00
parent 096d545376
commit 61211fec86
1 changed files with 16 additions and 4 deletions

View File

@ -1520,33 +1520,45 @@ 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.
template <typename IterTy>
/// Can optionally take a predicate to filter lazily some items.
template<typename IterTy,
typename Pred = bool (*)(const decltype(*std::declval<IterTy>()) &)>
bool hasNItems(
IterTy &&Begin, IterTy &&End, unsigned N,
Pred &&ShouldBeCounted =
[](const decltype(*std::declval<IterTy>()) &) { return true; },
std::enable_if_t<
!std::is_same<typename std::iterator_traits<std::remove_reference_t<
decltype(Begin)>>::iterator_category,
std::random_access_iterator_tag>::value,
void> * = nullptr) {
for (; N; --N, ++Begin)
for (; N; ++Begin) {
if (Begin == End)
return false; // Too few.
N -= ShouldBeCounted(*Begin);
}
return Begin == End;
}
/// 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.
template <typename IterTy>
/// Can optionally take a predicate to filter lazily some items.
template<typename IterTy,
typename Pred = bool (*)(const decltype(*std::declval<IterTy>()) &)>
bool hasNItemsOrMore(
IterTy &&Begin, IterTy &&End, unsigned N,
Pred &&ShouldBeCounted =
[](const decltype(*std::declval<IterTy>()) &) { return true; },
std::enable_if_t<
!std::is_same<typename std::iterator_traits<std::remove_reference_t<
decltype(Begin)>>::iterator_category,
std::random_access_iterator_tag>::value,
void> * = nullptr) {
for (; N; --N, ++Begin)
for (; N; ++Begin) {
if (Begin == End)
return false; // Too few.
N -= ShouldBeCounted(*Begin);
}
return true;
}