126 std::vector<std::tuple<InputIt, InputIt>> parts;
127 parts.push_back(std::make_tuple(start, end));
132 while(parts.size() > 0)
134 std::vector<std::tuple<InputIt, InputIt>> l_parts;
138 for(
auto it = parts.begin(); it != parts.end(); it++)
142 InputIt i = std::get<0>(*it);
143 InputIt end = std::get<1>(*it);
144 std::ptrdiff_t diff = end - i;
147 if(predicate(*i, *(end - 1)))
155 std::swap(*(end - 1), *(end - 2));
157 std::swap(*i, *(end - 1));
162 if(end - 1 - std::get<0>(*it) > 1)
166 std::make_tuple(std::get<0>(*it), end - 1));
167 omp_unset_lock(&mtx);
169 if(std::get<1>(*it) - end > 1)
172 l_parts.push_back(std::make_tuple(end, std::get<1>(*it)));
173 omp_unset_lock(&mtx);
178 parts = std::move(l_parts);
181 omp_destroy_lock(&mtx);
202 return std::remove(start, end, val);
210#pragma omp for ordered
211 for(T *i = s + 1; i != e; i++)
217 *s = std::move((*i));
222 start += s - start.base();
246 return std::remove_if(start, end, predicate);
254#pragma omp for ordered
255 for(T *i = s + 1; i != e; i++)
266 start += s - start.base();