in include/range/v3/algorithm/partition.hpp [76:99]
static I impl(I begin, S end_, C pred_, P proj_, concepts::BidirectionalIterator*)
{
auto && pred = as_function(pred_);
auto && proj = as_function(proj_);
I end = ranges::next(begin, end_);
while(true)
{
while(true)
{
if(begin == end)
return begin;
if(!pred(proj(*begin)))
break;
++begin;
}
do
{
if(begin == --end)
return begin;
} while(!pred(proj(*end)));
ranges::iter_swap(begin, end);
++begin;
}
}