Seredenko-V

async_v1

Aug 6th, 2022 (edited)
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.21 KB | None | 0 0
  1. template <typename RandomAccessIterator, typename Value>
  2. RandomAccessIterator LowerBound(const execution::sequenced_policy&,
  3.     RandomAccessIterator range_begin, RandomAccessIterator range_end, const Value& value) {
  4.     auto left_bound = range_begin;
  5.     auto right_bound = range_end;
  6.     while (left_bound + 1 < right_bound) {
  7.         const auto middle = left_bound + (right_bound - left_bound) / 2;
  8.         if (*middle < value) {
  9.             left_bound = middle;
  10.         } else {
  11.             right_bound = middle;
  12.         }
  13.     }
  14.     if (left_bound == range_begin && !(*left_bound < value)) {
  15.         return left_bound;
  16.     } else {
  17.         return right_bound;
  18.     }
  19. }
  20.  
  21. template <typename RandomAccessIterator, typename Value>
  22. RandomAccessIterator LowerBound(RandomAccessIterator range_begin, RandomAccessIterator range_end,
  23.     const Value& value) {
  24.     return LowerBound(execution::seq, range_begin, range_end, value);
  25. }
  26.  
  27. template <typename RandomAccessIterator, typename Value>
  28. RandomAccessIterator LowerBound(const execution::parallel_policy&, RandomAccessIterator range_begin,
  29.     RandomAccessIterator range_end, const Value& value) {
  30.     if (range_end - range_begin == 1) {
  31.         return range_begin;
  32.     }
  33.     if (range_end - range_begin == 2) {
  34.         return *range_begin < value ? range_begin : range_end;
  35.     }
  36.     // размер 2-х поддиапазонов
  37.     size_t size_one_third = (range_end - range_begin) / 3;
  38.     const RandomAccessIterator middle_left = range_begin + size_one_third;
  39.     const RandomAccessIterator middle_right = middle_left + size_one_third;
  40.     future<bool> is_first_one_third = async([middle_left, &value] {
  41.         return !(*middle_left < value); }); // false - левая часть нас не интересует
  42.     bool is_second_one_third = !(*middle_right < value);
  43.     //future<bool> no_is_second_one_third = async([middle_right, &value] {
  44.     //    return *middle_left < value; });
  45.  
  46.     if (is_first_one_third.get()) {
  47.         return LowerBound(range_begin, middle_left, value);
  48.     } else if (is_second_one_third) {
  49.         return LowerBound(middle_left, middle_right, value);
  50.     } else {
  51.         return LowerBound(middle_right, range_end, value);
  52.     }
  53. }
Advertisement
Add Comment
Please, Sign In to add comment