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

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc4/] [libstdc++-v3/] [include/] [bits/] [stl_algo.h] - Blame information for rev 594

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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