FwdIter upper_bound(FwdIter first, FwdIter last, T const& value, F && f, CancelToken& tok) { typedef typename std::iterator_traits<FwdIter>::difference_type difference_type; difference_type count = std::distance(first, last); while (count > 0) { if (tok.was_cancelled()) break; difference_type step = count / 2; FwdIter it = detail::next(first, step); if (!f(*it, value)) { first = ++it; count -= step + 1; } else { count = step; } } return first; }
HPX_HOST_DEVICE static Begin call(Begin it, End end, CancelToken& tok, F && func) { for (/**/; it != end; ++it) { if (tok.was_cancelled()) break; func(it); } return it; }
HPX_HOST_DEVICE static Iter call(Iter it, std::size_t count, CancelToken& tok, F && f) { for (/**/; count != 0; (void) --count, ++it) { if (tok.was_cancelled()) break; f(it); } return it; }
static Iter call(std::size_t base_idx, Iter it, std::size_t count, CancelToken& tok, F && f) { for (/**/; count != 0; (void) --count, ++it, ++base_idx) { if (tok.was_cancelled(base_idx)) break; f(*it, base_idx); } return it; }
bool sequential_includes(InIter1 first1, InIter1 last1, InIter2 first2, InIter2 last2, F && f, CancelToken& tok) { while (first2 != last2) { if (tok.was_cancelled()) return false; if (first1 == last1 || f(*first2, *first1)) return false; if (!f(*first1, *first2)) ++first2; ++first1; } return true; }
static FwdIter call_with_token(Iter it, std::size_t count, FwdIter dest, CancelToken& tok, F && f, Cleanup && cleanup) { FwdIter base = dest; try { for (/**/; count != 0; (void) --count, ++it, ++dest) { if (tok.was_cancelled()) break; f(it, dest); } return dest; } catch (...) { tok.cancel(); for (/**/; base != dest; ++base) cleanup(base); throw; } }