Ejemplo n.º 1
0
 range<I>
 operator()(I begin, iterator_difference_t<I> dist, V const & val, R pred_ = R{},
     P proj_ = P{}) const
 {
     RANGES_ASSERT(0 <= dist);
     auto &&pred = invokable(pred_);
     auto &&proj = invokable(proj_);
     while(0 != dist)
     {
         auto half = dist / 2;
         auto middle = next(begin, half);
         if(pred(proj(*middle), val))
         {
             begin = std::move(++middle);
             dist -= half + 1;
         }
         else if(pred(val, proj(*middle)))
         {
             dist = half;
         }
         else
             return {lower_bound_n(std::move(begin), half, val, std::ref(pred)),
                     upper_bound_n(next(middle), dist - half - 1, val, std::ref(pred))};
     }
     return {begin, begin};
 }
            std::pair<I, O>
            operator()(I begin, S end, O result, S2 end_result, BOp bop_ = BOp{},
                       P proj_ = P{}) const
            {
                auto &&bop = invokable(bop_);
                auto &&proj = invokable(proj_);
                using V = iterator_value_t<I>;
                using X = concepts::Invokable::result_t<P, V>;
                coerce<V> v;
                coerce<X> x;

                if(begin != end && result != end_result)
                {
                    auto t1(x(proj(v(*begin))));
                    *result = t1;
                    for(++begin, ++result; begin != end && result != end_result;
                        ++begin, ++result)
                    {
                        auto t2(x(proj(v(*begin))));
                        *result = bop(t2, t1);
                        t1 = std::move(t2);
                    }
                }
                return {begin, result};
            }
Ejemplo n.º 3
0
 O operator()(I begin, SI end, O out_begin, SO out_end, C pred_ = C{}, PI in_proj_ = PI{},
     PO out_proj_ = PO{}) const
 {
     auto && pred = invokable(pred_);
     auto && in_proj = invokable(in_proj_);
     auto && out_proj = invokable(out_proj_);
     O r = out_begin;
     if(r != out_end)
     {
         for(; begin != end && r != out_end; ++begin, ++r)
             *r = *begin;
         make_heap(out_begin, r, std::ref(pred), std::ref(out_proj));
         auto len = r - out_begin;
         for(; begin != end; ++begin)
         {
             if(pred(in_proj(*begin), out_proj(*out_begin)))
             {
                 *out_begin = *begin;
                 detail::sift_down_n(out_begin, len, out_begin, std::ref(pred), std::ref(out_proj));
             }
         }
         sort_heap(out_begin, r, std::ref(pred), std::ref(out_proj));
     }
     return r;
 }
Ejemplo n.º 4
0
 T operator()(I begin, S end, T init, Op op_ = Op{}, P proj_ = P{}) const
 {
     auto &&op = invokable(op_);
     auto &&proj = invokable(proj_);
     for(; begin != end; ++begin)
         init = op(init, proj(*begin));
     return init;
 }
Ejemplo n.º 5
0
 I operator()(I begin, S end, F pred_, P proj_ = P{}) const
 {
     auto &&pred = invokable(pred_);
     auto &&proj = invokable(proj_);
     for(; begin != end; ++begin)
         if(pred(proj(*begin)))
             break;
     return begin;
 }
Ejemplo n.º 6
0
 I operator()(I begin, S end, C pred_, T const & new_value, P proj_ = P{}) const
 {
     auto &&pred = invokable(pred_);
     auto &&proj = invokable(proj_);
     for(; begin != end; ++begin)
         if(pred(proj(*begin)))
             *begin = new_value;
     return begin;
 }
Ejemplo n.º 7
0
 I operator()(I begin, S end, F fun_, P proj_ = P{}) const
 {
     auto &&fun = invokable(fun_);
     auto &&proj = invokable(proj_);
     for(; begin != end; ++begin)
     {
         fun(proj(*begin));
     }
     return begin;
 }
Ejemplo n.º 8
0
 bool
 operator()(I first, S last, F pred, P proj = P{}) const
 {
     auto &&ipred = invokable(pred);
     auto &&iproj = invokable(proj);
     for(; first != last; ++first)
         if(!ipred(iproj(*first)))
             break;
     return first == last;
 }
Ejemplo n.º 9
0
 bool
 operator()(I first, S last, F pred, P proj = P{}) const
 {
     auto &&ipred = invokable(pred);
     auto &&iproj = invokable(proj);
     for(; first != last; ++first)
         if(ipred(iproj(*first)))
             return true;
     return false;
 }
Ejemplo n.º 10
0
 I operator()(I begin, S end, C pred_ = C{}, P proj_ = P{}) const
 {
     auto && pred = invokable(pred_);
     auto && proj = invokable(proj_);
     if(begin != end)
         for(auto tmp = next(begin); tmp != end; ++tmp)
             if(pred(proj(*begin), proj(*tmp)))
                 begin = tmp;
     return begin;
 }
