libstdc++
stl_algo.h
Go to the documentation of this file.
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
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
74namespace 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,
200 {
201 __first = std::__find_if(__first, __last, __unary_pred);
202 while (__first != __last)
203 {
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,
233 {
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<
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,
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,
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,
562
563 // A specific debug-mode test will be necessary...
564 __glibcxx_requires_valid_range(__first, __last);
565
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,
629 __glibcxx_function_requires(_EqualOpConcept<
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,
663 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
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,
698 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
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,
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,
791 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator2,
793 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
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<
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,
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<
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,
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,
995 {
996 // concept requirements -- iterators already checked
997 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
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,
1025 {
1026 // concept requirements -- iterators already checked
1027 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
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,
1058 {
1059 // concept requirements -- iterators already checked
1060 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
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,
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,
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,
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,
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,
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,
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
1296 _Distance;
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,
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,
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
1702 _InputValueType;
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
1754 _InputValueType;
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 {
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 {
1812 __val = _GLIBCXX_MOVE(*__i);
1813 _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
1814 *__first = _GLIBCXX_MOVE(__val);
1815 }
1816 else
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)
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,
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<
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,
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<
2161 __glibcxx_function_requires(_LessThanOpConcept<
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,
2198 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
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<
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,
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)
2523 (__first, __middle, __last, __len1, __len2, __comp);
2524 else
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<
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,
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<
2813 __glibcxx_function_requires(_LessThanOpConcept<
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,
2860 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
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<
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,
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<
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,
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,
3131 __glibcxx_function_requires(_EqualOpConcept<
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,
3167 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
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<
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,
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<
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,
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,
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
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;
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);
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 find(_InputIterator __first, _InputIterator __last,
3844 const _Tp& __val)
3845 {
3846 // concept requirements
3847 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3848 __glibcxx_function_requires(_EqualOpConcept<
3850 __glibcxx_requires_valid_range(__first, __last);
3851 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,
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<
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,
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<
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,
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<
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,
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<
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,
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<
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,
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<
4331 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
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,
4364 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
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,
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,
4468 __glibcxx_function_requires(_EqualityComparableConcept<
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,
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,
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<
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,
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<
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,
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<
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,
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,
4914 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4916 __glibcxx_function_requires(_LessThanOpConcept<
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,
4965 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4967 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
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<
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,
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,
5139 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5141 __glibcxx_function_requires(_LessThanOpConcept<
5144 __glibcxx_function_requires(_LessThanOpConcept<
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,
5190 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5192 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5195 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
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,
5263 __glibcxx_function_requires(_LessThanOpConcept<
5266 __glibcxx_function_requires(_LessThanOpConcept<
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,
5313 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5316 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
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,
5388 __glibcxx_function_requires(_LessThanOpConcept<
5391 __glibcxx_function_requires(_LessThanOpConcept<
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,
5440 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5443 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
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,
5521 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5523 __glibcxx_function_requires(_LessThanOpConcept<
5526 __glibcxx_function_requires(_LessThanOpConcept<
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,
5574 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5576 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5579 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
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<
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,
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<
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,
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,
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>;
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
5872 using __samp_cat = typename
5874
5875 static_assert(
5876 __or_<is_convertible<__pop_cat, forward_iterator_tag>,
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
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 */
typename remove_reference< _Tp >::type remove_reference_t
Alias template for remove_reference.
Definition: type_traits:1664
typename make_unsigned< _Tp >::type make_unsigned_t
Alias template for make_unsigned.
Definition: type_traits:2003
typename common_type< _Tp... >::type common_type_t
Alias template for common_type.
Definition: type_traits:2616
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
Definition: move.h:104
void swap(any &__x, any &__y) noexcept
Exchange the states of two any objects.
Definition: any:429
constexpr _InputIterator for_each_n(_InputIterator __first, _Size __n, _Function __f)
Apply a function to every element of a sequence.
Definition: stl_algo.h:3807
constexpr const _Tp & clamp(const _Tp &, const _Tp &, const _Tp &)
Returns the value clamped between lo and hi.
Definition: stl_algo.h:3621
constexpr const _Tp & max(const _Tp &, const _Tp &)
This does what you think it does.
Definition: stl_algobase.h:254
constexpr pair< const _Tp &, const _Tp & > minmax(const _Tp &, const _Tp &)
Determines min and max at once as an ordered pair.
Definition: stl_algo.h:3284
constexpr const _Tp & min(const _Tp &, const _Tp &)
This does what you think it does.
Definition: stl_algobase.h:230
constexpr iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
ISO C++ entities toplevel namespace is std.
_BidirectionalIterator1 __rotate_adaptive(_BidirectionalIterator1 __first, _BidirectionalIterator1 __middle, _BidirectionalIterator1 __last, _Distance __len1, _Distance __len2, _BidirectionalIterator2 __buffer, _Distance __buffer_size)
This is a helper function for the merge routines.
Definition: stl_algo.h:2352
_RandomAccessIterator __sample(_InputIterator __first, _InputIterator __last, input_iterator_tag, _RandomAccessIterator __out, random_access_iterator_tag, _Size __n, _UniformRandomBitGenerator &&__g)
Reservoir sampling algorithm.
Definition: stl_algo.h:5769
constexpr _InputIterator __find_if_not_n(_InputIterator __first, _Distance &__len, _Predicate __pred)
Like find_if_not(), but uses and updates a count of the remaining range length instead of comparing a...
Definition: stl_algo.h:120
constexpr void __unguarded_linear_insert(_RandomAccessIterator __last, _Compare __comp)
This is a helper function for the sort routine.
Definition: stl_algo.h:1782
constexpr _OutputIterator __unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __binary_pred, forward_iterator_tag, output_iterator_tag)
Definition: stl_algo.h:992
void __merge_without_buffer(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, _Distance __len1, _Distance __len2, _Compare __comp)
This is a helper function for the merge routines.
Definition: stl_algo.h:2451
pair< _IntType, _IntType > __gen_two_uniform_ints(_IntType __b0, _IntType __b1, _UniformRandomBitGenerator &&__g)
Generate two uniformly distributed integers using a single distribution invocation.
Definition: stl_algo.h:3673
constexpr void __unguarded_insertion_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
This is a helper function for the sort routine.
Definition: stl_algo.h:1826
constexpr void __heap_select(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, _Compare __comp)
This is a helper function for the sort routines.
Definition: stl_algo.h:1625
void __merge_adaptive(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, _Distance __len1, _Distance __len2, _Pointer __buffer, _Distance __buffer_size, _Compare __comp)
This is a helper function for the merge routines.
Definition: stl_algo.h:2390
constexpr _RandomAccessIterator __unguarded_partition_pivot(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
This is a helper function...
Definition: stl_algo.h:1883
constexpr iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
void __inplace_stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
This is a helper function for the stable sorting routines.
Definition: stl_algo.h:2739
constexpr _ForwardIterator __rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, forward_iterator_tag)
This is a helper function for the rotate algorithm.
Definition: stl_algo.h:1200
constexpr void __introsort_loop(_RandomAccessIterator __first, _RandomAccessIterator __last, _Size __depth_limit, _Compare __comp)
This is a helper function for the sort routine.
Definition: stl_algo.h:1908
constexpr _RandomAccessIterator __unguarded_partition(_RandomAccessIterator __first, _RandomAccessIterator __last, _RandomAccessIterator __pivot, _Compare __comp)
This is a helper function...
Definition: stl_algo.h:1861
constexpr _InputIterator __find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred, input_iterator_tag)
This is an overload used by find algos for the Input Iterator case.
constexpr _EuclideanRingElement __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
Definition: stl_algo.h:1182
constexpr _ForwardIterator __partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
This is a helper function...
Definition: stl_algo.h:1444
constexpr void __insertion_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
This is a helper function for the sort routine.
Definition: stl_algo.h:1802
void __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
This is a helper function for the __merge_adaptive routines.
Definition: stl_algo.h:2283
constexpr void __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
Definition: stl_algo.h:1078
constexpr int __lg(int __n)
This is a helper function for the sort routines and for random.tcc.
_SampleIterator sample(_PopulationIterator __first, _PopulationIterator __last, _SampleIterator __out, _Distance __n, _UniformRandomBitGenerator &&__g)
Take a random sample from a population.
Definition: stl_algo.h:5866
constexpr void advance(_InputIterator &__i, _Distance __n)
A generalization of pointer arithmetic.
constexpr void __move_median_to_first(_Iterator __result, _Iterator __a, _Iterator __b, _Iterator __c, _Compare __comp)
Swaps the median value of *__a, *__b and *__c under __comp to *__result.
Definition: stl_algo.h:82
constexpr _ForwardIterator __search_n_aux(_ForwardIterator __first, _ForwardIterator __last, _Integer __count, _UnaryPredicate __unary_pred, std::forward_iterator_tag)
Definition: stl_algo.h:197
void __move_merge_adaptive_backward(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1, _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BidirectionalIterator3 __result, _Compare __comp)
This is a helper function for the __merge_adaptive routines.
Definition: stl_algo.h:2309
constexpr void __final_insertion_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
This is a helper function for the sort routine.
Definition: stl_algo.h:1844
_ForwardIterator __stable_partition_adaptive(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, _Distance __len, _Pointer __buffer, _Distance __buffer_size)
This is a helper function... Requires __first != __last and !__pred(__first) and __len == distance(__...
Definition: stl_algo.h:1506
constexpr _InputIterator __find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
Provided for stable_partition to use.
Definition: stl_algo.h:106
_OutputIterator __move_merge(_InputIterator __first1, _InputIterator __last1, _InputIterator __first2, _InputIterator __last2, _OutputIterator __result, _Compare __comp)
This is a helper function for the __merge_sort_loop routines.
Definition: stl_algo.h:2615
is_integral
Definition: type_traits:415
is_convertible
Definition: type_traits:1484
common_type
Definition: type_traits:2259
Traits class for iterators.
Struct holding two objects of arbitrary type.
Definition: stl_pair.h:187
_T1 first
The first member.
Definition: stl_pair.h:191
_T2 second
The second member.
Definition: stl_pair.h:192
Marking input iterators.
Marking output iterators.
Forward iterators support a superset of input iterator operations.
Bidirectional iterators support a superset of forward iterator operations.
Random-access iterators support a superset of bidirectional iterator operations.
Uniform discrete distribution for random numbers. A discrete random distribution on the range with e...