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