OpenCores
URL https://opencores.org/ocsvn/altor32/altor32/trunk

Subversion Repositories altor32

[/] [altor32/] [trunk/] [gcc-x64/] [or1knd-elf/] [or1knd-elf/] [include/] [c++/] [4.8.0/] [bits/] [stl_algo.h] - Blame information for rev 35

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 35 ultra_embe
// 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
#if __cplusplus >= 201103L
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,
351
               std::forward_iterator_tag)
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,
383
               std::random_access_iterator_tag)
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
#if __cplusplus >= 201103L
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
#if __cplusplus >= 201103L
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,
1274
                  forward_iterator_tag, output_iterator_tag)
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,
1297
                  input_iterator_tag, output_iterator_tag)
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,
1320
                  input_iterator_tag, forward_iterator_tag)
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,
1341
                  forward_iterator_tag, output_iterator_tag)
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,
1370
                  input_iterator_tag, output_iterator_tag)
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,
1399
                  input_iterator_tag, forward_iterator_tag)
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,
1421
              bidirectional_iterator_tag)
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,
1441
              random_access_iterator_tag)
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)-1-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,
1537
             forward_iterator_tag)
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,
1573
              bidirectional_iterator_tag)
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,
1603
             random_access_iterator_tag)
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
 
1937
          _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first,
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
2171
            std::__unguarded_linear_insert(__i);
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)
2207
        std::__unguarded_linear_insert(__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
 
3201
      _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
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
 
3258
      _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
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
#if __cplusplus >= 201103L
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 // C++11
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
#if __cplusplus >= 201103L
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
 
5678
      _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
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
 
5723
      _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
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 */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.