Ejemplo n.º 11
0
 iterator_difference_t<I>
 operator()(I begin, S end, R pred_, P proj_ = P{}) const
 {
     auto &&pred = invokable(pred_);
     auto &&proj = invokable(proj_);
     iterator_difference_t<I> n = 0;
     for(; begin != end; ++begin)
         if(pred(proj(*begin)))
             ++n;
     return n;
 }
Ejemplo n.º 12
0
            T operator()(I1 begin1, S1 end1, I2 begin2, S2 end2, T init, BOp1 bop1_ = BOp1{},
                BOp2 bop2_ = BOp2{}, P1 proj1_ = P1{}, P2 proj2_ = P2{}) const
            {
                auto &&bop1 = invokable(bop1_);
                auto &&bop2 = invokable(bop2_);
                auto &&proj1 = invokable(proj1_);
                auto &&proj2 = invokable(proj2_);

                for (; begin1 != end1 && begin2 != end2; ++begin1, ++begin2)
                  init = bop1(init, bop2(proj1(*begin1), proj2(*begin2)));
                return init;
            }
Ejemplo n.º 13
0
 I
 operator()(I begin, S end, C pred_ = C{}, P proj_ = P{}) const
 {
     auto &&pred = invokable(pred_);
     auto &&proj = invokable(proj_);
     if(begin == end)
         return begin;
     auto next = begin;
     for(; ++next != end; begin = next)
         if(pred(proj(*begin), proj(*next)))
             return begin;
     return next;
 }
Ejemplo n.º 14
0
 std::pair<I, O> operator()(I begin, S end, O out, C pred_, P proj_ = P{}) const
 {
     auto &&pred = invokable(pred_);
     auto &&proj = invokable(proj_);
     for(; begin != end; ++begin)
     {
         auto &&v = save(proj(*begin));
         if(!(pred(v)))
         {
             *out = (decltype(v)) v;
             ++out;
         }
     }
     return {begin, out};
 }
Ejemplo n.º 15
0
 bool operator()(I0 begin0, S0 end0, I1 begin1, S1 end1, C pred_ = C{}, P0 proj0_ = P0{},
     P1 proj1_ = P1{}) const
 {
     auto &&pred = invokable(pred_);
     auto &&proj0 = invokable(proj0_);
     auto &&proj1 = invokable(proj1_);
     for(; begin1 != end1; ++begin0, ++begin1)
     {
         if(begin0 == end0 || pred(proj0(*begin0), proj1(*begin1)))
             return true;
         if(pred(proj1(*begin1), proj1(*begin0)))
             return false;
     }
     return false;
 }
Ejemplo n.º 16
0
 static std::pair<I, O> impl(I begin, S end, O out, C pred_, P proj_,
     concepts::InputIterator*, std::true_type)
 {
     auto &&pred = invokable(pred_);
     auto &&proj = invokable(proj_);
     if(begin != end)
     {
         *out = *begin;
         while(++begin != end)
             if(!pred(proj(*out), proj(*begin)))
                 *++out = *begin;
         ++out;
     }
     return {begin, out};
 }
Ejemplo n.º 17
0
 std::pair<I, O>
 operator()(I begin, S end, O out, F pred_, P proj_ = P{}) const
 {
     auto &&pred = invokable(pred_);
     auto &&proj = invokable(proj_);
     for(; begin != end; ++begin)
     {
         if(pred(proj(*begin)))
         {
             *out = proj(*begin);
             ++out;
         }
     }
     return {begin, out};
 }
Ejemplo n.º 18
0
            I operator()(I begin, S end, C pred_ = C{}, P proj_ = P{}) const
            {
                auto &&pred = invokable(pred_);
                auto &&proj = invokable(proj_);

                begin = adjacent_find(std::move(begin), end, std::ref(pred), std::ref(proj));

                if(begin != end)
                {
                    for(I i = next(begin); ++i != end;)
                        if(!pred(proj(*begin), proj(*i)))
                            *++begin = std::move(*i);
                    ++begin;
                }
                return begin;
            }
Ejemplo n.º 19
0
 std::pair<I, O> operator()(I begin, S end, O out, P proj_ = P{}) const
 {
     auto &&proj = invokable(proj_);
     for(; begin != end; ++begin, ++out)
         *out = std::move(proj(*begin));
     return {begin, out};
 }
Ejemplo n.º 20
0
 I operator()(I begin, S end, R rel = R{}, P proj_ = P{}) const
 {
     auto &&irel = invokable(rel);
     auto &&iproj = invokable(proj_);
     auto i = begin;
     if(begin != end)
     {
         while(++i != end)
         {
             if(irel(iproj(*i), iproj(*begin)))
                 return i;
             begin = i;
         }
     }
     return i;
 }
Ejemplo n.º 21
0
 std::pair<I, O> operator()(I begin, S end_, O out, P proj = P{}) const
 {
     auto &&iproj = invokable(proj);
     I i = next_to(begin, end_), end = i;
     while(begin != i)
         *--out = iproj(*--i);
     return {end, out};
 }
Ejemplo n.º 22
0
 I operator()(I begin, S end, V const &val, P proj_ = P{}) const
 {
     auto &&proj = invokable(proj_);
     for(; begin != end; ++begin)
         if(proj(*begin) == val)
             break;
     return begin;
 }
