Line data Source code
1 : // Algorithm implementation -*- C++ -*-
2 :
3 : // Copyright (C) 2001-2022 Free Software Foundation, Inc.
4 : //
5 : // This file is part of the GNU ISO C++ Library. This library is free
6 : // software; you can redistribute it and/or modify it under the
7 : // terms of the GNU General Public License as published by the
8 : // Free Software Foundation; either version 3, or (at your option)
9 : // any later version.
10 :
11 : // This library is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 :
16 : // Under Section 7 of GPL version 3, you are granted additional
17 : // permissions described in the GCC Runtime Library Exception, version
18 : // 3.1, as published by the Free Software Foundation.
19 :
20 : // You should have received a copy of the GNU General Public License and
21 : // a copy of the GCC Runtime Library Exception along with this program;
22 : // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 : // <http://www.gnu.org/licenses/>.
24 :
25 : /*
26 : *
27 : * Copyright (c) 1994
28 : * Hewlett-Packard Company
29 : *
30 : * Permission to use, copy, modify, distribute and sell this software
31 : * and its documentation for any purpose is hereby granted without fee,
32 : * provided that the above copyright notice appear in all copies and
33 : * that both that copyright notice and this permission notice appear
34 : * in supporting documentation. Hewlett-Packard Company makes no
35 : * representations about the suitability of this software for any
36 : * purpose. It is provided "as is" without express or implied warranty.
37 : *
38 : *
39 : * Copyright (c) 1996
40 : * Silicon Graphics Computer Systems, Inc.
41 : *
42 : * Permission to use, copy, modify, distribute and sell this software
43 : * and its documentation for any purpose is hereby granted without fee,
44 : * provided that the above copyright notice appear in all copies and
45 : * that both that copyright notice and this permission notice appear
46 : * in supporting documentation. Silicon Graphics makes no
47 : * representations about the suitability of this software for any
48 : * purpose. It is provided "as is" without express or implied warranty.
49 : */
50 :
51 : /** @file bits/stl_algo.h
52 : * This is an internal header file, included by other library headers.
53 : * Do not attempt to use it directly. @headername{algorithm}
54 : */
55 :
56 : #ifndef _STL_ALGO_H
57 : #define _STL_ALGO_H 1
58 :
59 : #include <bits/algorithmfwd.h>
60 : #include <bits/stl_heap.h>
61 : #include <bits/stl_tempbuf.h> // for _Temporary_buffer
62 : #include <bits/predefined_ops.h>
63 :
64 : #if __cplusplus >= 201103L
65 : #include <bits/uniform_int_dist.h>
66 : #endif
67 :
68 : #if _GLIBCXX_HOSTED && (__cplusplus <= 201103L || _GLIBCXX_USE_DEPRECATED)
69 : #include <cstdlib> // for rand
70 : #endif
71 :
72 : // See concept_check.h for the __glibcxx_*_requires macros.
73 :
74 : namespace std _GLIBCXX_VISIBILITY(default)
75 : {
76 : _GLIBCXX_BEGIN_NAMESPACE_VERSION
77 :
78 : /// Swaps the median value of *__a, *__b and *__c under __comp to *__result
79 : template<typename _Iterator, typename _Compare>
80 : _GLIBCXX20_CONSTEXPR
81 : void
82 : __move_median_to_first(_Iterator __result,_Iterator __a, _Iterator __b,
83 : _Iterator __c, _Compare __comp)
84 : {
85 : if (__comp(__a, __b))
86 : {
87 : if (__comp(__b, __c))
88 : std::iter_swap(__result, __b);
89 : else if (__comp(__a, __c))
90 : std::iter_swap(__result, __c);
91 : else
92 : std::iter_swap(__result, __a);
93 : }
94 : else if (__comp(__a, __c))
95 : std::iter_swap(__result, __a);
96 : else if (__comp(__b, __c))
97 : std::iter_swap(__result, __c);
98 : else
99 : std::iter_swap(__result, __b);
100 : }
101 :
102 : /// Provided for stable_partition to use.
103 : template<typename _InputIterator, typename _Predicate>
104 : _GLIBCXX20_CONSTEXPR
105 : inline _InputIterator
106 : __find_if_not(_InputIterator __first, _InputIterator __last,
107 : _Predicate __pred)
108 : {
109 : return std::__find_if(__first, __last,
110 : __gnu_cxx::__ops::__negate(__pred),
111 : std::__iterator_category(__first));
112 : }
113 :
114 : /// Like find_if_not(), but uses and updates a count of the
115 : /// remaining range length instead of comparing against an end
116 : /// iterator.
117 : template<typename _InputIterator, typename _Predicate, typename _Distance>
118 : _GLIBCXX20_CONSTEXPR
119 : _InputIterator
120 : __find_if_not_n(_InputIterator __first, _Distance& __len, _Predicate __pred)
121 : {
122 : for (; __len; --__len, (void) ++__first)
123 : if (!__pred(__first))
124 : break;
125 : return __first;
126 : }
127 :
128 : // set_difference
129 : // set_intersection
130 : // set_symmetric_difference
131 : // set_union
132 : // for_each
133 : // find
134 : // find_if
135 : // find_first_of
136 : // adjacent_find
137 : // count
138 : // count_if
139 : // search
140 :
141 : template<typename _ForwardIterator1, typename _ForwardIterator2,
142 : typename _BinaryPredicate>
143 : _GLIBCXX20_CONSTEXPR
144 : _ForwardIterator1
145 : __search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
146 : _ForwardIterator2 __first2, _ForwardIterator2 __last2,
147 : _BinaryPredicate __predicate)
148 : {
149 : // Test for empty ranges
150 : if (__first1 == __last1 || __first2 == __last2)
151 : return __first1;
152 :
153 : // Test for a pattern of length 1.
154 : _ForwardIterator2 __p1(__first2);
155 : if (++__p1 == __last2)
156 : return std::__find_if(__first1, __last1,
157 : __gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2));
158 :
159 : // General case.
160 : _ForwardIterator1 __current = __first1;
161 :
162 : for (;;)
163 : {
164 : __first1 =
165 : std::__find_if(__first1, __last1,
166 : __gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2));
167 :
168 : if (__first1 == __last1)
169 : return __last1;
170 :
171 : _ForwardIterator2 __p = __p1;
172 : __current = __first1;
173 : if (++__current == __last1)
174 : return __last1;
175 :
176 : while (__predicate(__current, __p))
177 : {
178 : if (++__p == __last2)
179 : return __first1;
180 : if (++__current == __last1)
181 : return __last1;
182 : }
183 : ++__first1;
184 : }
185 : return __first1;
186 : }
187 :
188 : // search_n
189 :
190 : /**
191 : * This is an helper function for search_n overloaded for forward iterators.
192 : */
193 : template<typename _ForwardIterator, typename _Integer,
194 : typename _UnaryPredicate>
195 : _GLIBCXX20_CONSTEXPR
196 : _ForwardIterator
197 : __search_n_aux(_ForwardIterator __first, _ForwardIterator __last,
198 : _Integer __count, _UnaryPredicate __unary_pred,
199 : std::forward_iterator_tag)
200 : {
201 : __first = std::__find_if(__first, __last, __unary_pred);
202 : while (__first != __last)
203 : {
204 : typename iterator_traits<_ForwardIterator>::difference_type
205 : __n = __count;
206 : _ForwardIterator __i = __first;
207 : ++__i;
208 : while (__i != __last && __n != 1 && __unary_pred(__i))
209 : {
210 : ++__i;
211 : --__n;
212 : }
213 : if (__n == 1)
214 : return __first;
215 : if (__i == __last)
216 : return __last;
217 : __first = std::__find_if(++__i, __last, __unary_pred);
218 : }
219 : return __last;
220 : }
221 :
222 : /**
223 : * This is an helper function for search_n overloaded for random access
224 : * iterators.
225 : */
226 : template<typename _RandomAccessIter, typename _Integer,
227 : typename _UnaryPredicate>
228 : _GLIBCXX20_CONSTEXPR
229 : _RandomAccessIter
230 : __search_n_aux(_RandomAccessIter __first, _RandomAccessIter __last,
231 : _Integer __count, _UnaryPredicate __unary_pred,
232 : std::random_access_iterator_tag)
233 : {
234 : typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
235 : _DistanceType;
236 :
237 : _DistanceType __tailSize = __last - __first;
238 : _DistanceType __remainder = __count;
239 :
240 : while (__remainder <= __tailSize) // the main loop...
241 : {
242 : __first += __remainder;
243 : __tailSize -= __remainder;
244 : // __first here is always pointing to one past the last element of
245 : // next possible match.
246 : _RandomAccessIter __backTrack = __first;
247 : while (__unary_pred(--__backTrack))
248 : {
249 : if (--__remainder == 0)
250 : return (__first - __count); // Success
251 : }
252 : __remainder = __count + 1 - (__first - __backTrack);
253 : }
254 : return __last; // Failure
255 : }
256 :
257 : template<typename _ForwardIterator, typename _Integer,
258 : typename _UnaryPredicate>
259 : _GLIBCXX20_CONSTEXPR
260 : _ForwardIterator
261 : __search_n(_ForwardIterator __first, _ForwardIterator __last,
262 : _Integer __count,
263 : _UnaryPredicate __unary_pred)
264 : {
265 : if (__count <= 0)
266 : return __first;
267 :
268 : if (__count == 1)
269 : return std::__find_if(__first, __last, __unary_pred);
270 :
271 : return std::__search_n_aux(__first, __last, __count, __unary_pred,
272 : std::__iterator_category(__first));
273 : }
274 :
275 : // find_end for forward iterators.
276 : template<typename _ForwardIterator1, typename _ForwardIterator2,
277 : typename _BinaryPredicate>
278 : _GLIBCXX20_CONSTEXPR
279 : _ForwardIterator1
280 : __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
281 : _ForwardIterator2 __first2, _ForwardIterator2 __last2,
282 : forward_iterator_tag, forward_iterator_tag,
283 : _BinaryPredicate __comp)
284 : {
285 : if (__first2 == __last2)
286 : return __last1;
287 :
288 : _ForwardIterator1 __result = __last1;
289 : while (1)
290 : {
291 : _ForwardIterator1 __new_result
292 : = std::__search(__first1, __last1, __first2, __last2, __comp);
293 : if (__new_result == __last1)
294 : return __result;
295 : else
296 : {
297 : __result = __new_result;
298 : __first1 = __new_result;
299 : ++__first1;
300 : }
301 : }
302 : }
303 :
304 : // find_end for bidirectional iterators (much faster).
305 : template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
306 : typename _BinaryPredicate>
307 : _GLIBCXX20_CONSTEXPR
308 : _BidirectionalIterator1
309 : __find_end(_BidirectionalIterator1 __first1,
310 : _BidirectionalIterator1 __last1,
311 : _BidirectionalIterator2 __first2,
312 : _BidirectionalIterator2 __last2,
313 : bidirectional_iterator_tag, bidirectional_iterator_tag,
314 : _BinaryPredicate __comp)
315 : {
316 : // concept requirements
317 : __glibcxx_function_requires(_BidirectionalIteratorConcept<
318 : _BidirectionalIterator1>)
319 : __glibcxx_function_requires(_BidirectionalIteratorConcept<
320 : _BidirectionalIterator2>)
321 :
322 : typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
323 : typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
324 :
325 : _RevIterator1 __rlast1(__first1);
326 : _RevIterator2 __rlast2(__first2);
327 : _RevIterator1 __rresult = std::__search(_RevIterator1(__last1), __rlast1,
328 : _RevIterator2(__last2), __rlast2,
329 : __comp);
330 :
331 : if (__rresult == __rlast1)
332 : return __last1;
333 : else
334 : {
335 : _BidirectionalIterator1 __result = __rresult.base();
336 : std::advance(__result, -std::distance(__first2, __last2));
337 : return __result;
338 : }
339 : }
340 :
341 : /**
342 : * @brief Find last matching subsequence in a sequence.
343 : * @ingroup non_mutating_algorithms
344 : * @param __first1 Start of range to search.
345 : * @param __last1 End of range to search.
346 : * @param __first2 Start of sequence to match.
347 : * @param __last2 End of sequence to match.
348 : * @return The last iterator @c i in the range
349 : * @p [__first1,__last1-(__last2-__first2)) such that @c *(i+N) ==
350 : * @p *(__first2+N) for each @c N in the range @p
351 : * [0,__last2-__first2), or @p __last1 if no such iterator exists.
352 : *
353 : * Searches the range @p [__first1,__last1) for a sub-sequence that
354 : * compares equal value-by-value with the sequence given by @p
355 : * [__first2,__last2) and returns an iterator to the __first
356 : * element of the sub-sequence, or @p __last1 if the sub-sequence
357 : * is not found. The sub-sequence will be the last such
358 : * subsequence contained in [__first1,__last1).
359 : *
360 : * Because the sub-sequence must lie completely within the range @p
361 : * [__first1,__last1) it must start at a position less than @p
362 : * __last1-(__last2-__first2) where @p __last2-__first2 is the
363 : * length of the sub-sequence. This means that the returned
364 : * iterator @c i will be in the range @p
365 : * [__first1,__last1-(__last2-__first2))
366 : */
367 : template<typename _ForwardIterator1, typename _ForwardIterator2>
368 : _GLIBCXX20_CONSTEXPR
369 : inline _ForwardIterator1
370 : find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
371 : _ForwardIterator2 __first2, _ForwardIterator2 __last2)
372 : {
373 : // concept requirements
374 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
375 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
376 : __glibcxx_function_requires(_EqualOpConcept<
377 : typename iterator_traits<_ForwardIterator1>::value_type,
378 : typename iterator_traits<_ForwardIterator2>::value_type>)
379 : __glibcxx_requires_valid_range(__first1, __last1);
380 : __glibcxx_requires_valid_range(__first2, __last2);
381 :
382 : return std::__find_end(__first1, __last1, __first2, __last2,
383 : std::__iterator_category(__first1),
384 : std::__iterator_category(__first2),
385 : __gnu_cxx::__ops::__iter_equal_to_iter());
386 : }
387 :
388 : /**
389 : * @brief Find last matching subsequence in a sequence using a predicate.
390 : * @ingroup non_mutating_algorithms
391 : * @param __first1 Start of range to search.
392 : * @param __last1 End of range to search.
393 : * @param __first2 Start of sequence to match.
394 : * @param __last2 End of sequence to match.
395 : * @param __comp The predicate to use.
396 : * @return The last iterator @c i in the range @p
397 : * [__first1,__last1-(__last2-__first2)) such that @c
398 : * predicate(*(i+N), @p (__first2+N)) is true for each @c N in the
399 : * range @p [0,__last2-__first2), or @p __last1 if no such iterator
400 : * exists.
401 : *
402 : * Searches the range @p [__first1,__last1) for a sub-sequence that
403 : * compares equal value-by-value with the sequence given by @p
404 : * [__first2,__last2) using comp as a predicate and returns an
405 : * iterator to the first element of the sub-sequence, or @p __last1
406 : * if the sub-sequence is not found. The sub-sequence will be the
407 : * last such subsequence contained in [__first,__last1).
408 : *
409 : * Because the sub-sequence must lie completely within the range @p
410 : * [__first1,__last1) it must start at a position less than @p
411 : * __last1-(__last2-__first2) where @p __last2-__first2 is the
412 : * length of the sub-sequence. This means that the returned
413 : * iterator @c i will be in the range @p
414 : * [__first1,__last1-(__last2-__first2))
415 : */
416 : template<typename _ForwardIterator1, typename _ForwardIterator2,
417 : typename _BinaryPredicate>
418 : _GLIBCXX20_CONSTEXPR
419 : inline _ForwardIterator1
420 : find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
421 : _ForwardIterator2 __first2, _ForwardIterator2 __last2,
422 : _BinaryPredicate __comp)
423 : {
424 : // concept requirements
425 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
426 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
427 : __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
428 : typename iterator_traits<_ForwardIterator1>::value_type,
429 : typename iterator_traits<_ForwardIterator2>::value_type>)
430 : __glibcxx_requires_valid_range(__first1, __last1);
431 : __glibcxx_requires_valid_range(__first2, __last2);
432 :
433 : return std::__find_end(__first1, __last1, __first2, __last2,
434 : std::__iterator_category(__first1),
435 : std::__iterator_category(__first2),
436 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
437 : }
438 :
439 : #if __cplusplus >= 201103L
440 : /**
441 : * @brief Checks that a predicate is true for all the elements
442 : * of a sequence.
443 : * @ingroup non_mutating_algorithms
444 : * @param __first An input iterator.
445 : * @param __last An input iterator.
446 : * @param __pred A predicate.
447 : * @return True if the check is true, false otherwise.
448 : *
449 : * Returns true if @p __pred is true for each element in the range
450 : * @p [__first,__last), and false otherwise.
451 : */
452 : template<typename _InputIterator, typename _Predicate>
453 : _GLIBCXX20_CONSTEXPR
454 : inline bool
455 : all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
456 : { return __last == std::find_if_not(__first, __last, __pred); }
457 :
458 : /**
459 : * @brief Checks that a predicate is false for all the elements
460 : * of a sequence.
461 : * @ingroup non_mutating_algorithms
462 : * @param __first An input iterator.
463 : * @param __last An input iterator.
464 : * @param __pred A predicate.
465 : * @return True if the check is true, false otherwise.
466 : *
467 : * Returns true if @p __pred is false for each element in the range
468 : * @p [__first,__last), and false otherwise.
469 : */
470 : template<typename _InputIterator, typename _Predicate>
471 : _GLIBCXX20_CONSTEXPR
472 : inline bool
473 : none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
474 : { return __last == _GLIBCXX_STD_A::find_if(__first, __last, __pred); }
475 :
476 : /**
477 : * @brief Checks that a predicate is true for at least one element
478 : * of a sequence.
479 : * @ingroup non_mutating_algorithms
480 : * @param __first An input iterator.
481 : * @param __last An input iterator.
482 : * @param __pred A predicate.
483 : * @return True if the check is true, false otherwise.
484 : *
485 : * Returns true if an element exists in the range @p
486 : * [__first,__last) such that @p __pred is true, and false
487 : * otherwise.
488 : */
489 : template<typename _InputIterator, typename _Predicate>
490 : _GLIBCXX20_CONSTEXPR
491 : inline bool
492 : any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
493 : { return !std::none_of(__first, __last, __pred); }
494 :
495 : /**
496 : * @brief Find the first element in a sequence for which a
497 : * predicate is false.
498 : * @ingroup non_mutating_algorithms
499 : * @param __first An input iterator.
500 : * @param __last An input iterator.
501 : * @param __pred A predicate.
502 : * @return The first iterator @c i in the range @p [__first,__last)
503 : * such that @p __pred(*i) is false, or @p __last if no such iterator exists.
504 : */
505 : template<typename _InputIterator, typename _Predicate>
506 : _GLIBCXX20_CONSTEXPR
507 : inline _InputIterator
508 : find_if_not(_InputIterator __first, _InputIterator __last,
509 : _Predicate __pred)
510 : {
511 : // concept requirements
512 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
513 : __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
514 : typename iterator_traits<_InputIterator>::value_type>)
515 : __glibcxx_requires_valid_range(__first, __last);
516 : return std::__find_if_not(__first, __last,
517 : __gnu_cxx::__ops::__pred_iter(__pred));
518 : }
519 :
520 : /**
521 : * @brief Checks whether the sequence is partitioned.
522 : * @ingroup mutating_algorithms
523 : * @param __first An input iterator.
524 : * @param __last An input iterator.
525 : * @param __pred A predicate.
526 : * @return True if the range @p [__first,__last) is partioned by @p __pred,
527 : * i.e. if all elements that satisfy @p __pred appear before those that
528 : * do not.
529 : */
530 : template<typename _InputIterator, typename _Predicate>
531 : _GLIBCXX20_CONSTEXPR
532 : inline bool
533 : is_partitioned(_InputIterator __first, _InputIterator __last,
534 : _Predicate __pred)
535 : {
536 : __first = std::find_if_not(__first, __last, __pred);
537 : if (__first == __last)
538 : return true;
539 : ++__first;
540 : return std::none_of(__first, __last, __pred);
541 : }
542 :
543 : /**
544 : * @brief Find the partition point of a partitioned range.
545 : * @ingroup mutating_algorithms
546 : * @param __first An iterator.
547 : * @param __last Another iterator.
548 : * @param __pred A predicate.
549 : * @return An iterator @p mid such that @p all_of(__first, mid, __pred)
550 : * and @p none_of(mid, __last, __pred) are both true.
551 : */
552 : template<typename _ForwardIterator, typename _Predicate>
553 : _GLIBCXX20_CONSTEXPR
554 : _ForwardIterator
555 : partition_point(_ForwardIterator __first, _ForwardIterator __last,
556 : _Predicate __pred)
557 : {
558 : // concept requirements
559 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
560 : __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
561 : typename iterator_traits<_ForwardIterator>::value_type>)
562 :
563 : // A specific debug-mode test will be necessary...
564 : __glibcxx_requires_valid_range(__first, __last);
565 :
566 : typedef typename iterator_traits<_ForwardIterator>::difference_type
567 : _DistanceType;
568 :
569 : _DistanceType __len = std::distance(__first, __last);
570 :
571 : while (__len > 0)
572 : {
573 : _DistanceType __half = __len >> 1;
574 : _ForwardIterator __middle = __first;
575 : std::advance(__middle, __half);
576 : if (__pred(*__middle))
577 : {
578 : __first = __middle;
579 : ++__first;
580 : __len = __len - __half - 1;
581 : }
582 : else
583 : __len = __half;
584 : }
585 : return __first;
586 : }
587 : #endif
588 :
589 : template<typename _InputIterator, typename _OutputIterator,
590 : typename _Predicate>
591 : _GLIBCXX20_CONSTEXPR
592 : _OutputIterator
593 : __remove_copy_if(_InputIterator __first, _InputIterator __last,
594 : _OutputIterator __result, _Predicate __pred)
595 : {
596 : for (; __first != __last; ++__first)
597 : if (!__pred(__first))
598 : {
599 : *__result = *__first;
600 : ++__result;
601 : }
602 : return __result;
603 : }
604 :
605 : /**
606 : * @brief Copy a sequence, removing elements of a given value.
607 : * @ingroup mutating_algorithms
608 : * @param __first An input iterator.
609 : * @param __last An input iterator.
610 : * @param __result An output iterator.
611 : * @param __value The value to be removed.
612 : * @return An iterator designating the end of the resulting sequence.
613 : *
614 : * Copies each element in the range @p [__first,__last) not equal
615 : * to @p __value to the range beginning at @p __result.
616 : * remove_copy() is stable, so the relative order of elements that
617 : * are copied is unchanged.
618 : */
619 : template<typename _InputIterator, typename _OutputIterator, typename _Tp>
620 : _GLIBCXX20_CONSTEXPR
621 : inline _OutputIterator
622 : remove_copy(_InputIterator __first, _InputIterator __last,
623 : _OutputIterator __result, const _Tp& __value)
624 : {
625 : // concept requirements
626 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
627 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
628 : typename iterator_traits<_InputIterator>::value_type>)
629 : __glibcxx_function_requires(_EqualOpConcept<
630 : typename iterator_traits<_InputIterator>::value_type, _Tp>)
631 : __glibcxx_requires_valid_range(__first, __last);
632 :
633 : return std::__remove_copy_if(__first, __last, __result,
634 : __gnu_cxx::__ops::__iter_equals_val(__value));
635 : }
636 :
637 : /**
638 : * @brief Copy a sequence, removing elements for which a predicate is true.
639 : * @ingroup mutating_algorithms
640 : * @param __first An input iterator.
641 : * @param __last An input iterator.
642 : * @param __result An output iterator.
643 : * @param __pred A predicate.
644 : * @return An iterator designating the end of the resulting sequence.
645 : *
646 : * Copies each element in the range @p [__first,__last) for which
647 : * @p __pred returns false to the range beginning at @p __result.
648 : *
649 : * remove_copy_if() is stable, so the relative order of elements that are
650 : * copied is unchanged.
651 : */
652 : template<typename _InputIterator, typename _OutputIterator,
653 : typename _Predicate>
654 : _GLIBCXX20_CONSTEXPR
655 : inline _OutputIterator
656 : remove_copy_if(_InputIterator __first, _InputIterator __last,
657 : _OutputIterator __result, _Predicate __pred)
658 : {
659 : // concept requirements
660 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
661 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
662 : typename iterator_traits<_InputIterator>::value_type>)
663 : __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
664 : typename iterator_traits<_InputIterator>::value_type>)
665 : __glibcxx_requires_valid_range(__first, __last);
666 :
667 : return std::__remove_copy_if(__first, __last, __result,
668 : __gnu_cxx::__ops::__pred_iter(__pred));
669 : }
670 :
671 : #if __cplusplus >= 201103L
672 : /**
673 : * @brief Copy the elements of a sequence for which a predicate is true.
674 : * @ingroup mutating_algorithms
675 : * @param __first An input iterator.
676 : * @param __last An input iterator.
677 : * @param __result An output iterator.
678 : * @param __pred A predicate.
679 : * @return An iterator designating the end of the resulting sequence.
680 : *
681 : * Copies each element in the range @p [__first,__last) for which
682 : * @p __pred returns true to the range beginning at @p __result.
683 : *
684 : * copy_if() is stable, so the relative order of elements that are
685 : * copied is unchanged.
686 : */
687 : template<typename _InputIterator, typename _OutputIterator,
688 : typename _Predicate>
689 : _GLIBCXX20_CONSTEXPR
690 : _OutputIterator
691 : copy_if(_InputIterator __first, _InputIterator __last,
692 : _OutputIterator __result, _Predicate __pred)
693 : {
694 : // concept requirements
695 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
696 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
697 : typename iterator_traits<_InputIterator>::value_type>)
698 : __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
699 : typename iterator_traits<_InputIterator>::value_type>)
700 : __glibcxx_requires_valid_range(__first, __last);
701 :
702 : for (; __first != __last; ++__first)
703 : if (__pred(*__first))
704 : {
705 : *__result = *__first;
706 : ++__result;
707 : }
708 : return __result;
709 : }
710 :
711 : template<typename _InputIterator, typename _Size, typename _OutputIterator>
712 : _GLIBCXX20_CONSTEXPR
713 : _OutputIterator
714 : __copy_n(_InputIterator __first, _Size __n,
715 : _OutputIterator __result, input_iterator_tag)
716 : {
717 : return std::__niter_wrap(__result,
718 : __copy_n_a(__first, __n,
719 : std::__niter_base(__result), true));
720 : }
721 :
722 : template<typename _RandomAccessIterator, typename _Size,
723 : typename _OutputIterator>
724 : _GLIBCXX20_CONSTEXPR
725 : inline _OutputIterator
726 : __copy_n(_RandomAccessIterator __first, _Size __n,
727 : _OutputIterator __result, random_access_iterator_tag)
728 : { return std::copy(__first, __first + __n, __result); }
729 :
730 : /**
731 : * @brief Copies the range [first,first+n) into [result,result+n).
732 : * @ingroup mutating_algorithms
733 : * @param __first An input iterator.
734 : * @param __n The number of elements to copy.
735 : * @param __result An output iterator.
736 : * @return result+n.
737 : *
738 : * This inline function will boil down to a call to @c memmove whenever
739 : * possible. Failing that, if random access iterators are passed, then the
740 : * loop count will be known (and therefore a candidate for compiler
741 : * optimizations such as unrolling).
742 : */
743 : template<typename _InputIterator, typename _Size, typename _OutputIterator>
744 : _GLIBCXX20_CONSTEXPR
745 : inline _OutputIterator
746 : copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
747 : {
748 : // concept requirements
749 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
750 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
751 : typename iterator_traits<_InputIterator>::value_type>)
752 :
753 : const auto __n2 = std::__size_to_integer(__n);
754 : if (__n2 <= 0)
755 : return __result;
756 :
757 : __glibcxx_requires_can_increment(__first, __n2);
758 : __glibcxx_requires_can_increment(__result, __n2);
759 :
760 : return std::__copy_n(__first, __n2, __result,
761 : std::__iterator_category(__first));
762 : }
763 :
764 : /**
765 : * @brief Copy the elements of a sequence to separate output sequences
766 : * depending on the truth value of a predicate.
767 : * @ingroup mutating_algorithms
768 : * @param __first An input iterator.
769 : * @param __last An input iterator.
770 : * @param __out_true An output iterator.
771 : * @param __out_false An output iterator.
772 : * @param __pred A predicate.
773 : * @return A pair designating the ends of the resulting sequences.
774 : *
775 : * Copies each element in the range @p [__first,__last) for which
776 : * @p __pred returns true to the range beginning at @p out_true
777 : * and each element for which @p __pred returns false to @p __out_false.
778 : */
779 : template<typename _InputIterator, typename _OutputIterator1,
780 : typename _OutputIterator2, typename _Predicate>
781 : _GLIBCXX20_CONSTEXPR
782 : pair<_OutputIterator1, _OutputIterator2>
783 : partition_copy(_InputIterator __first, _InputIterator __last,
784 : _OutputIterator1 __out_true, _OutputIterator2 __out_false,
785 : _Predicate __pred)
786 : {
787 : // concept requirements
788 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
789 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator1,
790 : typename iterator_traits<_InputIterator>::value_type>)
791 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator2,
792 : typename iterator_traits<_InputIterator>::value_type>)
793 : __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
794 : typename iterator_traits<_InputIterator>::value_type>)
795 : __glibcxx_requires_valid_range(__first, __last);
796 :
797 : for (; __first != __last; ++__first)
798 : if (__pred(*__first))
799 : {
800 : *__out_true = *__first;
801 : ++__out_true;
802 : }
803 : else
804 : {
805 : *__out_false = *__first;
806 : ++__out_false;
807 : }
808 :
809 : return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
810 : }
811 : #endif // C++11
812 :
813 : /**
814 : * @brief Remove elements from a sequence.
815 : * @ingroup mutating_algorithms
816 : * @param __first An input iterator.
817 : * @param __last An input iterator.
818 : * @param __value The value to be removed.
819 : * @return An iterator designating the end of the resulting sequence.
820 : *
821 : * All elements equal to @p __value are removed from the range
822 : * @p [__first,__last).
823 : *
824 : * remove() is stable, so the relative order of elements that are
825 : * not removed is unchanged.
826 : *
827 : * Elements between the end of the resulting sequence and @p __last
828 : * are still present, but their value is unspecified.
829 : */
830 : template<typename _ForwardIterator, typename _Tp>
831 : _GLIBCXX20_CONSTEXPR
832 : inline _ForwardIterator
833 : remove(_ForwardIterator __first, _ForwardIterator __last,
834 : const _Tp& __value)
835 : {
836 : // concept requirements
837 : __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
838 : _ForwardIterator>)
839 : __glibcxx_function_requires(_EqualOpConcept<
840 : typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
841 : __glibcxx_requires_valid_range(__first, __last);
842 :
843 : return std::__remove_if(__first, __last,
844 : __gnu_cxx::__ops::__iter_equals_val(__value));
845 : }
846 :
847 : /**
848 : * @brief Remove elements from a sequence using a predicate.
849 : * @ingroup mutating_algorithms
850 : * @param __first A forward iterator.
851 : * @param __last A forward iterator.
852 : * @param __pred A predicate.
853 : * @return An iterator designating the end of the resulting sequence.
854 : *
855 : * All elements for which @p __pred returns true are removed from the range
856 : * @p [__first,__last).
857 : *
858 : * remove_if() is stable, so the relative order of elements that are
859 : * not removed is unchanged.
860 : *
861 : * Elements between the end of the resulting sequence and @p __last
862 : * are still present, but their value is unspecified.
863 : */
864 : template<typename _ForwardIterator, typename _Predicate>
865 : _GLIBCXX20_CONSTEXPR
866 : inline _ForwardIterator
867 : remove_if(_ForwardIterator __first, _ForwardIterator __last,
868 : _Predicate __pred)
869 : {
870 : // concept requirements
871 : __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
872 : _ForwardIterator>)
873 : __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
874 : typename iterator_traits<_ForwardIterator>::value_type>)
875 : __glibcxx_requires_valid_range(__first, __last);
876 :
877 : return std::__remove_if(__first, __last,
878 : __gnu_cxx::__ops::__pred_iter(__pred));
879 : }
880 :
881 : template<typename _ForwardIterator, typename _BinaryPredicate>
882 : _GLIBCXX20_CONSTEXPR
883 : _ForwardIterator
884 : __adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
885 : _BinaryPredicate __binary_pred)
886 : {
887 : if (__first == __last)
888 : return __last;
889 : _ForwardIterator __next = __first;
890 : while (++__next != __last)
891 : {
892 : if (__binary_pred(__first, __next))
893 : return __first;
894 : __first = __next;
895 : }
896 : return __last;
897 : }
898 :
899 : template<typename _ForwardIterator, typename _BinaryPredicate>
900 : _GLIBCXX20_CONSTEXPR
901 : _ForwardIterator
902 : __unique(_ForwardIterator __first, _ForwardIterator __last,
903 : _BinaryPredicate __binary_pred)
904 : {
905 : // Skip the beginning, if already unique.
906 : __first = std::__adjacent_find(__first, __last, __binary_pred);
907 : if (__first == __last)
908 : return __last;
909 :
910 : // Do the real copy work.
911 : _ForwardIterator __dest = __first;
912 : ++__first;
913 : while (++__first != __last)
914 : if (!__binary_pred(__dest, __first))
915 : *++__dest = _GLIBCXX_MOVE(*__first);
916 : return ++__dest;
917 : }
918 :
919 : /**
920 : * @brief Remove consecutive duplicate values from a sequence.
921 : * @ingroup mutating_algorithms
922 : * @param __first A forward iterator.
923 : * @param __last A forward iterator.
924 : * @return An iterator designating the end of the resulting sequence.
925 : *
926 : * Removes all but the first element from each group of consecutive
927 : * values that compare equal.
928 : * unique() is stable, so the relative order of elements that are
929 : * not removed is unchanged.
930 : * Elements between the end of the resulting sequence and @p __last
931 : * are still present, but their value is unspecified.
932 : */
933 : template<typename _ForwardIterator>
934 : _GLIBCXX20_CONSTEXPR
935 : inline _ForwardIterator
936 : unique(_ForwardIterator __first, _ForwardIterator __last)
937 : {
938 : // concept requirements
939 : __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
940 : _ForwardIterator>)
941 : __glibcxx_function_requires(_EqualityComparableConcept<
942 : typename iterator_traits<_ForwardIterator>::value_type>)
943 : __glibcxx_requires_valid_range(__first, __last);
944 :
945 : return std::__unique(__first, __last,
946 : __gnu_cxx::__ops::__iter_equal_to_iter());
947 : }
948 :
949 : /**
950 : * @brief Remove consecutive values from a sequence using a predicate.
951 : * @ingroup mutating_algorithms
952 : * @param __first A forward iterator.
953 : * @param __last A forward iterator.
954 : * @param __binary_pred A binary predicate.
955 : * @return An iterator designating the end of the resulting sequence.
956 : *
957 : * Removes all but the first element from each group of consecutive
958 : * values for which @p __binary_pred returns true.
959 : * unique() is stable, so the relative order of elements that are
960 : * not removed is unchanged.
961 : * Elements between the end of the resulting sequence and @p __last
962 : * are still present, but their value is unspecified.
963 : */
964 : template<typename _ForwardIterator, typename _BinaryPredicate>
965 : _GLIBCXX20_CONSTEXPR
966 : inline _ForwardIterator
967 : unique(_ForwardIterator __first, _ForwardIterator __last,
968 : _BinaryPredicate __binary_pred)
969 : {
970 : // concept requirements
971 : __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
972 : _ForwardIterator>)
973 : __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
974 : typename iterator_traits<_ForwardIterator>::value_type,
975 : typename iterator_traits<_ForwardIterator>::value_type>)
976 : __glibcxx_requires_valid_range(__first, __last);
977 :
978 : return std::__unique(__first, __last,
979 : __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
980 : }
981 :
982 : /**
983 : * This is an uglified
984 : * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
985 : * _BinaryPredicate)
986 : * overloaded for forward iterators and output iterator as result.
987 : */
988 : template<typename _ForwardIterator, typename _OutputIterator,
989 : typename _BinaryPredicate>
990 : _GLIBCXX20_CONSTEXPR
991 : _OutputIterator
992 : __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
993 : _OutputIterator __result, _BinaryPredicate __binary_pred,
994 : forward_iterator_tag, output_iterator_tag)
995 : {
996 : // concept requirements -- iterators already checked
997 : __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
998 : typename iterator_traits<_ForwardIterator>::value_type,
999 : typename iterator_traits<_ForwardIterator>::value_type>)
1000 :
1001 : _ForwardIterator __next = __first;
1002 : *__result = *__first;
1003 : while (++__next != __last)
1004 : if (!__binary_pred(__first, __next))
1005 : {
1006 : __first = __next;
1007 : *++__result = *__first;
1008 : }
1009 : return ++__result;
1010 : }
1011 :
1012 : /**
1013 : * This is an uglified
1014 : * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1015 : * _BinaryPredicate)
1016 : * overloaded for input iterators and output iterator as result.
1017 : */
1018 : template<typename _InputIterator, typename _OutputIterator,
1019 : typename _BinaryPredicate>
1020 : _GLIBCXX20_CONSTEXPR
1021 : _OutputIterator
1022 : __unique_copy(_InputIterator __first, _InputIterator __last,
1023 : _OutputIterator __result, _BinaryPredicate __binary_pred,
1024 : input_iterator_tag, output_iterator_tag)
1025 : {
1026 : // concept requirements -- iterators already checked
1027 : __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1028 : typename iterator_traits<_InputIterator>::value_type,
1029 : typename iterator_traits<_InputIterator>::value_type>)
1030 :
1031 : typename iterator_traits<_InputIterator>::value_type __value = *__first;
1032 : __decltype(__gnu_cxx::__ops::__iter_comp_val(__binary_pred))
1033 : __rebound_pred
1034 : = __gnu_cxx::__ops::__iter_comp_val(__binary_pred);
1035 : *__result = __value;
1036 : while (++__first != __last)
1037 : if (!__rebound_pred(__first, __value))
1038 : {
1039 : __value = *__first;
1040 : *++__result = __value;
1041 : }
1042 : return ++__result;
1043 : }
1044 :
1045 : /**
1046 : * This is an uglified
1047 : * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1048 : * _BinaryPredicate)
1049 : * overloaded for input iterators and forward iterator as result.
1050 : */
1051 : template<typename _InputIterator, typename _ForwardIterator,
1052 : typename _BinaryPredicate>
1053 : _GLIBCXX20_CONSTEXPR
1054 : _ForwardIterator
1055 : __unique_copy(_InputIterator __first, _InputIterator __last,
1056 : _ForwardIterator __result, _BinaryPredicate __binary_pred,
1057 : input_iterator_tag, forward_iterator_tag)
1058 : {
1059 : // concept requirements -- iterators already checked
1060 : __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1061 : typename iterator_traits<_ForwardIterator>::value_type,
1062 : typename iterator_traits<_InputIterator>::value_type>)
1063 : *__result = *__first;
1064 : while (++__first != __last)
1065 : if (!__binary_pred(__result, __first))
1066 : *++__result = *__first;
1067 : return ++__result;
1068 : }
1069 :
1070 : /**
1071 : * This is an uglified reverse(_BidirectionalIterator,
1072 : * _BidirectionalIterator)
1073 : * overloaded for bidirectional iterators.
1074 : */
1075 : template<typename _BidirectionalIterator>
1076 : _GLIBCXX20_CONSTEXPR
1077 : void
1078 : __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
1079 : bidirectional_iterator_tag)
1080 : {
1081 : while (true)
1082 : if (__first == __last || __first == --__last)
1083 : return;
1084 : else
1085 : {
1086 : std::iter_swap(__first, __last);
1087 : ++__first;
1088 : }
1089 : }
1090 :
1091 : /**
1092 : * This is an uglified reverse(_BidirectionalIterator,
1093 : * _BidirectionalIterator)
1094 : * overloaded for random access iterators.
1095 : */
1096 : template<typename _RandomAccessIterator>
1097 : _GLIBCXX20_CONSTEXPR
1098 : void
1099 : __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
1100 : random_access_iterator_tag)
1101 : {
1102 : if (__first == __last)
1103 : return;
1104 : --__last;
1105 : while (__first < __last)
1106 : {
1107 : std::iter_swap(__first, __last);
1108 : ++__first;
1109 : --__last;
1110 : }
1111 : }
1112 :
1113 : /**
1114 : * @brief Reverse a sequence.
1115 : * @ingroup mutating_algorithms
1116 : * @param __first A bidirectional iterator.
1117 : * @param __last A bidirectional iterator.
1118 : * @return reverse() returns no value.
1119 : *
1120 : * Reverses the order of the elements in the range @p [__first,__last),
1121 : * so that the first element becomes the last etc.
1122 : * For every @c i such that @p 0<=i<=(__last-__first)/2), @p reverse()
1123 : * swaps @p *(__first+i) and @p *(__last-(i+1))
1124 : */
1125 : template<typename _BidirectionalIterator>
1126 : _GLIBCXX20_CONSTEXPR
1127 : inline void
1128 : reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
1129 : {
1130 : // concept requirements
1131 : __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1132 : _BidirectionalIterator>)
1133 : __glibcxx_requires_valid_range(__first, __last);
1134 : std::__reverse(__first, __last, std::__iterator_category(__first));
1135 : }
1136 :
1137 : /**
1138 : * @brief Copy a sequence, reversing its elements.
1139 : * @ingroup mutating_algorithms
1140 : * @param __first A bidirectional iterator.
1141 : * @param __last A bidirectional iterator.
1142 : * @param __result An output iterator.
1143 : * @return An iterator designating the end of the resulting sequence.
1144 : *
1145 : * Copies the elements in the range @p [__first,__last) to the
1146 : * range @p [__result,__result+(__last-__first)) such that the
1147 : * order of the elements is reversed. For every @c i such that @p
1148 : * 0<=i<=(__last-__first), @p reverse_copy() performs the
1149 : * assignment @p *(__result+(__last-__first)-1-i) = *(__first+i).
1150 : * The ranges @p [__first,__last) and @p
1151 : * [__result,__result+(__last-__first)) must not overlap.
1152 : */
1153 : template<typename _BidirectionalIterator, typename _OutputIterator>
1154 : _GLIBCXX20_CONSTEXPR
1155 : _OutputIterator
1156 : reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
1157 : _OutputIterator __result)
1158 : {
1159 : // concept requirements
1160 : __glibcxx_function_requires(_BidirectionalIteratorConcept<
1161 : _BidirectionalIterator>)
1162 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1163 : typename iterator_traits<_BidirectionalIterator>::value_type>)
1164 : __glibcxx_requires_valid_range(__first, __last);
1165 :
1166 : while (__first != __last)
1167 : {
1168 : --__last;
1169 : *__result = *__last;
1170 : ++__result;
1171 : }
1172 : return __result;
1173 : }
1174 :
1175 : /**
1176 : * This is a helper function for the rotate algorithm specialized on RAIs.
1177 : * It returns the greatest common divisor of two integer values.
1178 : */
1179 : template<typename _EuclideanRingElement>
1180 : _GLIBCXX20_CONSTEXPR
1181 : _EuclideanRingElement
1182 : __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
1183 : {
1184 : while (__n != 0)
1185 : {
1186 : _EuclideanRingElement __t = __m % __n;
1187 : __m = __n;
1188 : __n = __t;
1189 : }
1190 : return __m;
1191 : }
1192 :
1193 : inline namespace _V2
1194 : {
1195 :
1196 : /// This is a helper function for the rotate algorithm.
1197 : template<typename _ForwardIterator>
1198 : _GLIBCXX20_CONSTEXPR
1199 : _ForwardIterator
1200 : __rotate(_ForwardIterator __first,
1201 : _ForwardIterator __middle,
1202 : _ForwardIterator __last,
1203 : forward_iterator_tag)
1204 : {
1205 : if (__first == __middle)
1206 : return __last;
1207 : else if (__last == __middle)
1208 : return __first;
1209 :
1210 : _ForwardIterator __first2 = __middle;
1211 : do
1212 : {
1213 : std::iter_swap(__first, __first2);
1214 : ++__first;
1215 : ++__first2;
1216 : if (__first == __middle)
1217 : __middle = __first2;
1218 : }
1219 : while (__first2 != __last);
1220 :
1221 : _ForwardIterator __ret = __first;
1222 :
1223 : __first2 = __middle;
1224 :
1225 : while (__first2 != __last)
1226 : {
1227 : std::iter_swap(__first, __first2);
1228 : ++__first;
1229 : ++__first2;
1230 : if (__first == __middle)
1231 : __middle = __first2;
1232 : else if (__first2 == __last)
1233 : __first2 = __middle;
1234 : }
1235 : return __ret;
1236 : }
1237 :
1238 : /// This is a helper function for the rotate algorithm.
1239 : template<typename _BidirectionalIterator>
1240 : _GLIBCXX20_CONSTEXPR
1241 : _BidirectionalIterator
1242 : __rotate(_BidirectionalIterator __first,
1243 : _BidirectionalIterator __middle,
1244 : _BidirectionalIterator __last,
1245 : bidirectional_iterator_tag)
1246 : {
1247 : // concept requirements
1248 : __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1249 : _BidirectionalIterator>)
1250 :
1251 : if (__first == __middle)
1252 : return __last;
1253 : else if (__last == __middle)
1254 : return __first;
1255 :
1256 : std::__reverse(__first, __middle, bidirectional_iterator_tag());
1257 : std::__reverse(__middle, __last, bidirectional_iterator_tag());
1258 :
1259 : while (__first != __middle && __middle != __last)
1260 : {
1261 : std::iter_swap(__first, --__last);
1262 : ++__first;
1263 : }
1264 :
1265 : if (__first == __middle)
1266 : {
1267 : std::__reverse(__middle, __last, bidirectional_iterator_tag());
1268 : return __last;
1269 : }
1270 : else
1271 : {
1272 : std::__reverse(__first, __middle, bidirectional_iterator_tag());
1273 : return __first;
1274 : }
1275 : }
1276 :
1277 : /// This is a helper function for the rotate algorithm.
1278 : template<typename _RandomAccessIterator>
1279 : _GLIBCXX20_CONSTEXPR
1280 : _RandomAccessIterator
1281 : __rotate(_RandomAccessIterator __first,
1282 : _RandomAccessIterator __middle,
1283 : _RandomAccessIterator __last,
1284 : random_access_iterator_tag)
1285 : {
1286 : // concept requirements
1287 : __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1288 : _RandomAccessIterator>)
1289 :
1290 : if (__first == __middle)
1291 : return __last;
1292 : else if (__last == __middle)
1293 : return __first;
1294 :
1295 : typedef typename iterator_traits<_RandomAccessIterator>::difference_type
1296 : _Distance;
1297 : typedef typename iterator_traits<_RandomAccessIterator>::value_type
1298 : _ValueType;
1299 :
1300 : _Distance __n = __last - __first;
1301 : _Distance __k = __middle - __first;
1302 :
1303 : if (__k == __n - __k)
1304 : {
1305 : std::swap_ranges(__first, __middle, __middle);
1306 : return __middle;
1307 : }
1308 :
1309 : _RandomAccessIterator __p = __first;
1310 : _RandomAccessIterator __ret = __first + (__last - __middle);
1311 :
1312 : for (;;)
1313 : {
1314 : if (__k < __n - __k)
1315 : {
1316 : if (__is_pod(_ValueType) && __k == 1)
1317 : {
1318 : _ValueType __t = _GLIBCXX_MOVE(*__p);
1319 : _GLIBCXX_MOVE3(__p + 1, __p + __n, __p);
1320 : *(__p + __n - 1) = _GLIBCXX_MOVE(__t);
1321 : return __ret;
1322 : }
1323 : _RandomAccessIterator __q = __p + __k;
1324 : for (_Distance __i = 0; __i < __n - __k; ++ __i)
1325 : {
1326 : std::iter_swap(__p, __q);
1327 : ++__p;
1328 : ++__q;
1329 : }
1330 : __n %= __k;
1331 : if (__n == 0)
1332 : return __ret;
1333 : std::swap(__n, __k);
1334 : __k = __n - __k;
1335 : }
1336 : else
1337 : {
1338 : __k = __n - __k;
1339 : if (__is_pod(_ValueType) && __k == 1)
1340 : {
1341 : _ValueType __t = _GLIBCXX_MOVE(*(__p + __n - 1));
1342 : _GLIBCXX_MOVE_BACKWARD3(__p, __p + __n - 1, __p + __n);
1343 : *__p = _GLIBCXX_MOVE(__t);
1344 : return __ret;
1345 : }
1346 : _RandomAccessIterator __q = __p + __n;
1347 : __p = __q - __k;
1348 : for (_Distance __i = 0; __i < __n - __k; ++ __i)
1349 : {
1350 : --__p;
1351 : --__q;
1352 : std::iter_swap(__p, __q);
1353 : }
1354 : __n %= __k;
1355 : if (__n == 0)
1356 : return __ret;
1357 : std::swap(__n, __k);
1358 : }
1359 : }
1360 : }
1361 :
1362 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1363 : // DR 488. rotate throws away useful information
1364 : /**
1365 : * @brief Rotate the elements of a sequence.
1366 : * @ingroup mutating_algorithms
1367 : * @param __first A forward iterator.
1368 : * @param __middle A forward iterator.
1369 : * @param __last A forward iterator.
1370 : * @return first + (last - middle).
1371 : *
1372 : * Rotates the elements of the range @p [__first,__last) by
1373 : * @p (__middle - __first) positions so that the element at @p __middle
1374 : * is moved to @p __first, the element at @p __middle+1 is moved to
1375 : * @p __first+1 and so on for each element in the range
1376 : * @p [__first,__last).
1377 : *
1378 : * This effectively swaps the ranges @p [__first,__middle) and
1379 : * @p [__middle,__last).
1380 : *
1381 : * Performs
1382 : * @p *(__first+(n+(__last-__middle))%(__last-__first))=*(__first+n)
1383 : * for each @p n in the range @p [0,__last-__first).
1384 : */
1385 : template<typename _ForwardIterator>
1386 : _GLIBCXX20_CONSTEXPR
1387 : inline _ForwardIterator
1388 : rotate(_ForwardIterator __first, _ForwardIterator __middle,
1389 : _ForwardIterator __last)
1390 : {
1391 : // concept requirements
1392 : __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1393 : _ForwardIterator>)
1394 : __glibcxx_requires_valid_range(__first, __middle);
1395 : __glibcxx_requires_valid_range(__middle, __last);
1396 :
1397 : return std::__rotate(__first, __middle, __last,
1398 : std::__iterator_category(__first));
1399 : }
1400 :
1401 : } // namespace _V2
1402 :
1403 : /**
1404 : * @brief Copy a sequence, rotating its elements.
1405 : * @ingroup mutating_algorithms
1406 : * @param __first A forward iterator.
1407 : * @param __middle A forward iterator.
1408 : * @param __last A forward iterator.
1409 : * @param __result An output iterator.
1410 : * @return An iterator designating the end of the resulting sequence.
1411 : *
1412 : * Copies the elements of the range @p [__first,__last) to the
1413 : * range beginning at @result, rotating the copied elements by
1414 : * @p (__middle-__first) positions so that the element at @p __middle
1415 : * is moved to @p __result, the element at @p __middle+1 is moved
1416 : * to @p __result+1 and so on for each element in the range @p
1417 : * [__first,__last).
1418 : *
1419 : * Performs
1420 : * @p *(__result+(n+(__last-__middle))%(__last-__first))=*(__first+n)
1421 : * for each @p n in the range @p [0,__last-__first).
1422 : */
1423 : template<typename _ForwardIterator, typename _OutputIterator>
1424 : _GLIBCXX20_CONSTEXPR
1425 : inline _OutputIterator
1426 : rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
1427 : _ForwardIterator __last, _OutputIterator __result)
1428 : {
1429 : // concept requirements
1430 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1431 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1432 : typename iterator_traits<_ForwardIterator>::value_type>)
1433 : __glibcxx_requires_valid_range(__first, __middle);
1434 : __glibcxx_requires_valid_range(__middle, __last);
1435 :
1436 : return std::copy(__first, __middle,
1437 : std::copy(__middle, __last, __result));
1438 : }
1439 :
1440 : /// This is a helper function...
1441 : template<typename _ForwardIterator, typename _Predicate>
1442 : _GLIBCXX20_CONSTEXPR
1443 : _ForwardIterator
1444 : __partition(_ForwardIterator __first, _ForwardIterator __last,
1445 : _Predicate __pred, forward_iterator_tag)
1446 : {
1447 : if (__first == __last)
1448 : return __first;
1449 :
1450 : while (__pred(*__first))
1451 : if (++__first == __last)
1452 : return __first;
1453 :
1454 : _ForwardIterator __next = __first;
1455 :
1456 : while (++__next != __last)
1457 : if (__pred(*__next))
1458 : {
1459 : std::iter_swap(__first, __next);
1460 : ++__first;
1461 : }
1462 :
1463 : return __first;
1464 : }
1465 :
1466 : /// This is a helper function...
1467 : template<typename _BidirectionalIterator, typename _Predicate>
1468 : _GLIBCXX20_CONSTEXPR
1469 : _BidirectionalIterator
1470 : __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
1471 : _Predicate __pred, bidirectional_iterator_tag)
1472 : {
1473 : while (true)
1474 : {
1475 : while (true)
1476 : if (__first == __last)
1477 : return __first;
1478 : else if (__pred(*__first))
1479 : ++__first;
1480 : else
1481 : break;
1482 : --__last;
1483 : while (true)
1484 : if (__first == __last)
1485 : return __first;
1486 : else if (!bool(__pred(*__last)))
1487 : --__last;
1488 : else
1489 : break;
1490 : std::iter_swap(__first, __last);
1491 : ++__first;
1492 : }
1493 : }
1494 :
1495 : // partition
1496 :
1497 : /// This is a helper function...
1498 : /// Requires __first != __last and !__pred(__first)
1499 : /// and __len == distance(__first, __last).
1500 : ///
1501 : /// !__pred(__first) allows us to guarantee that we don't
1502 : /// move-assign an element onto itself.
1503 : template<typename _ForwardIterator, typename _Pointer, typename _Predicate,
1504 : typename _Distance>
1505 : _ForwardIterator
1506 : __stable_partition_adaptive(_ForwardIterator __first,
1507 : _ForwardIterator __last,
1508 : _Predicate __pred, _Distance __len,
1509 : _Pointer __buffer,
1510 : _Distance __buffer_size)
1511 : {
1512 : if (__len == 1)
1513 : return __first;
1514 :
1515 : if (__len <= __buffer_size)
1516 : {
1517 : _ForwardIterator __result1 = __first;
1518 : _Pointer __result2 = __buffer;
1519 :
1520 : // The precondition guarantees that !__pred(__first), so
1521 : // move that element to the buffer before starting the loop.
1522 : // This ensures that we only call __pred once per element.
1523 : *__result2 = _GLIBCXX_MOVE(*__first);
1524 : ++__result2;
1525 : ++__first;
1526 : for (; __first != __last; ++__first)
1527 : if (__pred(__first))
1528 : {
1529 : *__result1 = _GLIBCXX_MOVE(*__first);
1530 : ++__result1;
1531 : }
1532 : else
1533 : {
1534 : *__result2 = _GLIBCXX_MOVE(*__first);
1535 : ++__result2;
1536 : }
1537 :
1538 : _GLIBCXX_MOVE3(__buffer, __result2, __result1);
1539 : return __result1;
1540 : }
1541 :
1542 : _ForwardIterator __middle = __first;
1543 : std::advance(__middle, __len / 2);
1544 : _ForwardIterator __left_split =
1545 : std::__stable_partition_adaptive(__first, __middle, __pred,
1546 : __len / 2, __buffer,
1547 : __buffer_size);
1548 :
1549 : // Advance past true-predicate values to satisfy this
1550 : // function's preconditions.
1551 : _Distance __right_len = __len - __len / 2;
1552 : _ForwardIterator __right_split =
1553 : std::__find_if_not_n(__middle, __right_len, __pred);
1554 :
1555 : if (__right_len)
1556 : __right_split =
1557 : std::__stable_partition_adaptive(__right_split, __last, __pred,
1558 : __right_len,
1559 : __buffer, __buffer_size);
1560 :
1561 : return std::rotate(__left_split, __middle, __right_split);
1562 : }
1563 :
1564 : template<typename _ForwardIterator, typename _Predicate>
1565 : _ForwardIterator
1566 : __stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1567 : _Predicate __pred)
1568 : {
1569 : __first = std::__find_if_not(__first, __last, __pred);
1570 :
1571 : if (__first == __last)
1572 : return __first;
1573 :
1574 : typedef typename iterator_traits<_ForwardIterator>::value_type
1575 : _ValueType;
1576 : typedef typename iterator_traits<_ForwardIterator>::difference_type
1577 : _DistanceType;
1578 :
1579 : _Temporary_buffer<_ForwardIterator, _ValueType>
1580 : __buf(__first, std::distance(__first, __last));
1581 : return
1582 : std::__stable_partition_adaptive(__first, __last, __pred,
1583 : _DistanceType(__buf.requested_size()),
1584 : __buf.begin(),
1585 : _DistanceType(__buf.size()));
1586 : }
1587 :
1588 : /**
1589 : * @brief Move elements for which a predicate is true to the beginning
1590 : * of a sequence, preserving relative ordering.
1591 : * @ingroup mutating_algorithms
1592 : * @param __first A forward iterator.
1593 : * @param __last A forward iterator.
1594 : * @param __pred A predicate functor.
1595 : * @return An iterator @p middle such that @p __pred(i) is true for each
1596 : * iterator @p i in the range @p [first,middle) and false for each @p i
1597 : * in the range @p [middle,last).
1598 : *
1599 : * Performs the same function as @p partition() with the additional
1600 : * guarantee that the relative ordering of elements in each group is
1601 : * preserved, so any two elements @p x and @p y in the range
1602 : * @p [__first,__last) such that @p __pred(x)==__pred(y) will have the same
1603 : * relative ordering after calling @p stable_partition().
1604 : */
1605 : template<typename _ForwardIterator, typename _Predicate>
1606 : inline _ForwardIterator
1607 : stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1608 : _Predicate __pred)
1609 : {
1610 : // concept requirements
1611 : __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1612 : _ForwardIterator>)
1613 : __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1614 : typename iterator_traits<_ForwardIterator>::value_type>)
1615 : __glibcxx_requires_valid_range(__first, __last);
1616 :
1617 : return std::__stable_partition(__first, __last,
1618 : __gnu_cxx::__ops::__pred_iter(__pred));
1619 : }
1620 :
1621 : /// This is a helper function for the sort routines.
1622 : template<typename _RandomAccessIterator, typename _Compare>
1623 : _GLIBCXX20_CONSTEXPR
1624 : void
1625 : __heap_select(_RandomAccessIterator __first,
1626 : _RandomAccessIterator __middle,
1627 : _RandomAccessIterator __last, _Compare __comp)
1628 : {
1629 : std::__make_heap(__first, __middle, __comp);
1630 : for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
1631 : if (__comp(__i, __first))
1632 : std::__pop_heap(__first, __middle, __i, __comp);
1633 : }
1634 :
1635 : // partial_sort
1636 :
1637 : template<typename _InputIterator, typename _RandomAccessIterator,
1638 : typename _Compare>
1639 : _GLIBCXX20_CONSTEXPR
1640 : _RandomAccessIterator
1641 : __partial_sort_copy(_InputIterator __first, _InputIterator __last,
1642 : _RandomAccessIterator __result_first,
1643 : _RandomAccessIterator __result_last,
1644 : _Compare __comp)
1645 : {
1646 : typedef typename iterator_traits<_InputIterator>::value_type
1647 : _InputValueType;
1648 : typedef iterator_traits<_RandomAccessIterator> _RItTraits;
1649 : typedef typename _RItTraits::difference_type _DistanceType;
1650 :
1651 : if (__result_first == __result_last)
1652 : return __result_last;
1653 : _RandomAccessIterator __result_real_last = __result_first;
1654 : while (__first != __last && __result_real_last != __result_last)
1655 : {
1656 : *__result_real_last = *__first;
1657 : ++__result_real_last;
1658 : ++__first;
1659 : }
1660 :
1661 : std::__make_heap(__result_first, __result_real_last, __comp);
1662 : while (__first != __last)
1663 : {
1664 : if (__comp(__first, __result_first))
1665 : std::__adjust_heap(__result_first, _DistanceType(0),
1666 : _DistanceType(__result_real_last
1667 : - __result_first),
1668 : _InputValueType(*__first), __comp);
1669 : ++__first;
1670 : }
1671 : std::__sort_heap(__result_first, __result_real_last, __comp);
1672 : return __result_real_last;
1673 : }
1674 :
1675 : /**
1676 : * @brief Copy the smallest elements of a sequence.
1677 : * @ingroup sorting_algorithms
1678 : * @param __first An iterator.
1679 : * @param __last Another iterator.
1680 : * @param __result_first A random-access iterator.
1681 : * @param __result_last Another random-access iterator.
1682 : * @return An iterator indicating the end of the resulting sequence.
1683 : *
1684 : * Copies and sorts the smallest N values from the range @p [__first,__last)
1685 : * to the range beginning at @p __result_first, where the number of
1686 : * elements to be copied, @p N, is the smaller of @p (__last-__first) and
1687 : * @p (__result_last-__result_first).
1688 : * After the sort if @e i and @e j are iterators in the range
1689 : * @p [__result_first,__result_first+N) such that i precedes j then
1690 : * *j<*i is false.
1691 : * The value returned is @p __result_first+N.
1692 : */
1693 : template<typename _InputIterator, typename _RandomAccessIterator>
1694 : _GLIBCXX20_CONSTEXPR
1695 : inline _RandomAccessIterator
1696 : partial_sort_copy(_InputIterator __first, _InputIterator __last,
1697 : _RandomAccessIterator __result_first,
1698 : _RandomAccessIterator __result_last)
1699 : {
1700 : #ifdef _GLIBCXX_CONCEPT_CHECKS
1701 : typedef typename iterator_traits<_InputIterator>::value_type
1702 : _InputValueType;
1703 : typedef typename iterator_traits<_RandomAccessIterator>::value_type
1704 : _OutputValueType;
1705 : #endif
1706 :
1707 : // concept requirements
1708 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1709 : __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1710 : _OutputValueType>)
1711 : __glibcxx_function_requires(_LessThanOpConcept<_InputValueType,
1712 : _OutputValueType>)
1713 : __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>)
1714 : __glibcxx_requires_valid_range(__first, __last);
1715 : __glibcxx_requires_irreflexive(__first, __last);
1716 : __glibcxx_requires_valid_range(__result_first, __result_last);
1717 :
1718 : return std::__partial_sort_copy(__first, __last,
1719 : __result_first, __result_last,
1720 : __gnu_cxx::__ops::__iter_less_iter());
1721 : }
1722 :
1723 : /**
1724 : * @brief Copy the smallest elements of a sequence using a predicate for
1725 : * comparison.
1726 : * @ingroup sorting_algorithms
1727 : * @param __first An input iterator.
1728 : * @param __last Another input iterator.
1729 : * @param __result_first A random-access iterator.
1730 : * @param __result_last Another random-access iterator.
1731 : * @param __comp A comparison functor.
1732 : * @return An iterator indicating the end of the resulting sequence.
1733 : *
1734 : * Copies and sorts the smallest N values from the range @p [__first,__last)
1735 : * to the range beginning at @p result_first, where the number of
1736 : * elements to be copied, @p N, is the smaller of @p (__last-__first) and
1737 : * @p (__result_last-__result_first).
1738 : * After the sort if @e i and @e j are iterators in the range
1739 : * @p [__result_first,__result_first+N) such that i precedes j then
1740 : * @p __comp(*j,*i) is false.
1741 : * The value returned is @p __result_first+N.
1742 : */
1743 : template<typename _InputIterator, typename _RandomAccessIterator,
1744 : typename _Compare>
1745 : _GLIBCXX20_CONSTEXPR
1746 : inline _RandomAccessIterator
1747 : partial_sort_copy(_InputIterator __first, _InputIterator __last,
1748 : _RandomAccessIterator __result_first,
1749 : _RandomAccessIterator __result_last,
1750 : _Compare __comp)
1751 : {
1752 : #ifdef _GLIBCXX_CONCEPT_CHECKS
1753 : typedef typename iterator_traits<_InputIterator>::value_type
1754 : _InputValueType;
1755 : typedef typename iterator_traits<_RandomAccessIterator>::value_type
1756 : _OutputValueType;
1757 : #endif
1758 :
1759 : // concept requirements
1760 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1761 : __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1762 : _RandomAccessIterator>)
1763 : __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1764 : _OutputValueType>)
1765 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1766 : _InputValueType, _OutputValueType>)
1767 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1768 : _OutputValueType, _OutputValueType>)
1769 : __glibcxx_requires_valid_range(__first, __last);
1770 : __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
1771 : __glibcxx_requires_valid_range(__result_first, __result_last);
1772 :
1773 : return std::__partial_sort_copy(__first, __last,
1774 : __result_first, __result_last,
1775 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
1776 : }
1777 :
1778 : /// This is a helper function for the sort routine.
1779 : template<typename _RandomAccessIterator, typename _Compare>
1780 : _GLIBCXX20_CONSTEXPR
1781 : void
1782 : __unguarded_linear_insert(_RandomAccessIterator __last,
1783 : _Compare __comp)
1784 : {
1785 : typename iterator_traits<_RandomAccessIterator>::value_type
1786 : __val = _GLIBCXX_MOVE(*__last);
1787 : _RandomAccessIterator __next = __last;
1788 : --__next;
1789 : while (__comp(__val, __next))
1790 : {
1791 : *__last = _GLIBCXX_MOVE(*__next);
1792 : __last = __next;
1793 : --__next;
1794 : }
1795 : *__last = _GLIBCXX_MOVE(__val);
1796 : }
1797 :
1798 : /// This is a helper function for the sort routine.
1799 : template<typename _RandomAccessIterator, typename _Compare>
1800 : _GLIBCXX20_CONSTEXPR
1801 : void
1802 : __insertion_sort(_RandomAccessIterator __first,
1803 : _RandomAccessIterator __last, _Compare __comp)
1804 : {
1805 : if (__first == __last) return;
1806 :
1807 : for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
1808 : {
1809 : if (__comp(__i, __first))
1810 : {
1811 : typename iterator_traits<_RandomAccessIterator>::value_type
1812 : __val = _GLIBCXX_MOVE(*__i);
1813 : _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
1814 : *__first = _GLIBCXX_MOVE(__val);
1815 : }
1816 : else
1817 : std::__unguarded_linear_insert(__i,
1818 : __gnu_cxx::__ops::__val_comp_iter(__comp));
1819 : }
1820 : }
1821 :
1822 : /// This is a helper function for the sort routine.
1823 : template<typename _RandomAccessIterator, typename _Compare>
1824 : _GLIBCXX20_CONSTEXPR
1825 : inline void
1826 : __unguarded_insertion_sort(_RandomAccessIterator __first,
1827 : _RandomAccessIterator __last, _Compare __comp)
1828 : {
1829 : for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
1830 : std::__unguarded_linear_insert(__i,
1831 : __gnu_cxx::__ops::__val_comp_iter(__comp));
1832 : }
1833 :
1834 : /**
1835 : * @doctodo
1836 : * This controls some aspect of the sort routines.
1837 : */
1838 : enum { _S_threshold = 16 };
1839 :
1840 : /// This is a helper function for the sort routine.
1841 : template<typename _RandomAccessIterator, typename _Compare>
1842 : _GLIBCXX20_CONSTEXPR
1843 : void
1844 : __final_insertion_sort(_RandomAccessIterator __first,
1845 : _RandomAccessIterator __last, _Compare __comp)
1846 : {
1847 : if (__last - __first > int(_S_threshold))
1848 : {
1849 : std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
1850 : std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
1851 : __comp);
1852 : }
1853 : else
1854 : std::__insertion_sort(__first, __last, __comp);
1855 : }
1856 :
1857 : /// This is a helper function...
1858 : template<typename _RandomAccessIterator, typename _Compare>
1859 : _GLIBCXX20_CONSTEXPR
1860 : _RandomAccessIterator
1861 : __unguarded_partition(_RandomAccessIterator __first,
1862 : _RandomAccessIterator __last,
1863 : _RandomAccessIterator __pivot, _Compare __comp)
1864 : {
1865 : while (true)
1866 : {
1867 : while (__comp(__first, __pivot))
1868 : ++__first;
1869 : --__last;
1870 : while (__comp(__pivot, __last))
1871 : --__last;
1872 : if (!(__first < __last))
1873 : return __first;
1874 : std::iter_swap(__first, __last);
1875 : ++__first;
1876 : }
1877 : }
1878 :
1879 : /// This is a helper function...
1880 : template<typename _RandomAccessIterator, typename _Compare>
1881 : _GLIBCXX20_CONSTEXPR
1882 : inline _RandomAccessIterator
1883 : __unguarded_partition_pivot(_RandomAccessIterator __first,
1884 : _RandomAccessIterator __last, _Compare __comp)
1885 : {
1886 : _RandomAccessIterator __mid = __first + (__last - __first) / 2;
1887 : std::__move_median_to_first(__first, __first + 1, __mid, __last - 1,
1888 : __comp);
1889 : return std::__unguarded_partition(__first + 1, __last, __first, __comp);
1890 : }
1891 :
1892 : template<typename _RandomAccessIterator, typename _Compare>
1893 : _GLIBCXX20_CONSTEXPR
1894 : inline void
1895 : __partial_sort(_RandomAccessIterator __first,
1896 : _RandomAccessIterator __middle,
1897 : _RandomAccessIterator __last,
1898 : _Compare __comp)
1899 : {
1900 : std::__heap_select(__first, __middle, __last, __comp);
1901 : std::__sort_heap(__first, __middle, __comp);
1902 : }
1903 :
1904 : /// This is a helper function for the sort routine.
1905 : template<typename _RandomAccessIterator, typename _Size, typename _Compare>
1906 : _GLIBCXX20_CONSTEXPR
1907 : void
1908 : __introsort_loop(_RandomAccessIterator __first,
1909 : _RandomAccessIterator __last,
1910 : _Size __depth_limit, _Compare __comp)
1911 : {
1912 : while (__last - __first > int(_S_threshold))
1913 : {
1914 : if (__depth_limit == 0)
1915 : {
1916 : std::__partial_sort(__first, __last, __last, __comp);
1917 : return;
1918 : }
1919 : --__depth_limit;
1920 : _RandomAccessIterator __cut =
1921 : std::__unguarded_partition_pivot(__first, __last, __comp);
1922 : std::__introsort_loop(__cut, __last, __depth_limit, __comp);
1923 : __last = __cut;
1924 : }
1925 : }
1926 :
1927 : // sort
1928 :
1929 : template<typename _RandomAccessIterator, typename _Compare>
1930 : _GLIBCXX20_CONSTEXPR
1931 : inline void
1932 : __sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
1933 : _Compare __comp)
1934 : {
1935 : if (__first != __last)
1936 : {
1937 : std::__introsort_loop(__first, __last,
1938 : std::__lg(__last - __first) * 2,
1939 : __comp);
1940 : std::__final_insertion_sort(__first, __last, __comp);
1941 : }
1942 : }
1943 :
1944 : template<typename _RandomAccessIterator, typename _Size, typename _Compare>
1945 : _GLIBCXX20_CONSTEXPR
1946 : void
1947 : __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
1948 : _RandomAccessIterator __last, _Size __depth_limit,
1949 : _Compare __comp)
1950 : {
1951 : while (__last - __first > 3)
1952 : {
1953 : if (__depth_limit == 0)
1954 : {
1955 : std::__heap_select(__first, __nth + 1, __last, __comp);
1956 : // Place the nth largest element in its final position.
1957 : std::iter_swap(__first, __nth);
1958 : return;
1959 : }
1960 : --__depth_limit;
1961 : _RandomAccessIterator __cut =
1962 : std::__unguarded_partition_pivot(__first, __last, __comp);
1963 : if (__cut <= __nth)
1964 : __first = __cut;
1965 : else
1966 : __last = __cut;
1967 : }
1968 : std::__insertion_sort(__first, __last, __comp);
1969 : }
1970 :
1971 : // nth_element
1972 :
1973 : // lower_bound moved to stl_algobase.h
1974 :
1975 : /**
1976 : * @brief Finds the first position in which @p __val could be inserted
1977 : * without changing the ordering.
1978 : * @ingroup binary_search_algorithms
1979 : * @param __first An iterator.
1980 : * @param __last Another iterator.
1981 : * @param __val The search term.
1982 : * @param __comp A functor to use for comparisons.
1983 : * @return An iterator pointing to the first element <em>not less
1984 : * than</em> @p __val, or end() if every element is less
1985 : * than @p __val.
1986 : * @ingroup binary_search_algorithms
1987 : *
1988 : * The comparison function should have the same effects on ordering as
1989 : * the function used for the initial sort.
1990 : */
1991 : template<typename _ForwardIterator, typename _Tp, typename _Compare>
1992 : _GLIBCXX20_CONSTEXPR
1993 : inline _ForwardIterator
1994 : lower_bound(_ForwardIterator __first, _ForwardIterator __last,
1995 : const _Tp& __val, _Compare __comp)
1996 : {
1997 : // concept requirements
1998 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1999 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2000 : typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
2001 : __glibcxx_requires_partitioned_lower_pred(__first, __last,
2002 : __val, __comp);
2003 :
2004 : return std::__lower_bound(__first, __last, __val,
2005 : __gnu_cxx::__ops::__iter_comp_val(__comp));
2006 : }
2007 :
2008 : template<typename _ForwardIterator, typename _Tp, typename _Compare>
2009 : _GLIBCXX20_CONSTEXPR
2010 : _ForwardIterator
2011 : __upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2012 : const _Tp& __val, _Compare __comp)
2013 : {
2014 : typedef typename iterator_traits<_ForwardIterator>::difference_type
2015 : _DistanceType;
2016 :
2017 : _DistanceType __len = std::distance(__first, __last);
2018 :
2019 : while (__len > 0)
2020 : {
2021 : _DistanceType __half = __len >> 1;
2022 : _ForwardIterator __middle = __first;
2023 : std::advance(__middle, __half);
2024 : if (__comp(__val, __middle))
2025 : __len = __half;
2026 : else
2027 : {
2028 : __first = __middle;
2029 : ++__first;
2030 : __len = __len - __half - 1;
2031 : }
2032 : }
2033 : return __first;
2034 : }
2035 :
2036 : /**
2037 : * @brief Finds the last position in which @p __val could be inserted
2038 : * without changing the ordering.
2039 : * @ingroup binary_search_algorithms
2040 : * @param __first An iterator.
2041 : * @param __last Another iterator.
2042 : * @param __val The search term.
2043 : * @return An iterator pointing to the first element greater than @p __val,
2044 : * or end() if no elements are greater than @p __val.
2045 : * @ingroup binary_search_algorithms
2046 : */
2047 : template<typename _ForwardIterator, typename _Tp>
2048 : _GLIBCXX20_CONSTEXPR
2049 : inline _ForwardIterator
2050 : upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2051 : const _Tp& __val)
2052 : {
2053 : // concept requirements
2054 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2055 : __glibcxx_function_requires(_LessThanOpConcept<
2056 : _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
2057 : __glibcxx_requires_partitioned_upper(__first, __last, __val);
2058 :
2059 : return std::__upper_bound(__first, __last, __val,
2060 : __gnu_cxx::__ops::__val_less_iter());
2061 : }
2062 :
2063 : /**
2064 : * @brief Finds the last position in which @p __val could be inserted
2065 : * without changing the ordering.
2066 : * @ingroup binary_search_algorithms
2067 : * @param __first An iterator.
2068 : * @param __last Another iterator.
2069 : * @param __val The search term.
2070 : * @param __comp A functor to use for comparisons.
2071 : * @return An iterator pointing to the first element greater than @p __val,
2072 : * or end() if no elements are greater than @p __val.
2073 : * @ingroup binary_search_algorithms
2074 : *
2075 : * The comparison function should have the same effects on ordering as
2076 : * the function used for the initial sort.
2077 : */
2078 : template<typename _ForwardIterator, typename _Tp, typename _Compare>
2079 : _GLIBCXX20_CONSTEXPR
2080 : inline _ForwardIterator
2081 : upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2082 : const _Tp& __val, _Compare __comp)
2083 : {
2084 : // concept requirements
2085 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2086 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2087 : _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
2088 : __glibcxx_requires_partitioned_upper_pred(__first, __last,
2089 : __val, __comp);
2090 :
2091 : return std::__upper_bound(__first, __last, __val,
2092 : __gnu_cxx::__ops::__val_comp_iter(__comp));
2093 : }
2094 :
2095 : template<typename _ForwardIterator, typename _Tp,
2096 : typename _CompareItTp, typename _CompareTpIt>
2097 : _GLIBCXX20_CONSTEXPR
2098 : pair<_ForwardIterator, _ForwardIterator>
2099 : __equal_range(_ForwardIterator __first, _ForwardIterator __last,
2100 : const _Tp& __val,
2101 : _CompareItTp __comp_it_val, _CompareTpIt __comp_val_it)
2102 : {
2103 : typedef typename iterator_traits<_ForwardIterator>::difference_type
2104 : _DistanceType;
2105 :
2106 : _DistanceType __len = std::distance(__first, __last);
2107 :
2108 : while (__len > 0)
2109 : {
2110 : _DistanceType __half = __len >> 1;
2111 : _ForwardIterator __middle = __first;
2112 : std::advance(__middle, __half);
2113 : if (__comp_it_val(__middle, __val))
2114 : {
2115 : __first = __middle;
2116 : ++__first;
2117 : __len = __len - __half - 1;
2118 : }
2119 : else if (__comp_val_it(__val, __middle))
2120 : __len = __half;
2121 : else
2122 : {
2123 : _ForwardIterator __left
2124 : = std::__lower_bound(__first, __middle, __val, __comp_it_val);
2125 : std::advance(__first, __len);
2126 : _ForwardIterator __right
2127 : = std::__upper_bound(++__middle, __first, __val, __comp_val_it);
2128 : return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
2129 : }
2130 : }
2131 : return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
2132 : }
2133 :
2134 : /**
2135 : * @brief Finds the largest subrange in which @p __val could be inserted
2136 : * at any place in it without changing the ordering.
2137 : * @ingroup binary_search_algorithms
2138 : * @param __first An iterator.
2139 : * @param __last Another iterator.
2140 : * @param __val The search term.
2141 : * @return An pair of iterators defining the subrange.
2142 : * @ingroup binary_search_algorithms
2143 : *
2144 : * This is equivalent to
2145 : * @code
2146 : * std::make_pair(lower_bound(__first, __last, __val),
2147 : * upper_bound(__first, __last, __val))
2148 : * @endcode
2149 : * but does not actually call those functions.
2150 : */
2151 : template<typename _ForwardIterator, typename _Tp>
2152 : _GLIBCXX20_CONSTEXPR
2153 : inline pair<_ForwardIterator, _ForwardIterator>
2154 : equal_range(_ForwardIterator __first, _ForwardIterator __last,
2155 : const _Tp& __val)
2156 : {
2157 : // concept requirements
2158 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2159 : __glibcxx_function_requires(_LessThanOpConcept<
2160 : typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
2161 : __glibcxx_function_requires(_LessThanOpConcept<
2162 : _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
2163 : __glibcxx_requires_partitioned_lower(__first, __last, __val);
2164 : __glibcxx_requires_partitioned_upper(__first, __last, __val);
2165 :
2166 : return std::__equal_range(__first, __last, __val,
2167 : __gnu_cxx::__ops::__iter_less_val(),
2168 : __gnu_cxx::__ops::__val_less_iter());
2169 : }
2170 :
2171 : /**
2172 : * @brief Finds the largest subrange in which @p __val could be inserted
2173 : * at any place in it without changing the ordering.
2174 : * @param __first An iterator.
2175 : * @param __last Another iterator.
2176 : * @param __val The search term.
2177 : * @param __comp A functor to use for comparisons.
2178 : * @return An pair of iterators defining the subrange.
2179 : * @ingroup binary_search_algorithms
2180 : *
2181 : * This is equivalent to
2182 : * @code
2183 : * std::make_pair(lower_bound(__first, __last, __val, __comp),
2184 : * upper_bound(__first, __last, __val, __comp))
2185 : * @endcode
2186 : * but does not actually call those functions.
2187 : */
2188 : template<typename _ForwardIterator, typename _Tp, typename _Compare>
2189 : _GLIBCXX20_CONSTEXPR
2190 : inline pair<_ForwardIterator, _ForwardIterator>
2191 : equal_range(_ForwardIterator __first, _ForwardIterator __last,
2192 : const _Tp& __val, _Compare __comp)
2193 : {
2194 : // concept requirements
2195 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2196 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2197 : typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
2198 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2199 : _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
2200 : __glibcxx_requires_partitioned_lower_pred(__first, __last,
2201 : __val, __comp);
2202 : __glibcxx_requires_partitioned_upper_pred(__first, __last,
2203 : __val, __comp);
2204 :
2205 : return std::__equal_range(__first, __last, __val,
2206 : __gnu_cxx::__ops::__iter_comp_val(__comp),
2207 : __gnu_cxx::__ops::__val_comp_iter(__comp));
2208 : }
2209 :
2210 : /**
2211 : * @brief Determines whether an element exists in a range.
2212 : * @ingroup binary_search_algorithms
2213 : * @param __first An iterator.
2214 : * @param __last Another iterator.
2215 : * @param __val The search term.
2216 : * @return True if @p __val (or its equivalent) is in [@p
2217 : * __first,@p __last ].
2218 : *
2219 : * Note that this does not actually return an iterator to @p __val. For
2220 : * that, use std::find or a container's specialized find member functions.
2221 : */
2222 : template<typename _ForwardIterator, typename _Tp>
2223 : _GLIBCXX20_CONSTEXPR
2224 : bool
2225 : binary_search(_ForwardIterator __first, _ForwardIterator __last,
2226 : const _Tp& __val)
2227 : {
2228 : // concept requirements
2229 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2230 : __glibcxx_function_requires(_LessThanOpConcept<
2231 : _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
2232 : __glibcxx_requires_partitioned_lower(__first, __last, __val);
2233 : __glibcxx_requires_partitioned_upper(__first, __last, __val);
2234 :
2235 : _ForwardIterator __i
2236 : = std::__lower_bound(__first, __last, __val,
2237 : __gnu_cxx::__ops::__iter_less_val());
2238 : return __i != __last && !(__val < *__i);
2239 : }
2240 :
2241 : /**
2242 : * @brief Determines whether an element exists in a range.
2243 : * @ingroup binary_search_algorithms
2244 : * @param __first An iterator.
2245 : * @param __last Another iterator.
2246 : * @param __val The search term.
2247 : * @param __comp A functor to use for comparisons.
2248 : * @return True if @p __val (or its equivalent) is in @p [__first,__last].
2249 : *
2250 : * Note that this does not actually return an iterator to @p __val. For
2251 : * that, use std::find or a container's specialized find member functions.
2252 : *
2253 : * The comparison function should have the same effects on ordering as
2254 : * the function used for the initial sort.
2255 : */
2256 : template<typename _ForwardIterator, typename _Tp, typename _Compare>
2257 : _GLIBCXX20_CONSTEXPR
2258 : bool
2259 : binary_search(_ForwardIterator __first, _ForwardIterator __last,
2260 : const _Tp& __val, _Compare __comp)
2261 : {
2262 : // concept requirements
2263 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2264 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2265 : _Tp, typename iterator_traits<_ForwardIterator>::value_type>)
2266 : __glibcxx_requires_partitioned_lower_pred(__first, __last,
2267 : __val, __comp);
2268 : __glibcxx_requires_partitioned_upper_pred(__first, __last,
2269 : __val, __comp);
2270 :
2271 : _ForwardIterator __i
2272 : = std::__lower_bound(__first, __last, __val,
2273 : __gnu_cxx::__ops::__iter_comp_val(__comp));
2274 : return __i != __last && !bool(__comp(__val, *__i));
2275 : }
2276 :
2277 : // merge
2278 :
2279 : /// This is a helper function for the __merge_adaptive routines.
2280 : template<typename _InputIterator1, typename _InputIterator2,
2281 : typename _OutputIterator, typename _Compare>
2282 : void
2283 : __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1,
2284 : _InputIterator2 __first2, _InputIterator2 __last2,
2285 : _OutputIterator __result, _Compare __comp)
2286 : {
2287 : while (__first1 != __last1 && __first2 != __last2)
2288 : {
2289 : if (__comp(__first2, __first1))
2290 : {
2291 : *__result = _GLIBCXX_MOVE(*__first2);
2292 : ++__first2;
2293 : }
2294 : else
2295 : {
2296 : *__result = _GLIBCXX_MOVE(*__first1);
2297 : ++__first1;
2298 : }
2299 : ++__result;
2300 : }
2301 : if (__first1 != __last1)
2302 : _GLIBCXX_MOVE3(__first1, __last1, __result);
2303 : }
2304 :
2305 : /// This is a helper function for the __merge_adaptive routines.
2306 : template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
2307 : typename _BidirectionalIterator3, typename _Compare>
2308 : void
2309 : __move_merge_adaptive_backward(_BidirectionalIterator1 __first1,
2310 : _BidirectionalIterator1 __last1,
2311 : _BidirectionalIterator2 __first2,
2312 : _BidirectionalIterator2 __last2,
2313 : _BidirectionalIterator3 __result,
2314 : _Compare __comp)
2315 : {
2316 : if (__first1 == __last1)
2317 : {
2318 : _GLIBCXX_MOVE_BACKWARD3(__first2, __last2, __result);
2319 : return;
2320 : }
2321 : else if (__first2 == __last2)
2322 : return;
2323 :
2324 : --__last1;
2325 : --__last2;
2326 : while (true)
2327 : {
2328 : if (__comp(__last2, __last1))
2329 : {
2330 : *--__result = _GLIBCXX_MOVE(*__last1);
2331 : if (__first1 == __last1)
2332 : {
2333 : _GLIBCXX_MOVE_BACKWARD3(__first2, ++__last2, __result);
2334 : return;
2335 : }
2336 : --__last1;
2337 : }
2338 : else
2339 : {
2340 : *--__result = _GLIBCXX_MOVE(*__last2);
2341 : if (__first2 == __last2)
2342 : return;
2343 : --__last2;
2344 : }
2345 : }
2346 : }
2347 :
2348 : /// This is a helper function for the merge routines.
2349 : template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
2350 : typename _Distance>
2351 : _BidirectionalIterator1
2352 : __rotate_adaptive(_BidirectionalIterator1 __first,
2353 : _BidirectionalIterator1 __middle,
2354 : _BidirectionalIterator1 __last,
2355 : _Distance __len1, _Distance __len2,
2356 : _BidirectionalIterator2 __buffer,
2357 : _Distance __buffer_size)
2358 : {
2359 : _BidirectionalIterator2 __buffer_end;
2360 : if (__len1 > __len2 && __len2 <= __buffer_size)
2361 : {
2362 : if (__len2)
2363 : {
2364 : __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2365 : _GLIBCXX_MOVE_BACKWARD3(__first, __middle, __last);
2366 : return _GLIBCXX_MOVE3(__buffer, __buffer_end, __first);
2367 : }
2368 : else
2369 : return __first;
2370 : }
2371 : else if (__len1 <= __buffer_size)
2372 : {
2373 : if (__len1)
2374 : {
2375 : __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2376 : _GLIBCXX_MOVE3(__middle, __last, __first);
2377 : return _GLIBCXX_MOVE_BACKWARD3(__buffer, __buffer_end, __last);
2378 : }
2379 : else
2380 : return __last;
2381 : }
2382 : else
2383 : return std::rotate(__first, __middle, __last);
2384 : }
2385 :
2386 : /// This is a helper function for the merge routines.
2387 : template<typename _BidirectionalIterator, typename _Distance,
2388 : typename _Pointer, typename _Compare>
2389 : void
2390 : __merge_adaptive(_BidirectionalIterator __first,
2391 : _BidirectionalIterator __middle,
2392 : _BidirectionalIterator __last,
2393 : _Distance __len1, _Distance __len2,
2394 : _Pointer __buffer, _Distance __buffer_size,
2395 : _Compare __comp)
2396 : {
2397 : if (__len1 <= __len2 && __len1 <= __buffer_size)
2398 : {
2399 : _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2400 : std::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,
2401 : __first, __comp);
2402 : }
2403 : else if (__len2 <= __buffer_size)
2404 : {
2405 : _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2406 : std::__move_merge_adaptive_backward(__first, __middle, __buffer,
2407 : __buffer_end, __last, __comp);
2408 : }
2409 : else
2410 : {
2411 : _BidirectionalIterator __first_cut = __first;
2412 : _BidirectionalIterator __second_cut = __middle;
2413 : _Distance __len11 = 0;
2414 : _Distance __len22 = 0;
2415 : if (__len1 > __len2)
2416 : {
2417 : __len11 = __len1 / 2;
2418 : std::advance(__first_cut, __len11);
2419 : __second_cut
2420 : = std::__lower_bound(__middle, __last, *__first_cut,
2421 : __gnu_cxx::__ops::__iter_comp_val(__comp));
2422 : __len22 = std::distance(__middle, __second_cut);
2423 : }
2424 : else
2425 : {
2426 : __len22 = __len2 / 2;
2427 : std::advance(__second_cut, __len22);
2428 : __first_cut
2429 : = std::__upper_bound(__first, __middle, *__second_cut,
2430 : __gnu_cxx::__ops::__val_comp_iter(__comp));
2431 : __len11 = std::distance(__first, __first_cut);
2432 : }
2433 :
2434 : _BidirectionalIterator __new_middle
2435 : = std::__rotate_adaptive(__first_cut, __middle, __second_cut,
2436 : __len1 - __len11, __len22, __buffer,
2437 : __buffer_size);
2438 : std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
2439 : __len22, __buffer, __buffer_size, __comp);
2440 : std::__merge_adaptive(__new_middle, __second_cut, __last,
2441 : __len1 - __len11,
2442 : __len2 - __len22, __buffer,
2443 : __buffer_size, __comp);
2444 : }
2445 : }
2446 :
2447 : /// This is a helper function for the merge routines.
2448 : template<typename _BidirectionalIterator, typename _Distance,
2449 : typename _Compare>
2450 : void
2451 : __merge_without_buffer(_BidirectionalIterator __first,
2452 : _BidirectionalIterator __middle,
2453 : _BidirectionalIterator __last,
2454 : _Distance __len1, _Distance __len2,
2455 : _Compare __comp)
2456 : {
2457 : if (__len1 == 0 || __len2 == 0)
2458 : return;
2459 :
2460 : if (__len1 + __len2 == 2)
2461 : {
2462 : if (__comp(__middle, __first))
2463 : std::iter_swap(__first, __middle);
2464 : return;
2465 : }
2466 :
2467 : _BidirectionalIterator __first_cut = __first;
2468 : _BidirectionalIterator __second_cut = __middle;
2469 : _Distance __len11 = 0;
2470 : _Distance __len22 = 0;
2471 : if (__len1 > __len2)
2472 : {
2473 : __len11 = __len1 / 2;
2474 : std::advance(__first_cut, __len11);
2475 : __second_cut
2476 : = std::__lower_bound(__middle, __last, *__first_cut,
2477 : __gnu_cxx::__ops::__iter_comp_val(__comp));
2478 : __len22 = std::distance(__middle, __second_cut);
2479 : }
2480 : else
2481 : {
2482 : __len22 = __len2 / 2;
2483 : std::advance(__second_cut, __len22);
2484 : __first_cut
2485 : = std::__upper_bound(__first, __middle, *__second_cut,
2486 : __gnu_cxx::__ops::__val_comp_iter(__comp));
2487 : __len11 = std::distance(__first, __first_cut);
2488 : }
2489 :
2490 : _BidirectionalIterator __new_middle
2491 : = std::rotate(__first_cut, __middle, __second_cut);
2492 : std::__merge_without_buffer(__first, __first_cut, __new_middle,
2493 : __len11, __len22, __comp);
2494 : std::__merge_without_buffer(__new_middle, __second_cut, __last,
2495 : __len1 - __len11, __len2 - __len22, __comp);
2496 : }
2497 :
2498 : template<typename _BidirectionalIterator, typename _Compare>
2499 : void
2500 : __inplace_merge(_BidirectionalIterator __first,
2501 : _BidirectionalIterator __middle,
2502 : _BidirectionalIterator __last,
2503 : _Compare __comp)
2504 : {
2505 : typedef typename iterator_traits<_BidirectionalIterator>::value_type
2506 : _ValueType;
2507 : typedef typename iterator_traits<_BidirectionalIterator>::difference_type
2508 : _DistanceType;
2509 : typedef _Temporary_buffer<_BidirectionalIterator, _ValueType> _TmpBuf;
2510 :
2511 : if (__first == __middle || __middle == __last)
2512 : return;
2513 :
2514 : const _DistanceType __len1 = std::distance(__first, __middle);
2515 : const _DistanceType __len2 = std::distance(__middle, __last);
2516 :
2517 : // __merge_adaptive will use a buffer for the smaller of
2518 : // [first,middle) and [middle,last).
2519 : _TmpBuf __buf(__first, std::min(__len1, __len2));
2520 :
2521 : if (__buf.begin() == 0)
2522 : std::__merge_without_buffer
2523 : (__first, __middle, __last, __len1, __len2, __comp);
2524 : else
2525 : std::__merge_adaptive
2526 : (__first, __middle, __last, __len1, __len2, __buf.begin(),
2527 : _DistanceType(__buf.size()), __comp);
2528 : }
2529 :
2530 : /**
2531 : * @brief Merges two sorted ranges in place.
2532 : * @ingroup sorting_algorithms
2533 : * @param __first An iterator.
2534 : * @param __middle Another iterator.
2535 : * @param __last Another iterator.
2536 : * @return Nothing.
2537 : *
2538 : * Merges two sorted and consecutive ranges, [__first,__middle) and
2539 : * [__middle,__last), and puts the result in [__first,__last). The
2540 : * output will be sorted. The sort is @e stable, that is, for
2541 : * equivalent elements in the two ranges, elements from the first
2542 : * range will always come before elements from the second.
2543 : *
2544 : * If enough additional memory is available, this takes (__last-__first)-1
2545 : * comparisons. Otherwise an NlogN algorithm is used, where N is
2546 : * distance(__first,__last).
2547 : */
2548 : template<typename _BidirectionalIterator>
2549 : inline void
2550 : inplace_merge(_BidirectionalIterator __first,
2551 : _BidirectionalIterator __middle,
2552 : _BidirectionalIterator __last)
2553 : {
2554 : // concept requirements
2555 : __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
2556 : _BidirectionalIterator>)
2557 : __glibcxx_function_requires(_LessThanComparableConcept<
2558 : typename iterator_traits<_BidirectionalIterator>::value_type>)
2559 : __glibcxx_requires_sorted(__first, __middle);
2560 : __glibcxx_requires_sorted(__middle, __last);
2561 : __glibcxx_requires_irreflexive(__first, __last);
2562 :
2563 : std::__inplace_merge(__first, __middle, __last,
2564 : __gnu_cxx::__ops::__iter_less_iter());
2565 : }
2566 :
2567 : /**
2568 : * @brief Merges two sorted ranges in place.
2569 : * @ingroup sorting_algorithms
2570 : * @param __first An iterator.
2571 : * @param __middle Another iterator.
2572 : * @param __last Another iterator.
2573 : * @param __comp A functor to use for comparisons.
2574 : * @return Nothing.
2575 : *
2576 : * Merges two sorted and consecutive ranges, [__first,__middle) and
2577 : * [middle,last), and puts the result in [__first,__last). The output will
2578 : * be sorted. The sort is @e stable, that is, for equivalent
2579 : * elements in the two ranges, elements from the first range will always
2580 : * come before elements from the second.
2581 : *
2582 : * If enough additional memory is available, this takes (__last-__first)-1
2583 : * comparisons. Otherwise an NlogN algorithm is used, where N is
2584 : * distance(__first,__last).
2585 : *
2586 : * The comparison function should have the same effects on ordering as
2587 : * the function used for the initial sort.
2588 : */
2589 : template<typename _BidirectionalIterator, typename _Compare>
2590 : inline void
2591 : inplace_merge(_BidirectionalIterator __first,
2592 : _BidirectionalIterator __middle,
2593 : _BidirectionalIterator __last,
2594 : _Compare __comp)
2595 : {
2596 : // concept requirements
2597 : __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
2598 : _BidirectionalIterator>)
2599 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2600 : typename iterator_traits<_BidirectionalIterator>::value_type,
2601 : typename iterator_traits<_BidirectionalIterator>::value_type>)
2602 : __glibcxx_requires_sorted_pred(__first, __middle, __comp);
2603 : __glibcxx_requires_sorted_pred(__middle, __last, __comp);
2604 : __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
2605 :
2606 : std::__inplace_merge(__first, __middle, __last,
2607 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
2608 : }
2609 :
2610 :
2611 : /// This is a helper function for the __merge_sort_loop routines.
2612 : template<typename _InputIterator, typename _OutputIterator,
2613 : typename _Compare>
2614 : _OutputIterator
2615 : __move_merge(_InputIterator __first1, _InputIterator __last1,
2616 : _InputIterator __first2, _InputIterator __last2,
2617 : _OutputIterator __result, _Compare __comp)
2618 : {
2619 : while (__first1 != __last1 && __first2 != __last2)
2620 : {
2621 : if (__comp(__first2, __first1))
2622 : {
2623 : *__result = _GLIBCXX_MOVE(*__first2);
2624 : ++__first2;
2625 : }
2626 : else
2627 : {
2628 : *__result = _GLIBCXX_MOVE(*__first1);
2629 : ++__first1;
2630 : }
2631 : ++__result;
2632 : }
2633 : return _GLIBCXX_MOVE3(__first2, __last2,
2634 : _GLIBCXX_MOVE3(__first1, __last1,
2635 : __result));
2636 : }
2637 :
2638 : template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
2639 : typename _Distance, typename _Compare>
2640 : void
2641 : __merge_sort_loop(_RandomAccessIterator1 __first,
2642 : _RandomAccessIterator1 __last,
2643 : _RandomAccessIterator2 __result, _Distance __step_size,
2644 : _Compare __comp)
2645 : {
2646 : const _Distance __two_step = 2 * __step_size;
2647 :
2648 : while (__last - __first >= __two_step)
2649 : {
2650 : __result = std::__move_merge(__first, __first + __step_size,
2651 : __first + __step_size,
2652 : __first + __two_step,
2653 : __result, __comp);
2654 : __first += __two_step;
2655 : }
2656 : __step_size = std::min(_Distance(__last - __first), __step_size);
2657 :
2658 : std::__move_merge(__first, __first + __step_size,
2659 : __first + __step_size, __last, __result, __comp);
2660 : }
2661 :
2662 : template<typename _RandomAccessIterator, typename _Distance,
2663 : typename _Compare>
2664 : _GLIBCXX20_CONSTEXPR
2665 : void
2666 : __chunk_insertion_sort(_RandomAccessIterator __first,
2667 : _RandomAccessIterator __last,
2668 : _Distance __chunk_size, _Compare __comp)
2669 : {
2670 : while (__last - __first >= __chunk_size)
2671 : {
2672 : std::__insertion_sort(__first, __first + __chunk_size, __comp);
2673 : __first += __chunk_size;
2674 : }
2675 : std::__insertion_sort(__first, __last, __comp);
2676 : }
2677 :
2678 : enum { _S_chunk_size = 7 };
2679 :
2680 : template<typename _RandomAccessIterator, typename _Pointer, typename _Compare>
2681 : void
2682 : __merge_sort_with_buffer(_RandomAccessIterator __first,
2683 : _RandomAccessIterator __last,
2684 : _Pointer __buffer, _Compare __comp)
2685 : {
2686 : typedef typename iterator_traits<_RandomAccessIterator>::difference_type
2687 : _Distance;
2688 :
2689 : const _Distance __len = __last - __first;
2690 : const _Pointer __buffer_last = __buffer + __len;
2691 :
2692 : _Distance __step_size = _S_chunk_size;
2693 : std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
2694 :
2695 : while (__step_size < __len)
2696 : {
2697 : std::__merge_sort_loop(__first, __last, __buffer,
2698 : __step_size, __comp);
2699 : __step_size *= 2;
2700 : std::__merge_sort_loop(__buffer, __buffer_last, __first,
2701 : __step_size, __comp);
2702 : __step_size *= 2;
2703 : }
2704 : }
2705 :
2706 : template<typename _RandomAccessIterator, typename _Pointer,
2707 : typename _Distance, typename _Compare>
2708 : void
2709 : __stable_sort_adaptive(_RandomAccessIterator __first,
2710 : _RandomAccessIterator __last,
2711 : _Pointer __buffer, _Distance __buffer_size,
2712 : _Compare __comp)
2713 : {
2714 : const _Distance __len = (__last - __first + 1) / 2;
2715 : const _RandomAccessIterator __middle = __first + __len;
2716 : if (__len > __buffer_size)
2717 : {
2718 : std::__stable_sort_adaptive(__first, __middle, __buffer,
2719 : __buffer_size, __comp);
2720 : std::__stable_sort_adaptive(__middle, __last, __buffer,
2721 : __buffer_size, __comp);
2722 : }
2723 : else
2724 : {
2725 : std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
2726 : std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
2727 : }
2728 :
2729 : std::__merge_adaptive(__first, __middle, __last,
2730 : _Distance(__middle - __first),
2731 : _Distance(__last - __middle),
2732 : __buffer, __buffer_size,
2733 : __comp);
2734 : }
2735 :
2736 : /// This is a helper function for the stable sorting routines.
2737 : template<typename _RandomAccessIterator, typename _Compare>
2738 : void
2739 : __inplace_stable_sort(_RandomAccessIterator __first,
2740 : _RandomAccessIterator __last, _Compare __comp)
2741 : {
2742 : if (__last - __first < 15)
2743 : {
2744 : std::__insertion_sort(__first, __last, __comp);
2745 : return;
2746 : }
2747 : _RandomAccessIterator __middle = __first + (__last - __first) / 2;
2748 : std::__inplace_stable_sort(__first, __middle, __comp);
2749 : std::__inplace_stable_sort(__middle, __last, __comp);
2750 : std::__merge_without_buffer(__first, __middle, __last,
2751 : __middle - __first,
2752 : __last - __middle,
2753 : __comp);
2754 : }
2755 :
2756 : // stable_sort
2757 :
2758 : // Set algorithms: includes, set_union, set_intersection, set_difference,
2759 : // set_symmetric_difference. All of these algorithms have the precondition
2760 : // that their input ranges are sorted and the postcondition that their output
2761 : // ranges are sorted.
2762 :
2763 : template<typename _InputIterator1, typename _InputIterator2,
2764 : typename _Compare>
2765 : _GLIBCXX20_CONSTEXPR
2766 : bool
2767 : __includes(_InputIterator1 __first1, _InputIterator1 __last1,
2768 : _InputIterator2 __first2, _InputIterator2 __last2,
2769 : _Compare __comp)
2770 : {
2771 : while (__first1 != __last1 && __first2 != __last2)
2772 : {
2773 : if (__comp(__first2, __first1))
2774 : return false;
2775 : if (!__comp(__first1, __first2))
2776 : ++__first2;
2777 : ++__first1;
2778 : }
2779 :
2780 : return __first2 == __last2;
2781 : }
2782 :
2783 : /**
2784 : * @brief Determines whether all elements of a sequence exists in a range.
2785 : * @param __first1 Start of search range.
2786 : * @param __last1 End of search range.
2787 : * @param __first2 Start of sequence
2788 : * @param __last2 End of sequence.
2789 : * @return True if each element in [__first2,__last2) is contained in order
2790 : * within [__first1,__last1). False otherwise.
2791 : * @ingroup set_algorithms
2792 : *
2793 : * This operation expects both [__first1,__last1) and
2794 : * [__first2,__last2) to be sorted. Searches for the presence of
2795 : * each element in [__first2,__last2) within [__first1,__last1).
2796 : * The iterators over each range only move forward, so this is a
2797 : * linear algorithm. If an element in [__first2,__last2) is not
2798 : * found before the search iterator reaches @p __last2, false is
2799 : * returned.
2800 : */
2801 : template<typename _InputIterator1, typename _InputIterator2>
2802 : _GLIBCXX20_CONSTEXPR
2803 : inline bool
2804 : includes(_InputIterator1 __first1, _InputIterator1 __last1,
2805 : _InputIterator2 __first2, _InputIterator2 __last2)
2806 : {
2807 : // concept requirements
2808 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2809 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2810 : __glibcxx_function_requires(_LessThanOpConcept<
2811 : typename iterator_traits<_InputIterator1>::value_type,
2812 : typename iterator_traits<_InputIterator2>::value_type>)
2813 : __glibcxx_function_requires(_LessThanOpConcept<
2814 : typename iterator_traits<_InputIterator2>::value_type,
2815 : typename iterator_traits<_InputIterator1>::value_type>)
2816 : __glibcxx_requires_sorted_set(__first1, __last1, __first2);
2817 : __glibcxx_requires_sorted_set(__first2, __last2, __first1);
2818 : __glibcxx_requires_irreflexive2(__first1, __last1);
2819 : __glibcxx_requires_irreflexive2(__first2, __last2);
2820 :
2821 : return std::__includes(__first1, __last1, __first2, __last2,
2822 : __gnu_cxx::__ops::__iter_less_iter());
2823 : }
2824 :
2825 : /**
2826 : * @brief Determines whether all elements of a sequence exists in a range
2827 : * using comparison.
2828 : * @ingroup set_algorithms
2829 : * @param __first1 Start of search range.
2830 : * @param __last1 End of search range.
2831 : * @param __first2 Start of sequence
2832 : * @param __last2 End of sequence.
2833 : * @param __comp Comparison function to use.
2834 : * @return True if each element in [__first2,__last2) is contained
2835 : * in order within [__first1,__last1) according to comp. False
2836 : * otherwise. @ingroup set_algorithms
2837 : *
2838 : * This operation expects both [__first1,__last1) and
2839 : * [__first2,__last2) to be sorted. Searches for the presence of
2840 : * each element in [__first2,__last2) within [__first1,__last1),
2841 : * using comp to decide. The iterators over each range only move
2842 : * forward, so this is a linear algorithm. If an element in
2843 : * [__first2,__last2) is not found before the search iterator
2844 : * reaches @p __last2, false is returned.
2845 : */
2846 : template<typename _InputIterator1, typename _InputIterator2,
2847 : typename _Compare>
2848 : _GLIBCXX20_CONSTEXPR
2849 : inline bool
2850 : includes(_InputIterator1 __first1, _InputIterator1 __last1,
2851 : _InputIterator2 __first2, _InputIterator2 __last2,
2852 : _Compare __comp)
2853 : {
2854 : // concept requirements
2855 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2856 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2857 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2858 : typename iterator_traits<_InputIterator1>::value_type,
2859 : typename iterator_traits<_InputIterator2>::value_type>)
2860 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2861 : typename iterator_traits<_InputIterator2>::value_type,
2862 : typename iterator_traits<_InputIterator1>::value_type>)
2863 : __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
2864 : __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
2865 : __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
2866 : __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
2867 :
2868 : return std::__includes(__first1, __last1, __first2, __last2,
2869 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
2870 : }
2871 :
2872 : // nth_element
2873 : // merge
2874 : // set_difference
2875 : // set_intersection
2876 : // set_union
2877 : // stable_sort
2878 : // set_symmetric_difference
2879 : // min_element
2880 : // max_element
2881 :
2882 : template<typename _BidirectionalIterator, typename _Compare>
2883 : _GLIBCXX20_CONSTEXPR
2884 : bool
2885 : __next_permutation(_BidirectionalIterator __first,
2886 : _BidirectionalIterator __last, _Compare __comp)
2887 : {
2888 : if (__first == __last)
2889 : return false;
2890 : _BidirectionalIterator __i = __first;
2891 : ++__i;
2892 : if (__i == __last)
2893 : return false;
2894 : __i = __last;
2895 : --__i;
2896 :
2897 : for(;;)
2898 : {
2899 : _BidirectionalIterator __ii = __i;
2900 : --__i;
2901 : if (__comp(__i, __ii))
2902 : {
2903 : _BidirectionalIterator __j = __last;
2904 : while (!__comp(__i, --__j))
2905 : {}
2906 : std::iter_swap(__i, __j);
2907 : std::__reverse(__ii, __last,
2908 : std::__iterator_category(__first));
2909 : return true;
2910 : }
2911 : if (__i == __first)
2912 : {
2913 : std::__reverse(__first, __last,
2914 : std::__iterator_category(__first));
2915 : return false;
2916 : }
2917 : }
2918 : }
2919 :
2920 : /**
2921 : * @brief Permute range into the next @e dictionary ordering.
2922 : * @ingroup sorting_algorithms
2923 : * @param __first Start of range.
2924 : * @param __last End of range.
2925 : * @return False if wrapped to first permutation, true otherwise.
2926 : *
2927 : * Treats all permutations of the range as a set of @e dictionary sorted
2928 : * sequences. Permutes the current sequence into the next one of this set.
2929 : * Returns true if there are more sequences to generate. If the sequence
2930 : * is the largest of the set, the smallest is generated and false returned.
2931 : */
2932 : template<typename _BidirectionalIterator>
2933 : _GLIBCXX20_CONSTEXPR
2934 : inline bool
2935 : next_permutation(_BidirectionalIterator __first,
2936 : _BidirectionalIterator __last)
2937 : {
2938 : // concept requirements
2939 : __glibcxx_function_requires(_BidirectionalIteratorConcept<
2940 : _BidirectionalIterator>)
2941 : __glibcxx_function_requires(_LessThanComparableConcept<
2942 : typename iterator_traits<_BidirectionalIterator>::value_type>)
2943 : __glibcxx_requires_valid_range(__first, __last);
2944 : __glibcxx_requires_irreflexive(__first, __last);
2945 :
2946 : return std::__next_permutation
2947 : (__first, __last, __gnu_cxx::__ops::__iter_less_iter());
2948 : }
2949 :
2950 : /**
2951 : * @brief Permute range into the next @e dictionary ordering using
2952 : * comparison functor.
2953 : * @ingroup sorting_algorithms
2954 : * @param __first Start of range.
2955 : * @param __last End of range.
2956 : * @param __comp A comparison functor.
2957 : * @return False if wrapped to first permutation, true otherwise.
2958 : *
2959 : * Treats all permutations of the range [__first,__last) as a set of
2960 : * @e dictionary sorted sequences ordered by @p __comp. Permutes the current
2961 : * sequence into the next one of this set. Returns true if there are more
2962 : * sequences to generate. If the sequence is the largest of the set, the
2963 : * smallest is generated and false returned.
2964 : */
2965 : template<typename _BidirectionalIterator, typename _Compare>
2966 : _GLIBCXX20_CONSTEXPR
2967 : inline bool
2968 : next_permutation(_BidirectionalIterator __first,
2969 : _BidirectionalIterator __last, _Compare __comp)
2970 : {
2971 : // concept requirements
2972 : __glibcxx_function_requires(_BidirectionalIteratorConcept<
2973 : _BidirectionalIterator>)
2974 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2975 : typename iterator_traits<_BidirectionalIterator>::value_type,
2976 : typename iterator_traits<_BidirectionalIterator>::value_type>)
2977 : __glibcxx_requires_valid_range(__first, __last);
2978 : __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
2979 :
2980 : return std::__next_permutation
2981 : (__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
2982 : }
2983 :
2984 : template<typename _BidirectionalIterator, typename _Compare>
2985 : _GLIBCXX20_CONSTEXPR
2986 : bool
2987 : __prev_permutation(_BidirectionalIterator __first,
2988 : _BidirectionalIterator __last, _Compare __comp)
2989 : {
2990 : if (__first == __last)
2991 : return false;
2992 : _BidirectionalIterator __i = __first;
2993 : ++__i;
2994 : if (__i == __last)
2995 : return false;
2996 : __i = __last;
2997 : --__i;
2998 :
2999 : for(;;)
3000 : {
3001 : _BidirectionalIterator __ii = __i;
3002 : --__i;
3003 : if (__comp(__ii, __i))
3004 : {
3005 : _BidirectionalIterator __j = __last;
3006 : while (!__comp(--__j, __i))
3007 : {}
3008 : std::iter_swap(__i, __j);
3009 : std::__reverse(__ii, __last,
3010 : std::__iterator_category(__first));
3011 : return true;
3012 : }
3013 : if (__i == __first)
3014 : {
3015 : std::__reverse(__first, __last,
3016 : std::__iterator_category(__first));
3017 : return false;
3018 : }
3019 : }
3020 : }
3021 :
3022 : /**
3023 : * @brief Permute range into the previous @e dictionary ordering.
3024 : * @ingroup sorting_algorithms
3025 : * @param __first Start of range.
3026 : * @param __last End of range.
3027 : * @return False if wrapped to last permutation, true otherwise.
3028 : *
3029 : * Treats all permutations of the range as a set of @e dictionary sorted
3030 : * sequences. Permutes the current sequence into the previous one of this
3031 : * set. Returns true if there are more sequences to generate. If the
3032 : * sequence is the smallest of the set, the largest is generated and false
3033 : * returned.
3034 : */
3035 : template<typename _BidirectionalIterator>
3036 : _GLIBCXX20_CONSTEXPR
3037 : inline bool
3038 : prev_permutation(_BidirectionalIterator __first,
3039 : _BidirectionalIterator __last)
3040 : {
3041 : // concept requirements
3042 : __glibcxx_function_requires(_BidirectionalIteratorConcept<
3043 : _BidirectionalIterator>)
3044 : __glibcxx_function_requires(_LessThanComparableConcept<
3045 : typename iterator_traits<_BidirectionalIterator>::value_type>)
3046 : __glibcxx_requires_valid_range(__first, __last);
3047 : __glibcxx_requires_irreflexive(__first, __last);
3048 :
3049 : return std::__prev_permutation(__first, __last,
3050 : __gnu_cxx::__ops::__iter_less_iter());
3051 : }
3052 :
3053 : /**
3054 : * @brief Permute range into the previous @e dictionary ordering using
3055 : * comparison functor.
3056 : * @ingroup sorting_algorithms
3057 : * @param __first Start of range.
3058 : * @param __last End of range.
3059 : * @param __comp A comparison functor.
3060 : * @return False if wrapped to last permutation, true otherwise.
3061 : *
3062 : * Treats all permutations of the range [__first,__last) as a set of
3063 : * @e dictionary sorted sequences ordered by @p __comp. Permutes the current
3064 : * sequence into the previous one of this set. Returns true if there are
3065 : * more sequences to generate. If the sequence is the smallest of the set,
3066 : * the largest is generated and false returned.
3067 : */
3068 : template<typename _BidirectionalIterator, typename _Compare>
3069 : _GLIBCXX20_CONSTEXPR
3070 : inline bool
3071 : prev_permutation(_BidirectionalIterator __first,
3072 : _BidirectionalIterator __last, _Compare __comp)
3073 : {
3074 : // concept requirements
3075 : __glibcxx_function_requires(_BidirectionalIteratorConcept<
3076 : _BidirectionalIterator>)
3077 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3078 : typename iterator_traits<_BidirectionalIterator>::value_type,
3079 : typename iterator_traits<_BidirectionalIterator>::value_type>)
3080 : __glibcxx_requires_valid_range(__first, __last);
3081 : __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3082 :
3083 : return std::__prev_permutation(__first, __last,
3084 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
3085 : }
3086 :
3087 : // replace
3088 : // replace_if
3089 :
3090 : template<typename _InputIterator, typename _OutputIterator,
3091 : typename _Predicate, typename _Tp>
3092 : _GLIBCXX20_CONSTEXPR
3093 : _OutputIterator
3094 : __replace_copy_if(_InputIterator __first, _InputIterator __last,
3095 : _OutputIterator __result,
3096 : _Predicate __pred, const _Tp& __new_value)
3097 : {
3098 : for (; __first != __last; ++__first, (void)++__result)
3099 : if (__pred(__first))
3100 : *__result = __new_value;
3101 : else
3102 : *__result = *__first;
3103 : return __result;
3104 : }
3105 :
3106 : /**
3107 : * @brief Copy a sequence, replacing each element of one value with another
3108 : * value.
3109 : * @param __first An input iterator.
3110 : * @param __last An input iterator.
3111 : * @param __result An output iterator.
3112 : * @param __old_value The value to be replaced.
3113 : * @param __new_value The replacement value.
3114 : * @return The end of the output sequence, @p result+(last-first).
3115 : *
3116 : * Copies each element in the input range @p [__first,__last) to the
3117 : * output range @p [__result,__result+(__last-__first)) replacing elements
3118 : * equal to @p __old_value with @p __new_value.
3119 : */
3120 : template<typename _InputIterator, typename _OutputIterator, typename _Tp>
3121 : _GLIBCXX20_CONSTEXPR
3122 : inline _OutputIterator
3123 : replace_copy(_InputIterator __first, _InputIterator __last,
3124 : _OutputIterator __result,
3125 : const _Tp& __old_value, const _Tp& __new_value)
3126 : {
3127 : // concept requirements
3128 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3129 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3130 : typename iterator_traits<_InputIterator>::value_type>)
3131 : __glibcxx_function_requires(_EqualOpConcept<
3132 : typename iterator_traits<_InputIterator>::value_type, _Tp>)
3133 : __glibcxx_requires_valid_range(__first, __last);
3134 :
3135 : return std::__replace_copy_if(__first, __last, __result,
3136 : __gnu_cxx::__ops::__iter_equals_val(__old_value),
3137 : __new_value);
3138 : }
3139 :
3140 : /**
3141 : * @brief Copy a sequence, replacing each value for which a predicate
3142 : * returns true with another value.
3143 : * @ingroup mutating_algorithms
3144 : * @param __first An input iterator.
3145 : * @param __last An input iterator.
3146 : * @param __result An output iterator.
3147 : * @param __pred A predicate.
3148 : * @param __new_value The replacement value.
3149 : * @return The end of the output sequence, @p __result+(__last-__first).
3150 : *
3151 : * Copies each element in the range @p [__first,__last) to the range
3152 : * @p [__result,__result+(__last-__first)) replacing elements for which
3153 : * @p __pred returns true with @p __new_value.
3154 : */
3155 : template<typename _InputIterator, typename _OutputIterator,
3156 : typename _Predicate, typename _Tp>
3157 : _GLIBCXX20_CONSTEXPR
3158 : inline _OutputIterator
3159 : replace_copy_if(_InputIterator __first, _InputIterator __last,
3160 : _OutputIterator __result,
3161 : _Predicate __pred, const _Tp& __new_value)
3162 : {
3163 : // concept requirements
3164 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3165 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3166 : typename iterator_traits<_InputIterator>::value_type>)
3167 : __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
3168 : typename iterator_traits<_InputIterator>::value_type>)
3169 : __glibcxx_requires_valid_range(__first, __last);
3170 :
3171 : return std::__replace_copy_if(__first, __last, __result,
3172 : __gnu_cxx::__ops::__pred_iter(__pred),
3173 : __new_value);
3174 : }
3175 :
3176 : #if __cplusplus >= 201103L
3177 : /**
3178 : * @brief Determines whether the elements of a sequence are sorted.
3179 : * @ingroup sorting_algorithms
3180 : * @param __first An iterator.
3181 : * @param __last Another iterator.
3182 : * @return True if the elements are sorted, false otherwise.
3183 : */
3184 : template<typename _ForwardIterator>
3185 : _GLIBCXX20_CONSTEXPR
3186 : inline bool
3187 : is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3188 : { return std::is_sorted_until(__first, __last) == __last; }
3189 :
3190 : /**
3191 : * @brief Determines whether the elements of a sequence are sorted
3192 : * according to a comparison functor.
3193 : * @ingroup sorting_algorithms
3194 : * @param __first An iterator.
3195 : * @param __last Another iterator.
3196 : * @param __comp A comparison functor.
3197 : * @return True if the elements are sorted, false otherwise.
3198 : */
3199 : template<typename _ForwardIterator, typename _Compare>
3200 : _GLIBCXX20_CONSTEXPR
3201 : inline bool
3202 : is_sorted(_ForwardIterator __first, _ForwardIterator __last,
3203 : _Compare __comp)
3204 : { return std::is_sorted_until(__first, __last, __comp) == __last; }
3205 :
3206 : template<typename _ForwardIterator, typename _Compare>
3207 : _GLIBCXX20_CONSTEXPR
3208 : _ForwardIterator
3209 : __is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
3210 : _Compare __comp)
3211 : {
3212 : if (__first == __last)
3213 : return __last;
3214 :
3215 : _ForwardIterator __next = __first;
3216 : for (++__next; __next != __last; __first = __next, (void)++__next)
3217 : if (__comp(__next, __first))
3218 : return __next;
3219 : return __next;
3220 : }
3221 :
3222 : /**
3223 : * @brief Determines the end of a sorted sequence.
3224 : * @ingroup sorting_algorithms
3225 : * @param __first An iterator.
3226 : * @param __last Another iterator.
3227 : * @return An iterator pointing to the last iterator i in [__first, __last)
3228 : * for which the range [__first, i) is sorted.
3229 : */
3230 : template<typename _ForwardIterator>
3231 : _GLIBCXX20_CONSTEXPR
3232 : inline _ForwardIterator
3233 : is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3234 : {
3235 : // concept requirements
3236 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3237 : __glibcxx_function_requires(_LessThanComparableConcept<
3238 : typename iterator_traits<_ForwardIterator>::value_type>)
3239 : __glibcxx_requires_valid_range(__first, __last);
3240 : __glibcxx_requires_irreflexive(__first, __last);
3241 :
3242 : return std::__is_sorted_until(__first, __last,
3243 : __gnu_cxx::__ops::__iter_less_iter());
3244 : }
3245 :
3246 : /**
3247 : * @brief Determines the end of a sorted sequence using comparison functor.
3248 : * @ingroup sorting_algorithms
3249 : * @param __first An iterator.
3250 : * @param __last Another iterator.
3251 : * @param __comp A comparison functor.
3252 : * @return An iterator pointing to the last iterator i in [__first, __last)
3253 : * for which the range [__first, i) is sorted.
3254 : */
3255 : template<typename _ForwardIterator, typename _Compare>
3256 : _GLIBCXX20_CONSTEXPR
3257 : inline _ForwardIterator
3258 : is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
3259 : _Compare __comp)
3260 : {
3261 : // concept requirements
3262 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3263 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3264 : typename iterator_traits<_ForwardIterator>::value_type,
3265 : typename iterator_traits<_ForwardIterator>::value_type>)
3266 : __glibcxx_requires_valid_range(__first, __last);
3267 : __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3268 :
3269 : return std::__is_sorted_until(__first, __last,
3270 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
3271 : }
3272 :
3273 : /**
3274 : * @brief Determines min and max at once as an ordered pair.
3275 : * @ingroup sorting_algorithms
3276 : * @param __a A thing of arbitrary type.
3277 : * @param __b Another thing of arbitrary type.
3278 : * @return A pair(__b, __a) if __b is smaller than __a, pair(__a,
3279 : * __b) otherwise.
3280 : */
3281 : template<typename _Tp>
3282 : _GLIBCXX14_CONSTEXPR
3283 : inline pair<const _Tp&, const _Tp&>
3284 : minmax(const _Tp& __a, const _Tp& __b)
3285 : {
3286 : // concept requirements
3287 : __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
3288 :
3289 : return __b < __a ? pair<const _Tp&, const _Tp&>(__b, __a)
3290 : : pair<const _Tp&, const _Tp&>(__a, __b);
3291 : }
3292 :
3293 : /**
3294 : * @brief Determines min and max at once as an ordered pair.
3295 : * @ingroup sorting_algorithms
3296 : * @param __a A thing of arbitrary type.
3297 : * @param __b Another thing of arbitrary type.
3298 : * @param __comp A @link comparison_functors comparison functor @endlink.
3299 : * @return A pair(__b, __a) if __b is smaller than __a, pair(__a,
3300 : * __b) otherwise.
3301 : */
3302 : template<typename _Tp, typename _Compare>
3303 : _GLIBCXX14_CONSTEXPR
3304 : inline pair<const _Tp&, const _Tp&>
3305 : minmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
3306 : {
3307 : return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a)
3308 : : pair<const _Tp&, const _Tp&>(__a, __b);
3309 : }
3310 :
3311 : template<typename _ForwardIterator, typename _Compare>
3312 : _GLIBCXX14_CONSTEXPR
3313 : pair<_ForwardIterator, _ForwardIterator>
3314 : __minmax_element(_ForwardIterator __first, _ForwardIterator __last,
3315 : _Compare __comp)
3316 : {
3317 : _ForwardIterator __next = __first;
3318 : if (__first == __last
3319 : || ++__next == __last)
3320 : return std::make_pair(__first, __first);
3321 :
3322 : _ForwardIterator __min{}, __max{};
3323 : if (__comp(__next, __first))
3324 : {
3325 : __min = __next;
3326 : __max = __first;
3327 : }
3328 : else
3329 : {
3330 : __min = __first;
3331 : __max = __next;
3332 : }
3333 :
3334 : __first = __next;
3335 : ++__first;
3336 :
3337 : while (__first != __last)
3338 : {
3339 : __next = __first;
3340 : if (++__next == __last)
3341 : {
3342 : if (__comp(__first, __min))
3343 : __min = __first;
3344 : else if (!__comp(__first, __max))
3345 : __max = __first;
3346 : break;
3347 : }
3348 :
3349 : if (__comp(__next, __first))
3350 : {
3351 : if (__comp(__next, __min))
3352 : __min = __next;
3353 : if (!__comp(__first, __max))
3354 : __max = __first;
3355 : }
3356 : else
3357 : {
3358 : if (__comp(__first, __min))
3359 : __min = __first;
3360 : if (!__comp(__next, __max))
3361 : __max = __next;
3362 : }
3363 :
3364 : __first = __next;
3365 : ++__first;
3366 : }
3367 :
3368 : return std::make_pair(__min, __max);
3369 : }
3370 :
3371 : /**
3372 : * @brief Return a pair of iterators pointing to the minimum and maximum
3373 : * elements in a range.
3374 : * @ingroup sorting_algorithms
3375 : * @param __first Start of range.
3376 : * @param __last End of range.
3377 : * @return make_pair(m, M), where m is the first iterator i in
3378 : * [__first, __last) such that no other element in the range is
3379 : * smaller, and where M is the last iterator i in [__first, __last)
3380 : * such that no other element in the range is larger.
3381 : */
3382 : template<typename _ForwardIterator>
3383 : _GLIBCXX14_CONSTEXPR
3384 : inline pair<_ForwardIterator, _ForwardIterator>
3385 : minmax_element(_ForwardIterator __first, _ForwardIterator __last)
3386 : {
3387 : // concept requirements
3388 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3389 : __glibcxx_function_requires(_LessThanComparableConcept<
3390 : typename iterator_traits<_ForwardIterator>::value_type>)
3391 : __glibcxx_requires_valid_range(__first, __last);
3392 : __glibcxx_requires_irreflexive(__first, __last);
3393 :
3394 : return std::__minmax_element(__first, __last,
3395 : __gnu_cxx::__ops::__iter_less_iter());
3396 : }
3397 :
3398 : /**
3399 : * @brief Return a pair of iterators pointing to the minimum and maximum
3400 : * elements in a range.
3401 : * @ingroup sorting_algorithms
3402 : * @param __first Start of range.
3403 : * @param __last End of range.
3404 : * @param __comp Comparison functor.
3405 : * @return make_pair(m, M), where m is the first iterator i in
3406 : * [__first, __last) such that no other element in the range is
3407 : * smaller, and where M is the last iterator i in [__first, __last)
3408 : * such that no other element in the range is larger.
3409 : */
3410 : template<typename _ForwardIterator, typename _Compare>
3411 : _GLIBCXX14_CONSTEXPR
3412 : inline pair<_ForwardIterator, _ForwardIterator>
3413 : minmax_element(_ForwardIterator __first, _ForwardIterator __last,
3414 : _Compare __comp)
3415 : {
3416 : // concept requirements
3417 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3418 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3419 : typename iterator_traits<_ForwardIterator>::value_type,
3420 : typename iterator_traits<_ForwardIterator>::value_type>)
3421 : __glibcxx_requires_valid_range(__first, __last);
3422 : __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3423 :
3424 : return std::__minmax_element(__first, __last,
3425 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
3426 : }
3427 :
3428 : template<typename _Tp>
3429 : _GLIBCXX14_CONSTEXPR
3430 : inline pair<_Tp, _Tp>
3431 : minmax(initializer_list<_Tp> __l)
3432 : {
3433 : __glibcxx_requires_irreflexive(__l.begin(), __l.end());
3434 : pair<const _Tp*, const _Tp*> __p =
3435 : std::__minmax_element(__l.begin(), __l.end(),
3436 : __gnu_cxx::__ops::__iter_less_iter());
3437 : return std::make_pair(*__p.first, *__p.second);
3438 : }
3439 :
3440 : template<typename _Tp, typename _Compare>
3441 : _GLIBCXX14_CONSTEXPR
3442 : inline pair<_Tp, _Tp>
3443 : minmax(initializer_list<_Tp> __l, _Compare __comp)
3444 : {
3445 : __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
3446 : pair<const _Tp*, const _Tp*> __p =
3447 : std::__minmax_element(__l.begin(), __l.end(),
3448 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
3449 : return std::make_pair(*__p.first, *__p.second);
3450 : }
3451 :
3452 : /**
3453 : * @brief Checks whether a permutation of the second sequence is equal
3454 : * to the first sequence.
3455 : * @ingroup non_mutating_algorithms
3456 : * @param __first1 Start of first range.
3457 : * @param __last1 End of first range.
3458 : * @param __first2 Start of second range.
3459 : * @param __pred A binary predicate.
3460 : * @return true if there exists a permutation of the elements in
3461 : * the range [__first2, __first2 + (__last1 - __first1)),
3462 : * beginning with ForwardIterator2 begin, such that
3463 : * equal(__first1, __last1, __begin, __pred) returns true;
3464 : * otherwise, returns false.
3465 : */
3466 : template<typename _ForwardIterator1, typename _ForwardIterator2,
3467 : typename _BinaryPredicate>
3468 : _GLIBCXX20_CONSTEXPR
3469 : inline bool
3470 : is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3471 : _ForwardIterator2 __first2, _BinaryPredicate __pred)
3472 : {
3473 : // concept requirements
3474 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
3475 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
3476 : __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3477 : typename iterator_traits<_ForwardIterator1>::value_type,
3478 : typename iterator_traits<_ForwardIterator2>::value_type>)
3479 : __glibcxx_requires_valid_range(__first1, __last1);
3480 :
3481 : return std::__is_permutation(__first1, __last1, __first2,
3482 : __gnu_cxx::__ops::__iter_comp_iter(__pred));
3483 : }
3484 :
3485 : #if __cplusplus > 201103L
3486 : template<typename _ForwardIterator1, typename _ForwardIterator2,
3487 : typename _BinaryPredicate>
3488 : _GLIBCXX20_CONSTEXPR
3489 : bool
3490 : __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3491 : _ForwardIterator2 __first2, _ForwardIterator2 __last2,
3492 : _BinaryPredicate __pred)
3493 : {
3494 : using _Cat1
3495 : = typename iterator_traits<_ForwardIterator1>::iterator_category;
3496 : using _Cat2
3497 : = typename iterator_traits<_ForwardIterator2>::iterator_category;
3498 : using _It1_is_RA = is_same<_Cat1, random_access_iterator_tag>;
3499 : using _It2_is_RA = is_same<_Cat2, random_access_iterator_tag>;
3500 : constexpr bool __ra_iters = _It1_is_RA() && _It2_is_RA();
3501 : if (__ra_iters)
3502 : {
3503 : auto __d1 = std::distance(__first1, __last1);
3504 : auto __d2 = std::distance(__first2, __last2);
3505 : if (__d1 != __d2)
3506 : return false;
3507 : }
3508 :
3509 : // Efficiently compare identical prefixes: O(N) if sequences
3510 : // have the same elements in the same order.
3511 : for (; __first1 != __last1 && __first2 != __last2;
3512 : ++__first1, (void)++__first2)
3513 : if (!__pred(__first1, __first2))
3514 : break;
3515 :
3516 : if (__ra_iters)
3517 : {
3518 : if (__first1 == __last1)
3519 : return true;
3520 : }
3521 : else
3522 : {
3523 : auto __d1 = std::distance(__first1, __last1);
3524 : auto __d2 = std::distance(__first2, __last2);
3525 : if (__d1 == 0 && __d2 == 0)
3526 : return true;
3527 : if (__d1 != __d2)
3528 : return false;
3529 : }
3530 :
3531 : for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)
3532 : {
3533 : if (__scan != std::__find_if(__first1, __scan,
3534 : __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)))
3535 : continue; // We've seen this one before.
3536 :
3537 : auto __matches = std::__count_if(__first2, __last2,
3538 : __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan));
3539 : if (0 == __matches
3540 : || std::__count_if(__scan, __last1,
3541 : __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))
3542 : != __matches)
3543 : return false;
3544 : }
3545 : return true;
3546 : }
3547 :
3548 : /**
3549 : * @brief Checks whether a permutaion of the second sequence is equal
3550 : * to the first sequence.
3551 : * @ingroup non_mutating_algorithms
3552 : * @param __first1 Start of first range.
3553 : * @param __last1 End of first range.
3554 : * @param __first2 Start of second range.
3555 : * @param __last2 End of first range.
3556 : * @return true if there exists a permutation of the elements in the range
3557 : * [__first2, __last2), beginning with ForwardIterator2 begin,
3558 : * such that equal(__first1, __last1, begin) returns true;
3559 : * otherwise, returns false.
3560 : */
3561 : template<typename _ForwardIterator1, typename _ForwardIterator2>
3562 : _GLIBCXX20_CONSTEXPR
3563 : inline bool
3564 : is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3565 : _ForwardIterator2 __first2, _ForwardIterator2 __last2)
3566 : {
3567 : __glibcxx_requires_valid_range(__first1, __last1);
3568 : __glibcxx_requires_valid_range(__first2, __last2);
3569 :
3570 : return
3571 : std::__is_permutation(__first1, __last1, __first2, __last2,
3572 : __gnu_cxx::__ops::__iter_equal_to_iter());
3573 : }
3574 :
3575 : /**
3576 : * @brief Checks whether a permutation of the second sequence is equal
3577 : * to the first sequence.
3578 : * @ingroup non_mutating_algorithms
3579 : * @param __first1 Start of first range.
3580 : * @param __last1 End of first range.
3581 : * @param __first2 Start of second range.
3582 : * @param __last2 End of first range.
3583 : * @param __pred A binary predicate.
3584 : * @return true if there exists a permutation of the elements in the range
3585 : * [__first2, __last2), beginning with ForwardIterator2 begin,
3586 : * such that equal(__first1, __last1, __begin, __pred) returns true;
3587 : * otherwise, returns false.
3588 : */
3589 : template<typename _ForwardIterator1, typename _ForwardIterator2,
3590 : typename _BinaryPredicate>
3591 : _GLIBCXX20_CONSTEXPR
3592 : inline bool
3593 : is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3594 : _ForwardIterator2 __first2, _ForwardIterator2 __last2,
3595 : _BinaryPredicate __pred)
3596 : {
3597 : __glibcxx_requires_valid_range(__first1, __last1);
3598 : __glibcxx_requires_valid_range(__first2, __last2);
3599 :
3600 : return std::__is_permutation(__first1, __last1, __first2, __last2,
3601 : __gnu_cxx::__ops::__iter_comp_iter(__pred));
3602 : }
3603 :
3604 : #if __cplusplus >= 201703L
3605 :
3606 : #define __cpp_lib_clamp 201603L
3607 :
3608 : /**
3609 : * @brief Returns the value clamped between lo and hi.
3610 : * @ingroup sorting_algorithms
3611 : * @param __val A value of arbitrary type.
3612 : * @param __lo A lower limit of arbitrary type.
3613 : * @param __hi An upper limit of arbitrary type.
3614 : * @retval `__lo` if `__val < __lo`
3615 : * @retval `__hi` if `__hi < __val`
3616 : * @retval `__val` otherwise.
3617 : * @pre `_Tp` is LessThanComparable and `(__hi < __lo)` is false.
3618 : */
3619 : template<typename _Tp>
3620 : constexpr const _Tp&
3621 : clamp(const _Tp& __val, const _Tp& __lo, const _Tp& __hi)
3622 : {
3623 : __glibcxx_assert(!(__hi < __lo));
3624 : return std::min(std::max(__val, __lo), __hi);
3625 : }
3626 :
3627 : /**
3628 : * @brief Returns the value clamped between lo and hi.
3629 : * @ingroup sorting_algorithms
3630 : * @param __val A value of arbitrary type.
3631 : * @param __lo A lower limit of arbitrary type.
3632 : * @param __hi An upper limit of arbitrary type.
3633 : * @param __comp A comparison functor.
3634 : * @retval `__lo` if `__comp(__val, __lo)`
3635 : * @retval `__hi` if `__comp(__hi, __val)`
3636 : * @retval `__val` otherwise.
3637 : * @pre `__comp(__hi, __lo)` is false.
3638 : */
3639 : template<typename _Tp, typename _Compare>
3640 : constexpr const _Tp&
3641 : clamp(const _Tp& __val, const _Tp& __lo, const _Tp& __hi, _Compare __comp)
3642 : {
3643 : __glibcxx_assert(!__comp(__hi, __lo));
3644 : return std::min(std::max(__val, __lo, __comp), __hi, __comp);
3645 : }
3646 : #endif // C++17
3647 : #endif // C++14
3648 :
3649 : #ifdef _GLIBCXX_USE_C99_STDINT_TR1
3650 : /**
3651 : * @brief Generate two uniformly distributed integers using a
3652 : * single distribution invocation.
3653 : * @param __b0 The upper bound for the first integer.
3654 : * @param __b1 The upper bound for the second integer.
3655 : * @param __g A UniformRandomBitGenerator.
3656 : * @return A pair (i, j) with i and j uniformly distributed
3657 : * over [0, __b0) and [0, __b1), respectively.
3658 : *
3659 : * Requires: __b0 * __b1 <= __g.max() - __g.min().
3660 : *
3661 : * Using uniform_int_distribution with a range that is very
3662 : * small relative to the range of the generator ends up wasting
3663 : * potentially expensively generated randomness, since
3664 : * uniform_int_distribution does not store leftover randomness
3665 : * between invocations.
3666 : *
3667 : * If we know we want two integers in ranges that are sufficiently
3668 : * small, we can compose the ranges, use a single distribution
3669 : * invocation, and significantly reduce the waste.
3670 : */
3671 : template<typename _IntType, typename _UniformRandomBitGenerator>
3672 : pair<_IntType, _IntType>
3673 : __gen_two_uniform_ints(_IntType __b0, _IntType __b1,
3674 : _UniformRandomBitGenerator&& __g)
3675 : {
3676 : _IntType __x
3677 : = uniform_int_distribution<_IntType>{0, (__b0 * __b1) - 1}(__g);
3678 : return std::make_pair(__x / __b1, __x % __b1);
3679 : }
3680 :
3681 : /**
3682 : * @brief Shuffle the elements of a sequence using a uniform random
3683 : * number generator.
3684 : * @ingroup mutating_algorithms
3685 : * @param __first A forward iterator.
3686 : * @param __last A forward iterator.
3687 : * @param __g A UniformRandomNumberGenerator (26.5.1.3).
3688 : * @return Nothing.
3689 : *
3690 : * Reorders the elements in the range @p [__first,__last) using @p __g to
3691 : * provide random numbers.
3692 : */
3693 : template<typename _RandomAccessIterator,
3694 : typename _UniformRandomNumberGenerator>
3695 : void
3696 : shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
3697 : _UniformRandomNumberGenerator&& __g)
3698 : {
3699 : // concept requirements
3700 : __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
3701 : _RandomAccessIterator>)
3702 : __glibcxx_requires_valid_range(__first, __last);
3703 :
3704 : if (__first == __last)
3705 : return;
3706 :
3707 : typedef typename iterator_traits<_RandomAccessIterator>::difference_type
3708 : _DistanceType;
3709 :
3710 : typedef typename std::make_unsigned<_DistanceType>::type __ud_type;
3711 : typedef typename std::uniform_int_distribution<__ud_type> __distr_type;
3712 : typedef typename __distr_type::param_type __p_type;
3713 :
3714 : typedef typename remove_reference<_UniformRandomNumberGenerator>::type
3715 : _Gen;
3716 : typedef typename common_type<typename _Gen::result_type, __ud_type>::type
3717 : __uc_type;
3718 :
3719 : const __uc_type __urngrange = __g.max() - __g.min();
3720 : const __uc_type __urange = __uc_type(__last - __first);
3721 :
3722 : if (__urngrange / __urange >= __urange)
3723 : // I.e. (__urngrange >= __urange * __urange) but without wrap issues.
3724 : {
3725 : _RandomAccessIterator __i = __first + 1;
3726 :
3727 : // Since we know the range isn't empty, an even number of elements
3728 : // means an uneven number of elements /to swap/, in which case we
3729 : // do the first one up front:
3730 :
3731 : if ((__urange % 2) == 0)
3732 : {
3733 : __distr_type __d{0, 1};
3734 : std::iter_swap(__i++, __first + __d(__g));
3735 : }
3736 :
3737 : // Now we know that __last - __i is even, so we do the rest in pairs,
3738 : // using a single distribution invocation to produce swap positions
3739 : // for two successive elements at a time:
3740 :
3741 : while (__i != __last)
3742 : {
3743 : const __uc_type __swap_range = __uc_type(__i - __first) + 1;
3744 :
3745 : const pair<__uc_type, __uc_type> __pospos =
3746 : __gen_two_uniform_ints(__swap_range, __swap_range + 1, __g);
3747 :
3748 : std::iter_swap(__i++, __first + __pospos.first);
3749 : std::iter_swap(__i++, __first + __pospos.second);
3750 : }
3751 :
3752 : return;
3753 : }
3754 :
3755 : __distr_type __d;
3756 :
3757 : for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
3758 : std::iter_swap(__i, __first + __d(__g, __p_type(0, __i - __first)));
3759 : }
3760 : #endif // USE C99_STDINT
3761 :
3762 : #endif // C++11
3763 :
3764 : _GLIBCXX_BEGIN_NAMESPACE_ALGO
3765 :
3766 : /**
3767 : * @brief Apply a function to every element of a sequence.
3768 : * @ingroup non_mutating_algorithms
3769 : * @param __first An input iterator.
3770 : * @param __last An input iterator.
3771 : * @param __f A unary function object.
3772 : * @return @p __f
3773 : *
3774 : * Applies the function object @p __f to each element in the range
3775 : * @p [first,last). @p __f must not modify the order of the sequence.
3776 : * If @p __f has a return value it is ignored.
3777 : */
3778 : template<typename _InputIterator, typename _Function>
3779 : _GLIBCXX20_CONSTEXPR
3780 : _Function
3781 : for_each(_InputIterator __first, _InputIterator __last, _Function __f)
3782 : {
3783 : // concept requirements
3784 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3785 : __glibcxx_requires_valid_range(__first, __last);
3786 : for (; __first != __last; ++__first)
3787 : __f(*__first);
3788 : return __f; // N.B. [alg.foreach] says std::move(f) but it's redundant.
3789 : }
3790 :
3791 : #if __cplusplus >= 201703L
3792 : /**
3793 : * @brief Apply a function to every element of a sequence.
3794 : * @ingroup non_mutating_algorithms
3795 : * @param __first An input iterator.
3796 : * @param __n A value convertible to an integer.
3797 : * @param __f A unary function object.
3798 : * @return `__first+__n`
3799 : *
3800 : * Applies the function object `__f` to each element in the range
3801 : * `[first, first+n)`. `__f` must not modify the order of the sequence.
3802 : * If `__f` has a return value it is ignored.
3803 : */
3804 : template<typename _InputIterator, typename _Size, typename _Function>
3805 : _GLIBCXX20_CONSTEXPR
3806 : _InputIterator
3807 : for_each_n(_InputIterator __first, _Size __n, _Function __f)
3808 : {
3809 : auto __n2 = std::__size_to_integer(__n);
3810 : using _Cat = typename iterator_traits<_InputIterator>::iterator_category;
3811 : if constexpr (is_base_of_v<random_access_iterator_tag, _Cat>)
3812 : {
3813 : if (__n2 <= 0)
3814 : return __first;
3815 : auto __last = __first + __n2;
3816 : std::for_each(__first, __last, std::move(__f));
3817 : return __last;
3818 : }
3819 : else
3820 : {
3821 : while (__n2-->0)
3822 : {
3823 : __f(*__first);
3824 : ++__first;
3825 : }
3826 : return __first;
3827 : }
3828 : }
3829 : #endif // C++17
3830 :
3831 : /**
3832 : * @brief Find the first occurrence of a value in a sequence.
3833 : * @ingroup non_mutating_algorithms
3834 : * @param __first An input iterator.
3835 : * @param __last An input iterator.
3836 : * @param __val The value to find.
3837 : * @return The first iterator @c i in the range @p [__first,__last)
3838 : * such that @c *i == @p __val, or @p __last if no such iterator exists.
3839 : */
3840 : template<typename _InputIterator, typename _Tp>
3841 : _GLIBCXX20_CONSTEXPR
3842 : inline _InputIterator
3843 42 : find(_InputIterator __first, _InputIterator __last,
3844 : const _Tp& __val)
3845 : {
3846 : // concept requirements
3847 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3848 : __glibcxx_function_requires(_EqualOpConcept<
3849 : typename iterator_traits<_InputIterator>::value_type, _Tp>)
3850 : __glibcxx_requires_valid_range(__first, __last);
3851 42 : return std::__find_if(__first, __last,
3852 : __gnu_cxx::__ops::__iter_equals_val(__val));
3853 : }
3854 :
3855 : /**
3856 : * @brief Find the first element in a sequence for which a
3857 : * predicate is true.
3858 : * @ingroup non_mutating_algorithms
3859 : * @param __first An input iterator.
3860 : * @param __last An input iterator.
3861 : * @param __pred A predicate.
3862 : * @return The first iterator @c i in the range @p [__first,__last)
3863 : * such that @p __pred(*i) is true, or @p __last if no such iterator exists.
3864 : */
3865 : template<typename _InputIterator, typename _Predicate>
3866 : _GLIBCXX20_CONSTEXPR
3867 : inline _InputIterator
3868 : find_if(_InputIterator __first, _InputIterator __last,
3869 : _Predicate __pred)
3870 : {
3871 : // concept requirements
3872 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3873 : __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
3874 : typename iterator_traits<_InputIterator>::value_type>)
3875 : __glibcxx_requires_valid_range(__first, __last);
3876 :
3877 : return std::__find_if(__first, __last,
3878 : __gnu_cxx::__ops::__pred_iter(__pred));
3879 : }
3880 :
3881 : /**
3882 : * @brief Find element from a set in a sequence.
3883 : * @ingroup non_mutating_algorithms
3884 : * @param __first1 Start of range to search.
3885 : * @param __last1 End of range to search.
3886 : * @param __first2 Start of match candidates.
3887 : * @param __last2 End of match candidates.
3888 : * @return The first iterator @c i in the range
3889 : * @p [__first1,__last1) such that @c *i == @p *(i2) such that i2 is an
3890 : * iterator in [__first2,__last2), or @p __last1 if no such iterator exists.
3891 : *
3892 : * Searches the range @p [__first1,__last1) for an element that is
3893 : * equal to some element in the range [__first2,__last2). If
3894 : * found, returns an iterator in the range [__first1,__last1),
3895 : * otherwise returns @p __last1.
3896 : */
3897 : template<typename _InputIterator, typename _ForwardIterator>
3898 : _GLIBCXX20_CONSTEXPR
3899 : _InputIterator
3900 : find_first_of(_InputIterator __first1, _InputIterator __last1,
3901 : _ForwardIterator __first2, _ForwardIterator __last2)
3902 : {
3903 : // concept requirements
3904 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3905 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3906 : __glibcxx_function_requires(_EqualOpConcept<
3907 : typename iterator_traits<_InputIterator>::value_type,
3908 : typename iterator_traits<_ForwardIterator>::value_type>)
3909 : __glibcxx_requires_valid_range(__first1, __last1);
3910 : __glibcxx_requires_valid_range(__first2, __last2);
3911 :
3912 : for (; __first1 != __last1; ++__first1)
3913 : for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
3914 : if (*__first1 == *__iter)
3915 : return __first1;
3916 : return __last1;
3917 : }
3918 :
3919 : /**
3920 : * @brief Find element from a set in a sequence using a predicate.
3921 : * @ingroup non_mutating_algorithms
3922 : * @param __first1 Start of range to search.
3923 : * @param __last1 End of range to search.
3924 : * @param __first2 Start of match candidates.
3925 : * @param __last2 End of match candidates.
3926 : * @param __comp Predicate to use.
3927 : * @return The first iterator @c i in the range
3928 : * @p [__first1,__last1) such that @c comp(*i, @p *(i2)) is true
3929 : * and i2 is an iterator in [__first2,__last2), or @p __last1 if no
3930 : * such iterator exists.
3931 : *
3932 :
3933 : * Searches the range @p [__first1,__last1) for an element that is
3934 : * equal to some element in the range [__first2,__last2). If
3935 : * found, returns an iterator in the range [__first1,__last1),
3936 : * otherwise returns @p __last1.
3937 : */
3938 : template<typename _InputIterator, typename _ForwardIterator,
3939 : typename _BinaryPredicate>
3940 : _GLIBCXX20_CONSTEXPR
3941 : _InputIterator
3942 : find_first_of(_InputIterator __first1, _InputIterator __last1,
3943 : _ForwardIterator __first2, _ForwardIterator __last2,
3944 : _BinaryPredicate __comp)
3945 : {
3946 : // concept requirements
3947 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3948 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3949 : __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3950 : typename iterator_traits<_InputIterator>::value_type,
3951 : typename iterator_traits<_ForwardIterator>::value_type>)
3952 : __glibcxx_requires_valid_range(__first1, __last1);
3953 : __glibcxx_requires_valid_range(__first2, __last2);
3954 :
3955 : for (; __first1 != __last1; ++__first1)
3956 : for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
3957 : if (__comp(*__first1, *__iter))
3958 : return __first1;
3959 : return __last1;
3960 : }
3961 :
3962 : /**
3963 : * @brief Find two adjacent values in a sequence that are equal.
3964 : * @ingroup non_mutating_algorithms
3965 : * @param __first A forward iterator.
3966 : * @param __last A forward iterator.
3967 : * @return The first iterator @c i such that @c i and @c i+1 are both
3968 : * valid iterators in @p [__first,__last) and such that @c *i == @c *(i+1),
3969 : * or @p __last if no such iterator exists.
3970 : */
3971 : template<typename _ForwardIterator>
3972 : _GLIBCXX20_CONSTEXPR
3973 : inline _ForwardIterator
3974 : adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
3975 : {
3976 : // concept requirements
3977 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3978 : __glibcxx_function_requires(_EqualityComparableConcept<
3979 : typename iterator_traits<_ForwardIterator>::value_type>)
3980 : __glibcxx_requires_valid_range(__first, __last);
3981 :
3982 : return std::__adjacent_find(__first, __last,
3983 : __gnu_cxx::__ops::__iter_equal_to_iter());
3984 : }
3985 :
3986 : /**
3987 : * @brief Find two adjacent values in a sequence using a predicate.
3988 : * @ingroup non_mutating_algorithms
3989 : * @param __first A forward iterator.
3990 : * @param __last A forward iterator.
3991 : * @param __binary_pred A binary predicate.
3992 : * @return The first iterator @c i such that @c i and @c i+1 are both
3993 : * valid iterators in @p [__first,__last) and such that
3994 : * @p __binary_pred(*i,*(i+1)) is true, or @p __last if no such iterator
3995 : * exists.
3996 : */
3997 : template<typename _ForwardIterator, typename _BinaryPredicate>
3998 : _GLIBCXX20_CONSTEXPR
3999 : inline _ForwardIterator
4000 : adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
4001 : _BinaryPredicate __binary_pred)
4002 : {
4003 : // concept requirements
4004 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4005 : __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4006 : typename iterator_traits<_ForwardIterator>::value_type,
4007 : typename iterator_traits<_ForwardIterator>::value_type>)
4008 : __glibcxx_requires_valid_range(__first, __last);
4009 :
4010 : return std::__adjacent_find(__first, __last,
4011 : __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
4012 : }
4013 :
4014 : /**
4015 : * @brief Count the number of copies of a value in a sequence.
4016 : * @ingroup non_mutating_algorithms
4017 : * @param __first An input iterator.
4018 : * @param __last An input iterator.
4019 : * @param __value The value to be counted.
4020 : * @return The number of iterators @c i in the range @p [__first,__last)
4021 : * for which @c *i == @p __value
4022 : */
4023 : template<typename _InputIterator, typename _Tp>
4024 : _GLIBCXX20_CONSTEXPR
4025 : inline typename iterator_traits<_InputIterator>::difference_type
4026 : count(_InputIterator __first, _InputIterator __last, const _Tp& __value)
4027 : {
4028 : // concept requirements
4029 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4030 : __glibcxx_function_requires(_EqualOpConcept<
4031 : typename iterator_traits<_InputIterator>::value_type, _Tp>)
4032 : __glibcxx_requires_valid_range(__first, __last);
4033 :
4034 : return std::__count_if(__first, __last,
4035 : __gnu_cxx::__ops::__iter_equals_val(__value));
4036 : }
4037 :
4038 : /**
4039 : * @brief Count the elements of a sequence for which a predicate is true.
4040 : * @ingroup non_mutating_algorithms
4041 : * @param __first An input iterator.
4042 : * @param __last An input iterator.
4043 : * @param __pred A predicate.
4044 : * @return The number of iterators @c i in the range @p [__first,__last)
4045 : * for which @p __pred(*i) is true.
4046 : */
4047 : template<typename _InputIterator, typename _Predicate>
4048 : _GLIBCXX20_CONSTEXPR
4049 : inline typename iterator_traits<_InputIterator>::difference_type
4050 : count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
4051 : {
4052 : // concept requirements
4053 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4054 : __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4055 : typename iterator_traits<_InputIterator>::value_type>)
4056 : __glibcxx_requires_valid_range(__first, __last);
4057 :
4058 : return std::__count_if(__first, __last,
4059 : __gnu_cxx::__ops::__pred_iter(__pred));
4060 : }
4061 :
4062 : /**
4063 : * @brief Search a sequence for a matching sub-sequence.
4064 : * @ingroup non_mutating_algorithms
4065 : * @param __first1 A forward iterator.
4066 : * @param __last1 A forward iterator.
4067 : * @param __first2 A forward iterator.
4068 : * @param __last2 A forward iterator.
4069 : * @return The first iterator @c i in the range @p
4070 : * [__first1,__last1-(__last2-__first2)) such that @c *(i+N) == @p
4071 : * *(__first2+N) for each @c N in the range @p
4072 : * [0,__last2-__first2), or @p __last1 if no such iterator exists.
4073 : *
4074 : * Searches the range @p [__first1,__last1) for a sub-sequence that
4075 : * compares equal value-by-value with the sequence given by @p
4076 : * [__first2,__last2) and returns an iterator to the first element
4077 : * of the sub-sequence, or @p __last1 if the sub-sequence is not
4078 : * found.
4079 : *
4080 : * Because the sub-sequence must lie completely within the range @p
4081 : * [__first1,__last1) it must start at a position less than @p
4082 : * __last1-(__last2-__first2) where @p __last2-__first2 is the
4083 : * length of the sub-sequence.
4084 : *
4085 : * This means that the returned iterator @c i will be in the range
4086 : * @p [__first1,__last1-(__last2-__first2))
4087 : */
4088 : template<typename _ForwardIterator1, typename _ForwardIterator2>
4089 : _GLIBCXX20_CONSTEXPR
4090 : inline _ForwardIterator1
4091 : search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
4092 : _ForwardIterator2 __first2, _ForwardIterator2 __last2)
4093 : {
4094 : // concept requirements
4095 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
4096 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
4097 : __glibcxx_function_requires(_EqualOpConcept<
4098 : typename iterator_traits<_ForwardIterator1>::value_type,
4099 : typename iterator_traits<_ForwardIterator2>::value_type>)
4100 : __glibcxx_requires_valid_range(__first1, __last1);
4101 : __glibcxx_requires_valid_range(__first2, __last2);
4102 :
4103 : return std::__search(__first1, __last1, __first2, __last2,
4104 : __gnu_cxx::__ops::__iter_equal_to_iter());
4105 : }
4106 :
4107 : /**
4108 : * @brief Search a sequence for a matching sub-sequence using a predicate.
4109 : * @ingroup non_mutating_algorithms
4110 : * @param __first1 A forward iterator.
4111 : * @param __last1 A forward iterator.
4112 : * @param __first2 A forward iterator.
4113 : * @param __last2 A forward iterator.
4114 : * @param __predicate A binary predicate.
4115 : * @return The first iterator @c i in the range
4116 : * @p [__first1,__last1-(__last2-__first2)) such that
4117 : * @p __predicate(*(i+N),*(__first2+N)) is true for each @c N in the range
4118 : * @p [0,__last2-__first2), or @p __last1 if no such iterator exists.
4119 : *
4120 : * Searches the range @p [__first1,__last1) for a sub-sequence that
4121 : * compares equal value-by-value with the sequence given by @p
4122 : * [__first2,__last2), using @p __predicate to determine equality,
4123 : * and returns an iterator to the first element of the
4124 : * sub-sequence, or @p __last1 if no such iterator exists.
4125 : *
4126 : * @see search(_ForwardIter1, _ForwardIter1, _ForwardIter2, _ForwardIter2)
4127 : */
4128 : template<typename _ForwardIterator1, typename _ForwardIterator2,
4129 : typename _BinaryPredicate>
4130 : _GLIBCXX20_CONSTEXPR
4131 : inline _ForwardIterator1
4132 : search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
4133 : _ForwardIterator2 __first2, _ForwardIterator2 __last2,
4134 : _BinaryPredicate __predicate)
4135 : {
4136 : // concept requirements
4137 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
4138 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
4139 : __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4140 : typename iterator_traits<_ForwardIterator1>::value_type,
4141 : typename iterator_traits<_ForwardIterator2>::value_type>)
4142 : __glibcxx_requires_valid_range(__first1, __last1);
4143 : __glibcxx_requires_valid_range(__first2, __last2);
4144 :
4145 : return std::__search(__first1, __last1, __first2, __last2,
4146 : __gnu_cxx::__ops::__iter_comp_iter(__predicate));
4147 : }
4148 :
4149 : /**
4150 : * @brief Search a sequence for a number of consecutive values.
4151 : * @ingroup non_mutating_algorithms
4152 : * @param __first A forward iterator.
4153 : * @param __last A forward iterator.
4154 : * @param __count The number of consecutive values.
4155 : * @param __val The value to find.
4156 : * @return The first iterator @c i in the range @p
4157 : * [__first,__last-__count) such that @c *(i+N) == @p __val for
4158 : * each @c N in the range @p [0,__count), or @p __last if no such
4159 : * iterator exists.
4160 : *
4161 : * Searches the range @p [__first,__last) for @p count consecutive elements
4162 : * equal to @p __val.
4163 : */
4164 : template<typename _ForwardIterator, typename _Integer, typename _Tp>
4165 : _GLIBCXX20_CONSTEXPR
4166 : inline _ForwardIterator
4167 : search_n(_ForwardIterator __first, _ForwardIterator __last,
4168 : _Integer __count, const _Tp& __val)
4169 : {
4170 : // concept requirements
4171 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4172 : __glibcxx_function_requires(_EqualOpConcept<
4173 : typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
4174 : __glibcxx_requires_valid_range(__first, __last);
4175 :
4176 : return std::__search_n(__first, __last, __count,
4177 : __gnu_cxx::__ops::__iter_equals_val(__val));
4178 : }
4179 :
4180 :
4181 : /**
4182 : * @brief Search a sequence for a number of consecutive values using a
4183 : * predicate.
4184 : * @ingroup non_mutating_algorithms
4185 : * @param __first A forward iterator.
4186 : * @param __last A forward iterator.
4187 : * @param __count The number of consecutive values.
4188 : * @param __val The value to find.
4189 : * @param __binary_pred A binary predicate.
4190 : * @return The first iterator @c i in the range @p
4191 : * [__first,__last-__count) such that @p
4192 : * __binary_pred(*(i+N),__val) is true for each @c N in the range
4193 : * @p [0,__count), or @p __last if no such iterator exists.
4194 : *
4195 : * Searches the range @p [__first,__last) for @p __count
4196 : * consecutive elements for which the predicate returns true.
4197 : */
4198 : template<typename _ForwardIterator, typename _Integer, typename _Tp,
4199 : typename _BinaryPredicate>
4200 : _GLIBCXX20_CONSTEXPR
4201 : inline _ForwardIterator
4202 : search_n(_ForwardIterator __first, _ForwardIterator __last,
4203 : _Integer __count, const _Tp& __val,
4204 : _BinaryPredicate __binary_pred)
4205 : {
4206 : // concept requirements
4207 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4208 : __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4209 : typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
4210 : __glibcxx_requires_valid_range(__first, __last);
4211 :
4212 : return std::__search_n(__first, __last, __count,
4213 : __gnu_cxx::__ops::__iter_comp_val(__binary_pred, __val));
4214 : }
4215 :
4216 : #if __cplusplus >= 201703L
4217 : /** @brief Search a sequence using a Searcher object.
4218 : *
4219 : * @param __first A forward iterator.
4220 : * @param __last A forward iterator.
4221 : * @param __searcher A callable object.
4222 : * @return @p __searcher(__first,__last).first
4223 : */
4224 : template<typename _ForwardIterator, typename _Searcher>
4225 : _GLIBCXX20_CONSTEXPR
4226 : inline _ForwardIterator
4227 : search(_ForwardIterator __first, _ForwardIterator __last,
4228 : const _Searcher& __searcher)
4229 : { return __searcher(__first, __last).first; }
4230 : #endif
4231 :
4232 : /**
4233 : * @brief Perform an operation on a sequence.
4234 : * @ingroup mutating_algorithms
4235 : * @param __first An input iterator.
4236 : * @param __last An input iterator.
4237 : * @param __result An output iterator.
4238 : * @param __unary_op A unary operator.
4239 : * @return An output iterator equal to @p __result+(__last-__first).
4240 : *
4241 : * Applies the operator to each element in the input range and assigns
4242 : * the results to successive elements of the output sequence.
4243 : * Evaluates @p *(__result+N)=unary_op(*(__first+N)) for each @c N in the
4244 : * range @p [0,__last-__first).
4245 : *
4246 : * @p unary_op must not alter its argument.
4247 : */
4248 : template<typename _InputIterator, typename _OutputIterator,
4249 : typename _UnaryOperation>
4250 : _GLIBCXX20_CONSTEXPR
4251 : _OutputIterator
4252 : transform(_InputIterator __first, _InputIterator __last,
4253 : _OutputIterator __result, _UnaryOperation __unary_op)
4254 : {
4255 : // concept requirements
4256 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4257 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4258 : // "the type returned by a _UnaryOperation"
4259 : __typeof__(__unary_op(*__first))>)
4260 : __glibcxx_requires_valid_range(__first, __last);
4261 :
4262 : for (; __first != __last; ++__first, (void)++__result)
4263 : *__result = __unary_op(*__first);
4264 : return __result;
4265 : }
4266 :
4267 : /**
4268 : * @brief Perform an operation on corresponding elements of two sequences.
4269 : * @ingroup mutating_algorithms
4270 : * @param __first1 An input iterator.
4271 : * @param __last1 An input iterator.
4272 : * @param __first2 An input iterator.
4273 : * @param __result An output iterator.
4274 : * @param __binary_op A binary operator.
4275 : * @return An output iterator equal to @p result+(last-first).
4276 : *
4277 : * Applies the operator to the corresponding elements in the two
4278 : * input ranges and assigns the results to successive elements of the
4279 : * output sequence.
4280 : * Evaluates @p
4281 : * *(__result+N)=__binary_op(*(__first1+N),*(__first2+N)) for each
4282 : * @c N in the range @p [0,__last1-__first1).
4283 : *
4284 : * @p binary_op must not alter either of its arguments.
4285 : */
4286 : template<typename _InputIterator1, typename _InputIterator2,
4287 : typename _OutputIterator, typename _BinaryOperation>
4288 : _GLIBCXX20_CONSTEXPR
4289 : _OutputIterator
4290 : transform(_InputIterator1 __first1, _InputIterator1 __last1,
4291 : _InputIterator2 __first2, _OutputIterator __result,
4292 : _BinaryOperation __binary_op)
4293 : {
4294 : // concept requirements
4295 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4296 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4297 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4298 : // "the type returned by a _BinaryOperation"
4299 : __typeof__(__binary_op(*__first1,*__first2))>)
4300 : __glibcxx_requires_valid_range(__first1, __last1);
4301 :
4302 : for (; __first1 != __last1; ++__first1, (void)++__first2, ++__result)
4303 : *__result = __binary_op(*__first1, *__first2);
4304 : return __result;
4305 : }
4306 :
4307 : /**
4308 : * @brief Replace each occurrence of one value in a sequence with another
4309 : * value.
4310 : * @ingroup mutating_algorithms
4311 : * @param __first A forward iterator.
4312 : * @param __last A forward iterator.
4313 : * @param __old_value The value to be replaced.
4314 : * @param __new_value The replacement value.
4315 : * @return replace() returns no value.
4316 : *
4317 : * For each iterator @c i in the range @p [__first,__last) if @c *i ==
4318 : * @p __old_value then the assignment @c *i = @p __new_value is performed.
4319 : */
4320 : template<typename _ForwardIterator, typename _Tp>
4321 : _GLIBCXX20_CONSTEXPR
4322 : void
4323 : replace(_ForwardIterator __first, _ForwardIterator __last,
4324 : const _Tp& __old_value, const _Tp& __new_value)
4325 : {
4326 : // concept requirements
4327 : __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4328 : _ForwardIterator>)
4329 : __glibcxx_function_requires(_EqualOpConcept<
4330 : typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
4331 : __glibcxx_function_requires(_ConvertibleConcept<_Tp,
4332 : typename iterator_traits<_ForwardIterator>::value_type>)
4333 : __glibcxx_requires_valid_range(__first, __last);
4334 :
4335 : for (; __first != __last; ++__first)
4336 : if (*__first == __old_value)
4337 : *__first = __new_value;
4338 : }
4339 :
4340 : /**
4341 : * @brief Replace each value in a sequence for which a predicate returns
4342 : * true with another value.
4343 : * @ingroup mutating_algorithms
4344 : * @param __first A forward iterator.
4345 : * @param __last A forward iterator.
4346 : * @param __pred A predicate.
4347 : * @param __new_value The replacement value.
4348 : * @return replace_if() returns no value.
4349 : *
4350 : * For each iterator @c i in the range @p [__first,__last) if @p __pred(*i)
4351 : * is true then the assignment @c *i = @p __new_value is performed.
4352 : */
4353 : template<typename _ForwardIterator, typename _Predicate, typename _Tp>
4354 : _GLIBCXX20_CONSTEXPR
4355 : void
4356 : replace_if(_ForwardIterator __first, _ForwardIterator __last,
4357 : _Predicate __pred, const _Tp& __new_value)
4358 : {
4359 : // concept requirements
4360 : __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4361 : _ForwardIterator>)
4362 : __glibcxx_function_requires(_ConvertibleConcept<_Tp,
4363 : typename iterator_traits<_ForwardIterator>::value_type>)
4364 : __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4365 : typename iterator_traits<_ForwardIterator>::value_type>)
4366 : __glibcxx_requires_valid_range(__first, __last);
4367 :
4368 : for (; __first != __last; ++__first)
4369 : if (__pred(*__first))
4370 : *__first = __new_value;
4371 : }
4372 :
4373 : /**
4374 : * @brief Assign the result of a function object to each value in a
4375 : * sequence.
4376 : * @ingroup mutating_algorithms
4377 : * @param __first A forward iterator.
4378 : * @param __last A forward iterator.
4379 : * @param __gen A function object taking no arguments and returning
4380 : * std::iterator_traits<_ForwardIterator>::value_type
4381 : * @return generate() returns no value.
4382 : *
4383 : * Performs the assignment @c *i = @p __gen() for each @c i in the range
4384 : * @p [__first,__last).
4385 : */
4386 : template<typename _ForwardIterator, typename _Generator>
4387 : _GLIBCXX20_CONSTEXPR
4388 : void
4389 : generate(_ForwardIterator __first, _ForwardIterator __last,
4390 : _Generator __gen)
4391 : {
4392 : // concept requirements
4393 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4394 : __glibcxx_function_requires(_GeneratorConcept<_Generator,
4395 : typename iterator_traits<_ForwardIterator>::value_type>)
4396 : __glibcxx_requires_valid_range(__first, __last);
4397 :
4398 : for (; __first != __last; ++__first)
4399 : *__first = __gen();
4400 : }
4401 :
4402 : /**
4403 : * @brief Assign the result of a function object to each value in a
4404 : * sequence.
4405 : * @ingroup mutating_algorithms
4406 : * @param __first A forward iterator.
4407 : * @param __n The length of the sequence.
4408 : * @param __gen A function object taking no arguments and returning
4409 : * std::iterator_traits<_ForwardIterator>::value_type
4410 : * @return The end of the sequence, @p __first+__n
4411 : *
4412 : * Performs the assignment @c *i = @p __gen() for each @c i in the range
4413 : * @p [__first,__first+__n).
4414 : *
4415 : * If @p __n is negative, the function does nothing and returns @p __first.
4416 : */
4417 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
4418 : // DR 865. More algorithms that throw away information
4419 : // DR 426. search_n(), fill_n(), and generate_n() with negative n
4420 : template<typename _OutputIterator, typename _Size, typename _Generator>
4421 : _GLIBCXX20_CONSTEXPR
4422 : _OutputIterator
4423 : generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
4424 : {
4425 : // concept requirements
4426 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4427 : // "the type returned by a _Generator"
4428 : __typeof__(__gen())>)
4429 :
4430 : typedef __decltype(std::__size_to_integer(__n)) _IntSize;
4431 : for (_IntSize __niter = std::__size_to_integer(__n);
4432 : __niter > 0; --__niter, (void) ++__first)
4433 : *__first = __gen();
4434 : return __first;
4435 : }
4436 :
4437 : /**
4438 : * @brief Copy a sequence, removing consecutive duplicate values.
4439 : * @ingroup mutating_algorithms
4440 : * @param __first An input iterator.
4441 : * @param __last An input iterator.
4442 : * @param __result An output iterator.
4443 : * @return An iterator designating the end of the resulting sequence.
4444 : *
4445 : * Copies each element in the range @p [__first,__last) to the range
4446 : * beginning at @p __result, except that only the first element is copied
4447 : * from groups of consecutive elements that compare equal.
4448 : * unique_copy() is stable, so the relative order of elements that are
4449 : * copied is unchanged.
4450 : *
4451 : * _GLIBCXX_RESOLVE_LIB_DEFECTS
4452 : * DR 241. Does unique_copy() require CopyConstructible and Assignable?
4453 : *
4454 : * _GLIBCXX_RESOLVE_LIB_DEFECTS
4455 : * DR 538. 241 again: Does unique_copy() require CopyConstructible and
4456 : * Assignable?
4457 : */
4458 : template<typename _InputIterator, typename _OutputIterator>
4459 : _GLIBCXX20_CONSTEXPR
4460 : inline _OutputIterator
4461 : unique_copy(_InputIterator __first, _InputIterator __last,
4462 : _OutputIterator __result)
4463 : {
4464 : // concept requirements
4465 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4466 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4467 : typename iterator_traits<_InputIterator>::value_type>)
4468 : __glibcxx_function_requires(_EqualityComparableConcept<
4469 : typename iterator_traits<_InputIterator>::value_type>)
4470 : __glibcxx_requires_valid_range(__first, __last);
4471 :
4472 : if (__first == __last)
4473 : return __result;
4474 : return std::__unique_copy(__first, __last, __result,
4475 : __gnu_cxx::__ops::__iter_equal_to_iter(),
4476 : std::__iterator_category(__first),
4477 : std::__iterator_category(__result));
4478 : }
4479 :
4480 : /**
4481 : * @brief Copy a sequence, removing consecutive values using a predicate.
4482 : * @ingroup mutating_algorithms
4483 : * @param __first An input iterator.
4484 : * @param __last An input iterator.
4485 : * @param __result An output iterator.
4486 : * @param __binary_pred A binary predicate.
4487 : * @return An iterator designating the end of the resulting sequence.
4488 : *
4489 : * Copies each element in the range @p [__first,__last) to the range
4490 : * beginning at @p __result, except that only the first element is copied
4491 : * from groups of consecutive elements for which @p __binary_pred returns
4492 : * true.
4493 : * unique_copy() is stable, so the relative order of elements that are
4494 : * copied is unchanged.
4495 : *
4496 : * _GLIBCXX_RESOLVE_LIB_DEFECTS
4497 : * DR 241. Does unique_copy() require CopyConstructible and Assignable?
4498 : */
4499 : template<typename _InputIterator, typename _OutputIterator,
4500 : typename _BinaryPredicate>
4501 : _GLIBCXX20_CONSTEXPR
4502 : inline _OutputIterator
4503 : unique_copy(_InputIterator __first, _InputIterator __last,
4504 : _OutputIterator __result,
4505 : _BinaryPredicate __binary_pred)
4506 : {
4507 : // concept requirements -- predicates checked later
4508 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4509 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4510 : typename iterator_traits<_InputIterator>::value_type>)
4511 : __glibcxx_requires_valid_range(__first, __last);
4512 :
4513 : if (__first == __last)
4514 : return __result;
4515 : return std::__unique_copy(__first, __last, __result,
4516 : __gnu_cxx::__ops::__iter_comp_iter(__binary_pred),
4517 : std::__iterator_category(__first),
4518 : std::__iterator_category(__result));
4519 : }
4520 :
4521 : #if __cplusplus <= 201103L || _GLIBCXX_USE_DEPRECATED
4522 : #if _GLIBCXX_HOSTED
4523 : /**
4524 : * @brief Randomly shuffle the elements of a sequence.
4525 : * @ingroup mutating_algorithms
4526 : * @param __first A forward iterator.
4527 : * @param __last A forward iterator.
4528 : * @return Nothing.
4529 : *
4530 : * Reorder the elements in the range @p [__first,__last) using a random
4531 : * distribution, so that every possible ordering of the sequence is
4532 : * equally likely.
4533 : *
4534 : * @deprecated
4535 : * Since C++14 `std::random_shuffle` is not part of the C++ standard.
4536 : * Use `std::shuffle` instead, which was introduced in C++11.
4537 : */
4538 : template<typename _RandomAccessIterator>
4539 : _GLIBCXX14_DEPRECATED_SUGGEST("std::shuffle")
4540 : inline void
4541 : random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
4542 : {
4543 : // concept requirements
4544 : __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4545 : _RandomAccessIterator>)
4546 : __glibcxx_requires_valid_range(__first, __last);
4547 :
4548 : if (__first != __last)
4549 : for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
4550 : {
4551 : // XXX rand() % N is not uniformly distributed
4552 : _RandomAccessIterator __j = __first
4553 : + std::rand() % ((__i - __first) + 1);
4554 : if (__i != __j)
4555 : std::iter_swap(__i, __j);
4556 : }
4557 : }
4558 : #endif
4559 :
4560 : /**
4561 : * @brief Shuffle the elements of a sequence using a random number
4562 : * generator.
4563 : * @ingroup mutating_algorithms
4564 : * @param __first A forward iterator.
4565 : * @param __last A forward iterator.
4566 : * @param __rand The RNG functor or function.
4567 : * @return Nothing.
4568 : *
4569 : * Reorders the elements in the range @p [__first,__last) using @p __rand to
4570 : * provide a random distribution. Calling @p __rand(N) for a positive
4571 : * integer @p N should return a randomly chosen integer from the
4572 : * range [0,N).
4573 : *
4574 : * @deprecated
4575 : * Since C++14 `std::random_shuffle` is not part of the C++ standard.
4576 : * Use `std::shuffle` instead, which was introduced in C++11.
4577 : */
4578 : template<typename _RandomAccessIterator, typename _RandomNumberGenerator>
4579 : _GLIBCXX14_DEPRECATED_SUGGEST("std::shuffle")
4580 : void
4581 : random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
4582 : #if __cplusplus >= 201103L
4583 : _RandomNumberGenerator&& __rand)
4584 : #else
4585 : _RandomNumberGenerator& __rand)
4586 : #endif
4587 : {
4588 : // concept requirements
4589 : __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4590 : _RandomAccessIterator>)
4591 : __glibcxx_requires_valid_range(__first, __last);
4592 :
4593 : if (__first == __last)
4594 : return;
4595 : for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
4596 : {
4597 : _RandomAccessIterator __j = __first + __rand((__i - __first) + 1);
4598 : if (__i != __j)
4599 : std::iter_swap(__i, __j);
4600 : }
4601 : }
4602 : #endif // C++11 || USE_DEPRECATED
4603 :
4604 : /**
4605 : * @brief Move elements for which a predicate is true to the beginning
4606 : * of a sequence.
4607 : * @ingroup mutating_algorithms
4608 : * @param __first A forward iterator.
4609 : * @param __last A forward iterator.
4610 : * @param __pred A predicate functor.
4611 : * @return An iterator @p middle such that @p __pred(i) is true for each
4612 : * iterator @p i in the range @p [__first,middle) and false for each @p i
4613 : * in the range @p [middle,__last).
4614 : *
4615 : * @p __pred must not modify its operand. @p partition() does not preserve
4616 : * the relative ordering of elements in each group, use
4617 : * @p stable_partition() if this is needed.
4618 : */
4619 : template<typename _ForwardIterator, typename _Predicate>
4620 : _GLIBCXX20_CONSTEXPR
4621 : inline _ForwardIterator
4622 : partition(_ForwardIterator __first, _ForwardIterator __last,
4623 : _Predicate __pred)
4624 : {
4625 : // concept requirements
4626 : __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4627 : _ForwardIterator>)
4628 : __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4629 : typename iterator_traits<_ForwardIterator>::value_type>)
4630 : __glibcxx_requires_valid_range(__first, __last);
4631 :
4632 : return std::__partition(__first, __last, __pred,
4633 : std::__iterator_category(__first));
4634 : }
4635 :
4636 :
4637 : /**
4638 : * @brief Sort the smallest elements of a sequence.
4639 : * @ingroup sorting_algorithms
4640 : * @param __first An iterator.
4641 : * @param __middle Another iterator.
4642 : * @param __last Another iterator.
4643 : * @return Nothing.
4644 : *
4645 : * Sorts the smallest @p (__middle-__first) elements in the range
4646 : * @p [first,last) and moves them to the range @p [__first,__middle). The
4647 : * order of the remaining elements in the range @p [__middle,__last) is
4648 : * undefined.
4649 : * After the sort if @e i and @e j are iterators in the range
4650 : * @p [__first,__middle) such that i precedes j and @e k is an iterator in
4651 : * the range @p [__middle,__last) then *j<*i and *k<*i are both false.
4652 : */
4653 : template<typename _RandomAccessIterator>
4654 : _GLIBCXX20_CONSTEXPR
4655 : inline void
4656 : partial_sort(_RandomAccessIterator __first,
4657 : _RandomAccessIterator __middle,
4658 : _RandomAccessIterator __last)
4659 : {
4660 : // concept requirements
4661 : __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4662 : _RandomAccessIterator>)
4663 : __glibcxx_function_requires(_LessThanComparableConcept<
4664 : typename iterator_traits<_RandomAccessIterator>::value_type>)
4665 : __glibcxx_requires_valid_range(__first, __middle);
4666 : __glibcxx_requires_valid_range(__middle, __last);
4667 : __glibcxx_requires_irreflexive(__first, __last);
4668 :
4669 : std::__partial_sort(__first, __middle, __last,
4670 : __gnu_cxx::__ops::__iter_less_iter());
4671 : }
4672 :
4673 : /**
4674 : * @brief Sort the smallest elements of a sequence using a predicate
4675 : * for comparison.
4676 : * @ingroup sorting_algorithms
4677 : * @param __first An iterator.
4678 : * @param __middle Another iterator.
4679 : * @param __last Another iterator.
4680 : * @param __comp A comparison functor.
4681 : * @return Nothing.
4682 : *
4683 : * Sorts the smallest @p (__middle-__first) elements in the range
4684 : * @p [__first,__last) and moves them to the range @p [__first,__middle). The
4685 : * order of the remaining elements in the range @p [__middle,__last) is
4686 : * undefined.
4687 : * After the sort if @e i and @e j are iterators in the range
4688 : * @p [__first,__middle) such that i precedes j and @e k is an iterator in
4689 : * the range @p [__middle,__last) then @p *__comp(j,*i) and @p __comp(*k,*i)
4690 : * are both false.
4691 : */
4692 : template<typename _RandomAccessIterator, typename _Compare>
4693 : _GLIBCXX20_CONSTEXPR
4694 : inline void
4695 : partial_sort(_RandomAccessIterator __first,
4696 : _RandomAccessIterator __middle,
4697 : _RandomAccessIterator __last,
4698 : _Compare __comp)
4699 : {
4700 : // concept requirements
4701 : __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4702 : _RandomAccessIterator>)
4703 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4704 : typename iterator_traits<_RandomAccessIterator>::value_type,
4705 : typename iterator_traits<_RandomAccessIterator>::value_type>)
4706 : __glibcxx_requires_valid_range(__first, __middle);
4707 : __glibcxx_requires_valid_range(__middle, __last);
4708 : __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4709 :
4710 : std::__partial_sort(__first, __middle, __last,
4711 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
4712 : }
4713 :
4714 : /**
4715 : * @brief Sort a sequence just enough to find a particular position.
4716 : * @ingroup sorting_algorithms
4717 : * @param __first An iterator.
4718 : * @param __nth Another iterator.
4719 : * @param __last Another iterator.
4720 : * @return Nothing.
4721 : *
4722 : * Rearranges the elements in the range @p [__first,__last) so that @p *__nth
4723 : * is the same element that would have been in that position had the
4724 : * whole sequence been sorted. The elements either side of @p *__nth are
4725 : * not completely sorted, but for any iterator @e i in the range
4726 : * @p [__first,__nth) and any iterator @e j in the range @p [__nth,__last) it
4727 : * holds that *j < *i is false.
4728 : */
4729 : template<typename _RandomAccessIterator>
4730 : _GLIBCXX20_CONSTEXPR
4731 : inline void
4732 : nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4733 : _RandomAccessIterator __last)
4734 : {
4735 : // concept requirements
4736 : __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4737 : _RandomAccessIterator>)
4738 : __glibcxx_function_requires(_LessThanComparableConcept<
4739 : typename iterator_traits<_RandomAccessIterator>::value_type>)
4740 : __glibcxx_requires_valid_range(__first, __nth);
4741 : __glibcxx_requires_valid_range(__nth, __last);
4742 : __glibcxx_requires_irreflexive(__first, __last);
4743 :
4744 : if (__first == __last || __nth == __last)
4745 : return;
4746 :
4747 : std::__introselect(__first, __nth, __last,
4748 : std::__lg(__last - __first) * 2,
4749 : __gnu_cxx::__ops::__iter_less_iter());
4750 : }
4751 :
4752 : /**
4753 : * @brief Sort a sequence just enough to find a particular position
4754 : * using a predicate for comparison.
4755 : * @ingroup sorting_algorithms
4756 : * @param __first An iterator.
4757 : * @param __nth Another iterator.
4758 : * @param __last Another iterator.
4759 : * @param __comp A comparison functor.
4760 : * @return Nothing.
4761 : *
4762 : * Rearranges the elements in the range @p [__first,__last) so that @p *__nth
4763 : * is the same element that would have been in that position had the
4764 : * whole sequence been sorted. The elements either side of @p *__nth are
4765 : * not completely sorted, but for any iterator @e i in the range
4766 : * @p [__first,__nth) and any iterator @e j in the range @p [__nth,__last) it
4767 : * holds that @p __comp(*j,*i) is false.
4768 : */
4769 : template<typename _RandomAccessIterator, typename _Compare>
4770 : _GLIBCXX20_CONSTEXPR
4771 : inline void
4772 : nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4773 : _RandomAccessIterator __last, _Compare __comp)
4774 : {
4775 : // concept requirements
4776 : __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4777 : _RandomAccessIterator>)
4778 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4779 : typename iterator_traits<_RandomAccessIterator>::value_type,
4780 : typename iterator_traits<_RandomAccessIterator>::value_type>)
4781 : __glibcxx_requires_valid_range(__first, __nth);
4782 : __glibcxx_requires_valid_range(__nth, __last);
4783 : __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4784 :
4785 : if (__first == __last || __nth == __last)
4786 : return;
4787 :
4788 : std::__introselect(__first, __nth, __last,
4789 : std::__lg(__last - __first) * 2,
4790 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
4791 : }
4792 :
4793 : /**
4794 : * @brief Sort the elements of a sequence.
4795 : * @ingroup sorting_algorithms
4796 : * @param __first An iterator.
4797 : * @param __last Another iterator.
4798 : * @return Nothing.
4799 : *
4800 : * Sorts the elements in the range @p [__first,__last) in ascending order,
4801 : * such that for each iterator @e i in the range @p [__first,__last-1),
4802 : * *(i+1)<*i is false.
4803 : *
4804 : * The relative ordering of equivalent elements is not preserved, use
4805 : * @p stable_sort() if this is needed.
4806 : */
4807 : template<typename _RandomAccessIterator>
4808 : _GLIBCXX20_CONSTEXPR
4809 : inline void
4810 : sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4811 : {
4812 : // concept requirements
4813 : __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4814 : _RandomAccessIterator>)
4815 : __glibcxx_function_requires(_LessThanComparableConcept<
4816 : typename iterator_traits<_RandomAccessIterator>::value_type>)
4817 : __glibcxx_requires_valid_range(__first, __last);
4818 : __glibcxx_requires_irreflexive(__first, __last);
4819 :
4820 : std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
4821 : }
4822 :
4823 : /**
4824 : * @brief Sort the elements of a sequence using a predicate for comparison.
4825 : * @ingroup sorting_algorithms
4826 : * @param __first An iterator.
4827 : * @param __last Another iterator.
4828 : * @param __comp A comparison functor.
4829 : * @return Nothing.
4830 : *
4831 : * Sorts the elements in the range @p [__first,__last) in ascending order,
4832 : * such that @p __comp(*(i+1),*i) is false for every iterator @e i in the
4833 : * range @p [__first,__last-1).
4834 : *
4835 : * The relative ordering of equivalent elements is not preserved, use
4836 : * @p stable_sort() if this is needed.
4837 : */
4838 : template<typename _RandomAccessIterator, typename _Compare>
4839 : _GLIBCXX20_CONSTEXPR
4840 : inline void
4841 : sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
4842 : _Compare __comp)
4843 : {
4844 : // concept requirements
4845 : __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4846 : _RandomAccessIterator>)
4847 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4848 : typename iterator_traits<_RandomAccessIterator>::value_type,
4849 : typename iterator_traits<_RandomAccessIterator>::value_type>)
4850 : __glibcxx_requires_valid_range(__first, __last);
4851 : __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4852 :
4853 : std::__sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
4854 : }
4855 :
4856 : template<typename _InputIterator1, typename _InputIterator2,
4857 : typename _OutputIterator, typename _Compare>
4858 : _GLIBCXX20_CONSTEXPR
4859 : _OutputIterator
4860 : __merge(_InputIterator1 __first1, _InputIterator1 __last1,
4861 : _InputIterator2 __first2, _InputIterator2 __last2,
4862 : _OutputIterator __result, _Compare __comp)
4863 : {
4864 : while (__first1 != __last1 && __first2 != __last2)
4865 : {
4866 : if (__comp(__first2, __first1))
4867 : {
4868 : *__result = *__first2;
4869 : ++__first2;
4870 : }
4871 : else
4872 : {
4873 : *__result = *__first1;
4874 : ++__first1;
4875 : }
4876 : ++__result;
4877 : }
4878 : return std::copy(__first2, __last2,
4879 : std::copy(__first1, __last1, __result));
4880 : }
4881 :
4882 : /**
4883 : * @brief Merges two sorted ranges.
4884 : * @ingroup sorting_algorithms
4885 : * @param __first1 An iterator.
4886 : * @param __first2 Another iterator.
4887 : * @param __last1 Another iterator.
4888 : * @param __last2 Another iterator.
4889 : * @param __result An iterator pointing to the end of the merged range.
4890 : * @return An output iterator equal to @p __result + (__last1 - __first1)
4891 : * + (__last2 - __first2).
4892 : *
4893 : * Merges the ranges @p [__first1,__last1) and @p [__first2,__last2) into
4894 : * the sorted range @p [__result, __result + (__last1-__first1) +
4895 : * (__last2-__first2)). Both input ranges must be sorted, and the
4896 : * output range must not overlap with either of the input ranges.
4897 : * The sort is @e stable, that is, for equivalent elements in the
4898 : * two ranges, elements from the first range will always come
4899 : * before elements from the second.
4900 : */
4901 : template<typename _InputIterator1, typename _InputIterator2,
4902 : typename _OutputIterator>
4903 : _GLIBCXX20_CONSTEXPR
4904 : inline _OutputIterator
4905 : merge(_InputIterator1 __first1, _InputIterator1 __last1,
4906 : _InputIterator2 __first2, _InputIterator2 __last2,
4907 : _OutputIterator __result)
4908 : {
4909 : // concept requirements
4910 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4911 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4912 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4913 : typename iterator_traits<_InputIterator1>::value_type>)
4914 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4915 : typename iterator_traits<_InputIterator2>::value_type>)
4916 : __glibcxx_function_requires(_LessThanOpConcept<
4917 : typename iterator_traits<_InputIterator2>::value_type,
4918 : typename iterator_traits<_InputIterator1>::value_type>)
4919 : __glibcxx_requires_sorted_set(__first1, __last1, __first2);
4920 : __glibcxx_requires_sorted_set(__first2, __last2, __first1);
4921 : __glibcxx_requires_irreflexive2(__first1, __last1);
4922 : __glibcxx_requires_irreflexive2(__first2, __last2);
4923 :
4924 : return _GLIBCXX_STD_A::__merge(__first1, __last1,
4925 : __first2, __last2, __result,
4926 : __gnu_cxx::__ops::__iter_less_iter());
4927 : }
4928 :
4929 : /**
4930 : * @brief Merges two sorted ranges.
4931 : * @ingroup sorting_algorithms
4932 : * @param __first1 An iterator.
4933 : * @param __first2 Another iterator.
4934 : * @param __last1 Another iterator.
4935 : * @param __last2 Another iterator.
4936 : * @param __result An iterator pointing to the end of the merged range.
4937 : * @param __comp A functor to use for comparisons.
4938 : * @return An output iterator equal to @p __result + (__last1 - __first1)
4939 : * + (__last2 - __first2).
4940 : *
4941 : * Merges the ranges @p [__first1,__last1) and @p [__first2,__last2) into
4942 : * the sorted range @p [__result, __result + (__last1-__first1) +
4943 : * (__last2-__first2)). Both input ranges must be sorted, and the
4944 : * output range must not overlap with either of the input ranges.
4945 : * The sort is @e stable, that is, for equivalent elements in the
4946 : * two ranges, elements from the first range will always come
4947 : * before elements from the second.
4948 : *
4949 : * The comparison function should have the same effects on ordering as
4950 : * the function used for the initial sort.
4951 : */
4952 : template<typename _InputIterator1, typename _InputIterator2,
4953 : typename _OutputIterator, typename _Compare>
4954 : _GLIBCXX20_CONSTEXPR
4955 : inline _OutputIterator
4956 : merge(_InputIterator1 __first1, _InputIterator1 __last1,
4957 : _InputIterator2 __first2, _InputIterator2 __last2,
4958 : _OutputIterator __result, _Compare __comp)
4959 : {
4960 : // concept requirements
4961 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4962 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4963 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4964 : typename iterator_traits<_InputIterator1>::value_type>)
4965 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4966 : typename iterator_traits<_InputIterator2>::value_type>)
4967 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4968 : typename iterator_traits<_InputIterator2>::value_type,
4969 : typename iterator_traits<_InputIterator1>::value_type>)
4970 : __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
4971 : __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
4972 : __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
4973 : __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
4974 :
4975 : return _GLIBCXX_STD_A::__merge(__first1, __last1,
4976 : __first2, __last2, __result,
4977 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
4978 : }
4979 :
4980 : template<typename _RandomAccessIterator, typename _Compare>
4981 : inline void
4982 : __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
4983 : _Compare __comp)
4984 : {
4985 : typedef typename iterator_traits<_RandomAccessIterator>::value_type
4986 : _ValueType;
4987 : typedef typename iterator_traits<_RandomAccessIterator>::difference_type
4988 : _DistanceType;
4989 : typedef _Temporary_buffer<_RandomAccessIterator, _ValueType> _TmpBuf;
4990 :
4991 : if (__first == __last)
4992 : return;
4993 :
4994 : // __stable_sort_adaptive sorts the range in two halves,
4995 : // so the buffer only needs to fit half the range at once.
4996 : _TmpBuf __buf(__first, (__last - __first + 1) / 2);
4997 :
4998 : if (__buf.begin() == 0)
4999 : std::__inplace_stable_sort(__first, __last, __comp);
5000 : else
5001 : std::__stable_sort_adaptive(__first, __last, __buf.begin(),
5002 : _DistanceType(__buf.size()), __comp);
5003 : }
5004 :
5005 : /**
5006 : * @brief Sort the elements of a sequence, preserving the relative order
5007 : * of equivalent elements.
5008 : * @ingroup sorting_algorithms
5009 : * @param __first An iterator.
5010 : * @param __last Another iterator.
5011 : * @return Nothing.
5012 : *
5013 : * Sorts the elements in the range @p [__first,__last) in ascending order,
5014 : * such that for each iterator @p i in the range @p [__first,__last-1),
5015 : * @p *(i+1)<*i is false.
5016 : *
5017 : * The relative ordering of equivalent elements is preserved, so any two
5018 : * elements @p x and @p y in the range @p [__first,__last) such that
5019 : * @p x<y is false and @p y<x is false will have the same relative
5020 : * ordering after calling @p stable_sort().
5021 : */
5022 : template<typename _RandomAccessIterator>
5023 : inline void
5024 : stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
5025 : {
5026 : // concept requirements
5027 : __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
5028 : _RandomAccessIterator>)
5029 : __glibcxx_function_requires(_LessThanComparableConcept<
5030 : typename iterator_traits<_RandomAccessIterator>::value_type>)
5031 : __glibcxx_requires_valid_range(__first, __last);
5032 : __glibcxx_requires_irreflexive(__first, __last);
5033 :
5034 : _GLIBCXX_STD_A::__stable_sort(__first, __last,
5035 : __gnu_cxx::__ops::__iter_less_iter());
5036 : }
5037 :
5038 : /**
5039 : * @brief Sort the elements of a sequence using a predicate for comparison,
5040 : * preserving the relative order of equivalent elements.
5041 : * @ingroup sorting_algorithms
5042 : * @param __first An iterator.
5043 : * @param __last Another iterator.
5044 : * @param __comp A comparison functor.
5045 : * @return Nothing.
5046 : *
5047 : * Sorts the elements in the range @p [__first,__last) in ascending order,
5048 : * such that for each iterator @p i in the range @p [__first,__last-1),
5049 : * @p __comp(*(i+1),*i) is false.
5050 : *
5051 : * The relative ordering of equivalent elements is preserved, so any two
5052 : * elements @p x and @p y in the range @p [__first,__last) such that
5053 : * @p __comp(x,y) is false and @p __comp(y,x) is false will have the same
5054 : * relative ordering after calling @p stable_sort().
5055 : */
5056 : template<typename _RandomAccessIterator, typename _Compare>
5057 : inline void
5058 : stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
5059 : _Compare __comp)
5060 : {
5061 : // concept requirements
5062 : __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
5063 : _RandomAccessIterator>)
5064 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5065 : typename iterator_traits<_RandomAccessIterator>::value_type,
5066 : typename iterator_traits<_RandomAccessIterator>::value_type>)
5067 : __glibcxx_requires_valid_range(__first, __last);
5068 : __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5069 :
5070 : _GLIBCXX_STD_A::__stable_sort(__first, __last,
5071 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
5072 : }
5073 :
5074 : template<typename _InputIterator1, typename _InputIterator2,
5075 : typename _OutputIterator,
5076 : typename _Compare>
5077 : _GLIBCXX20_CONSTEXPR
5078 : _OutputIterator
5079 : __set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5080 : _InputIterator2 __first2, _InputIterator2 __last2,
5081 : _OutputIterator __result, _Compare __comp)
5082 : {
5083 : while (__first1 != __last1 && __first2 != __last2)
5084 : {
5085 : if (__comp(__first1, __first2))
5086 : {
5087 : *__result = *__first1;
5088 : ++__first1;
5089 : }
5090 : else if (__comp(__first2, __first1))
5091 : {
5092 : *__result = *__first2;
5093 : ++__first2;
5094 : }
5095 : else
5096 : {
5097 : *__result = *__first1;
5098 : ++__first1;
5099 : ++__first2;
5100 : }
5101 : ++__result;
5102 : }
5103 : return std::copy(__first2, __last2,
5104 : std::copy(__first1, __last1, __result));
5105 : }
5106 :
5107 : /**
5108 : * @brief Return the union of two sorted ranges.
5109 : * @ingroup set_algorithms
5110 : * @param __first1 Start of first range.
5111 : * @param __last1 End of first range.
5112 : * @param __first2 Start of second range.
5113 : * @param __last2 End of second range.
5114 : * @param __result Start of output range.
5115 : * @return End of the output range.
5116 : * @ingroup set_algorithms
5117 : *
5118 : * This operation iterates over both ranges, copying elements present in
5119 : * each range in order to the output range. Iterators increment for each
5120 : * range. When the current element of one range is less than the other,
5121 : * that element is copied and the iterator advanced. If an element is
5122 : * contained in both ranges, the element from the first range is copied and
5123 : * both ranges advance. The output range may not overlap either input
5124 : * range.
5125 : */
5126 : template<typename _InputIterator1, typename _InputIterator2,
5127 : typename _OutputIterator>
5128 : _GLIBCXX20_CONSTEXPR
5129 : inline _OutputIterator
5130 : set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5131 : _InputIterator2 __first2, _InputIterator2 __last2,
5132 : _OutputIterator __result)
5133 : {
5134 : // concept requirements
5135 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5136 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5137 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5138 : typename iterator_traits<_InputIterator1>::value_type>)
5139 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5140 : typename iterator_traits<_InputIterator2>::value_type>)
5141 : __glibcxx_function_requires(_LessThanOpConcept<
5142 : typename iterator_traits<_InputIterator1>::value_type,
5143 : typename iterator_traits<_InputIterator2>::value_type>)
5144 : __glibcxx_function_requires(_LessThanOpConcept<
5145 : typename iterator_traits<_InputIterator2>::value_type,
5146 : typename iterator_traits<_InputIterator1>::value_type>)
5147 : __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5148 : __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5149 : __glibcxx_requires_irreflexive2(__first1, __last1);
5150 : __glibcxx_requires_irreflexive2(__first2, __last2);
5151 :
5152 : return _GLIBCXX_STD_A::__set_union(__first1, __last1,
5153 : __first2, __last2, __result,
5154 : __gnu_cxx::__ops::__iter_less_iter());
5155 : }
5156 :
5157 : /**
5158 : * @brief Return the union of two sorted ranges using a comparison functor.
5159 : * @ingroup set_algorithms
5160 : * @param __first1 Start of first range.
5161 : * @param __last1 End of first range.
5162 : * @param __first2 Start of second range.
5163 : * @param __last2 End of second range.
5164 : * @param __result Start of output range.
5165 : * @param __comp The comparison functor.
5166 : * @return End of the output range.
5167 : * @ingroup set_algorithms
5168 : *
5169 : * This operation iterates over both ranges, copying elements present in
5170 : * each range in order to the output range. Iterators increment for each
5171 : * range. When the current element of one range is less than the other
5172 : * according to @p __comp, that element is copied and the iterator advanced.
5173 : * If an equivalent element according to @p __comp is contained in both
5174 : * ranges, the element from the first range is copied and both ranges
5175 : * advance. The output range may not overlap either input range.
5176 : */
5177 : template<typename _InputIterator1, typename _InputIterator2,
5178 : typename _OutputIterator, typename _Compare>
5179 : _GLIBCXX20_CONSTEXPR
5180 : inline _OutputIterator
5181 : set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5182 : _InputIterator2 __first2, _InputIterator2 __last2,
5183 : _OutputIterator __result, _Compare __comp)
5184 : {
5185 : // concept requirements
5186 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5187 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5188 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5189 : typename iterator_traits<_InputIterator1>::value_type>)
5190 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5191 : typename iterator_traits<_InputIterator2>::value_type>)
5192 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5193 : typename iterator_traits<_InputIterator1>::value_type,
5194 : typename iterator_traits<_InputIterator2>::value_type>)
5195 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5196 : typename iterator_traits<_InputIterator2>::value_type,
5197 : typename iterator_traits<_InputIterator1>::value_type>)
5198 : __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5199 : __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5200 : __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5201 : __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5202 :
5203 : return _GLIBCXX_STD_A::__set_union(__first1, __last1,
5204 : __first2, __last2, __result,
5205 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
5206 : }
5207 :
5208 : template<typename _InputIterator1, typename _InputIterator2,
5209 : typename _OutputIterator,
5210 : typename _Compare>
5211 : _GLIBCXX20_CONSTEXPR
5212 : _OutputIterator
5213 : __set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5214 : _InputIterator2 __first2, _InputIterator2 __last2,
5215 : _OutputIterator __result, _Compare __comp)
5216 : {
5217 : while (__first1 != __last1 && __first2 != __last2)
5218 : if (__comp(__first1, __first2))
5219 : ++__first1;
5220 : else if (__comp(__first2, __first1))
5221 : ++__first2;
5222 : else
5223 : {
5224 : *__result = *__first1;
5225 : ++__first1;
5226 : ++__first2;
5227 : ++__result;
5228 : }
5229 : return __result;
5230 : }
5231 :
5232 : /**
5233 : * @brief Return the intersection of two sorted ranges.
5234 : * @ingroup set_algorithms
5235 : * @param __first1 Start of first range.
5236 : * @param __last1 End of first range.
5237 : * @param __first2 Start of second range.
5238 : * @param __last2 End of second range.
5239 : * @param __result Start of output range.
5240 : * @return End of the output range.
5241 : * @ingroup set_algorithms
5242 : *
5243 : * This operation iterates over both ranges, copying elements present in
5244 : * both ranges in order to the output range. Iterators increment for each
5245 : * range. When the current element of one range is less than the other,
5246 : * that iterator advances. If an element is contained in both ranges, the
5247 : * element from the first range is copied and both ranges advance. The
5248 : * output range may not overlap either input range.
5249 : */
5250 : template<typename _InputIterator1, typename _InputIterator2,
5251 : typename _OutputIterator>
5252 : _GLIBCXX20_CONSTEXPR
5253 : inline _OutputIterator
5254 : set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5255 : _InputIterator2 __first2, _InputIterator2 __last2,
5256 : _OutputIterator __result)
5257 : {
5258 : // concept requirements
5259 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5260 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5261 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5262 : typename iterator_traits<_InputIterator1>::value_type>)
5263 : __glibcxx_function_requires(_LessThanOpConcept<
5264 : typename iterator_traits<_InputIterator1>::value_type,
5265 : typename iterator_traits<_InputIterator2>::value_type>)
5266 : __glibcxx_function_requires(_LessThanOpConcept<
5267 : typename iterator_traits<_InputIterator2>::value_type,
5268 : typename iterator_traits<_InputIterator1>::value_type>)
5269 : __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5270 : __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5271 : __glibcxx_requires_irreflexive2(__first1, __last1);
5272 : __glibcxx_requires_irreflexive2(__first2, __last2);
5273 :
5274 : return _GLIBCXX_STD_A::__set_intersection(__first1, __last1,
5275 : __first2, __last2, __result,
5276 : __gnu_cxx::__ops::__iter_less_iter());
5277 : }
5278 :
5279 : /**
5280 : * @brief Return the intersection of two sorted ranges using comparison
5281 : * functor.
5282 : * @ingroup set_algorithms
5283 : * @param __first1 Start of first range.
5284 : * @param __last1 End of first range.
5285 : * @param __first2 Start of second range.
5286 : * @param __last2 End of second range.
5287 : * @param __result Start of output range.
5288 : * @param __comp The comparison functor.
5289 : * @return End of the output range.
5290 : * @ingroup set_algorithms
5291 : *
5292 : * This operation iterates over both ranges, copying elements present in
5293 : * both ranges in order to the output range. Iterators increment for each
5294 : * range. When the current element of one range is less than the other
5295 : * according to @p __comp, that iterator advances. If an element is
5296 : * contained in both ranges according to @p __comp, the element from the
5297 : * first range is copied and both ranges advance. The output range may not
5298 : * overlap either input range.
5299 : */
5300 : template<typename _InputIterator1, typename _InputIterator2,
5301 : typename _OutputIterator, typename _Compare>
5302 : _GLIBCXX20_CONSTEXPR
5303 : inline _OutputIterator
5304 : set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5305 : _InputIterator2 __first2, _InputIterator2 __last2,
5306 : _OutputIterator __result, _Compare __comp)
5307 : {
5308 : // concept requirements
5309 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5310 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5311 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5312 : typename iterator_traits<_InputIterator1>::value_type>)
5313 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5314 : typename iterator_traits<_InputIterator1>::value_type,
5315 : typename iterator_traits<_InputIterator2>::value_type>)
5316 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5317 : typename iterator_traits<_InputIterator2>::value_type,
5318 : typename iterator_traits<_InputIterator1>::value_type>)
5319 : __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5320 : __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5321 : __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5322 : __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5323 :
5324 : return _GLIBCXX_STD_A::__set_intersection(__first1, __last1,
5325 : __first2, __last2, __result,
5326 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
5327 : }
5328 :
5329 : template<typename _InputIterator1, typename _InputIterator2,
5330 : typename _OutputIterator,
5331 : typename _Compare>
5332 : _GLIBCXX20_CONSTEXPR
5333 : _OutputIterator
5334 : __set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5335 : _InputIterator2 __first2, _InputIterator2 __last2,
5336 : _OutputIterator __result, _Compare __comp)
5337 : {
5338 : while (__first1 != __last1 && __first2 != __last2)
5339 : if (__comp(__first1, __first2))
5340 : {
5341 : *__result = *__first1;
5342 : ++__first1;
5343 : ++__result;
5344 : }
5345 : else if (__comp(__first2, __first1))
5346 : ++__first2;
5347 : else
5348 : {
5349 : ++__first1;
5350 : ++__first2;
5351 : }
5352 : return std::copy(__first1, __last1, __result);
5353 : }
5354 :
5355 : /**
5356 : * @brief Return the difference of two sorted ranges.
5357 : * @ingroup set_algorithms
5358 : * @param __first1 Start of first range.
5359 : * @param __last1 End of first range.
5360 : * @param __first2 Start of second range.
5361 : * @param __last2 End of second range.
5362 : * @param __result Start of output range.
5363 : * @return End of the output range.
5364 : * @ingroup set_algorithms
5365 : *
5366 : * This operation iterates over both ranges, copying elements present in
5367 : * the first range but not the second in order to the output range.
5368 : * Iterators increment for each range. When the current element of the
5369 : * first range is less than the second, that element is copied and the
5370 : * iterator advances. If the current element of the second range is less,
5371 : * the iterator advances, but no element is copied. If an element is
5372 : * contained in both ranges, no elements are copied and both ranges
5373 : * advance. The output range may not overlap either input range.
5374 : */
5375 : template<typename _InputIterator1, typename _InputIterator2,
5376 : typename _OutputIterator>
5377 : _GLIBCXX20_CONSTEXPR
5378 : inline _OutputIterator
5379 : set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5380 : _InputIterator2 __first2, _InputIterator2 __last2,
5381 : _OutputIterator __result)
5382 : {
5383 : // concept requirements
5384 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5385 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5386 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5387 : typename iterator_traits<_InputIterator1>::value_type>)
5388 : __glibcxx_function_requires(_LessThanOpConcept<
5389 : typename iterator_traits<_InputIterator1>::value_type,
5390 : typename iterator_traits<_InputIterator2>::value_type>)
5391 : __glibcxx_function_requires(_LessThanOpConcept<
5392 : typename iterator_traits<_InputIterator2>::value_type,
5393 : typename iterator_traits<_InputIterator1>::value_type>)
5394 : __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5395 : __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5396 : __glibcxx_requires_irreflexive2(__first1, __last1);
5397 : __glibcxx_requires_irreflexive2(__first2, __last2);
5398 :
5399 : return _GLIBCXX_STD_A::__set_difference(__first1, __last1,
5400 : __first2, __last2, __result,
5401 : __gnu_cxx::__ops::__iter_less_iter());
5402 : }
5403 :
5404 : /**
5405 : * @brief Return the difference of two sorted ranges using comparison
5406 : * functor.
5407 : * @ingroup set_algorithms
5408 : * @param __first1 Start of first range.
5409 : * @param __last1 End of first range.
5410 : * @param __first2 Start of second range.
5411 : * @param __last2 End of second range.
5412 : * @param __result Start of output range.
5413 : * @param __comp The comparison functor.
5414 : * @return End of the output range.
5415 : * @ingroup set_algorithms
5416 : *
5417 : * This operation iterates over both ranges, copying elements present in
5418 : * the first range but not the second in order to the output range.
5419 : * Iterators increment for each range. When the current element of the
5420 : * first range is less than the second according to @p __comp, that element
5421 : * is copied and the iterator advances. If the current element of the
5422 : * second range is less, no element is copied and the iterator advances.
5423 : * If an element is contained in both ranges according to @p __comp, no
5424 : * elements are copied and both ranges advance. The output range may not
5425 : * overlap either input range.
5426 : */
5427 : template<typename _InputIterator1, typename _InputIterator2,
5428 : typename _OutputIterator, typename _Compare>
5429 : _GLIBCXX20_CONSTEXPR
5430 : inline _OutputIterator
5431 : set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5432 : _InputIterator2 __first2, _InputIterator2 __last2,
5433 : _OutputIterator __result, _Compare __comp)
5434 : {
5435 : // concept requirements
5436 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5437 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5438 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5439 : typename iterator_traits<_InputIterator1>::value_type>)
5440 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5441 : typename iterator_traits<_InputIterator1>::value_type,
5442 : typename iterator_traits<_InputIterator2>::value_type>)
5443 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5444 : typename iterator_traits<_InputIterator2>::value_type,
5445 : typename iterator_traits<_InputIterator1>::value_type>)
5446 : __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5447 : __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5448 : __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5449 : __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5450 :
5451 : return _GLIBCXX_STD_A::__set_difference(__first1, __last1,
5452 : __first2, __last2, __result,
5453 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
5454 : }
5455 :
5456 : template<typename _InputIterator1, typename _InputIterator2,
5457 : typename _OutputIterator,
5458 : typename _Compare>
5459 : _GLIBCXX20_CONSTEXPR
5460 : _OutputIterator
5461 : __set_symmetric_difference(_InputIterator1 __first1,
5462 : _InputIterator1 __last1,
5463 : _InputIterator2 __first2,
5464 : _InputIterator2 __last2,
5465 : _OutputIterator __result,
5466 : _Compare __comp)
5467 : {
5468 : while (__first1 != __last1 && __first2 != __last2)
5469 : if (__comp(__first1, __first2))
5470 : {
5471 : *__result = *__first1;
5472 : ++__first1;
5473 : ++__result;
5474 : }
5475 : else if (__comp(__first2, __first1))
5476 : {
5477 : *__result = *__first2;
5478 : ++__first2;
5479 : ++__result;
5480 : }
5481 : else
5482 : {
5483 : ++__first1;
5484 : ++__first2;
5485 : }
5486 : return std::copy(__first2, __last2,
5487 : std::copy(__first1, __last1, __result));
5488 : }
5489 :
5490 : /**
5491 : * @brief Return the symmetric difference of two sorted ranges.
5492 : * @ingroup set_algorithms
5493 : * @param __first1 Start of first range.
5494 : * @param __last1 End of first range.
5495 : * @param __first2 Start of second range.
5496 : * @param __last2 End of second range.
5497 : * @param __result Start of output range.
5498 : * @return End of the output range.
5499 : * @ingroup set_algorithms
5500 : *
5501 : * This operation iterates over both ranges, copying elements present in
5502 : * one range but not the other in order to the output range. Iterators
5503 : * increment for each range. When the current element of one range is less
5504 : * than the other, that element is copied and the iterator advances. If an
5505 : * element is contained in both ranges, no elements are copied and both
5506 : * ranges advance. The output range may not overlap either input range.
5507 : */
5508 : template<typename _InputIterator1, typename _InputIterator2,
5509 : typename _OutputIterator>
5510 : _GLIBCXX20_CONSTEXPR
5511 : inline _OutputIterator
5512 : set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5513 : _InputIterator2 __first2, _InputIterator2 __last2,
5514 : _OutputIterator __result)
5515 : {
5516 : // concept requirements
5517 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5518 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5519 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5520 : typename iterator_traits<_InputIterator1>::value_type>)
5521 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5522 : typename iterator_traits<_InputIterator2>::value_type>)
5523 : __glibcxx_function_requires(_LessThanOpConcept<
5524 : typename iterator_traits<_InputIterator1>::value_type,
5525 : typename iterator_traits<_InputIterator2>::value_type>)
5526 : __glibcxx_function_requires(_LessThanOpConcept<
5527 : typename iterator_traits<_InputIterator2>::value_type,
5528 : typename iterator_traits<_InputIterator1>::value_type>)
5529 : __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5530 : __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5531 : __glibcxx_requires_irreflexive2(__first1, __last1);
5532 : __glibcxx_requires_irreflexive2(__first2, __last2);
5533 :
5534 : return _GLIBCXX_STD_A::__set_symmetric_difference(__first1, __last1,
5535 : __first2, __last2, __result,
5536 : __gnu_cxx::__ops::__iter_less_iter());
5537 : }
5538 :
5539 : /**
5540 : * @brief Return the symmetric difference of two sorted ranges using
5541 : * comparison functor.
5542 : * @ingroup set_algorithms
5543 : * @param __first1 Start of first range.
5544 : * @param __last1 End of first range.
5545 : * @param __first2 Start of second range.
5546 : * @param __last2 End of second range.
5547 : * @param __result Start of output range.
5548 : * @param __comp The comparison functor.
5549 : * @return End of the output range.
5550 : * @ingroup set_algorithms
5551 : *
5552 : * This operation iterates over both ranges, copying elements present in
5553 : * one range but not the other in order to the output range. Iterators
5554 : * increment for each range. When the current element of one range is less
5555 : * than the other according to @p comp, that element is copied and the
5556 : * iterator advances. If an element is contained in both ranges according
5557 : * to @p __comp, no elements are copied and both ranges advance. The output
5558 : * range may not overlap either input range.
5559 : */
5560 : template<typename _InputIterator1, typename _InputIterator2,
5561 : typename _OutputIterator, typename _Compare>
5562 : _GLIBCXX20_CONSTEXPR
5563 : inline _OutputIterator
5564 : set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5565 : _InputIterator2 __first2, _InputIterator2 __last2,
5566 : _OutputIterator __result,
5567 : _Compare __comp)
5568 : {
5569 : // concept requirements
5570 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5571 : __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5572 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5573 : typename iterator_traits<_InputIterator1>::value_type>)
5574 : __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5575 : typename iterator_traits<_InputIterator2>::value_type>)
5576 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5577 : typename iterator_traits<_InputIterator1>::value_type,
5578 : typename iterator_traits<_InputIterator2>::value_type>)
5579 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5580 : typename iterator_traits<_InputIterator2>::value_type,
5581 : typename iterator_traits<_InputIterator1>::value_type>)
5582 : __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5583 : __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5584 : __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5585 : __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5586 :
5587 : return _GLIBCXX_STD_A::__set_symmetric_difference(__first1, __last1,
5588 : __first2, __last2, __result,
5589 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
5590 : }
5591 :
5592 : template<typename _ForwardIterator, typename _Compare>
5593 : _GLIBCXX14_CONSTEXPR
5594 : _ForwardIterator
5595 : __min_element(_ForwardIterator __first, _ForwardIterator __last,
5596 : _Compare __comp)
5597 : {
5598 : if (__first == __last)
5599 : return __first;
5600 : _ForwardIterator __result = __first;
5601 : while (++__first != __last)
5602 : if (__comp(__first, __result))
5603 : __result = __first;
5604 : return __result;
5605 : }
5606 :
5607 : /**
5608 : * @brief Return the minimum element in a range.
5609 : * @ingroup sorting_algorithms
5610 : * @param __first Start of range.
5611 : * @param __last End of range.
5612 : * @return Iterator referencing the first instance of the smallest value.
5613 : */
5614 : template<typename _ForwardIterator>
5615 : _GLIBCXX14_CONSTEXPR
5616 : _ForwardIterator
5617 : inline min_element(_ForwardIterator __first, _ForwardIterator __last)
5618 : {
5619 : // concept requirements
5620 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5621 : __glibcxx_function_requires(_LessThanComparableConcept<
5622 : typename iterator_traits<_ForwardIterator>::value_type>)
5623 : __glibcxx_requires_valid_range(__first, __last);
5624 : __glibcxx_requires_irreflexive(__first, __last);
5625 :
5626 : return _GLIBCXX_STD_A::__min_element(__first, __last,
5627 : __gnu_cxx::__ops::__iter_less_iter());
5628 : }
5629 :
5630 : /**
5631 : * @brief Return the minimum element in a range using comparison functor.
5632 : * @ingroup sorting_algorithms
5633 : * @param __first Start of range.
5634 : * @param __last End of range.
5635 : * @param __comp Comparison functor.
5636 : * @return Iterator referencing the first instance of the smallest value
5637 : * according to __comp.
5638 : */
5639 : template<typename _ForwardIterator, typename _Compare>
5640 : _GLIBCXX14_CONSTEXPR
5641 : inline _ForwardIterator
5642 : min_element(_ForwardIterator __first, _ForwardIterator __last,
5643 : _Compare __comp)
5644 : {
5645 : // concept requirements
5646 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5647 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5648 : typename iterator_traits<_ForwardIterator>::value_type,
5649 : typename iterator_traits<_ForwardIterator>::value_type>)
5650 : __glibcxx_requires_valid_range(__first, __last);
5651 : __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5652 :
5653 : return _GLIBCXX_STD_A::__min_element(__first, __last,
5654 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
5655 : }
5656 :
5657 : template<typename _ForwardIterator, typename _Compare>
5658 : _GLIBCXX14_CONSTEXPR
5659 : _ForwardIterator
5660 : __max_element(_ForwardIterator __first, _ForwardIterator __last,
5661 : _Compare __comp)
5662 : {
5663 : if (__first == __last) return __first;
5664 : _ForwardIterator __result = __first;
5665 : while (++__first != __last)
5666 : if (__comp(__result, __first))
5667 : __result = __first;
5668 : return __result;
5669 : }
5670 :
5671 : /**
5672 : * @brief Return the maximum element in a range.
5673 : * @ingroup sorting_algorithms
5674 : * @param __first Start of range.
5675 : * @param __last End of range.
5676 : * @return Iterator referencing the first instance of the largest value.
5677 : */
5678 : template<typename _ForwardIterator>
5679 : _GLIBCXX14_CONSTEXPR
5680 : inline _ForwardIterator
5681 : max_element(_ForwardIterator __first, _ForwardIterator __last)
5682 : {
5683 : // concept requirements
5684 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5685 : __glibcxx_function_requires(_LessThanComparableConcept<
5686 : typename iterator_traits<_ForwardIterator>::value_type>)
5687 : __glibcxx_requires_valid_range(__first, __last);
5688 : __glibcxx_requires_irreflexive(__first, __last);
5689 :
5690 : return _GLIBCXX_STD_A::__max_element(__first, __last,
5691 : __gnu_cxx::__ops::__iter_less_iter());
5692 : }
5693 :
5694 : /**
5695 : * @brief Return the maximum element in a range using comparison functor.
5696 : * @ingroup sorting_algorithms
5697 : * @param __first Start of range.
5698 : * @param __last End of range.
5699 : * @param __comp Comparison functor.
5700 : * @return Iterator referencing the first instance of the largest value
5701 : * according to __comp.
5702 : */
5703 : template<typename _ForwardIterator, typename _Compare>
5704 : _GLIBCXX14_CONSTEXPR
5705 : inline _ForwardIterator
5706 : max_element(_ForwardIterator __first, _ForwardIterator __last,
5707 : _Compare __comp)
5708 : {
5709 : // concept requirements
5710 : __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5711 : __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5712 : typename iterator_traits<_ForwardIterator>::value_type,
5713 : typename iterator_traits<_ForwardIterator>::value_type>)
5714 : __glibcxx_requires_valid_range(__first, __last);
5715 : __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5716 :
5717 : return _GLIBCXX_STD_A::__max_element(__first, __last,
5718 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
5719 : }
5720 :
5721 : #if __cplusplus >= 201103L
5722 : // N2722 + DR 915.
5723 : template<typename _Tp>
5724 : _GLIBCXX14_CONSTEXPR
5725 : inline _Tp
5726 : min(initializer_list<_Tp> __l)
5727 : {
5728 : __glibcxx_requires_irreflexive(__l.begin(), __l.end());
5729 : return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(),
5730 : __gnu_cxx::__ops::__iter_less_iter());
5731 : }
5732 :
5733 : template<typename _Tp, typename _Compare>
5734 : _GLIBCXX14_CONSTEXPR
5735 : inline _Tp
5736 : min(initializer_list<_Tp> __l, _Compare __comp)
5737 : {
5738 : __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
5739 : return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(),
5740 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
5741 : }
5742 :
5743 : template<typename _Tp>
5744 : _GLIBCXX14_CONSTEXPR
5745 : inline _Tp
5746 : max(initializer_list<_Tp> __l)
5747 : {
5748 : __glibcxx_requires_irreflexive(__l.begin(), __l.end());
5749 : return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(),
5750 : __gnu_cxx::__ops::__iter_less_iter());
5751 : }
5752 :
5753 : template<typename _Tp, typename _Compare>
5754 : _GLIBCXX14_CONSTEXPR
5755 : inline _Tp
5756 : max(initializer_list<_Tp> __l, _Compare __comp)
5757 : {
5758 : __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
5759 : return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(),
5760 : __gnu_cxx::__ops::__iter_comp_iter(__comp));
5761 : }
5762 : #endif // C++11
5763 :
5764 : #if __cplusplus >= 201402L
5765 : /// Reservoir sampling algorithm.
5766 : template<typename _InputIterator, typename _RandomAccessIterator,
5767 : typename _Size, typename _UniformRandomBitGenerator>
5768 : _RandomAccessIterator
5769 : __sample(_InputIterator __first, _InputIterator __last, input_iterator_tag,
5770 : _RandomAccessIterator __out, random_access_iterator_tag,
5771 : _Size __n, _UniformRandomBitGenerator&& __g)
5772 : {
5773 : using __distrib_type = uniform_int_distribution<_Size>;
5774 : using __param_type = typename __distrib_type::param_type;
5775 : __distrib_type __d{};
5776 : _Size __sample_sz = 0;
5777 : while (__first != __last && __sample_sz != __n)
5778 : {
5779 : __out[__sample_sz++] = *__first;
5780 : ++__first;
5781 : }
5782 : for (auto __pop_sz = __sample_sz; __first != __last;
5783 : ++__first, (void) ++__pop_sz)
5784 : {
5785 : const auto __k = __d(__g, __param_type{0, __pop_sz});
5786 : if (__k < __n)
5787 : __out[__k] = *__first;
5788 : }
5789 : return __out + __sample_sz;
5790 : }
5791 :
5792 : /// Selection sampling algorithm.
5793 : template<typename _ForwardIterator, typename _OutputIterator, typename _Cat,
5794 : typename _Size, typename _UniformRandomBitGenerator>
5795 : _OutputIterator
5796 : __sample(_ForwardIterator __first, _ForwardIterator __last,
5797 : forward_iterator_tag,
5798 : _OutputIterator __out, _Cat,
5799 : _Size __n, _UniformRandomBitGenerator&& __g)
5800 : {
5801 : using __distrib_type = uniform_int_distribution<_Size>;
5802 : using __param_type = typename __distrib_type::param_type;
5803 : using _USize = make_unsigned_t<_Size>;
5804 : using _Gen = remove_reference_t<_UniformRandomBitGenerator>;
5805 : using __uc_type = common_type_t<typename _Gen::result_type, _USize>;
5806 :
5807 : if (__first == __last)
5808 : return __out;
5809 :
5810 : __distrib_type __d{};
5811 : _Size __unsampled_sz = std::distance(__first, __last);
5812 : __n = std::min(__n, __unsampled_sz);
5813 :
5814 : // If possible, we use __gen_two_uniform_ints to efficiently produce
5815 : // two random numbers using a single distribution invocation:
5816 :
5817 : const __uc_type __urngrange = __g.max() - __g.min();
5818 : if (__urngrange / __uc_type(__unsampled_sz) >= __uc_type(__unsampled_sz))
5819 : // I.e. (__urngrange >= __unsampled_sz * __unsampled_sz) but without
5820 : // wrapping issues.
5821 : {
5822 : while (__n != 0 && __unsampled_sz >= 2)
5823 : {
5824 : const pair<_Size, _Size> __p =
5825 : __gen_two_uniform_ints(__unsampled_sz, __unsampled_sz - 1, __g);
5826 :
5827 : --__unsampled_sz;
5828 : if (__p.first < __n)
5829 : {
5830 : *__out++ = *__first;
5831 : --__n;
5832 : }
5833 :
5834 : ++__first;
5835 :
5836 : if (__n == 0) break;
5837 :
5838 : --__unsampled_sz;
5839 : if (__p.second < __n)
5840 : {
5841 : *__out++ = *__first;
5842 : --__n;
5843 : }
5844 :
5845 : ++__first;
5846 : }
5847 : }
5848 :
5849 : // The loop above is otherwise equivalent to this one-at-a-time version:
5850 :
5851 : for (; __n != 0; ++__first)
5852 : if (__d(__g, __param_type{0, --__unsampled_sz}) < __n)
5853 : {
5854 : *__out++ = *__first;
5855 : --__n;
5856 : }
5857 : return __out;
5858 : }
5859 :
5860 : #if __cplusplus > 201402L
5861 : #define __cpp_lib_sample 201603L
5862 : /// Take a random sample from a population.
5863 : template<typename _PopulationIterator, typename _SampleIterator,
5864 : typename _Distance, typename _UniformRandomBitGenerator>
5865 : _SampleIterator
5866 : sample(_PopulationIterator __first, _PopulationIterator __last,
5867 : _SampleIterator __out, _Distance __n,
5868 : _UniformRandomBitGenerator&& __g)
5869 : {
5870 : using __pop_cat = typename
5871 : std::iterator_traits<_PopulationIterator>::iterator_category;
5872 : using __samp_cat = typename
5873 : std::iterator_traits<_SampleIterator>::iterator_category;
5874 :
5875 : static_assert(
5876 : __or_<is_convertible<__pop_cat, forward_iterator_tag>,
5877 : is_convertible<__samp_cat, random_access_iterator_tag>>::value,
5878 : "output range must use a RandomAccessIterator when input range"
5879 : " does not meet the ForwardIterator requirements");
5880 :
5881 : static_assert(is_integral<_Distance>::value,
5882 : "sample size must be an integer type");
5883 :
5884 : typename iterator_traits<_PopulationIterator>::difference_type __d = __n;
5885 : return _GLIBCXX_STD_A::
5886 : __sample(__first, __last, __pop_cat{}, __out, __samp_cat{}, __d,
5887 : std::forward<_UniformRandomBitGenerator>(__g));
5888 : }
5889 : #endif // C++17
5890 : #endif // C++14
5891 :
5892 : _GLIBCXX_END_NAMESPACE_ALGO
5893 : _GLIBCXX_END_NAMESPACE_VERSION
5894 : } // namespace std
5895 :
5896 : #endif /* _STL_ALGO_H */
|