Ejemplo n.º 23
0
 I operator()(I begin, S end, C pred_, P proj_ = P{}) const
 {
     auto &&pred = invokable(pred_);
     auto &&proj = invokable(proj_);
     begin = find_if(std::move(begin), end, std::ref(pred), std::ref(proj));
     if(begin != end)
     {
         for(I i = next(begin); i != end; ++i)
         {
             if(!(pred(proj(*i))))
             {
                 *begin = iter_move(i);
                 ++begin;
             }
         }
     }
     return begin;
 }
Ejemplo n.º 24
0
            I operator()(I begin, I middle, S end, C pred_ = C{}, P proj_ = P{}) const
            {
                auto && pred = invokable(pred_);
                auto && proj = invokable(proj_);

                make_heap(begin, middle, std::ref(pred), std::ref(proj));
                auto const len = middle - begin;
                I i = middle;
                for(; i != end; ++i)
                {
                    if(pred(proj(*i), proj(*begin)))
                    {
                        iter_swap(i, begin);
                        detail::sift_down_n(begin, len, begin, std::ref(pred), std::ref(proj));
                    }
                }
                sort_heap(begin, middle, std::ref(pred), std::ref(proj));
                return i;
            }
Ejemplo n.º 25
0
 I operator()(I begin, S end, C pred_, P proj_ = P{}) const
 {
     auto && pred = invokable(pred_);
     auto && proj = invokable(proj_);
     auto len = distance(begin, end);
     while(len != 0)
     {
         auto const half = len / 2;
         auto middle = next(uncounted(begin), half);
         if(pred(proj(*middle)))
         {
             begin = recounted(begin, std::move(++middle), half + 1);
             len -= half + 1;
         }
         else
             len = half;
     }
     return begin;
 }
Ejemplo n.º 26
0
 std::pair<I, O> operator()(I begin, S end, O out, T0 const & old_value, T1 const & new_value, P proj_ = {}) const
 {
     auto &&proj = invokable(proj_);
     for(; begin != end; ++begin, ++out)
         if(proj(*begin) == old_value)
             *out = new_value;
         else
             *out = *begin;
     return {begin, out};
 }
Ejemplo n.º 27
0
 std::pair<I, O>
 operator()(I begin, iterator_difference_t<I> n, O out, P proj_ = P{}) const
 {
     RANGES_ASSERT(0 <= n);
     auto &&proj = invokable(proj_);
     auto norig = n;
     auto b = uncounted(begin);
     for(; n != 0; ++b, ++out, --n)
         *out = proj(*b);
     return {recounted(begin, b, norig), out};
 }
Ejemplo n.º 28
0
 std::tuple<I0, I1, O>
 operator()(I0 begin0, iterator_difference_t<I0> n0,
            I1 begin1, iterator_difference_t<I1> n1,
            O out, C r = C{}, P0 p0 = P0{}, P1 p1 = P1{}) const
 {
     using T = std::tuple<I0, I1, O>;
     auto &&ir = invokable(r);
     auto &&ip0 = invokable(p0);
     auto &&ip1 = invokable(p1);
     auto n0orig = n0;
     auto n1orig = n1;
     auto b0 = uncounted(begin0);
     auto b1 = uncounted(begin1);
     while(true)
     {
         if(0 == n0)
         {
             auto res = copy_n(b1, n1, out);
             begin0 = recounted(begin0, b0, n0orig);
             begin1 = recounted(begin1, res.first, n1orig);
             return T{begin0, begin1, res.second};
         }
         if(0 == n1)
         {
             auto res = copy_n(b0, n0, out);
             begin0 = recounted(begin0, res.first, n0orig);
             begin1 = recounted(begin1, b1, n1orig);
             return T{begin0, begin1, res.second};
         }
         if(ir(ip1(*b1), ip0(*b0)))
         {
             *out = *b1;
             ++b1; ++out; --n1;
         }
         else
         {
             *out = *b0;
             ++b0; ++out; --n0;
         }
     }
 }
Ejemplo n.º 29
0
 std::pair<I, O> operator()(I begin, S end_, O out, P proj_ = P{}) const
 {
     auto &&proj = invokable(proj_);
     I i = next_to(begin, end_), end = i;
     while(begin != i)
     {
         // BUGBUG should the projection be applied *before* the move?
         auto &&x = iter_move(--i);
         *--out = proj((decltype(x) &&) x);
     }
     return {end, out};
 }
Ejemplo n.º 30
0
 static I impl(I begin, S end, C pred_, P proj_, concepts::ForwardIterator*)
 {
     auto && pred = invokable(pred_);
     auto && proj = invokable(proj_);
     while(true)
     {
         if(begin == end)
             return begin;
         if(!pred(proj(*begin)))
             break;
         ++begin;
     }
     for(I p = begin; ++p != end;)
     {
         if(pred(proj(*p)))
         {
             ranges::iter_swap(begin, p);
             ++begin;
         }
     }
     return begin;
 }