1*3e519524SHoward Hinnant// -*- C++ -*-
2*3e519524SHoward Hinnant//===-------------------------- algorithm ---------------------------------===//
3*3e519524SHoward Hinnant//
4*3e519524SHoward Hinnant// ��������������������The LLVM Compiler Infrastructure
5*3e519524SHoward Hinnant//
6*3e519524SHoward Hinnant// This file is distributed under the University of Illinois Open Source
7*3e519524SHoward Hinnant// License. See LICENSE.TXT for details.
8*3e519524SHoward Hinnant//
9*3e519524SHoward Hinnant//===----------------------------------------------------------------------===//
10*3e519524SHoward Hinnant
11*3e519524SHoward Hinnant#ifndef _LIBCPP_ALGORITHM
12*3e519524SHoward Hinnant#define _LIBCPP_ALGORITHM
13*3e519524SHoward Hinnant
14*3e519524SHoward Hinnant/*
15*3e519524SHoward Hinnant    algorithm synopsis
16*3e519524SHoward Hinnant
17*3e519524SHoward Hinnant#include <initializer_list>
18*3e519524SHoward Hinnant
19*3e519524SHoward Hinnantnamespace std
20*3e519524SHoward Hinnant{
21*3e519524SHoward Hinnant
22*3e519524SHoward Hinnanttemplate <class InputIterator, class Predicate>
23*3e519524SHoward Hinnant    bool
24*3e519524SHoward Hinnant    all_of(InputIterator first, InputIterator last, Predicate pred);
25*3e519524SHoward Hinnant
26*3e519524SHoward Hinnanttemplate <class InputIterator, class Predicate>
27*3e519524SHoward Hinnant    bool
28*3e519524SHoward Hinnant    any_of(InputIterator first, InputIterator last, Predicate pred);
29*3e519524SHoward Hinnant
30*3e519524SHoward Hinnanttemplate <class InputIterator, class Predicate>
31*3e519524SHoward Hinnant    bool
32*3e519524SHoward Hinnant    none_of(InputIterator first, InputIterator last, Predicate pred);
33*3e519524SHoward Hinnant
34*3e519524SHoward Hinnanttemplate <class InputIterator, class Function>
35*3e519524SHoward Hinnant    Function
36*3e519524SHoward Hinnant    for_each(InputIterator first, InputIterator last, Function f);
37*3e519524SHoward Hinnant
38*3e519524SHoward Hinnanttemplate <class InputIterator, class T>
39*3e519524SHoward Hinnant    InputIterator
40*3e519524SHoward Hinnant    find(InputIterator first, InputIterator last, const T& value);
41*3e519524SHoward Hinnant
42*3e519524SHoward Hinnanttemplate <class InputIterator, class Predicate>
43*3e519524SHoward Hinnant    InputIterator
44*3e519524SHoward Hinnant    find_if(InputIterator first, InputIterator last, Predicate pred);
45*3e519524SHoward Hinnant
46*3e519524SHoward Hinnanttemplate<class InputIterator, class Predicate>
47*3e519524SHoward Hinnant    InputIterator
48*3e519524SHoward Hinnant    find_if_not(InputIterator first, InputIterator last, Predicate pred);
49*3e519524SHoward Hinnant
50*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2>
51*3e519524SHoward Hinnant    ForwardIterator1
52*3e519524SHoward Hinnant    find_end(ForwardIterator1 first1, ForwardIterator1 last1,
53*3e519524SHoward Hinnant             ForwardIterator2 first2, ForwardIterator2 last2);
54*3e519524SHoward Hinnant
55*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
56*3e519524SHoward Hinnant    ForwardIterator1
57*3e519524SHoward Hinnant    find_end(ForwardIterator1 first1, ForwardIterator1 last1,
58*3e519524SHoward Hinnant             ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
59*3e519524SHoward Hinnant
60*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2>
61*3e519524SHoward Hinnant    ForwardIterator1
62*3e519524SHoward Hinnant    find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
63*3e519524SHoward Hinnant                  ForwardIterator2 first2, ForwardIterator2 last2);
64*3e519524SHoward Hinnant
65*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
66*3e519524SHoward Hinnant    ForwardIterator1
67*3e519524SHoward Hinnant    find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
68*3e519524SHoward Hinnant                  ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
69*3e519524SHoward Hinnant
70*3e519524SHoward Hinnanttemplate <class ForwardIterator>
71*3e519524SHoward Hinnant    ForwardIterator
72*3e519524SHoward Hinnant    adjacent_find(ForwardIterator first, ForwardIterator last);
73*3e519524SHoward Hinnant
74*3e519524SHoward Hinnanttemplate <class ForwardIterator, class BinaryPredicate>
75*3e519524SHoward Hinnant    ForwardIterator
76*3e519524SHoward Hinnant    adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
77*3e519524SHoward Hinnant
78*3e519524SHoward Hinnanttemplate <class InputIterator, class T>
79*3e519524SHoward Hinnant    typename iterator_traits<InputIterator>::difference_type
80*3e519524SHoward Hinnant    count(InputIterator first, InputIterator last, const T& value);
81*3e519524SHoward Hinnant
82*3e519524SHoward Hinnanttemplate <class InputIterator, class Predicate>
83*3e519524SHoward Hinnant    typename iterator_traits<InputIterator>::difference_type
84*3e519524SHoward Hinnant    count_if(InputIterator first, InputIterator last, Predicate pred);
85*3e519524SHoward Hinnant
86*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2>
87*3e519524SHoward Hinnant    pair<InputIterator1, InputIterator2>
88*3e519524SHoward Hinnant    mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
89*3e519524SHoward Hinnant
90*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
91*3e519524SHoward Hinnant    pair<InputIterator1, InputIterator2>
92*3e519524SHoward Hinnant    mismatch(InputIterator1 first1, InputIterator1 last1,
93*3e519524SHoward Hinnant             InputIterator2 first2, BinaryPredicate pred);
94*3e519524SHoward Hinnant
95*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2>
96*3e519524SHoward Hinnant    bool
97*3e519524SHoward Hinnant    equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
98*3e519524SHoward Hinnant
99*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
100*3e519524SHoward Hinnant    bool
101*3e519524SHoward Hinnant    equal(InputIterator1 first1, InputIterator1 last1,
102*3e519524SHoward Hinnant          InputIterator2 first2, BinaryPredicate pred);
103*3e519524SHoward Hinnant
104*3e519524SHoward Hinnanttemplate<class ForwardIterator1, class ForwardIterator2>
105*3e519524SHoward Hinnant    bool
106*3e519524SHoward Hinnant    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
107*3e519524SHoward Hinnant                   ForwardIterator2 first2);
108*3e519524SHoward Hinnant
109*3e519524SHoward Hinnanttemplate<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
110*3e519524SHoward Hinnant    bool
111*3e519524SHoward Hinnant    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
112*3e519524SHoward Hinnant                   ForwardIterator2 first2, BinaryPredicate pred);
113*3e519524SHoward Hinnant
114*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2>
115*3e519524SHoward Hinnant    ForwardIterator1
116*3e519524SHoward Hinnant    search(ForwardIterator1 first1, ForwardIterator1 last1,
117*3e519524SHoward Hinnant           ForwardIterator2 first2, ForwardIterator2 last2);
118*3e519524SHoward Hinnant
119*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
120*3e519524SHoward Hinnant    ForwardIterator1
121*3e519524SHoward Hinnant    search(ForwardIterator1 first1, ForwardIterator1 last1,
122*3e519524SHoward Hinnant           ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
123*3e519524SHoward Hinnant
124*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Size, class T>
125*3e519524SHoward Hinnant    ForwardIterator
126*3e519524SHoward Hinnant    search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
127*3e519524SHoward Hinnant
128*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Size, class T, class BinaryPredicate>
129*3e519524SHoward Hinnant    ForwardIterator
130*3e519524SHoward Hinnant    search_n(ForwardIterator first, ForwardIterator last,
131*3e519524SHoward Hinnant             Size count, const T& value, BinaryPredicate pred);
132*3e519524SHoward Hinnant
133*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator>
134*3e519524SHoward Hinnant    OutputIterator
135*3e519524SHoward Hinnant    copy(InputIterator first, InputIterator last, OutputIterator result);
136*3e519524SHoward Hinnant
137*3e519524SHoward Hinnanttemplate<class InputIterator, class OutputIterator, class Predicate>
138*3e519524SHoward Hinnant    OutputIterator
139*3e519524SHoward Hinnant    copy_if(InputIterator first, InputIterator last,
140*3e519524SHoward Hinnant            OutputIterator result, Predicate pred);
141*3e519524SHoward Hinnant
142*3e519524SHoward Hinnanttemplate<class InputIterator, class Size, class OutputIterator>
143*3e519524SHoward Hinnant    OutputIterator
144*3e519524SHoward Hinnant    copy_n(InputIterator first, Size n, OutputIterator result);
145*3e519524SHoward Hinnant
146*3e519524SHoward Hinnanttemplate <class BidirectionalIterator1, class BidirectionalIterator2>
147*3e519524SHoward Hinnant    BidirectionalIterator2
148*3e519524SHoward Hinnant    copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
149*3e519524SHoward Hinnant                  BidirectionalIterator2 result);
150*3e519524SHoward Hinnant
151*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2>
152*3e519524SHoward Hinnant    ForwardIterator2
153*3e519524SHoward Hinnant    swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
154*3e519524SHoward Hinnant
155*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2>
156*3e519524SHoward Hinnant    void
157*3e519524SHoward Hinnant    iter_swap(ForwardIterator1 a, ForwardIterator2 b);
158*3e519524SHoward Hinnant
159*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class UnaryOperation>
160*3e519524SHoward Hinnant    OutputIterator
161*3e519524SHoward Hinnant    transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
162*3e519524SHoward Hinnant
163*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
164*3e519524SHoward Hinnant    OutputIterator
165*3e519524SHoward Hinnant    transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
166*3e519524SHoward Hinnant              OutputIterator result, BinaryOperation binary_op);
167*3e519524SHoward Hinnant
168*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
169*3e519524SHoward Hinnant    void
170*3e519524SHoward Hinnant    replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
171*3e519524SHoward Hinnant
172*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Predicate, class T>
173*3e519524SHoward Hinnant    void
174*3e519524SHoward Hinnant    replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
175*3e519524SHoward Hinnant
176*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class T>
177*3e519524SHoward Hinnant    OutputIterator
178*3e519524SHoward Hinnant    replace_copy(InputIterator first, InputIterator last, OutputIterator result,
179*3e519524SHoward Hinnant                 const T& old_value, const T& new_value);
180*3e519524SHoward Hinnant
181*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class Predicate, class T>
182*3e519524SHoward Hinnant    OutputIterator
183*3e519524SHoward Hinnant    replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
184*3e519524SHoward Hinnant
185*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
186*3e519524SHoward Hinnant    void
187*3e519524SHoward Hinnant    fill(ForwardIterator first, ForwardIterator last, const T& value);
188*3e519524SHoward Hinnant
189*3e519524SHoward Hinnanttemplate <class OutputIterator, class Size, class T>
190*3e519524SHoward Hinnant    OutputIterator
191*3e519524SHoward Hinnant    fill_n(OutputIterator first, Size n, const T& value);
192*3e519524SHoward Hinnant
193*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Generator>
194*3e519524SHoward Hinnant    void
195*3e519524SHoward Hinnant    generate(ForwardIterator first, ForwardIterator last, Generator gen);
196*3e519524SHoward Hinnant
197*3e519524SHoward Hinnanttemplate <class OutputIterator, class Size, class Generator>
198*3e519524SHoward Hinnant    OutputIterator
199*3e519524SHoward Hinnant    generate_n(OutputIterator first, Size n, Generator gen);
200*3e519524SHoward Hinnant
201*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
202*3e519524SHoward Hinnant    ForwardIterator
203*3e519524SHoward Hinnant    remove(ForwardIterator first, ForwardIterator last, const T& value);
204*3e519524SHoward Hinnant
205*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Predicate>
206*3e519524SHoward Hinnant    ForwardIterator
207*3e519524SHoward Hinnant    remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
208*3e519524SHoward Hinnant
209*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class T>
210*3e519524SHoward Hinnant    OutputIterator
211*3e519524SHoward Hinnant    remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
212*3e519524SHoward Hinnant
213*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class Predicate>
214*3e519524SHoward Hinnant    OutputIterator
215*3e519524SHoward Hinnant    remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);
216*3e519524SHoward Hinnant
217*3e519524SHoward Hinnanttemplate <class ForwardIterator>
218*3e519524SHoward Hinnant    ForwardIterator
219*3e519524SHoward Hinnant    unique(ForwardIterator first, ForwardIterator last);
220*3e519524SHoward Hinnant
221*3e519524SHoward Hinnanttemplate <class ForwardIterator, class BinaryPredicate>
222*3e519524SHoward Hinnant    ForwardIterator
223*3e519524SHoward Hinnant    unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
224*3e519524SHoward Hinnant
225*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator>
226*3e519524SHoward Hinnant    OutputIterator
227*3e519524SHoward Hinnant    unique_copy(InputIterator first, InputIterator last, OutputIterator result);
228*3e519524SHoward Hinnant
229*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class BinaryPredicate>
230*3e519524SHoward Hinnant    OutputIterator
231*3e519524SHoward Hinnant    unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
232*3e519524SHoward Hinnant
233*3e519524SHoward Hinnanttemplate <class BidirectionalIterator>
234*3e519524SHoward Hinnant    void
235*3e519524SHoward Hinnant    reverse(BidirectionalIterator first, BidirectionalIterator last);
236*3e519524SHoward Hinnant
237*3e519524SHoward Hinnanttemplate <class BidirectionalIterator, class OutputIterator>
238*3e519524SHoward Hinnant    OutputIterator
239*3e519524SHoward Hinnant    reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
240*3e519524SHoward Hinnant
241*3e519524SHoward Hinnanttemplate <class ForwardIterator>
242*3e519524SHoward Hinnant    ForwardIterator
243*3e519524SHoward Hinnant    rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
244*3e519524SHoward Hinnant
245*3e519524SHoward Hinnanttemplate <class ForwardIterator, class OutputIterator>
246*3e519524SHoward Hinnant    OutputIterator
247*3e519524SHoward Hinnant    rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
248*3e519524SHoward Hinnant
249*3e519524SHoward Hinnanttemplate <class RandomAccessIterator>
250*3e519524SHoward Hinnant    void
251*3e519524SHoward Hinnant    random_shuffle(RandomAccessIterator first, RandomAccessIterator last);
252*3e519524SHoward Hinnant
253*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class RandomNumberGenerator>
254*3e519524SHoward Hinnant    void
255*3e519524SHoward Hinnant    random_shuffle(RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator& rand);
256*3e519524SHoward Hinnant
257*3e519524SHoward Hinnanttemplate <class InputIterator, class Predicate>
258*3e519524SHoward Hinnant    bool
259*3e519524SHoward Hinnant    is_partitioned(InputIterator first, InputIterator last, Predicate pred);
260*3e519524SHoward Hinnant
261*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Predicate>
262*3e519524SHoward Hinnant    ForwardIterator
263*3e519524SHoward Hinnant    partition(ForwardIterator first, ForwardIterator last, Predicate pred);
264*3e519524SHoward Hinnant
265*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator1,
266*3e519524SHoward Hinnant          class OutputIterator2, class Predicate>
267*3e519524SHoward Hinnant    pair<OutputIterator1, OutputIterator2>
268*3e519524SHoward Hinnant    partition_copy(InputIterator first, InputIterator last,
269*3e519524SHoward Hinnant                   OutputIterator1 out_true, OutputIterator2 out_false,
270*3e519524SHoward Hinnant                   Predicate pred);
271*3e519524SHoward Hinnant
272*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Predicate>
273*3e519524SHoward Hinnant    ForwardIterator
274*3e519524SHoward Hinnant    stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);
275*3e519524SHoward Hinnant
276*3e519524SHoward Hinnanttemplate<class ForwardIterator, class Predicate>
277*3e519524SHoward Hinnant    ForwardIterator
278*3e519524SHoward Hinnant    partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
279*3e519524SHoward Hinnant
280*3e519524SHoward Hinnanttemplate <class ForwardIterator>
281*3e519524SHoward Hinnant    bool
282*3e519524SHoward Hinnant    is_sorted(ForwardIterator first, ForwardIterator last);
283*3e519524SHoward Hinnant
284*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Compare>
285*3e519524SHoward Hinnant    bool
286*3e519524SHoward Hinnant    is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);
287*3e519524SHoward Hinnant
288*3e519524SHoward Hinnanttemplate<class ForwardIterator>
289*3e519524SHoward Hinnant    ForwardIterator
290*3e519524SHoward Hinnant    is_sorted_until(ForwardIterator first, ForwardIterator last);
291*3e519524SHoward Hinnant
292*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Compare>
293*3e519524SHoward Hinnant    ForwardIterator
294*3e519524SHoward Hinnant    is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
295*3e519524SHoward Hinnant
296*3e519524SHoward Hinnanttemplate <class RandomAccessIterator>
297*3e519524SHoward Hinnant    void
298*3e519524SHoward Hinnant    sort(RandomAccessIterator first, RandomAccessIterator last);
299*3e519524SHoward Hinnant
300*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
301*3e519524SHoward Hinnant    void
302*3e519524SHoward Hinnant    sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
303*3e519524SHoward Hinnant
304*3e519524SHoward Hinnanttemplate <class RandomAccessIterator>
305*3e519524SHoward Hinnant    void
306*3e519524SHoward Hinnant    stable_sort(RandomAccessIterator first, RandomAccessIterator last);
307*3e519524SHoward Hinnant
308*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
309*3e519524SHoward Hinnant    void
310*3e519524SHoward Hinnant    stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
311*3e519524SHoward Hinnant
312*3e519524SHoward Hinnanttemplate <class RandomAccessIterator>
313*3e519524SHoward Hinnant    void
314*3e519524SHoward Hinnant    partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
315*3e519524SHoward Hinnant
316*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
317*3e519524SHoward Hinnant    void
318*3e519524SHoward Hinnant    partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
319*3e519524SHoward Hinnant
320*3e519524SHoward Hinnanttemplate <class InputIterator, class RandomAccessIterator>
321*3e519524SHoward Hinnant    RandomAccessIterator
322*3e519524SHoward Hinnant    partial_sort_copy(InputIterator first, InputIterator last,
323*3e519524SHoward Hinnant                      RandomAccessIterator result_first, RandomAccessIterator result_last);
324*3e519524SHoward Hinnant
325*3e519524SHoward Hinnanttemplate <class InputIterator, class RandomAccessIterator, class Compare>
326*3e519524SHoward Hinnant    RandomAccessIterator
327*3e519524SHoward Hinnant    partial_sort_copy(InputIterator first, InputIterator last,
328*3e519524SHoward Hinnant                      RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);
329*3e519524SHoward Hinnant
330*3e519524SHoward Hinnanttemplate <class RandomAccessIterator>
331*3e519524SHoward Hinnant    void
332*3e519524SHoward Hinnant    nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
333*3e519524SHoward Hinnant
334*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
335*3e519524SHoward Hinnant    void
336*3e519524SHoward Hinnant    nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
337*3e519524SHoward Hinnant
338*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
339*3e519524SHoward Hinnant    ForwardIterator
340*3e519524SHoward Hinnant    lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
341*3e519524SHoward Hinnant
342*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T, class Compare>
343*3e519524SHoward Hinnant    ForwardIterator
344*3e519524SHoward Hinnant    lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
345*3e519524SHoward Hinnant
346*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
347*3e519524SHoward Hinnant    ForwardIterator
348*3e519524SHoward Hinnant    upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
349*3e519524SHoward Hinnant
350*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T, class Compare>
351*3e519524SHoward Hinnant    ForwardIterator
352*3e519524SHoward Hinnant    upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
353*3e519524SHoward Hinnant
354*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
355*3e519524SHoward Hinnant    pair<ForwardIterator, ForwardIterator>
356*3e519524SHoward Hinnant    equal_range(ForwardIterator first, ForwardIterator last, const T& value);
357*3e519524SHoward Hinnant
358*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T, class Compare>
359*3e519524SHoward Hinnant    pair<ForwardIterator, ForwardIterator>
360*3e519524SHoward Hinnant    equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
361*3e519524SHoward Hinnant
362*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T>
363*3e519524SHoward Hinnant    bool
364*3e519524SHoward Hinnant    binary_search(ForwardIterator first, ForwardIterator last, const T& value);
365*3e519524SHoward Hinnant
366*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T, class Compare>
367*3e519524SHoward Hinnant    bool
368*3e519524SHoward Hinnant    binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
369*3e519524SHoward Hinnant
370*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator>
371*3e519524SHoward Hinnant    OutputIterator
372*3e519524SHoward Hinnant    merge(InputIterator1 first1, InputIterator1 last1,
373*3e519524SHoward Hinnant          InputIterator2 first2, InputIterator2 last2, OutputIterator result);
374*3e519524SHoward Hinnant
375*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
376*3e519524SHoward Hinnant    OutputIterator
377*3e519524SHoward Hinnant    merge(InputIterator1 first1, InputIterator1 last1,
378*3e519524SHoward Hinnant          InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
379*3e519524SHoward Hinnant
380*3e519524SHoward Hinnanttemplate <class BidirectionalIterator>
381*3e519524SHoward Hinnant    void
382*3e519524SHoward Hinnant    inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
383*3e519524SHoward Hinnant
384*3e519524SHoward Hinnanttemplate <class BidirectionalIterator, class Compare>
385*3e519524SHoward Hinnant    void
386*3e519524SHoward Hinnant    inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
387*3e519524SHoward Hinnant
388*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2>
389*3e519524SHoward Hinnant    bool
390*3e519524SHoward Hinnant    includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
391*3e519524SHoward Hinnant
392*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class Compare>
393*3e519524SHoward Hinnant    bool
394*3e519524SHoward Hinnant    includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
395*3e519524SHoward Hinnant
396*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator>
397*3e519524SHoward Hinnant    OutputIterator
398*3e519524SHoward Hinnant    set_union(InputIterator1 first1, InputIterator1 last1,
399*3e519524SHoward Hinnant              InputIterator2 first2, InputIterator2 last2, OutputIterator result);
400*3e519524SHoward Hinnant
401*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
402*3e519524SHoward Hinnant    OutputIterator
403*3e519524SHoward Hinnant    set_union(InputIterator1 first1, InputIterator1 last1,
404*3e519524SHoward Hinnant              InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
405*3e519524SHoward Hinnant
406*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator>
407*3e519524SHoward Hinnant    OutputIterator
408*3e519524SHoward Hinnant    set_intersection(InputIterator1 first1, InputIterator1 last1,
409*3e519524SHoward Hinnant                     InputIterator2 first2, InputIterator2 last2, OutputIterator result);
410*3e519524SHoward Hinnant
411*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
412*3e519524SHoward Hinnant    OutputIterator
413*3e519524SHoward Hinnant    set_intersection(InputIterator1 first1, InputIterator1 last1,
414*3e519524SHoward Hinnant                     InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
415*3e519524SHoward Hinnant
416*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator>
417*3e519524SHoward Hinnant    OutputIterator
418*3e519524SHoward Hinnant    set_difference(InputIterator1 first1, InputIterator1 last1,
419*3e519524SHoward Hinnant                   InputIterator2 first2, InputIterator2 last2, OutputIterator result);
420*3e519524SHoward Hinnant
421*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
422*3e519524SHoward Hinnant    OutputIterator
423*3e519524SHoward Hinnant    set_difference(InputIterator1 first1, InputIterator1 last1,
424*3e519524SHoward Hinnant                   InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
425*3e519524SHoward Hinnant
426*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator>
427*3e519524SHoward Hinnant    OutputIterator
428*3e519524SHoward Hinnant    set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
429*3e519524SHoward Hinnant                             InputIterator2 first2, InputIterator2 last2, OutputIterator result);
430*3e519524SHoward Hinnant
431*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
432*3e519524SHoward Hinnant    OutputIterator
433*3e519524SHoward Hinnant    set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
434*3e519524SHoward Hinnant                             InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
435*3e519524SHoward Hinnant
436*3e519524SHoward Hinnanttemplate <class RandomAccessIterator>
437*3e519524SHoward Hinnant    void
438*3e519524SHoward Hinnant    push_heap(RandomAccessIterator first, RandomAccessIterator last);
439*3e519524SHoward Hinnant
440*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
441*3e519524SHoward Hinnant    void
442*3e519524SHoward Hinnant    push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
443*3e519524SHoward Hinnant
444*3e519524SHoward Hinnanttemplate <class RandomAccessIterator>
445*3e519524SHoward Hinnant    void
446*3e519524SHoward Hinnant    pop_heap(RandomAccessIterator first, RandomAccessIterator last);
447*3e519524SHoward Hinnant
448*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
449*3e519524SHoward Hinnant    void
450*3e519524SHoward Hinnant    pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
451*3e519524SHoward Hinnant
452*3e519524SHoward Hinnanttemplate <class RandomAccessIterator>
453*3e519524SHoward Hinnant    void
454*3e519524SHoward Hinnant    make_heap(RandomAccessIterator first, RandomAccessIterator last);
455*3e519524SHoward Hinnant
456*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
457*3e519524SHoward Hinnant    void
458*3e519524SHoward Hinnant    make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
459*3e519524SHoward Hinnant
460*3e519524SHoward Hinnanttemplate <class RandomAccessIterator>
461*3e519524SHoward Hinnant    void
462*3e519524SHoward Hinnant    sort_heap(RandomAccessIterator first, RandomAccessIterator last);
463*3e519524SHoward Hinnant
464*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
465*3e519524SHoward Hinnant    void
466*3e519524SHoward Hinnant    sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
467*3e519524SHoward Hinnant
468*3e519524SHoward Hinnanttemplate <class RandomAccessIterator>
469*3e519524SHoward Hinnant    bool
470*3e519524SHoward Hinnant    is_heap(RandomAccessIterator first, RandomAccessiterator last);
471*3e519524SHoward Hinnant
472*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
473*3e519524SHoward Hinnant    bool
474*3e519524SHoward Hinnant    is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
475*3e519524SHoward Hinnant
476*3e519524SHoward Hinnanttemplate <class RandomAccessIterator>
477*3e519524SHoward Hinnant    RandomAccessIterator
478*3e519524SHoward Hinnant    is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
479*3e519524SHoward Hinnant
480*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare>
481*3e519524SHoward Hinnant    RandomAccessIterator
482*3e519524SHoward Hinnant    is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
483*3e519524SHoward Hinnant
484*3e519524SHoward Hinnanttemplate <class T>
485*3e519524SHoward Hinnant    const T&
486*3e519524SHoward Hinnant    min(const T& a, const T& b);
487*3e519524SHoward Hinnant
488*3e519524SHoward Hinnanttemplate <class T, class Compare>
489*3e519524SHoward Hinnant    const T&
490*3e519524SHoward Hinnant    min(const T& a, const T& b, Compare comp);
491*3e519524SHoward Hinnant
492*3e519524SHoward Hinnanttemplate <class T>
493*3e519524SHoward Hinnant    const T&
494*3e519524SHoward Hinnant    max(const T& a, const T& b);
495*3e519524SHoward Hinnant
496*3e519524SHoward Hinnanttemplate <class T, class Compare>
497*3e519524SHoward Hinnant    const T&
498*3e519524SHoward Hinnant    max(const T& a, const T& b, Compare comp);
499*3e519524SHoward Hinnant
500*3e519524SHoward Hinnanttemplate <class ForwardIterator>
501*3e519524SHoward Hinnant    ForwardIterator
502*3e519524SHoward Hinnant    min_element(ForwardIterator first, ForwardIterator last);
503*3e519524SHoward Hinnant
504*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Compare>
505*3e519524SHoward Hinnant    ForwardIterator
506*3e519524SHoward Hinnant    min_element(ForwardIterator first, ForwardIterator last, Compare comp);
507*3e519524SHoward Hinnant
508*3e519524SHoward Hinnanttemplate <class ForwardIterator>
509*3e519524SHoward Hinnant    ForwardIterator
510*3e519524SHoward Hinnant    max_element(ForwardIterator first, ForwardIterator last);
511*3e519524SHoward Hinnant
512*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Compare>
513*3e519524SHoward Hinnant    ForwardIterator
514*3e519524SHoward Hinnant    max_element(ForwardIterator first, ForwardIterator last, Compare comp);
515*3e519524SHoward Hinnant
516*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2>
517*3e519524SHoward Hinnant    bool
518*3e519524SHoward Hinnant    lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
519*3e519524SHoward Hinnant
520*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class Compare>
521*3e519524SHoward Hinnant    bool
522*3e519524SHoward Hinnant    lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
523*3e519524SHoward Hinnant                            InputIterator2 first2, InputIterator2 last2, Compare comp);
524*3e519524SHoward Hinnant
525*3e519524SHoward Hinnanttemplate <class BidirectionalIterator>
526*3e519524SHoward Hinnant    bool
527*3e519524SHoward Hinnant    next_permutation(BidirectionalIterator first, BidirectionalIterator last);
528*3e519524SHoward Hinnant
529*3e519524SHoward Hinnanttemplate <class BidirectionalIterator, class Compare>
530*3e519524SHoward Hinnant    bool
531*3e519524SHoward Hinnant    next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
532*3e519524SHoward Hinnant
533*3e519524SHoward Hinnanttemplate <class BidirectionalIterator>
534*3e519524SHoward Hinnant    bool
535*3e519524SHoward Hinnant    prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
536*3e519524SHoward Hinnant
537*3e519524SHoward Hinnanttemplate <class BidirectionalIterator, class Compare>
538*3e519524SHoward Hinnant    bool
539*3e519524SHoward Hinnant    prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
540*3e519524SHoward Hinnant
541*3e519524SHoward Hinnant}  // std
542*3e519524SHoward Hinnant
543*3e519524SHoward Hinnant*/
544*3e519524SHoward Hinnant
545*3e519524SHoward Hinnant#include <__config>
546*3e519524SHoward Hinnant#include <initializer_list>
547*3e519524SHoward Hinnant#include <type_traits>
548*3e519524SHoward Hinnant#include <cstring>
549*3e519524SHoward Hinnant#include <utility>
550*3e519524SHoward Hinnant#include <memory>
551*3e519524SHoward Hinnant#include <iterator>
552*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
553*3e519524SHoward Hinnant#include <cassert>
554*3e519524SHoward Hinnant#endif
555*3e519524SHoward Hinnant//#include <cstdlib>
556*3e519524SHoward Hinnant#define RAND_MAX 0x7fffffff     // #include <cstdlib>
557*3e519524SHoward Hinnantextern "C" int rand(void);      // #include <cstdlib>
558*3e519524SHoward Hinnant
559*3e519524SHoward Hinnant#pragma GCC system_header
560*3e519524SHoward Hinnant
561*3e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
562*3e519524SHoward Hinnant
563*3e519524SHoward Hinnantusing ::rand;                   // #include <cstdlib>
564*3e519524SHoward Hinnant
565*3e519524SHoward Hinnanttemplate <class _T1, class _T2 = _T1>
566*3e519524SHoward Hinnantstruct __equal_to
567*3e519524SHoward Hinnant{
568*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
569*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;}
570*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;}
571*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;}
572*3e519524SHoward Hinnant};
573*3e519524SHoward Hinnant
574*3e519524SHoward Hinnanttemplate <class _T1>
575*3e519524SHoward Hinnantstruct __equal_to<_T1, _T1>
576*3e519524SHoward Hinnant{
577*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
578*3e519524SHoward Hinnant};
579*3e519524SHoward Hinnant
580*3e519524SHoward Hinnanttemplate <class _T1>
581*3e519524SHoward Hinnantstruct __equal_to<const _T1, _T1>
582*3e519524SHoward Hinnant{
583*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
584*3e519524SHoward Hinnant};
585*3e519524SHoward Hinnant
586*3e519524SHoward Hinnanttemplate <class _T1>
587*3e519524SHoward Hinnantstruct __equal_to<_T1, const _T1>
588*3e519524SHoward Hinnant{
589*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
590*3e519524SHoward Hinnant};
591*3e519524SHoward Hinnant
592*3e519524SHoward Hinnanttemplate <class _T1, class _T2 = _T1>
593*3e519524SHoward Hinnantstruct __less
594*3e519524SHoward Hinnant{
595*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
596*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
597*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
598*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
599*3e519524SHoward Hinnant};
600*3e519524SHoward Hinnant
601*3e519524SHoward Hinnanttemplate <class _T1>
602*3e519524SHoward Hinnantstruct __less<_T1, _T1>
603*3e519524SHoward Hinnant{
604*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
605*3e519524SHoward Hinnant};
606*3e519524SHoward Hinnant
607*3e519524SHoward Hinnanttemplate <class _T1>
608*3e519524SHoward Hinnantstruct __less<const _T1, _T1>
609*3e519524SHoward Hinnant{
610*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
611*3e519524SHoward Hinnant};
612*3e519524SHoward Hinnant
613*3e519524SHoward Hinnanttemplate <class _T1>
614*3e519524SHoward Hinnantstruct __less<_T1, const _T1>
615*3e519524SHoward Hinnant{
616*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
617*3e519524SHoward Hinnant};
618*3e519524SHoward Hinnant
619*3e519524SHoward Hinnanttemplate <class _Predicate>
620*3e519524SHoward Hinnantclass __negate
621*3e519524SHoward Hinnant{
622*3e519524SHoward Hinnantprivate:
623*3e519524SHoward Hinnant    _Predicate __p_;
624*3e519524SHoward Hinnantpublic:
625*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY __negate() {}
626*3e519524SHoward Hinnant
627*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
628*3e519524SHoward Hinnant    explicit __negate(_Predicate __p) : __p_(__p) {}
629*3e519524SHoward Hinnant
630*3e519524SHoward Hinnant    template <class _T1>
631*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
632*3e519524SHoward Hinnant    bool operator()(const _T1& __x) {return !__p_(__x);}
633*3e519524SHoward Hinnant
634*3e519524SHoward Hinnant    template <class _T1, class _T2>
635*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
636*3e519524SHoward Hinnant    bool operator()(const _T1& __x, const _T2& __y) {return !__p_(__x, __y);}
637*3e519524SHoward Hinnant};
638*3e519524SHoward Hinnant
639*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
640*3e519524SHoward Hinnant
641*3e519524SHoward Hinnanttemplate <class _Compare>
642*3e519524SHoward Hinnantstruct __debug_less
643*3e519524SHoward Hinnant{
644*3e519524SHoward Hinnant    _Compare __comp_;
645*3e519524SHoward Hinnant    __debug_less(_Compare& __c) : __comp_(__c) {}
646*3e519524SHoward Hinnant    template <class _Tp, class _Up>
647*3e519524SHoward Hinnant    bool operator()(const _Tp& __x, const _Up& __y)
648*3e519524SHoward Hinnant    {
649*3e519524SHoward Hinnant        bool __r = __comp_(__x, __y);
650*3e519524SHoward Hinnant        if (__r)
651*3e519524SHoward Hinnant            assert(!__comp_(__y, __x));
652*3e519524SHoward Hinnant        return __r;
653*3e519524SHoward Hinnant    }
654*3e519524SHoward Hinnant};
655*3e519524SHoward Hinnant
656*3e519524SHoward Hinnant#endif  // _LIBCPP_DEBUG
657*3e519524SHoward Hinnant
658*3e519524SHoward Hinnant// all_of
659*3e519524SHoward Hinnant
660*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Predicate>
661*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
662*3e519524SHoward Hinnantbool
663*3e519524SHoward Hinnantall_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
664*3e519524SHoward Hinnant{
665*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
666*3e519524SHoward Hinnant        if (!__pred(*__first))
667*3e519524SHoward Hinnant            return false;
668*3e519524SHoward Hinnant    return true;
669*3e519524SHoward Hinnant}
670*3e519524SHoward Hinnant
671*3e519524SHoward Hinnant// any_of
672*3e519524SHoward Hinnant
673*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Predicate>
674*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
675*3e519524SHoward Hinnantbool
676*3e519524SHoward Hinnantany_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
677*3e519524SHoward Hinnant{
678*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
679*3e519524SHoward Hinnant        if (__pred(*__first))
680*3e519524SHoward Hinnant            return true;
681*3e519524SHoward Hinnant    return false;
682*3e519524SHoward Hinnant}
683*3e519524SHoward Hinnant
684*3e519524SHoward Hinnant// none_of
685*3e519524SHoward Hinnant
686*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Predicate>
687*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
688*3e519524SHoward Hinnantbool
689*3e519524SHoward Hinnantnone_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
690*3e519524SHoward Hinnant{
691*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
692*3e519524SHoward Hinnant        if (__pred(*__first))
693*3e519524SHoward Hinnant            return false;
694*3e519524SHoward Hinnant    return true;
695*3e519524SHoward Hinnant}
696*3e519524SHoward Hinnant
697*3e519524SHoward Hinnant// for_each
698*3e519524SHoward Hinnant
699*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Function>
700*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
701*3e519524SHoward Hinnant_Function
702*3e519524SHoward Hinnantfor_each(_InputIterator __first, _InputIterator __last, _Function __f)
703*3e519524SHoward Hinnant{
704*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
705*3e519524SHoward Hinnant        __f(*__first);
706*3e519524SHoward Hinnant    return _STD::move(__f);
707*3e519524SHoward Hinnant}
708*3e519524SHoward Hinnant
709*3e519524SHoward Hinnant// find
710*3e519524SHoward Hinnant
711*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Tp>
712*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
713*3e519524SHoward Hinnant_InputIterator
714*3e519524SHoward Hinnantfind(_InputIterator __first, _InputIterator __last, const _Tp& __value)
715*3e519524SHoward Hinnant{
716*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
717*3e519524SHoward Hinnant        if (*__first == __value)
718*3e519524SHoward Hinnant            break;
719*3e519524SHoward Hinnant    return __first;
720*3e519524SHoward Hinnant}
721*3e519524SHoward Hinnant
722*3e519524SHoward Hinnant// find_if
723*3e519524SHoward Hinnant
724*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Predicate>
725*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
726*3e519524SHoward Hinnant_InputIterator
727*3e519524SHoward Hinnantfind_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
728*3e519524SHoward Hinnant{
729*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
730*3e519524SHoward Hinnant        if (__pred(*__first))
731*3e519524SHoward Hinnant            break;
732*3e519524SHoward Hinnant    return __first;
733*3e519524SHoward Hinnant}
734*3e519524SHoward Hinnant
735*3e519524SHoward Hinnant// find_if_not
736*3e519524SHoward Hinnant
737*3e519524SHoward Hinnanttemplate<class _InputIterator, class _Predicate>
738*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
739*3e519524SHoward Hinnant_InputIterator
740*3e519524SHoward Hinnantfind_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
741*3e519524SHoward Hinnant{
742*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
743*3e519524SHoward Hinnant        if (!__pred(*__first))
744*3e519524SHoward Hinnant            break;
745*3e519524SHoward Hinnant    return __first;
746*3e519524SHoward Hinnant}
747*3e519524SHoward Hinnant
748*3e519524SHoward Hinnant// find_end
749*3e519524SHoward Hinnant
750*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
751*3e519524SHoward Hinnant_ForwardIterator1
752*3e519524SHoward Hinnant__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
753*3e519524SHoward Hinnant           _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
754*3e519524SHoward Hinnant           forward_iterator_tag, forward_iterator_tag)
755*3e519524SHoward Hinnant{
756*3e519524SHoward Hinnant    // modeled after search algorithm
757*3e519524SHoward Hinnant    _ForwardIterator1 __r = __last1;  // __last1 is the "default" answer
758*3e519524SHoward Hinnant    if (__first2 == __last2)
759*3e519524SHoward Hinnant        return __r;
760*3e519524SHoward Hinnant    while (true)
761*3e519524SHoward Hinnant    {
762*3e519524SHoward Hinnant        while (true)
763*3e519524SHoward Hinnant        {
764*3e519524SHoward Hinnant            if (__first1 == __last1)         // if source exhausted return last correct answer
765*3e519524SHoward Hinnant                return __r;                  //    (or __last1 if never found)
766*3e519524SHoward Hinnant            if (__pred(*__first1, *__first2))
767*3e519524SHoward Hinnant                break;
768*3e519524SHoward Hinnant            ++__first1;
769*3e519524SHoward Hinnant        }
770*3e519524SHoward Hinnant        // *__first1 matches *__first2, now match elements after here
771*3e519524SHoward Hinnant        _ForwardIterator1 __m1 = __first1;
772*3e519524SHoward Hinnant        _ForwardIterator2 __m2 = __first2;
773*3e519524SHoward Hinnant        while (true)
774*3e519524SHoward Hinnant        {
775*3e519524SHoward Hinnant            if (++__m2 == __last2)
776*3e519524SHoward Hinnant            {                         // Pattern exhaused, record answer and search for another one
777*3e519524SHoward Hinnant                __r = __first1;
778*3e519524SHoward Hinnant                ++__first1;
779*3e519524SHoward Hinnant                break;
780*3e519524SHoward Hinnant            }
781*3e519524SHoward Hinnant            if (++__m1 == __last1)     // Source exhausted, return last answer
782*3e519524SHoward Hinnant                return __r;
783*3e519524SHoward Hinnant            if (!__pred(*__m1, *__m2))  // mismatch, restart with a new __first
784*3e519524SHoward Hinnant            {
785*3e519524SHoward Hinnant                ++__first1;
786*3e519524SHoward Hinnant                break;
787*3e519524SHoward Hinnant            }  // else there is a match, check next elements
788*3e519524SHoward Hinnant        }
789*3e519524SHoward Hinnant    }
790*3e519524SHoward Hinnant}
791*3e519524SHoward Hinnant
792*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2>
793*3e519524SHoward Hinnant_BidirectionalIterator1
794*3e519524SHoward Hinnant__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1,
795*3e519524SHoward Hinnant           _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred,
796*3e519524SHoward Hinnant           bidirectional_iterator_tag, bidirectional_iterator_tag)
797*3e519524SHoward Hinnant{
798*3e519524SHoward Hinnant    // modeled after search algorithm (in reverse)
799*3e519524SHoward Hinnant    if (__first2 == __last2)
800*3e519524SHoward Hinnant        return __last1;  // Everything matches an empty sequence
801*3e519524SHoward Hinnant    _BidirectionalIterator1 __l1 = __last1;
802*3e519524SHoward Hinnant    _BidirectionalIterator2 __l2 = __last2;
803*3e519524SHoward Hinnant    --__l2;
804*3e519524SHoward Hinnant    while (true)
805*3e519524SHoward Hinnant    {
806*3e519524SHoward Hinnant        // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks
807*3e519524SHoward Hinnant        while (true)
808*3e519524SHoward Hinnant        {
809*3e519524SHoward Hinnant            if (__first1 == __l1)  // return __last1 if no element matches *__first2
810*3e519524SHoward Hinnant                return __last1;
811*3e519524SHoward Hinnant            if (__pred(*--__l1, *__l2))
812*3e519524SHoward Hinnant                break;
813*3e519524SHoward Hinnant        }
814*3e519524SHoward Hinnant        // *__l1 matches *__l2, now match elements before here
815*3e519524SHoward Hinnant        _BidirectionalIterator1 __m1 = __l1;
816*3e519524SHoward Hinnant        _BidirectionalIterator2 __m2 = __l2;
817*3e519524SHoward Hinnant        while (true)
818*3e519524SHoward Hinnant        {
819*3e519524SHoward Hinnant            if (__m2 == __first2)  // If pattern exhausted, __m1 is the answer (works for 1 element pattern)
820*3e519524SHoward Hinnant                return __m1;
821*3e519524SHoward Hinnant            if (__m1 == __first1)  // Otherwise if source exhaused, pattern not found
822*3e519524SHoward Hinnant                return __last1;
823*3e519524SHoward Hinnant            if (!__pred(*--__m1, *--__m2))  // if there is a mismatch, restart with a new __l1
824*3e519524SHoward Hinnant            {
825*3e519524SHoward Hinnant                break;
826*3e519524SHoward Hinnant            }  // else there is a match, check next elements
827*3e519524SHoward Hinnant        }
828*3e519524SHoward Hinnant    }
829*3e519524SHoward Hinnant}
830*3e519524SHoward Hinnant
831*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
832*3e519524SHoward Hinnant_RandomAccessIterator1
833*3e519524SHoward Hinnant__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
834*3e519524SHoward Hinnant           _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
835*3e519524SHoward Hinnant           random_access_iterator_tag, random_access_iterator_tag)
836*3e519524SHoward Hinnant{
837*3e519524SHoward Hinnant    // Take advantage of knowing source and pattern lengths.  Stop short when source is smaller than pattern
838*3e519524SHoward Hinnant    typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2;
839*3e519524SHoward Hinnant    if (__len2 == 0)
840*3e519524SHoward Hinnant        return __last1;
841*3e519524SHoward Hinnant    typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1;
842*3e519524SHoward Hinnant    if (__len1 < __len2)
843*3e519524SHoward Hinnant        return __last1;
844*3e519524SHoward Hinnant    const _RandomAccessIterator1 __s = __first1 + (__len2 - 1);  // End of pattern match can't go before here
845*3e519524SHoward Hinnant    _RandomAccessIterator1 __l1 = __last1;
846*3e519524SHoward Hinnant    _RandomAccessIterator2 __l2 = __last2;
847*3e519524SHoward Hinnant    --__l2;
848*3e519524SHoward Hinnant    while (true)
849*3e519524SHoward Hinnant    {
850*3e519524SHoward Hinnant        while (true)
851*3e519524SHoward Hinnant        {
852*3e519524SHoward Hinnant            if (__s == __l1)
853*3e519524SHoward Hinnant                return __last1;
854*3e519524SHoward Hinnant            if (__pred(*--__l1, *__l2))
855*3e519524SHoward Hinnant                break;
856*3e519524SHoward Hinnant        }
857*3e519524SHoward Hinnant        _RandomAccessIterator1 __m1 = __l1;
858*3e519524SHoward Hinnant        _RandomAccessIterator2 __m2 = __l2;
859*3e519524SHoward Hinnant        while (true)
860*3e519524SHoward Hinnant        {
861*3e519524SHoward Hinnant            if (__m2 == __first2)
862*3e519524SHoward Hinnant                return __m1;
863*3e519524SHoward Hinnant                                 // no need to check range on __m1 because __s guarantees we have enough source
864*3e519524SHoward Hinnant            if (!__pred(*--__m1, *--__m2))
865*3e519524SHoward Hinnant            {
866*3e519524SHoward Hinnant                break;
867*3e519524SHoward Hinnant            }
868*3e519524SHoward Hinnant        }
869*3e519524SHoward Hinnant    }
870*3e519524SHoward Hinnant}
871*3e519524SHoward Hinnant
872*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
873*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
874*3e519524SHoward Hinnant_ForwardIterator1
875*3e519524SHoward Hinnantfind_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
876*3e519524SHoward Hinnant         _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
877*3e519524SHoward Hinnant{
878*3e519524SHoward Hinnant    return _STD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type>
879*3e519524SHoward Hinnant                         (__first1, __last1, __first2, __last2, __pred,
880*3e519524SHoward Hinnant                          typename iterator_traits<_ForwardIterator1>::iterator_category(),
881*3e519524SHoward Hinnant                          typename iterator_traits<_ForwardIterator2>::iterator_category());
882*3e519524SHoward Hinnant}
883*3e519524SHoward Hinnant
884*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2>
885*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
886*3e519524SHoward Hinnant_ForwardIterator1
887*3e519524SHoward Hinnantfind_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
888*3e519524SHoward Hinnant         _ForwardIterator2 __first2, _ForwardIterator2 __last2)
889*3e519524SHoward Hinnant{
890*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
891*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
892*3e519524SHoward Hinnant    return _STD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
893*3e519524SHoward Hinnant}
894*3e519524SHoward Hinnant
895*3e519524SHoward Hinnant// find_first_of
896*3e519524SHoward Hinnant
897*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
898*3e519524SHoward Hinnant_ForwardIterator1
899*3e519524SHoward Hinnantfind_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
900*3e519524SHoward Hinnant              _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
901*3e519524SHoward Hinnant{
902*3e519524SHoward Hinnant    for (; __first1 != __last1; ++__first1)
903*3e519524SHoward Hinnant        for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
904*3e519524SHoward Hinnant            if (__pred(*__first1, *__j))
905*3e519524SHoward Hinnant                return __first1;
906*3e519524SHoward Hinnant    return __last1;
907*3e519524SHoward Hinnant}
908*3e519524SHoward Hinnant
909*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2>
910*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
911*3e519524SHoward Hinnant_ForwardIterator1
912*3e519524SHoward Hinnantfind_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
913*3e519524SHoward Hinnant              _ForwardIterator2 __first2, _ForwardIterator2 __last2)
914*3e519524SHoward Hinnant{
915*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
916*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
917*3e519524SHoward Hinnant    return _STD::find_first_of(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
918*3e519524SHoward Hinnant}
919*3e519524SHoward Hinnant
920*3e519524SHoward Hinnant// adjacent_find
921*3e519524SHoward Hinnant
922*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _BinaryPredicate>
923*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
924*3e519524SHoward Hinnant_ForwardIterator
925*3e519524SHoward Hinnantadjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
926*3e519524SHoward Hinnant{
927*3e519524SHoward Hinnant    if (__first != __last)
928*3e519524SHoward Hinnant    {
929*3e519524SHoward Hinnant        _ForwardIterator __i = __first;
930*3e519524SHoward Hinnant        while (++__i != __last)
931*3e519524SHoward Hinnant        {
932*3e519524SHoward Hinnant            if (__pred(*__first, *__i))
933*3e519524SHoward Hinnant                return __first;
934*3e519524SHoward Hinnant            __first = __i;
935*3e519524SHoward Hinnant        }
936*3e519524SHoward Hinnant    }
937*3e519524SHoward Hinnant    return __last;
938*3e519524SHoward Hinnant}
939*3e519524SHoward Hinnant
940*3e519524SHoward Hinnanttemplate <class _ForwardIterator>
941*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
942*3e519524SHoward Hinnant_ForwardIterator
943*3e519524SHoward Hinnantadjacent_find(_ForwardIterator __first, _ForwardIterator __last)
944*3e519524SHoward Hinnant{
945*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::value_type __v;
946*3e519524SHoward Hinnant    return _STD::adjacent_find(__first, __last, __equal_to<__v>());
947*3e519524SHoward Hinnant}
948*3e519524SHoward Hinnant
949*3e519524SHoward Hinnant// count
950*3e519524SHoward Hinnant
951*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Tp>
952*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
953*3e519524SHoward Hinnanttypename iterator_traits<_InputIterator>::difference_type
954*3e519524SHoward Hinnantcount(_InputIterator __first, _InputIterator __last, const _Tp& __value)
955*3e519524SHoward Hinnant{
956*3e519524SHoward Hinnant    typename iterator_traits<_InputIterator>::difference_type __r(0);
957*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
958*3e519524SHoward Hinnant        if (*__first == __value)
959*3e519524SHoward Hinnant            ++__r;
960*3e519524SHoward Hinnant    return __r;
961*3e519524SHoward Hinnant}
962*3e519524SHoward Hinnant
963*3e519524SHoward Hinnant// count_if
964*3e519524SHoward Hinnant
965*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Predicate>
966*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
967*3e519524SHoward Hinnanttypename iterator_traits<_InputIterator>::difference_type
968*3e519524SHoward Hinnantcount_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
969*3e519524SHoward Hinnant{
970*3e519524SHoward Hinnant    typename iterator_traits<_InputIterator>::difference_type __r(0);
971*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
972*3e519524SHoward Hinnant        if (__pred(*__first))
973*3e519524SHoward Hinnant            ++__r;
974*3e519524SHoward Hinnant    return __r;
975*3e519524SHoward Hinnant}
976*3e519524SHoward Hinnant
977*3e519524SHoward Hinnant// mismatch
978*3e519524SHoward Hinnant
979*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
980*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
981*3e519524SHoward Hinnantpair<_InputIterator1, _InputIterator2>
982*3e519524SHoward Hinnantmismatch(_InputIterator1 __first1, _InputIterator1 __last1,
983*3e519524SHoward Hinnant         _InputIterator2 __first2, _BinaryPredicate __pred)
984*3e519524SHoward Hinnant{
985*3e519524SHoward Hinnant    for (; __first1 != __last1; ++__first1, ++__first2)
986*3e519524SHoward Hinnant        if (!__pred(*__first1, *__first2))
987*3e519524SHoward Hinnant            break;
988*3e519524SHoward Hinnant    return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
989*3e519524SHoward Hinnant}
990*3e519524SHoward Hinnant
991*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2>
992*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
993*3e519524SHoward Hinnantpair<_InputIterator1, _InputIterator2>
994*3e519524SHoward Hinnantmismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
995*3e519524SHoward Hinnant{
996*3e519524SHoward Hinnant    typedef typename iterator_traits<_InputIterator1>::value_type __v1;
997*3e519524SHoward Hinnant    typedef typename iterator_traits<_InputIterator2>::value_type __v2;
998*3e519524SHoward Hinnant    return _STD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
999*3e519524SHoward Hinnant}
1000*3e519524SHoward Hinnant
1001*3e519524SHoward Hinnant// equal
1002*3e519524SHoward Hinnant
1003*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1004*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1005*3e519524SHoward Hinnantbool
1006*3e519524SHoward Hinnantequal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
1007*3e519524SHoward Hinnant{
1008*3e519524SHoward Hinnant    for (; __first1 != __last1; ++__first1, ++__first2)
1009*3e519524SHoward Hinnant        if (!__pred(*__first1, *__first2))
1010*3e519524SHoward Hinnant            return false;
1011*3e519524SHoward Hinnant    return true;
1012*3e519524SHoward Hinnant}
1013*3e519524SHoward Hinnant
1014*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2>
1015*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1016*3e519524SHoward Hinnantbool
1017*3e519524SHoward Hinnantequal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1018*3e519524SHoward Hinnant{
1019*3e519524SHoward Hinnant    typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1020*3e519524SHoward Hinnant    typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1021*3e519524SHoward Hinnant    return _STD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
1022*3e519524SHoward Hinnant}
1023*3e519524SHoward Hinnant
1024*3e519524SHoward Hinnant// is_permutation
1025*3e519524SHoward Hinnant
1026*3e519524SHoward Hinnanttemplate<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1027*3e519524SHoward Hinnantbool
1028*3e519524SHoward Hinnantis_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1029*3e519524SHoward Hinnant               _ForwardIterator2 __first2, _BinaryPredicate __pred)
1030*3e519524SHoward Hinnant{
1031*3e519524SHoward Hinnant    // shorten sequences as much as possible by lopping of any equal parts
1032*3e519524SHoward Hinnant    for (; __first1 != __last1; ++__first1, ++__first2)
1033*3e519524SHoward Hinnant        if (!__pred(*__first1, *__first2))
1034*3e519524SHoward Hinnant            goto __not_done;
1035*3e519524SHoward Hinnant    return true;
1036*3e519524SHoward Hinnant__not_done:
1037*3e519524SHoward Hinnant    // __first1 != __last1 && *__first1 != *__first2
1038*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
1039*3e519524SHoward Hinnant    _D1 __l1 = _STD::distance(__first1, __last1);
1040*3e519524SHoward Hinnant    if (__l1 == _D1(1))
1041*3e519524SHoward Hinnant        return false;
1042*3e519524SHoward Hinnant    _ForwardIterator2 __last2 = _STD::next(__first2, __l1);
1043*3e519524SHoward Hinnant    // For each element in [f1, l1) see if there are the same number of
1044*3e519524SHoward Hinnant    //    equal elements in [f2, l2)
1045*3e519524SHoward Hinnant    for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1046*3e519524SHoward Hinnant    {
1047*3e519524SHoward Hinnant        // Have we already counted the number of *__i in [f1, l1)?
1048*3e519524SHoward Hinnant        for (_ForwardIterator1 __j = __first1; __j != __i; ++__j)
1049*3e519524SHoward Hinnant            if (__pred(*__j, *__i))
1050*3e519524SHoward Hinnant                goto __next_iter;
1051*3e519524SHoward Hinnant        {
1052*3e519524SHoward Hinnant            // Count number of *__i in [f2, l2)
1053*3e519524SHoward Hinnant            _D1 __c2 = 0;
1054*3e519524SHoward Hinnant            for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1055*3e519524SHoward Hinnant                if (__pred(*__i, *__j))
1056*3e519524SHoward Hinnant                    ++__c2;
1057*3e519524SHoward Hinnant            if (__c2 == 0)
1058*3e519524SHoward Hinnant                return false;
1059*3e519524SHoward Hinnant            // Count number of *__i in [__i, l1) (we can start with 1)
1060*3e519524SHoward Hinnant            _D1 __c1 = 1;
1061*3e519524SHoward Hinnant            for (_ForwardIterator1 __j = _STD::next(__i); __j != __last1; ++__j)
1062*3e519524SHoward Hinnant                if (__pred(*__i, *__j))
1063*3e519524SHoward Hinnant                    ++__c1;
1064*3e519524SHoward Hinnant            if (__c1 != __c2)
1065*3e519524SHoward Hinnant                return false;
1066*3e519524SHoward Hinnant        }
1067*3e519524SHoward Hinnant__next_iter:;
1068*3e519524SHoward Hinnant    }
1069*3e519524SHoward Hinnant    return true;
1070*3e519524SHoward Hinnant}
1071*3e519524SHoward Hinnant
1072*3e519524SHoward Hinnanttemplate<class _ForwardIterator1, class _ForwardIterator2>
1073*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1074*3e519524SHoward Hinnantbool
1075*3e519524SHoward Hinnantis_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1076*3e519524SHoward Hinnant               _ForwardIterator2 __first2)
1077*3e519524SHoward Hinnant{
1078*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1079*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
1080*3e519524SHoward Hinnant    return _STD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
1081*3e519524SHoward Hinnant}
1082*3e519524SHoward Hinnant
1083*3e519524SHoward Hinnant// search
1084*3e519524SHoward Hinnant
1085*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
1086*3e519524SHoward Hinnant_ForwardIterator1
1087*3e519524SHoward Hinnant__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1088*3e519524SHoward Hinnant         _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
1089*3e519524SHoward Hinnant         forward_iterator_tag, forward_iterator_tag)
1090*3e519524SHoward Hinnant{
1091*3e519524SHoward Hinnant    if (__first2 == __last2)
1092*3e519524SHoward Hinnant        return __first1;  // Everything matches an empty sequence
1093*3e519524SHoward Hinnant    while (true)
1094*3e519524SHoward Hinnant    {
1095*3e519524SHoward Hinnant        // Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks
1096*3e519524SHoward Hinnant        while (true)
1097*3e519524SHoward Hinnant        {
1098*3e519524SHoward Hinnant            if (__first1 == __last1)  // return __last1 if no element matches *__first2
1099*3e519524SHoward Hinnant                return __last1;
1100*3e519524SHoward Hinnant            if (__pred(*__first1, *__first2))
1101*3e519524SHoward Hinnant                break;
1102*3e519524SHoward Hinnant            ++__first1;
1103*3e519524SHoward Hinnant        }
1104*3e519524SHoward Hinnant        // *__first1 matches *__first2, now match elements after here
1105*3e519524SHoward Hinnant        _ForwardIterator1 __m1 = __first1;
1106*3e519524SHoward Hinnant        _ForwardIterator2 __m2 = __first2;
1107*3e519524SHoward Hinnant        while (true)
1108*3e519524SHoward Hinnant        {
1109*3e519524SHoward Hinnant            if (++__m2 == __last2)  // If pattern exhausted, __first1 is the answer (works for 1 element pattern)
1110*3e519524SHoward Hinnant                return __first1;
1111*3e519524SHoward Hinnant            if (++__m1 == __last1)  // Otherwise if source exhaused, pattern not found
1112*3e519524SHoward Hinnant                return __last1;
1113*3e519524SHoward Hinnant            if (!__pred(*__m1, *__m2))  // if there is a mismatch, restart with a new __first1
1114*3e519524SHoward Hinnant            {
1115*3e519524SHoward Hinnant                ++__first1;
1116*3e519524SHoward Hinnant                break;
1117*3e519524SHoward Hinnant            }  // else there is a match, check next elements
1118*3e519524SHoward Hinnant        }
1119*3e519524SHoward Hinnant    }
1120*3e519524SHoward Hinnant}
1121*3e519524SHoward Hinnant
1122*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
1123*3e519524SHoward Hinnant_RandomAccessIterator1
1124*3e519524SHoward Hinnant__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1125*3e519524SHoward Hinnant           _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
1126*3e519524SHoward Hinnant           random_access_iterator_tag, random_access_iterator_tag)
1127*3e519524SHoward Hinnant{
1128*3e519524SHoward Hinnant    typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type _D1;
1129*3e519524SHoward Hinnant    typedef typename std::iterator_traits<_RandomAccessIterator2>::difference_type _D2;
1130*3e519524SHoward Hinnant    // Take advantage of knowing source and pattern lengths.  Stop short when source is smaller than pattern
1131*3e519524SHoward Hinnant    _D2 __len2 = __last2 - __first2;
1132*3e519524SHoward Hinnant    if (__len2 == 0)
1133*3e519524SHoward Hinnant        return __first1;
1134*3e519524SHoward Hinnant    _D1 __len1 = __last1 - __first1;
1135*3e519524SHoward Hinnant    if (__len1 < __len2)
1136*3e519524SHoward Hinnant        return __last1;
1137*3e519524SHoward Hinnant    const _RandomAccessIterator1 __s = __last1 - (__len2 - 1);  // Start of pattern match can't go beyond here
1138*3e519524SHoward Hinnant    while (true)
1139*3e519524SHoward Hinnant    {
1140*3e519524SHoward Hinnant#if !_LIBCPP_UNROLL_LOOPS
1141*3e519524SHoward Hinnant        while (true)
1142*3e519524SHoward Hinnant        {
1143*3e519524SHoward Hinnant            if (__first1 == __s)
1144*3e519524SHoward Hinnant                return __last1;
1145*3e519524SHoward Hinnant            if (__pred(*__first1, *__first2))
1146*3e519524SHoward Hinnant                break;
1147*3e519524SHoward Hinnant            ++__first1;
1148*3e519524SHoward Hinnant        }
1149*3e519524SHoward Hinnant#else  // _LIBCPP_UNROLL_LOOPS
1150*3e519524SHoward Hinnant        for (_D1 __loop_unroll = (__s - __first1) / 4; __loop_unroll > 0; --__loop_unroll)
1151*3e519524SHoward Hinnant        {
1152*3e519524SHoward Hinnant            if (__pred(*__first1, *__first2))
1153*3e519524SHoward Hinnant                goto __phase2;
1154*3e519524SHoward Hinnant            if (__pred(*++__first1, *__first2))
1155*3e519524SHoward Hinnant                goto __phase2;
1156*3e519524SHoward Hinnant            if (__pred(*++__first1, *__first2))
1157*3e519524SHoward Hinnant                goto __phase2;
1158*3e519524SHoward Hinnant            if (__pred(*++__first1, *__first2))
1159*3e519524SHoward Hinnant                goto __phase2;
1160*3e519524SHoward Hinnant            ++__first1;
1161*3e519524SHoward Hinnant        }
1162*3e519524SHoward Hinnant        switch (__s - __first1)
1163*3e519524SHoward Hinnant        {
1164*3e519524SHoward Hinnant        case 3:
1165*3e519524SHoward Hinnant            if (__pred(*__first1, *__first2))
1166*3e519524SHoward Hinnant                break;
1167*3e519524SHoward Hinnant            ++__first1;
1168*3e519524SHoward Hinnant        case 2:
1169*3e519524SHoward Hinnant            if (__pred(*__first1, *__first2))
1170*3e519524SHoward Hinnant                break;
1171*3e519524SHoward Hinnant            ++__first1;
1172*3e519524SHoward Hinnant        case 1:
1173*3e519524SHoward Hinnant            if (__pred(*__first1, *__first2))
1174*3e519524SHoward Hinnant                break;
1175*3e519524SHoward Hinnant        case 0:
1176*3e519524SHoward Hinnant            return __last1;
1177*3e519524SHoward Hinnant        }
1178*3e519524SHoward Hinnant    __phase2:
1179*3e519524SHoward Hinnant#endif  // _LIBCPP_UNROLL_LOOPS
1180*3e519524SHoward Hinnant        _RandomAccessIterator1 __m1 = __first1;
1181*3e519524SHoward Hinnant        _RandomAccessIterator2 __m2 = __first2;
1182*3e519524SHoward Hinnant#if !_LIBCPP_UNROLL_LOOPS
1183*3e519524SHoward Hinnant         while (true)
1184*3e519524SHoward Hinnant         {
1185*3e519524SHoward Hinnant             if (++__m2 == __last2)
1186*3e519524SHoward Hinnant                 return __first1;
1187*3e519524SHoward Hinnant             ++__m1;          // no need to check range on __m1 because __s guarantees we have enough source
1188*3e519524SHoward Hinnant             if (!__pred(*__m1, *__m2))
1189*3e519524SHoward Hinnant             {
1190*3e519524SHoward Hinnant                 ++__first1;
1191*3e519524SHoward Hinnant                 break;
1192*3e519524SHoward Hinnant             }
1193*3e519524SHoward Hinnant         }
1194*3e519524SHoward Hinnant#else  // _LIBCPP_UNROLL_LOOPS
1195*3e519524SHoward Hinnant        ++__m2;
1196*3e519524SHoward Hinnant        ++__m1;
1197*3e519524SHoward Hinnant        for (_D2 __loop_unroll = (__last2 - __m2) / 4; __loop_unroll > 0; --__loop_unroll)
1198*3e519524SHoward Hinnant        {
1199*3e519524SHoward Hinnant            if (!__pred(*__m1, *__m2))
1200*3e519524SHoward Hinnant                goto __continue;
1201*3e519524SHoward Hinnant            if (!__pred(*++__m1, *++__m2))
1202*3e519524SHoward Hinnant                goto __continue;
1203*3e519524SHoward Hinnant            if (!__pred(*++__m1, *++__m2))
1204*3e519524SHoward Hinnant                goto __continue;
1205*3e519524SHoward Hinnant            if (!__pred(*++__m1, *++__m2))
1206*3e519524SHoward Hinnant                goto __continue;
1207*3e519524SHoward Hinnant            ++__m1;
1208*3e519524SHoward Hinnant            ++__m2;
1209*3e519524SHoward Hinnant        }
1210*3e519524SHoward Hinnant        switch (__last2 - __m2)
1211*3e519524SHoward Hinnant        {
1212*3e519524SHoward Hinnant        case 3:
1213*3e519524SHoward Hinnant            if (!__pred(*__m1, *__m2))
1214*3e519524SHoward Hinnant                break;
1215*3e519524SHoward Hinnant            ++__m1;
1216*3e519524SHoward Hinnant            ++__m2;
1217*3e519524SHoward Hinnant        case 2:
1218*3e519524SHoward Hinnant            if (!__pred(*__m1, *__m2))
1219*3e519524SHoward Hinnant                break;
1220*3e519524SHoward Hinnant            ++__m1;
1221*3e519524SHoward Hinnant            ++__m2;
1222*3e519524SHoward Hinnant        case 1:
1223*3e519524SHoward Hinnant            if (!__pred(*__m1, *__m2))
1224*3e519524SHoward Hinnant                break;
1225*3e519524SHoward Hinnant        case 0:
1226*3e519524SHoward Hinnant            return __first1;
1227*3e519524SHoward Hinnant        }
1228*3e519524SHoward Hinnant    __continue:
1229*3e519524SHoward Hinnant        ++__first1;
1230*3e519524SHoward Hinnant#endif  // _LIBCPP_UNROLL_LOOPS
1231*3e519524SHoward Hinnant    }
1232*3e519524SHoward Hinnant}
1233*3e519524SHoward Hinnant
1234*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1235*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1236*3e519524SHoward Hinnant_ForwardIterator1
1237*3e519524SHoward Hinnantsearch(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1238*3e519524SHoward Hinnant       _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1239*3e519524SHoward Hinnant{
1240*3e519524SHoward Hinnant    return _STD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
1241*3e519524SHoward Hinnant                         (__first1, __last1, __first2, __last2, __pred,
1242*3e519524SHoward Hinnant                          typename std::iterator_traits<_ForwardIterator1>::iterator_category(),
1243*3e519524SHoward Hinnant                          typename std::iterator_traits<_ForwardIterator2>::iterator_category());
1244*3e519524SHoward Hinnant}
1245*3e519524SHoward Hinnant
1246*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2>
1247*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1248*3e519524SHoward Hinnant_ForwardIterator1
1249*3e519524SHoward Hinnantsearch(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1250*3e519524SHoward Hinnant       _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1251*3e519524SHoward Hinnant{
1252*3e519524SHoward Hinnant    typedef typename std::iterator_traits<_ForwardIterator1>::value_type __v1;
1253*3e519524SHoward Hinnant    typedef typename std::iterator_traits<_ForwardIterator2>::value_type __v2;
1254*3e519524SHoward Hinnant    return _STD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
1255*3e519524SHoward Hinnant}
1256*3e519524SHoward Hinnant
1257*3e519524SHoward Hinnant// search_n
1258*3e519524SHoward Hinnant
1259*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp>
1260*3e519524SHoward Hinnant_ForwardIterator
1261*3e519524SHoward Hinnant__search_n(_ForwardIterator __first, _ForwardIterator __last,
1262*3e519524SHoward Hinnant           _Size __count, const _Tp& __value, _BinaryPredicate __pred, forward_iterator_tag)
1263*3e519524SHoward Hinnant{
1264*3e519524SHoward Hinnant    if (__count <= 0)
1265*3e519524SHoward Hinnant        return __first;
1266*3e519524SHoward Hinnant    while (true)
1267*3e519524SHoward Hinnant    {
1268*3e519524SHoward Hinnant        // Find first element in sequence that matchs __value, with a mininum of loop checks
1269*3e519524SHoward Hinnant        while (true)
1270*3e519524SHoward Hinnant        {
1271*3e519524SHoward Hinnant            if (__first == __last)  // return __last if no element matches __value
1272*3e519524SHoward Hinnant                return __last;
1273*3e519524SHoward Hinnant            if (__pred(*__first, __value))
1274*3e519524SHoward Hinnant                break;
1275*3e519524SHoward Hinnant            ++__first;
1276*3e519524SHoward Hinnant        }
1277*3e519524SHoward Hinnant        // *__first matches __value, now match elements after here
1278*3e519524SHoward Hinnant        _ForwardIterator __m = __first;
1279*3e519524SHoward Hinnant        _Size __c(0);
1280*3e519524SHoward Hinnant        while (true)
1281*3e519524SHoward Hinnant        {
1282*3e519524SHoward Hinnant            if (++__c == __count)  // If pattern exhausted, __first is the answer (works for 1 element pattern)
1283*3e519524SHoward Hinnant                return __first;
1284*3e519524SHoward Hinnant            if (++__m == __last)  // Otherwise if source exhaused, pattern not found
1285*3e519524SHoward Hinnant                return __last;
1286*3e519524SHoward Hinnant            if (!__pred(*__m, __value))  // if there is a mismatch, restart with a new __first
1287*3e519524SHoward Hinnant            {
1288*3e519524SHoward Hinnant                __first = __m;
1289*3e519524SHoward Hinnant                ++__first;
1290*3e519524SHoward Hinnant                break;
1291*3e519524SHoward Hinnant            }  // else there is a match, check next elements
1292*3e519524SHoward Hinnant        }
1293*3e519524SHoward Hinnant    }
1294*3e519524SHoward Hinnant}
1295*3e519524SHoward Hinnant
1296*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp>
1297*3e519524SHoward Hinnant_RandomAccessIterator
1298*3e519524SHoward Hinnant__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last,
1299*3e519524SHoward Hinnant           _Size __count, const _Tp& __value, _BinaryPredicate __pred, random_access_iterator_tag)
1300*3e519524SHoward Hinnant{
1301*3e519524SHoward Hinnant    if (__count <= 0)
1302*3e519524SHoward Hinnant        return __first;
1303*3e519524SHoward Hinnant    _Size __len = static_cast<_Size>(__last - __first);
1304*3e519524SHoward Hinnant    if (__len < __count)
1305*3e519524SHoward Hinnant        return __last;
1306*3e519524SHoward Hinnant    const _RandomAccessIterator __s = __last - (__count - 1);  // Start of pattern match can't go beyond here
1307*3e519524SHoward Hinnant    while (true)
1308*3e519524SHoward Hinnant    {
1309*3e519524SHoward Hinnant        // Find first element in sequence that matchs __value, with a mininum of loop checks
1310*3e519524SHoward Hinnant        while (true)
1311*3e519524SHoward Hinnant        {
1312*3e519524SHoward Hinnant            if (__first == __s)  // return __last if no element matches __value
1313*3e519524SHoward Hinnant                return __last;
1314*3e519524SHoward Hinnant            if (__pred(*__first, __value))
1315*3e519524SHoward Hinnant                break;
1316*3e519524SHoward Hinnant            ++__first;
1317*3e519524SHoward Hinnant        }
1318*3e519524SHoward Hinnant        // *__first matches __value, now match elements after here
1319*3e519524SHoward Hinnant        _RandomAccessIterator __m = __first;
1320*3e519524SHoward Hinnant        _Size __c(0);
1321*3e519524SHoward Hinnant        while (true)
1322*3e519524SHoward Hinnant        {
1323*3e519524SHoward Hinnant            if (++__c == __count)  // If pattern exhausted, __first is the answer (works for 1 element pattern)
1324*3e519524SHoward Hinnant                return __first;
1325*3e519524SHoward Hinnant             ++__m;          // no need to check range on __m because __s guarantees we have enough source
1326*3e519524SHoward Hinnant            if (!__pred(*__m, __value))  // if there is a mismatch, restart with a new __first
1327*3e519524SHoward Hinnant            {
1328*3e519524SHoward Hinnant                __first = __m;
1329*3e519524SHoward Hinnant                ++__first;
1330*3e519524SHoward Hinnant                break;
1331*3e519524SHoward Hinnant            }  // else there is a match, check next elements
1332*3e519524SHoward Hinnant        }
1333*3e519524SHoward Hinnant    }
1334*3e519524SHoward Hinnant}
1335*3e519524SHoward Hinnant
1336*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
1337*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1338*3e519524SHoward Hinnant_ForwardIterator
1339*3e519524SHoward Hinnantsearch_n(_ForwardIterator __first, _ForwardIterator __last,
1340*3e519524SHoward Hinnant         _Size __count, const _Tp& __value, _BinaryPredicate __pred)
1341*3e519524SHoward Hinnant{
1342*3e519524SHoward Hinnant    return _STD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type>
1343*3e519524SHoward Hinnant           (__first, __last, __count, __value, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
1344*3e519524SHoward Hinnant}
1345*3e519524SHoward Hinnant
1346*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp>
1347*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1348*3e519524SHoward Hinnant_ForwardIterator
1349*3e519524SHoward Hinnantsearch_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value)
1350*3e519524SHoward Hinnant{
1351*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::value_type __v;
1352*3e519524SHoward Hinnant    return _STD::search_n(__first, __last, __count, __value, __equal_to<__v, _Tp>());
1353*3e519524SHoward Hinnant}
1354*3e519524SHoward Hinnant
1355*3e519524SHoward Hinnant// copy
1356*3e519524SHoward Hinnant
1357*3e519524SHoward Hinnanttemplate <class _Iter>
1358*3e519524SHoward Hinnantstruct __libcpp_is_trivial_iterator
1359*3e519524SHoward Hinnant{
1360*3e519524SHoward Hinnant    static const bool value = is_pointer<_Iter>::value;
1361*3e519524SHoward Hinnant};
1362*3e519524SHoward Hinnant
1363*3e519524SHoward Hinnanttemplate <class _Iter>
1364*3e519524SHoward Hinnantstruct __libcpp_is_trivial_iterator<move_iterator<_Iter> >
1365*3e519524SHoward Hinnant{
1366*3e519524SHoward Hinnant    static const bool value = is_pointer<_Iter>::value;
1367*3e519524SHoward Hinnant};
1368*3e519524SHoward Hinnant
1369*3e519524SHoward Hinnanttemplate <class _Iter>
1370*3e519524SHoward Hinnantstruct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> >
1371*3e519524SHoward Hinnant{
1372*3e519524SHoward Hinnant    static const bool value = is_pointer<_Iter>::value;
1373*3e519524SHoward Hinnant};
1374*3e519524SHoward Hinnant
1375*3e519524SHoward Hinnanttemplate <class _Iter>
1376*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1377*3e519524SHoward Hinnant_Iter
1378*3e519524SHoward Hinnant__unwrap_iter(_Iter __i)
1379*3e519524SHoward Hinnant{
1380*3e519524SHoward Hinnant    return __i;
1381*3e519524SHoward Hinnant}
1382*3e519524SHoward Hinnant
1383*3e519524SHoward Hinnanttemplate <class _Tp>
1384*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1385*3e519524SHoward Hinnanttypename enable_if
1386*3e519524SHoward Hinnant<
1387*3e519524SHoward Hinnant    has_trivial_copy_assign<_Tp>::value,
1388*3e519524SHoward Hinnant    _Tp*
1389*3e519524SHoward Hinnant>::type
1390*3e519524SHoward Hinnant__unwrap_iter(move_iterator<_Tp*> __i)
1391*3e519524SHoward Hinnant{
1392*3e519524SHoward Hinnant    return __i.base();
1393*3e519524SHoward Hinnant}
1394*3e519524SHoward Hinnant
1395*3e519524SHoward Hinnanttemplate <class _Tp>
1396*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1397*3e519524SHoward Hinnanttypename enable_if
1398*3e519524SHoward Hinnant<
1399*3e519524SHoward Hinnant    has_trivial_copy_assign<_Tp>::value,
1400*3e519524SHoward Hinnant    _Tp*
1401*3e519524SHoward Hinnant>::type
1402*3e519524SHoward Hinnant__unwrap_iter(__wrap_iter<_Tp*> __i)
1403*3e519524SHoward Hinnant{
1404*3e519524SHoward Hinnant    return __i.base();
1405*3e519524SHoward Hinnant}
1406*3e519524SHoward Hinnant
1407*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator>
1408*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1409*3e519524SHoward Hinnant_OutputIterator
1410*3e519524SHoward Hinnant__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1411*3e519524SHoward Hinnant{
1412*3e519524SHoward Hinnant    for (; __first != __last; ++__first, ++__result)
1413*3e519524SHoward Hinnant        *__result = *__first;
1414*3e519524SHoward Hinnant    return __result;
1415*3e519524SHoward Hinnant}
1416*3e519524SHoward Hinnant
1417*3e519524SHoward Hinnanttemplate <class _Tp, class _Up>
1418*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1419*3e519524SHoward Hinnanttypename enable_if
1420*3e519524SHoward Hinnant<
1421*3e519524SHoward Hinnant    is_same<typename remove_const<_Tp>::type, _Up>::value &&
1422*3e519524SHoward Hinnant    has_trivial_copy_assign<_Up>::value,
1423*3e519524SHoward Hinnant    _Up*
1424*3e519524SHoward Hinnant>::type
1425*3e519524SHoward Hinnant__copy(_Tp* __first, _Tp* __last, _Up* __result)
1426*3e519524SHoward Hinnant{
1427*3e519524SHoward Hinnant    const size_t __n = static_cast<size_t>(__last - __first);
1428*3e519524SHoward Hinnant    _STD::memmove(__result, __first, __n * sizeof(_Up));
1429*3e519524SHoward Hinnant    return __result + __n;
1430*3e519524SHoward Hinnant}
1431*3e519524SHoward Hinnant
1432*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator>
1433*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1434*3e519524SHoward Hinnant_OutputIterator
1435*3e519524SHoward Hinnantcopy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1436*3e519524SHoward Hinnant{
1437*3e519524SHoward Hinnant    return _STD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
1438*3e519524SHoward Hinnant}
1439*3e519524SHoward Hinnant
1440*3e519524SHoward Hinnant// copy_backward
1441*3e519524SHoward Hinnant
1442*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator>
1443*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1444*3e519524SHoward Hinnant_OutputIterator
1445*3e519524SHoward Hinnant__copy_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1446*3e519524SHoward Hinnant{
1447*3e519524SHoward Hinnant    while (__first != __last)
1448*3e519524SHoward Hinnant        *--__result = *--__last;
1449*3e519524SHoward Hinnant    return __result;
1450*3e519524SHoward Hinnant}
1451*3e519524SHoward Hinnant
1452*3e519524SHoward Hinnanttemplate <class _Tp, class _Up>
1453*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1454*3e519524SHoward Hinnanttypename enable_if
1455*3e519524SHoward Hinnant<
1456*3e519524SHoward Hinnant    is_same<typename remove_const<_Tp>::type, _Up>::value &&
1457*3e519524SHoward Hinnant    has_trivial_copy_assign<_Up>::value,
1458*3e519524SHoward Hinnant    _Up*
1459*3e519524SHoward Hinnant>::type
1460*3e519524SHoward Hinnant__copy_backward(_Tp* __first, _Tp* __last, _Up* __result)
1461*3e519524SHoward Hinnant{
1462*3e519524SHoward Hinnant    const size_t __n = static_cast<size_t>(__last - __first);
1463*3e519524SHoward Hinnant    __result -= __n;
1464*3e519524SHoward Hinnant    _STD::memmove(__result, __first, __n * sizeof(_Up));
1465*3e519524SHoward Hinnant    return __result;
1466*3e519524SHoward Hinnant}
1467*3e519524SHoward Hinnant
1468*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator1, class _BidirectionalIterator2>
1469*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1470*3e519524SHoward Hinnant_BidirectionalIterator2
1471*3e519524SHoward Hinnantcopy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1472*3e519524SHoward Hinnant              _BidirectionalIterator2 __result)
1473*3e519524SHoward Hinnant{
1474*3e519524SHoward Hinnant    return _STD::__copy_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
1475*3e519524SHoward Hinnant}
1476*3e519524SHoward Hinnant
1477*3e519524SHoward Hinnant// copy_if
1478*3e519524SHoward Hinnant
1479*3e519524SHoward Hinnanttemplate<class _InputIterator, class _OutputIterator, class _Predicate>
1480*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1481*3e519524SHoward Hinnant_OutputIterator
1482*3e519524SHoward Hinnantcopy_if(_InputIterator __first, _InputIterator __last,
1483*3e519524SHoward Hinnant        _OutputIterator __result, _Predicate __pred)
1484*3e519524SHoward Hinnant{
1485*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
1486*3e519524SHoward Hinnant    {
1487*3e519524SHoward Hinnant        if (__pred(*__first))
1488*3e519524SHoward Hinnant        {
1489*3e519524SHoward Hinnant            *__result = *__first;
1490*3e519524SHoward Hinnant            ++__result;
1491*3e519524SHoward Hinnant        }
1492*3e519524SHoward Hinnant    }
1493*3e519524SHoward Hinnant    return __result;
1494*3e519524SHoward Hinnant}
1495*3e519524SHoward Hinnant
1496*3e519524SHoward Hinnant// copy_n
1497*3e519524SHoward Hinnant
1498*3e519524SHoward Hinnanttemplate<class _InputIterator, class _Size, class _OutputIterator>
1499*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1500*3e519524SHoward Hinnanttypename enable_if
1501*3e519524SHoward Hinnant<
1502*3e519524SHoward Hinnant    __is_input_iterator<_InputIterator>::value &&
1503*3e519524SHoward Hinnant   !__is_random_access_iterator<_InputIterator>::value,
1504*3e519524SHoward Hinnant    _OutputIterator
1505*3e519524SHoward Hinnant>::type
1506*3e519524SHoward Hinnantcopy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1507*3e519524SHoward Hinnant{
1508*3e519524SHoward Hinnant    for (; __n > 0; --__n, ++__first, ++__result)
1509*3e519524SHoward Hinnant        *__result = *__first;
1510*3e519524SHoward Hinnant    return __result;
1511*3e519524SHoward Hinnant}
1512*3e519524SHoward Hinnant
1513*3e519524SHoward Hinnanttemplate<class _InputIterator, class _Size, class _OutputIterator>
1514*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1515*3e519524SHoward Hinnanttypename enable_if
1516*3e519524SHoward Hinnant<
1517*3e519524SHoward Hinnant    __is_random_access_iterator<_InputIterator>::value,
1518*3e519524SHoward Hinnant    _OutputIterator
1519*3e519524SHoward Hinnant>::type
1520*3e519524SHoward Hinnantcopy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1521*3e519524SHoward Hinnant{
1522*3e519524SHoward Hinnant    return copy(__first, __first + __n, __result);
1523*3e519524SHoward Hinnant}
1524*3e519524SHoward Hinnant
1525*3e519524SHoward Hinnant// move
1526*3e519524SHoward Hinnant
1527*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator>
1528*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1529*3e519524SHoward Hinnant_OutputIterator
1530*3e519524SHoward Hinnant__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1531*3e519524SHoward Hinnant{
1532*3e519524SHoward Hinnant    for (; __first != __last; ++__first, ++__result)
1533*3e519524SHoward Hinnant        *__result = _STD::move(*__first);
1534*3e519524SHoward Hinnant    return __result;
1535*3e519524SHoward Hinnant}
1536*3e519524SHoward Hinnant
1537*3e519524SHoward Hinnanttemplate <class _Tp, class _Up>
1538*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1539*3e519524SHoward Hinnanttypename enable_if
1540*3e519524SHoward Hinnant<
1541*3e519524SHoward Hinnant    is_same<typename remove_const<_Tp>::type, _Up>::value &&
1542*3e519524SHoward Hinnant    has_trivial_copy_assign<_Up>::value,
1543*3e519524SHoward Hinnant    _Up*
1544*3e519524SHoward Hinnant>::type
1545*3e519524SHoward Hinnant__move(_Tp* __first, _Tp* __last, _Up* __result)
1546*3e519524SHoward Hinnant{
1547*3e519524SHoward Hinnant    const size_t __n = static_cast<size_t>(__last - __first);
1548*3e519524SHoward Hinnant    _STD::memmove(__result, __first, __n * sizeof(_Up));
1549*3e519524SHoward Hinnant    return __result + __n;
1550*3e519524SHoward Hinnant}
1551*3e519524SHoward Hinnant
1552*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator>
1553*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1554*3e519524SHoward Hinnant_OutputIterator
1555*3e519524SHoward Hinnantmove(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1556*3e519524SHoward Hinnant{
1557*3e519524SHoward Hinnant    return _STD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
1558*3e519524SHoward Hinnant}
1559*3e519524SHoward Hinnant
1560*3e519524SHoward Hinnant// move_backward
1561*3e519524SHoward Hinnant
1562*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator>
1563*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1564*3e519524SHoward Hinnant_OutputIterator
1565*3e519524SHoward Hinnant__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1566*3e519524SHoward Hinnant{
1567*3e519524SHoward Hinnant    while (__first != __last)
1568*3e519524SHoward Hinnant        *--__result = _STD::move(*--__last);
1569*3e519524SHoward Hinnant    return __result;
1570*3e519524SHoward Hinnant}
1571*3e519524SHoward Hinnant
1572*3e519524SHoward Hinnanttemplate <class _Tp, class _Up>
1573*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1574*3e519524SHoward Hinnanttypename enable_if
1575*3e519524SHoward Hinnant<
1576*3e519524SHoward Hinnant    is_same<typename remove_const<_Tp>::type, _Up>::value &&
1577*3e519524SHoward Hinnant    has_trivial_copy_assign<_Up>::value,
1578*3e519524SHoward Hinnant    _Up*
1579*3e519524SHoward Hinnant>::type
1580*3e519524SHoward Hinnant__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
1581*3e519524SHoward Hinnant{
1582*3e519524SHoward Hinnant    const size_t __n = static_cast<size_t>(__last - __first);
1583*3e519524SHoward Hinnant    __result -= __n;
1584*3e519524SHoward Hinnant    _STD::memmove(__result, __first, __n * sizeof(_Up));
1585*3e519524SHoward Hinnant    return __result;
1586*3e519524SHoward Hinnant}
1587*3e519524SHoward Hinnant
1588*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator1, class _BidirectionalIterator2>
1589*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1590*3e519524SHoward Hinnant_BidirectionalIterator2
1591*3e519524SHoward Hinnantmove_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1592*3e519524SHoward Hinnant              _BidirectionalIterator2 __result)
1593*3e519524SHoward Hinnant{
1594*3e519524SHoward Hinnant    return _STD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
1595*3e519524SHoward Hinnant}
1596*3e519524SHoward Hinnant
1597*3e519524SHoward Hinnant// iter_swap
1598*3e519524SHoward Hinnant
1599*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2>
1600*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1601*3e519524SHoward Hinnantvoid
1602*3e519524SHoward Hinnantiter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
1603*3e519524SHoward Hinnant{
1604*3e519524SHoward Hinnant    swap(*__a, *__b);
1605*3e519524SHoward Hinnant}
1606*3e519524SHoward Hinnant
1607*3e519524SHoward Hinnant// transform
1608*3e519524SHoward Hinnant
1609*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _UnaryOperation>
1610*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1611*3e519524SHoward Hinnant_OutputIterator
1612*3e519524SHoward Hinnanttransform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
1613*3e519524SHoward Hinnant{
1614*3e519524SHoward Hinnant    for (; __first != __last; ++__first, ++__result)
1615*3e519524SHoward Hinnant        *__result = __op(*__first);
1616*3e519524SHoward Hinnant    return __result;
1617*3e519524SHoward Hinnant}
1618*3e519524SHoward Hinnant
1619*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation>
1620*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1621*3e519524SHoward Hinnant_OutputIterator
1622*3e519524SHoward Hinnanttransform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
1623*3e519524SHoward Hinnant          _OutputIterator __result, _BinaryOperation __binary_op)
1624*3e519524SHoward Hinnant{
1625*3e519524SHoward Hinnant    for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
1626*3e519524SHoward Hinnant        *__result = __binary_op(*__first1, *__first2);
1627*3e519524SHoward Hinnant    return __result;
1628*3e519524SHoward Hinnant}
1629*3e519524SHoward Hinnant
1630*3e519524SHoward Hinnant// replace
1631*3e519524SHoward Hinnant
1632*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp>
1633*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1634*3e519524SHoward Hinnantvoid
1635*3e519524SHoward Hinnantreplace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value)
1636*3e519524SHoward Hinnant{
1637*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
1638*3e519524SHoward Hinnant        if (*__first == __old_value)
1639*3e519524SHoward Hinnant            *__first = __new_value;
1640*3e519524SHoward Hinnant}
1641*3e519524SHoward Hinnant
1642*3e519524SHoward Hinnant// replace_if
1643*3e519524SHoward Hinnant
1644*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Predicate, class _Tp>
1645*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1646*3e519524SHoward Hinnantvoid
1647*3e519524SHoward Hinnantreplace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value)
1648*3e519524SHoward Hinnant{
1649*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
1650*3e519524SHoward Hinnant        if (__pred(*__first))
1651*3e519524SHoward Hinnant            *__first = __new_value;
1652*3e519524SHoward Hinnant}
1653*3e519524SHoward Hinnant
1654*3e519524SHoward Hinnant// replace_copy
1655*3e519524SHoward Hinnant
1656*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _Tp>
1657*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1658*3e519524SHoward Hinnant_OutputIterator
1659*3e519524SHoward Hinnantreplace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1660*3e519524SHoward Hinnant             const _Tp& __old_value, const _Tp& __new_value)
1661*3e519524SHoward Hinnant{
1662*3e519524SHoward Hinnant    for (; __first != __last; ++__first, ++__result)
1663*3e519524SHoward Hinnant        if (*__first == __old_value)
1664*3e519524SHoward Hinnant            *__result = __new_value;
1665*3e519524SHoward Hinnant        else
1666*3e519524SHoward Hinnant            *__result = *__first;
1667*3e519524SHoward Hinnant    return __result;
1668*3e519524SHoward Hinnant}
1669*3e519524SHoward Hinnant
1670*3e519524SHoward Hinnant// replace_copy_if
1671*3e519524SHoward Hinnant
1672*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp>
1673*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1674*3e519524SHoward Hinnant_OutputIterator
1675*3e519524SHoward Hinnantreplace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1676*3e519524SHoward Hinnant                _Predicate __pred, const _Tp& __new_value)
1677*3e519524SHoward Hinnant{
1678*3e519524SHoward Hinnant    for (; __first != __last; ++__first, ++__result)
1679*3e519524SHoward Hinnant        if (__pred(*__first))
1680*3e519524SHoward Hinnant            *__result = __new_value;
1681*3e519524SHoward Hinnant        else
1682*3e519524SHoward Hinnant            *__result = *__first;
1683*3e519524SHoward Hinnant    return __result;
1684*3e519524SHoward Hinnant}
1685*3e519524SHoward Hinnant
1686*3e519524SHoward Hinnant// fill_n
1687*3e519524SHoward Hinnant
1688*3e519524SHoward Hinnanttemplate <class _OutputIterator, class _Size, class _Tp>
1689*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1690*3e519524SHoward Hinnant_OutputIterator
1691*3e519524SHoward Hinnant__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value, false_type)
1692*3e519524SHoward Hinnant{
1693*3e519524SHoward Hinnant    for (; __n > 0; ++__first, --__n)
1694*3e519524SHoward Hinnant        *__first = __value;
1695*3e519524SHoward Hinnant    return __first;
1696*3e519524SHoward Hinnant}
1697*3e519524SHoward Hinnant
1698*3e519524SHoward Hinnanttemplate <class _OutputIterator, class _Size, class _Tp>
1699*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1700*3e519524SHoward Hinnant_OutputIterator
1701*3e519524SHoward Hinnant__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value, true_type)
1702*3e519524SHoward Hinnant{
1703*3e519524SHoward Hinnant    if (__n > 0)
1704*3e519524SHoward Hinnant        _STD::memset(__first, (unsigned char)__value, (size_t)(__n));
1705*3e519524SHoward Hinnant    return __first + __n;
1706*3e519524SHoward Hinnant}
1707*3e519524SHoward Hinnant
1708*3e519524SHoward Hinnanttemplate <class _OutputIterator, class _Size, class _Tp>
1709*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1710*3e519524SHoward Hinnant_OutputIterator
1711*3e519524SHoward Hinnantfill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
1712*3e519524SHoward Hinnant{
1713*3e519524SHoward Hinnant   return _STD::__fill_n(__first, __n, __value, integral_constant<bool,
1714*3e519524SHoward Hinnant                                              is_pointer<_OutputIterator>::value &&
1715*3e519524SHoward Hinnant                                              has_trivial_copy_assign<_Tp>::value     &&
1716*3e519524SHoward Hinnant                                              sizeof(_Tp) == 1>());
1717*3e519524SHoward Hinnant}
1718*3e519524SHoward Hinnant
1719*3e519524SHoward Hinnant// fill
1720*3e519524SHoward Hinnant
1721*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp>
1722*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1723*3e519524SHoward Hinnantvoid
1724*3e519524SHoward Hinnant__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, forward_iterator_tag)
1725*3e519524SHoward Hinnant{
1726*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
1727*3e519524SHoward Hinnant        *__first = __value;
1728*3e519524SHoward Hinnant}
1729*3e519524SHoward Hinnant
1730*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Tp>
1731*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1732*3e519524SHoward Hinnantvoid
1733*3e519524SHoward Hinnant__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value, random_access_iterator_tag)
1734*3e519524SHoward Hinnant{
1735*3e519524SHoward Hinnant    _STD::fill_n(__first, __last - __first, __value);
1736*3e519524SHoward Hinnant}
1737*3e519524SHoward Hinnant
1738*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp>
1739*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1740*3e519524SHoward Hinnantvoid
1741*3e519524SHoward Hinnantfill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
1742*3e519524SHoward Hinnant{
1743*3e519524SHoward Hinnant    _STD::__fill(__first, __last, __value, typename iterator_traits<_ForwardIterator>::iterator_category());
1744*3e519524SHoward Hinnant}
1745*3e519524SHoward Hinnant
1746*3e519524SHoward Hinnant// generate
1747*3e519524SHoward Hinnant
1748*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Generator>
1749*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1750*3e519524SHoward Hinnantvoid
1751*3e519524SHoward Hinnantgenerate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
1752*3e519524SHoward Hinnant{
1753*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
1754*3e519524SHoward Hinnant        *__first = __gen();
1755*3e519524SHoward Hinnant}
1756*3e519524SHoward Hinnant
1757*3e519524SHoward Hinnant// generate_n
1758*3e519524SHoward Hinnant
1759*3e519524SHoward Hinnanttemplate <class _OutputIterator, class _Size, class _Generator>
1760*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1761*3e519524SHoward Hinnant_OutputIterator
1762*3e519524SHoward Hinnantgenerate_n(_OutputIterator __first, _Size __n, _Generator __gen)
1763*3e519524SHoward Hinnant{
1764*3e519524SHoward Hinnant    for (; __n > 0; ++__first, --__n)
1765*3e519524SHoward Hinnant        *__first = __gen();
1766*3e519524SHoward Hinnant    return __first;
1767*3e519524SHoward Hinnant}
1768*3e519524SHoward Hinnant
1769*3e519524SHoward Hinnant// remove
1770*3e519524SHoward Hinnant
1771*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp>
1772*3e519524SHoward Hinnant_ForwardIterator
1773*3e519524SHoward Hinnantremove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
1774*3e519524SHoward Hinnant{
1775*3e519524SHoward Hinnant    __first = _STD::find(__first, __last, __value);
1776*3e519524SHoward Hinnant    if (__first != __last)
1777*3e519524SHoward Hinnant    {
1778*3e519524SHoward Hinnant        _ForwardIterator __i = __first;
1779*3e519524SHoward Hinnant        while (++__i != __last)
1780*3e519524SHoward Hinnant        {
1781*3e519524SHoward Hinnant            if (!(*__i == __value))
1782*3e519524SHoward Hinnant            {
1783*3e519524SHoward Hinnant                *__first = _STD::move(*__i);
1784*3e519524SHoward Hinnant                ++__first;
1785*3e519524SHoward Hinnant            }
1786*3e519524SHoward Hinnant        }
1787*3e519524SHoward Hinnant    }
1788*3e519524SHoward Hinnant    return __first;
1789*3e519524SHoward Hinnant}
1790*3e519524SHoward Hinnant
1791*3e519524SHoward Hinnant// remove_if
1792*3e519524SHoward Hinnant
1793*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Predicate>
1794*3e519524SHoward Hinnant_ForwardIterator
1795*3e519524SHoward Hinnantremove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
1796*3e519524SHoward Hinnant{
1797*3e519524SHoward Hinnant    __first = _STD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type>
1798*3e519524SHoward Hinnant                           (__first, __last, __pred);
1799*3e519524SHoward Hinnant    if (__first != __last)
1800*3e519524SHoward Hinnant    {
1801*3e519524SHoward Hinnant        _ForwardIterator __i = __first;
1802*3e519524SHoward Hinnant        while (++__i != __last)
1803*3e519524SHoward Hinnant        {
1804*3e519524SHoward Hinnant            if (!__pred(*__i))
1805*3e519524SHoward Hinnant            {
1806*3e519524SHoward Hinnant                *__first = _STD::move(*__i);
1807*3e519524SHoward Hinnant                ++__first;
1808*3e519524SHoward Hinnant            }
1809*3e519524SHoward Hinnant        }
1810*3e519524SHoward Hinnant    }
1811*3e519524SHoward Hinnant    return __first;
1812*3e519524SHoward Hinnant}
1813*3e519524SHoward Hinnant
1814*3e519524SHoward Hinnant// remove_copy
1815*3e519524SHoward Hinnant
1816*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _Tp>
1817*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1818*3e519524SHoward Hinnant_OutputIterator
1819*3e519524SHoward Hinnantremove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value)
1820*3e519524SHoward Hinnant{
1821*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
1822*3e519524SHoward Hinnant    {
1823*3e519524SHoward Hinnant        if (!(*__first == __value))
1824*3e519524SHoward Hinnant        {
1825*3e519524SHoward Hinnant            *__result = *__first;
1826*3e519524SHoward Hinnant            ++__result;
1827*3e519524SHoward Hinnant        }
1828*3e519524SHoward Hinnant    }
1829*3e519524SHoward Hinnant    return __result;
1830*3e519524SHoward Hinnant}
1831*3e519524SHoward Hinnant
1832*3e519524SHoward Hinnant// remove_copy_if
1833*3e519524SHoward Hinnant
1834*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _Predicate>
1835*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1836*3e519524SHoward Hinnant_OutputIterator
1837*3e519524SHoward Hinnantremove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred)
1838*3e519524SHoward Hinnant{
1839*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
1840*3e519524SHoward Hinnant    {
1841*3e519524SHoward Hinnant        if (!__pred(*__first))
1842*3e519524SHoward Hinnant        {
1843*3e519524SHoward Hinnant            *__result = *__first;
1844*3e519524SHoward Hinnant            ++__result;
1845*3e519524SHoward Hinnant        }
1846*3e519524SHoward Hinnant    }
1847*3e519524SHoward Hinnant    return __result;
1848*3e519524SHoward Hinnant}
1849*3e519524SHoward Hinnant
1850*3e519524SHoward Hinnant// unique
1851*3e519524SHoward Hinnant
1852*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _BinaryPredicate>
1853*3e519524SHoward Hinnant_ForwardIterator
1854*3e519524SHoward Hinnantunique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
1855*3e519524SHoward Hinnant{
1856*3e519524SHoward Hinnant    __first = _STD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type>
1857*3e519524SHoward Hinnant                                 (__first, __last, __pred);
1858*3e519524SHoward Hinnant    if (__first != __last)
1859*3e519524SHoward Hinnant    {
1860*3e519524SHoward Hinnant        // ...  a  a  ?  ...
1861*3e519524SHoward Hinnant        //      f     i
1862*3e519524SHoward Hinnant        _ForwardIterator __i = __first;
1863*3e519524SHoward Hinnant        for (++__i; ++__i != __last;)
1864*3e519524SHoward Hinnant            if (!__pred(*__first, *__i))
1865*3e519524SHoward Hinnant                *++__first = _STD::move(*__i);
1866*3e519524SHoward Hinnant        ++__first;
1867*3e519524SHoward Hinnant    }
1868*3e519524SHoward Hinnant    return __first;
1869*3e519524SHoward Hinnant}
1870*3e519524SHoward Hinnant
1871*3e519524SHoward Hinnanttemplate <class _ForwardIterator>
1872*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1873*3e519524SHoward Hinnant_ForwardIterator
1874*3e519524SHoward Hinnantunique(_ForwardIterator __first, _ForwardIterator __last)
1875*3e519524SHoward Hinnant{
1876*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::value_type __v;
1877*3e519524SHoward Hinnant    return _STD::unique(__first, __last, __equal_to<__v>());
1878*3e519524SHoward Hinnant}
1879*3e519524SHoward Hinnant
1880*3e519524SHoward Hinnant// unique_copy
1881*3e519524SHoward Hinnant
1882*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _InputIterator, class _OutputIterator>
1883*3e519524SHoward Hinnant_OutputIterator
1884*3e519524SHoward Hinnant__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
1885*3e519524SHoward Hinnant              input_iterator_tag, output_iterator_tag)
1886*3e519524SHoward Hinnant{
1887*3e519524SHoward Hinnant    if (__first != __last)
1888*3e519524SHoward Hinnant    {
1889*3e519524SHoward Hinnant        typename iterator_traits<_InputIterator>::value_type __t(*__first);
1890*3e519524SHoward Hinnant        *__result = __t;
1891*3e519524SHoward Hinnant        ++__result;
1892*3e519524SHoward Hinnant        while (++__first != __last)
1893*3e519524SHoward Hinnant        {
1894*3e519524SHoward Hinnant            if (!__pred(__t, *__first))
1895*3e519524SHoward Hinnant            {
1896*3e519524SHoward Hinnant                __t = *__first;
1897*3e519524SHoward Hinnant                *__result = __t;
1898*3e519524SHoward Hinnant                ++__result;
1899*3e519524SHoward Hinnant            }
1900*3e519524SHoward Hinnant        }
1901*3e519524SHoward Hinnant    }
1902*3e519524SHoward Hinnant    return __result;
1903*3e519524SHoward Hinnant}
1904*3e519524SHoward Hinnant
1905*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator>
1906*3e519524SHoward Hinnant_OutputIterator
1907*3e519524SHoward Hinnant__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
1908*3e519524SHoward Hinnant              forward_iterator_tag, output_iterator_tag)
1909*3e519524SHoward Hinnant{
1910*3e519524SHoward Hinnant    if (__first != __last)
1911*3e519524SHoward Hinnant    {
1912*3e519524SHoward Hinnant        _ForwardIterator __i = __first;
1913*3e519524SHoward Hinnant        *__result = *__i;
1914*3e519524SHoward Hinnant        ++__result;
1915*3e519524SHoward Hinnant        while (++__first != __last)
1916*3e519524SHoward Hinnant        {
1917*3e519524SHoward Hinnant            if (!__pred(*__i, *__first))
1918*3e519524SHoward Hinnant            {
1919*3e519524SHoward Hinnant                *__result = *__first;
1920*3e519524SHoward Hinnant                ++__result;
1921*3e519524SHoward Hinnant                __i = __first;
1922*3e519524SHoward Hinnant            }
1923*3e519524SHoward Hinnant        }
1924*3e519524SHoward Hinnant    }
1925*3e519524SHoward Hinnant    return __result;
1926*3e519524SHoward Hinnant}
1927*3e519524SHoward Hinnant
1928*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _InputIterator, class _ForwardIterator>
1929*3e519524SHoward Hinnant_ForwardIterator
1930*3e519524SHoward Hinnant__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred,
1931*3e519524SHoward Hinnant              input_iterator_tag, forward_iterator_tag)
1932*3e519524SHoward Hinnant{
1933*3e519524SHoward Hinnant    if (__first != __last)
1934*3e519524SHoward Hinnant    {
1935*3e519524SHoward Hinnant        *__result = *__first;
1936*3e519524SHoward Hinnant        while (++__first != __last)
1937*3e519524SHoward Hinnant            if (!__pred(*__result, *__first))
1938*3e519524SHoward Hinnant                *++__result = *__first;
1939*3e519524SHoward Hinnant        ++__result;
1940*3e519524SHoward Hinnant    }
1941*3e519524SHoward Hinnant    return __result;
1942*3e519524SHoward Hinnant}
1943*3e519524SHoward Hinnant
1944*3e519524SHoward Hinnant
1945*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _BinaryPredicate>
1946*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1947*3e519524SHoward Hinnant_OutputIterator
1948*3e519524SHoward Hinnantunique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred)
1949*3e519524SHoward Hinnant{
1950*3e519524SHoward Hinnant    return _STD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type>
1951*3e519524SHoward Hinnant                              (__first, __last, __result, __pred,
1952*3e519524SHoward Hinnant                               typename iterator_traits<_InputIterator>::iterator_category(),
1953*3e519524SHoward Hinnant                               typename iterator_traits<_OutputIterator>::iterator_category());
1954*3e519524SHoward Hinnant}
1955*3e519524SHoward Hinnant
1956*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator>
1957*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1958*3e519524SHoward Hinnant_OutputIterator
1959*3e519524SHoward Hinnantunique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1960*3e519524SHoward Hinnant{
1961*3e519524SHoward Hinnant    typedef typename iterator_traits<_InputIterator>::value_type __v;
1962*3e519524SHoward Hinnant    return _STD::unique_copy(__first, __last, __result, __equal_to<__v>());
1963*3e519524SHoward Hinnant}
1964*3e519524SHoward Hinnant
1965*3e519524SHoward Hinnant// reverse
1966*3e519524SHoward Hinnant
1967*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator>
1968*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1969*3e519524SHoward Hinnantvoid
1970*3e519524SHoward Hinnant__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
1971*3e519524SHoward Hinnant{
1972*3e519524SHoward Hinnant    while (__first != __last)
1973*3e519524SHoward Hinnant    {
1974*3e519524SHoward Hinnant        if (__first == --__last)
1975*3e519524SHoward Hinnant            break;
1976*3e519524SHoward Hinnant        swap(*__first, *__last);
1977*3e519524SHoward Hinnant        ++__first;
1978*3e519524SHoward Hinnant    }
1979*3e519524SHoward Hinnant}
1980*3e519524SHoward Hinnant
1981*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator>
1982*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1983*3e519524SHoward Hinnantvoid
1984*3e519524SHoward Hinnant__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
1985*3e519524SHoward Hinnant{
1986*3e519524SHoward Hinnant    if (__first != __last)
1987*3e519524SHoward Hinnant        for (; __first < --__last; ++__first)
1988*3e519524SHoward Hinnant            swap(*__first, *__last);
1989*3e519524SHoward Hinnant}
1990*3e519524SHoward Hinnant
1991*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator>
1992*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1993*3e519524SHoward Hinnantvoid
1994*3e519524SHoward Hinnantreverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
1995*3e519524SHoward Hinnant{
1996*3e519524SHoward Hinnant    _STD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category());
1997*3e519524SHoward Hinnant}
1998*3e519524SHoward Hinnant
1999*3e519524SHoward Hinnant// reverse_copy
2000*3e519524SHoward Hinnant
2001*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator, class _OutputIterator>
2002*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2003*3e519524SHoward Hinnant_OutputIterator
2004*3e519524SHoward Hinnantreverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
2005*3e519524SHoward Hinnant{
2006*3e519524SHoward Hinnant    for (; __first != __last; ++__result)
2007*3e519524SHoward Hinnant        *__result = *--__last;
2008*3e519524SHoward Hinnant    return __result;
2009*3e519524SHoward Hinnant}
2010*3e519524SHoward Hinnant
2011*3e519524SHoward Hinnant// rotate
2012*3e519524SHoward Hinnant
2013*3e519524SHoward Hinnanttemplate <class _ForwardIterator>
2014*3e519524SHoward Hinnant_ForwardIterator
2015*3e519524SHoward Hinnant__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, false_type)
2016*3e519524SHoward Hinnant{
2017*3e519524SHoward Hinnant    if (__first == __middle)
2018*3e519524SHoward Hinnant        return __last;
2019*3e519524SHoward Hinnant    if (__middle == __last)
2020*3e519524SHoward Hinnant        return __first;
2021*3e519524SHoward Hinnant    _ForwardIterator __i = __middle;
2022*3e519524SHoward Hinnant    while (true)
2023*3e519524SHoward Hinnant    {
2024*3e519524SHoward Hinnant        swap(*__first, *__i);
2025*3e519524SHoward Hinnant        ++__first;
2026*3e519524SHoward Hinnant        if (++__i == __last)
2027*3e519524SHoward Hinnant            break;
2028*3e519524SHoward Hinnant        if (__first == __middle)
2029*3e519524SHoward Hinnant            __middle = __i;
2030*3e519524SHoward Hinnant    }
2031*3e519524SHoward Hinnant    _ForwardIterator __r = __first;
2032*3e519524SHoward Hinnant    if (__first != __middle)
2033*3e519524SHoward Hinnant    {
2034*3e519524SHoward Hinnant        __i = __middle;
2035*3e519524SHoward Hinnant        while (true)
2036*3e519524SHoward Hinnant        {
2037*3e519524SHoward Hinnant            swap(*__first, *__i);
2038*3e519524SHoward Hinnant            ++__first;
2039*3e519524SHoward Hinnant            if (++__i == __last)
2040*3e519524SHoward Hinnant            {
2041*3e519524SHoward Hinnant                if (__first == __middle)
2042*3e519524SHoward Hinnant                    break;
2043*3e519524SHoward Hinnant                __i = __middle;
2044*3e519524SHoward Hinnant            }
2045*3e519524SHoward Hinnant            else if (__first == __middle)
2046*3e519524SHoward Hinnant                __middle = __i;
2047*3e519524SHoward Hinnant        }
2048*3e519524SHoward Hinnant    }
2049*3e519524SHoward Hinnant    return __r;
2050*3e519524SHoward Hinnant}
2051*3e519524SHoward Hinnant
2052*3e519524SHoward Hinnanttemplate<typename _Integral>
2053*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2054*3e519524SHoward Hinnant_Integral
2055*3e519524SHoward Hinnant__gcd(_Integral __x, _Integral __y)
2056*3e519524SHoward Hinnant{
2057*3e519524SHoward Hinnant    do
2058*3e519524SHoward Hinnant    {
2059*3e519524SHoward Hinnant        _Integral __t = __x % __y;
2060*3e519524SHoward Hinnant        __x = __y;
2061*3e519524SHoward Hinnant        __y = __t;
2062*3e519524SHoward Hinnant    } while (__y);
2063*3e519524SHoward Hinnant    return __x;
2064*3e519524SHoward Hinnant}
2065*3e519524SHoward Hinnant
2066*3e519524SHoward Hinnanttemplate<typename _RandomAccessIterator>
2067*3e519524SHoward Hinnant_RandomAccessIterator
2068*3e519524SHoward Hinnant__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, true_type)
2069*3e519524SHoward Hinnant{
2070*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2071*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
2072*3e519524SHoward Hinnant
2073*3e519524SHoward Hinnant    if (__first == __middle)
2074*3e519524SHoward Hinnant        return __last;
2075*3e519524SHoward Hinnant    if (__middle == __last)
2076*3e519524SHoward Hinnant        return __first;
2077*3e519524SHoward Hinnant    const difference_type __m1 = __middle - __first;
2078*3e519524SHoward Hinnant    const difference_type __m2 = __last - __middle;
2079*3e519524SHoward Hinnant    if (__m1 == __m2)
2080*3e519524SHoward Hinnant    {
2081*3e519524SHoward Hinnant        _STD::swap_ranges(__first, __middle, __middle);
2082*3e519524SHoward Hinnant        return __middle;
2083*3e519524SHoward Hinnant    }
2084*3e519524SHoward Hinnant    const difference_type __g = __gcd(__m1, __m2);
2085*3e519524SHoward Hinnant    for (_RandomAccessIterator __p = __first + __g; __p != __first;)
2086*3e519524SHoward Hinnant    {
2087*3e519524SHoward Hinnant        value_type __t(*--__p);
2088*3e519524SHoward Hinnant        _RandomAccessIterator __p1 = __p;
2089*3e519524SHoward Hinnant        _RandomAccessIterator __p2 = __p1 + __m1;
2090*3e519524SHoward Hinnant        do
2091*3e519524SHoward Hinnant        {
2092*3e519524SHoward Hinnant            *__p1 = *__p2;
2093*3e519524SHoward Hinnant            __p1 = __p2;
2094*3e519524SHoward Hinnant            const difference_type __d = __last - __p2;
2095*3e519524SHoward Hinnant            if (__m1 < __d)
2096*3e519524SHoward Hinnant                __p2 += __m1;
2097*3e519524SHoward Hinnant            else
2098*3e519524SHoward Hinnant                __p2 = __first + (__m1 - __d);
2099*3e519524SHoward Hinnant        } while (__p2 != __p);
2100*3e519524SHoward Hinnant        *__p1 = __t;
2101*3e519524SHoward Hinnant    }
2102*3e519524SHoward Hinnant    return __first + __m2;
2103*3e519524SHoward Hinnant}
2104*3e519524SHoward Hinnant
2105*3e519524SHoward Hinnanttemplate <class _ForwardIterator>
2106*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2107*3e519524SHoward Hinnant_ForwardIterator
2108*3e519524SHoward Hinnantrotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2109*3e519524SHoward Hinnant{
2110*3e519524SHoward Hinnant    return _STD::__rotate(__first, __middle, __last,
2111*3e519524SHoward Hinnant                          integral_constant
2112*3e519524SHoward Hinnant                          <
2113*3e519524SHoward Hinnant                               bool,
2114*3e519524SHoward Hinnant                               is_convertible
2115*3e519524SHoward Hinnant                               <
2116*3e519524SHoward Hinnant                                   typename iterator_traits<_ForwardIterator>::iterator_category,
2117*3e519524SHoward Hinnant                                   random_access_iterator_tag
2118*3e519524SHoward Hinnant                               >::value &&
2119*3e519524SHoward Hinnant                               has_trivial_copy_assign
2120*3e519524SHoward Hinnant                               <
2121*3e519524SHoward Hinnant                                   typename iterator_traits<_ForwardIterator>::value_type
2122*3e519524SHoward Hinnant                               >::value
2123*3e519524SHoward Hinnant                           >());
2124*3e519524SHoward Hinnant}
2125*3e519524SHoward Hinnant
2126*3e519524SHoward Hinnant// rotate_copy
2127*3e519524SHoward Hinnant
2128*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _OutputIterator>
2129*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2130*3e519524SHoward Hinnant_OutputIterator
2131*3e519524SHoward Hinnantrotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result)
2132*3e519524SHoward Hinnant{
2133*3e519524SHoward Hinnant    return _STD::copy(__first, __middle, _STD::copy(__middle, __last, __result));
2134*3e519524SHoward Hinnant}
2135*3e519524SHoward Hinnant
2136*3e519524SHoward Hinnant// min
2137*3e519524SHoward Hinnant
2138*3e519524SHoward Hinnanttemplate <class _Tp, class _Compare>
2139*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2140*3e519524SHoward Hinnantconst _Tp&
2141*3e519524SHoward Hinnantmin(const _Tp& __a, const _Tp& __b, _Compare __comp)
2142*3e519524SHoward Hinnant{
2143*3e519524SHoward Hinnant    return __comp(__b, __a) ? __b : __a;
2144*3e519524SHoward Hinnant}
2145*3e519524SHoward Hinnant
2146*3e519524SHoward Hinnanttemplate <class _Tp>
2147*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2148*3e519524SHoward Hinnantconst _Tp&
2149*3e519524SHoward Hinnantmin(const _Tp& __a, const _Tp& __b)
2150*3e519524SHoward Hinnant{
2151*3e519524SHoward Hinnant    return _STD::min(__a, __b, __less<_Tp>());
2152*3e519524SHoward Hinnant}
2153*3e519524SHoward Hinnant
2154*3e519524SHoward Hinnant// max
2155*3e519524SHoward Hinnant
2156*3e519524SHoward Hinnanttemplate <class _Tp, class _Compare>
2157*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2158*3e519524SHoward Hinnantconst _Tp&
2159*3e519524SHoward Hinnantmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
2160*3e519524SHoward Hinnant{
2161*3e519524SHoward Hinnant    return __comp(__a, __b) ? __b : __a;
2162*3e519524SHoward Hinnant}
2163*3e519524SHoward Hinnant
2164*3e519524SHoward Hinnanttemplate <class _Tp>
2165*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2166*3e519524SHoward Hinnantconst _Tp&
2167*3e519524SHoward Hinnantmax(const _Tp& __a, const _Tp& __b)
2168*3e519524SHoward Hinnant{
2169*3e519524SHoward Hinnant    return _STD::max(__a, __b, __less<_Tp>());
2170*3e519524SHoward Hinnant}
2171*3e519524SHoward Hinnant
2172*3e519524SHoward Hinnant// min_element
2173*3e519524SHoward Hinnant
2174*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Compare>
2175*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2176*3e519524SHoward Hinnant_ForwardIterator
2177*3e519524SHoward Hinnantmin_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2178*3e519524SHoward Hinnant{
2179*3e519524SHoward Hinnant    if (__first != __last)
2180*3e519524SHoward Hinnant    {
2181*3e519524SHoward Hinnant        _ForwardIterator __i = __first;
2182*3e519524SHoward Hinnant        while (++__i != __last)
2183*3e519524SHoward Hinnant            if (__comp(*__i, *__first))
2184*3e519524SHoward Hinnant                __first = __i;
2185*3e519524SHoward Hinnant    }
2186*3e519524SHoward Hinnant    return __first;
2187*3e519524SHoward Hinnant}
2188*3e519524SHoward Hinnant
2189*3e519524SHoward Hinnanttemplate <class _ForwardIterator>
2190*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2191*3e519524SHoward Hinnant_ForwardIterator
2192*3e519524SHoward Hinnantmin_element(_ForwardIterator __first, _ForwardIterator __last)
2193*3e519524SHoward Hinnant{
2194*3e519524SHoward Hinnant    return _STD::min_element(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
2195*3e519524SHoward Hinnant}
2196*3e519524SHoward Hinnant
2197*3e519524SHoward Hinnant// max_element
2198*3e519524SHoward Hinnant
2199*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Compare>
2200*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2201*3e519524SHoward Hinnant_ForwardIterator
2202*3e519524SHoward Hinnantmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2203*3e519524SHoward Hinnant{
2204*3e519524SHoward Hinnant    if (__first != __last)
2205*3e519524SHoward Hinnant    {
2206*3e519524SHoward Hinnant        _ForwardIterator __i = __first;
2207*3e519524SHoward Hinnant        while (++__i != __last)
2208*3e519524SHoward Hinnant            if (__comp(*__first, *__i))
2209*3e519524SHoward Hinnant                __first = __i;
2210*3e519524SHoward Hinnant    }
2211*3e519524SHoward Hinnant    return __first;
2212*3e519524SHoward Hinnant}
2213*3e519524SHoward Hinnant
2214*3e519524SHoward Hinnanttemplate <class _ForwardIterator>
2215*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2216*3e519524SHoward Hinnant_ForwardIterator
2217*3e519524SHoward Hinnantmax_element(_ForwardIterator __first, _ForwardIterator __last)
2218*3e519524SHoward Hinnant{
2219*3e519524SHoward Hinnant    return _STD::max_element(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
2220*3e519524SHoward Hinnant}
2221*3e519524SHoward Hinnant
2222*3e519524SHoward Hinnant// minmax_element
2223*3e519524SHoward Hinnant
2224*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Compare>
2225*3e519524SHoward Hinnantstd::pair<_ForwardIterator, _ForwardIterator>
2226*3e519524SHoward Hinnantminmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2227*3e519524SHoward Hinnant{
2228*3e519524SHoward Hinnant  std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first);
2229*3e519524SHoward Hinnant  if (__first != __last)
2230*3e519524SHoward Hinnant  {
2231*3e519524SHoward Hinnant      if (++__first != __last)
2232*3e519524SHoward Hinnant      {
2233*3e519524SHoward Hinnant          if (__comp(*__first, *__result.first))
2234*3e519524SHoward Hinnant          {
2235*3e519524SHoward Hinnant              __result.second = __result.first;
2236*3e519524SHoward Hinnant              __result.first = __first;
2237*3e519524SHoward Hinnant          }
2238*3e519524SHoward Hinnant          else
2239*3e519524SHoward Hinnant              __result.second = __first;
2240*3e519524SHoward Hinnant          while (++__first != __last)
2241*3e519524SHoward Hinnant          {
2242*3e519524SHoward Hinnant              _ForwardIterator __i = __first;
2243*3e519524SHoward Hinnant              if (++__first == __last)
2244*3e519524SHoward Hinnant              {
2245*3e519524SHoward Hinnant                  if (__comp(*__i, *__result.first))
2246*3e519524SHoward Hinnant                      __result.first = __i;
2247*3e519524SHoward Hinnant                  else if (!__comp(*__i, *__result.second))
2248*3e519524SHoward Hinnant                      __result.second = __i;
2249*3e519524SHoward Hinnant                  break;
2250*3e519524SHoward Hinnant              }
2251*3e519524SHoward Hinnant              else
2252*3e519524SHoward Hinnant              {
2253*3e519524SHoward Hinnant                  if (__comp(*__first, *__i))
2254*3e519524SHoward Hinnant                  {
2255*3e519524SHoward Hinnant                      if (__comp(*__first, *__result.first))
2256*3e519524SHoward Hinnant                          __result.first = __first;
2257*3e519524SHoward Hinnant                      if (!__comp(*__i, *__result.second))
2258*3e519524SHoward Hinnant                          __result.second = __i;
2259*3e519524SHoward Hinnant                  }
2260*3e519524SHoward Hinnant                  else
2261*3e519524SHoward Hinnant                  {
2262*3e519524SHoward Hinnant                      if (__comp(*__i, *__result.first))
2263*3e519524SHoward Hinnant                          __result.first = __i;
2264*3e519524SHoward Hinnant                      if (!__comp(*__first, *__result.second))
2265*3e519524SHoward Hinnant                          __result.second = __first;
2266*3e519524SHoward Hinnant                  }
2267*3e519524SHoward Hinnant              }
2268*3e519524SHoward Hinnant          }
2269*3e519524SHoward Hinnant      }
2270*3e519524SHoward Hinnant  }
2271*3e519524SHoward Hinnant  return __result;
2272*3e519524SHoward Hinnant}
2273*3e519524SHoward Hinnant
2274*3e519524SHoward Hinnanttemplate <class _ForwardIterator>
2275*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2276*3e519524SHoward Hinnantstd::pair<_ForwardIterator, _ForwardIterator>
2277*3e519524SHoward Hinnantminmax_element(_ForwardIterator __first, _ForwardIterator __last)
2278*3e519524SHoward Hinnant{
2279*3e519524SHoward Hinnant    return _STD::minmax_element(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
2280*3e519524SHoward Hinnant}
2281*3e519524SHoward Hinnant
2282*3e519524SHoward Hinnant// random_shuffle
2283*3e519524SHoward Hinnant
2284*3e519524SHoward Hinnanttemplate <unsigned int _Bits>
2285*3e519524SHoward Hinnantstruct __num_bits
2286*3e519524SHoward Hinnant{
2287*3e519524SHoward Hinnant    static const int __value = 1 + __num_bits<(_Bits >> 1)>::__value;
2288*3e519524SHoward Hinnant};
2289*3e519524SHoward Hinnant
2290*3e519524SHoward Hinnanttemplate <>
2291*3e519524SHoward Hinnantstruct __num_bits<0>
2292*3e519524SHoward Hinnant{
2293*3e519524SHoward Hinnant    static const int __value = 0;
2294*3e519524SHoward Hinnant};
2295*3e519524SHoward Hinnant
2296*3e519524SHoward Hinnantconst int __rbits = __num_bits<RAND_MAX>::__value;
2297*3e519524SHoward Hinnantconst int __lbits = static_cast<int>(sizeof(unsigned long) * __CHAR_BIT__);
2298*3e519524SHoward Hinnant
2299*3e519524SHoward Hinnanttemplate <int _NBits, bool = _NBits <= __rbits>
2300*3e519524SHoward Hinnantstruct __random_bits
2301*3e519524SHoward Hinnant{
2302*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY operator unsigned long () const
2303*3e519524SHoward Hinnant        {return static_cast<unsigned long>(_STD::rand()) >> (__rbits - _NBits);}
2304*3e519524SHoward Hinnant};
2305*3e519524SHoward Hinnant
2306*3e519524SHoward Hinnanttemplate <int _NBits>
2307*3e519524SHoward Hinnantstruct __random_bits<_NBits, false>
2308*3e519524SHoward Hinnant{
2309*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY operator unsigned long () const
2310*3e519524SHoward Hinnant        {return static_cast<unsigned long>(_STD::rand()) << (_NBits - __rbits) | __random_bits<_NBits - __rbits>();}
2311*3e519524SHoward Hinnant};
2312*3e519524SHoward Hinnant
2313*3e519524SHoward Hinnanttemplate <int _NBits>
2314*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2315*3e519524SHoward Hinnantunsigned long
2316*3e519524SHoward Hinnant__slab_size(unsigned long __n)
2317*3e519524SHoward Hinnant{
2318*3e519524SHoward Hinnant    return (1UL << _NBits) / __n;
2319*3e519524SHoward Hinnant}
2320*3e519524SHoward Hinnant
2321*3e519524SHoward Hinnanttemplate <>
2322*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2323*3e519524SHoward Hinnantunsigned long
2324*3e519524SHoward Hinnant__slab_size<__lbits>(unsigned long __n)
2325*3e519524SHoward Hinnant{
2326*3e519524SHoward Hinnant    if (__n & 1)
2327*3e519524SHoward Hinnant        return (unsigned long)(~0) / __n;
2328*3e519524SHoward Hinnant    return (1UL << (__lbits-1)) / (__n >> 1);
2329*3e519524SHoward Hinnant}
2330*3e519524SHoward Hinnant
2331*3e519524SHoward Hinnanttemplate <int _NBits>
2332*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2333*3e519524SHoward Hinnantunsigned long
2334*3e519524SHoward Hinnant__scaled_random_number(unsigned long __n)
2335*3e519524SHoward Hinnant{
2336*3e519524SHoward Hinnant    const unsigned long __slab = __slab_size<_NBits>(__n);
2337*3e519524SHoward Hinnant    const unsigned long __usable = __slab * __n;
2338*3e519524SHoward Hinnant    unsigned long __raw;
2339*3e519524SHoward Hinnant    do
2340*3e519524SHoward Hinnant        __raw = __random_bits<_NBits>();
2341*3e519524SHoward Hinnant    while (__raw >= __usable);
2342*3e519524SHoward Hinnant    return __raw / __slab;
2343*3e519524SHoward Hinnant}
2344*3e519524SHoward Hinnant
2345*3e519524SHoward Hinnanttemplate <bool __b, unsigned long = __lbits/__rbits> struct __rs_default;
2346*3e519524SHoward Hinnant
2347*3e519524SHoward Hinnanttemplate <bool __b>
2348*3e519524SHoward Hinnantstruct __rs_default<__b, 1>
2349*3e519524SHoward Hinnant{
2350*3e519524SHoward Hinnant    unsigned long operator()(unsigned long __n = 0) const;
2351*3e519524SHoward Hinnant};
2352*3e519524SHoward Hinnant
2353*3e519524SHoward Hinnanttemplate <bool __b>
2354*3e519524SHoward Hinnantunsigned long
2355*3e519524SHoward Hinnant__rs_default<__b, 1>::operator()(unsigned long __n) const
2356*3e519524SHoward Hinnant{
2357*3e519524SHoward Hinnant    switch (__n)
2358*3e519524SHoward Hinnant    {
2359*3e519524SHoward Hinnant    case 0:
2360*3e519524SHoward Hinnant        return __random_bits<__lbits>();
2361*3e519524SHoward Hinnant    case 1:
2362*3e519524SHoward Hinnant        return 0;
2363*3e519524SHoward Hinnant    }
2364*3e519524SHoward Hinnant    if (__n <= (1UL << __rbits))
2365*3e519524SHoward Hinnant        return __scaled_random_number<__rbits>(__n);
2366*3e519524SHoward Hinnant    return __scaled_random_number<__lbits>(__n);
2367*3e519524SHoward Hinnant}
2368*3e519524SHoward Hinnant
2369*3e519524SHoward Hinnanttemplate <bool __b>
2370*3e519524SHoward Hinnantstruct __rs_default<__b, 2>
2371*3e519524SHoward Hinnant{
2372*3e519524SHoward Hinnant    unsigned long operator()(unsigned long __n = 0) const;
2373*3e519524SHoward Hinnant};
2374*3e519524SHoward Hinnant
2375*3e519524SHoward Hinnanttemplate <bool __b>
2376*3e519524SHoward Hinnantunsigned long
2377*3e519524SHoward Hinnant__rs_default<__b, 2>::operator()(unsigned long __n) const
2378*3e519524SHoward Hinnant{
2379*3e519524SHoward Hinnant    switch (__n)
2380*3e519524SHoward Hinnant    {
2381*3e519524SHoward Hinnant    case 0:
2382*3e519524SHoward Hinnant        return __random_bits<__lbits>();
2383*3e519524SHoward Hinnant    case 1:
2384*3e519524SHoward Hinnant        return 0;
2385*3e519524SHoward Hinnant    }
2386*3e519524SHoward Hinnant    int __nb = __rbits;
2387*3e519524SHoward Hinnant    while (__nb < __lbits && __n > (1UL << __nb))
2388*3e519524SHoward Hinnant        __nb += _STD::min(__rbits, __lbits - __nb);
2389*3e519524SHoward Hinnant    switch (__nb)
2390*3e519524SHoward Hinnant    {
2391*3e519524SHoward Hinnant    case __rbits:
2392*3e519524SHoward Hinnant        return __scaled_random_number<__rbits>(__n);
2393*3e519524SHoward Hinnant    case 2*__rbits:
2394*3e519524SHoward Hinnant        return __scaled_random_number<2*__rbits>(__n);
2395*3e519524SHoward Hinnant    }
2396*3e519524SHoward Hinnant    return __scaled_random_number<__lbits>(__n);
2397*3e519524SHoward Hinnant}
2398*3e519524SHoward Hinnant
2399*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator>
2400*3e519524SHoward Hinnantvoid
2401*3e519524SHoward Hinnantrandom_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
2402*3e519524SHoward Hinnant{
2403*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2404*3e519524SHoward Hinnant    difference_type __d = __last - __first;
2405*3e519524SHoward Hinnant    if (__d > 1)
2406*3e519524SHoward Hinnant    {
2407*3e519524SHoward Hinnant        for (--__last; __first < __last; ++__first, --__d)
2408*3e519524SHoward Hinnant            swap(*__first, *(__first
2409*3e519524SHoward Hinnant                + static_cast<difference_type>(__rs_default<true>()(static_cast<unsigned long>(__d)))));
2410*3e519524SHoward Hinnant    }
2411*3e519524SHoward Hinnant}
2412*3e519524SHoward Hinnant
2413*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _RandomNumberGenerator>
2414*3e519524SHoward Hinnantvoid
2415*3e519524SHoward Hinnantrandom_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
2416*3e519524SHoward Hinnant#ifdef _LIBCPP_MOVE
2417*3e519524SHoward Hinnant               _RandomNumberGenerator&& __rand)
2418*3e519524SHoward Hinnant#else
2419*3e519524SHoward Hinnant               _RandomNumberGenerator& __rand)
2420*3e519524SHoward Hinnant#endif
2421*3e519524SHoward Hinnant{
2422*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2423*3e519524SHoward Hinnant    difference_type __d = __last - __first;
2424*3e519524SHoward Hinnant    if (__d > 1)
2425*3e519524SHoward Hinnant    {
2426*3e519524SHoward Hinnant        for (--__last; __first < __last; ++__first, --__d)
2427*3e519524SHoward Hinnant            swap(*__first, *(__first + __rand(__d)));
2428*3e519524SHoward Hinnant    }
2429*3e519524SHoward Hinnant}
2430*3e519524SHoward Hinnant
2431*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Predicate>
2432*3e519524SHoward Hinnantbool
2433*3e519524SHoward Hinnantis_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
2434*3e519524SHoward Hinnant{
2435*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
2436*3e519524SHoward Hinnant        if (!__pred(*__first))
2437*3e519524SHoward Hinnant            break;
2438*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
2439*3e519524SHoward Hinnant        if (__pred(*__first))
2440*3e519524SHoward Hinnant            return false;
2441*3e519524SHoward Hinnant    return true;
2442*3e519524SHoward Hinnant}
2443*3e519524SHoward Hinnant
2444*3e519524SHoward Hinnant// partition
2445*3e519524SHoward Hinnant
2446*3e519524SHoward Hinnanttemplate <class _Predicate, class _ForwardIterator>
2447*3e519524SHoward Hinnant_ForwardIterator
2448*3e519524SHoward Hinnant__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
2449*3e519524SHoward Hinnant{
2450*3e519524SHoward Hinnant    while (true)
2451*3e519524SHoward Hinnant    {
2452*3e519524SHoward Hinnant        if (__first == __last)
2453*3e519524SHoward Hinnant            return __first;
2454*3e519524SHoward Hinnant        if (!__pred(*__first))
2455*3e519524SHoward Hinnant            break;
2456*3e519524SHoward Hinnant        ++__first;
2457*3e519524SHoward Hinnant    }
2458*3e519524SHoward Hinnant    for (_ForwardIterator __p = __first; ++__p != __last;)
2459*3e519524SHoward Hinnant    {
2460*3e519524SHoward Hinnant        if (__pred(*__p))
2461*3e519524SHoward Hinnant        {
2462*3e519524SHoward Hinnant            swap(*__first, *__p);
2463*3e519524SHoward Hinnant            ++__first;
2464*3e519524SHoward Hinnant        }
2465*3e519524SHoward Hinnant    }
2466*3e519524SHoward Hinnant    return __first;
2467*3e519524SHoward Hinnant}
2468*3e519524SHoward Hinnant
2469*3e519524SHoward Hinnanttemplate <class _Predicate, class _BidirectionalIterator>
2470*3e519524SHoward Hinnant_BidirectionalIterator
2471*3e519524SHoward Hinnant__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
2472*3e519524SHoward Hinnant            bidirectional_iterator_tag)
2473*3e519524SHoward Hinnant{
2474*3e519524SHoward Hinnant    while (true)
2475*3e519524SHoward Hinnant    {
2476*3e519524SHoward Hinnant        while (true)
2477*3e519524SHoward Hinnant        {
2478*3e519524SHoward Hinnant            if (__first == __last)
2479*3e519524SHoward Hinnant                return __first;
2480*3e519524SHoward Hinnant            if (!__pred(*__first))
2481*3e519524SHoward Hinnant                break;
2482*3e519524SHoward Hinnant            ++__first;
2483*3e519524SHoward Hinnant        }
2484*3e519524SHoward Hinnant        do
2485*3e519524SHoward Hinnant        {
2486*3e519524SHoward Hinnant            if (__first == --__last)
2487*3e519524SHoward Hinnant                return __first;
2488*3e519524SHoward Hinnant        } while (!__pred(*__last));
2489*3e519524SHoward Hinnant        swap(*__first, *__last);
2490*3e519524SHoward Hinnant        ++__first;
2491*3e519524SHoward Hinnant    }
2492*3e519524SHoward Hinnant}
2493*3e519524SHoward Hinnant
2494*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Predicate>
2495*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2496*3e519524SHoward Hinnant_ForwardIterator
2497*3e519524SHoward Hinnantpartition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2498*3e519524SHoward Hinnant{
2499*3e519524SHoward Hinnant    return _STD::__partition<typename add_lvalue_reference<_Predicate>::type>
2500*3e519524SHoward Hinnant                            (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
2501*3e519524SHoward Hinnant}
2502*3e519524SHoward Hinnant
2503*3e519524SHoward Hinnant// partition_copy
2504*3e519524SHoward Hinnant
2505*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator1,
2506*3e519524SHoward Hinnant          class _OutputIterator2, class _Predicate>
2507*3e519524SHoward Hinnantpair<_OutputIterator1, _OutputIterator2>
2508*3e519524SHoward Hinnantpartition_copy(_InputIterator __first, _InputIterator __last,
2509*3e519524SHoward Hinnant               _OutputIterator1 __out_true, _OutputIterator2 __out_false,
2510*3e519524SHoward Hinnant               _Predicate __pred)
2511*3e519524SHoward Hinnant{
2512*3e519524SHoward Hinnant    for (; __first != __last; ++__first)
2513*3e519524SHoward Hinnant    {
2514*3e519524SHoward Hinnant        if (__pred(*__first))
2515*3e519524SHoward Hinnant        {
2516*3e519524SHoward Hinnant            *__out_true = *__first;
2517*3e519524SHoward Hinnant            ++__out_true;
2518*3e519524SHoward Hinnant        }
2519*3e519524SHoward Hinnant        else
2520*3e519524SHoward Hinnant        {
2521*3e519524SHoward Hinnant            *__out_false = *__first;
2522*3e519524SHoward Hinnant            ++__out_false;
2523*3e519524SHoward Hinnant        }
2524*3e519524SHoward Hinnant    }
2525*3e519524SHoward Hinnant    return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
2526*3e519524SHoward Hinnant}
2527*3e519524SHoward Hinnant
2528*3e519524SHoward Hinnant// partition_point
2529*3e519524SHoward Hinnant
2530*3e519524SHoward Hinnanttemplate<class _ForwardIterator, class _Predicate>
2531*3e519524SHoward Hinnant_ForwardIterator
2532*3e519524SHoward Hinnantpartition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2533*3e519524SHoward Hinnant{
2534*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
2535*3e519524SHoward Hinnant    difference_type __len = _STD::distance(__first, __last);
2536*3e519524SHoward Hinnant    while (__len != 0)
2537*3e519524SHoward Hinnant    {
2538*3e519524SHoward Hinnant        difference_type __l2 = __len / 2;
2539*3e519524SHoward Hinnant        _ForwardIterator __m = __first;
2540*3e519524SHoward Hinnant        _STD::advance(__m, __l2);
2541*3e519524SHoward Hinnant        if (__pred(*__m))
2542*3e519524SHoward Hinnant        {
2543*3e519524SHoward Hinnant            __first = ++__m;
2544*3e519524SHoward Hinnant            __len -= __l2 + 1;
2545*3e519524SHoward Hinnant        }
2546*3e519524SHoward Hinnant        else
2547*3e519524SHoward Hinnant            __len = __l2;
2548*3e519524SHoward Hinnant    }
2549*3e519524SHoward Hinnant    return __first;
2550*3e519524SHoward Hinnant}
2551*3e519524SHoward Hinnant
2552*3e519524SHoward Hinnant// stable_partition
2553*3e519524SHoward Hinnant
2554*3e519524SHoward Hinnanttemplate <class _Predicate, class _ForwardIterator, class _Distance, class _Pair>
2555*3e519524SHoward Hinnant_ForwardIterator
2556*3e519524SHoward Hinnant__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
2557*3e519524SHoward Hinnant                   _Distance __len, _Pair __p, forward_iterator_tag __fit)
2558*3e519524SHoward Hinnant{
2559*3e519524SHoward Hinnant    // *__first is known to be false
2560*3e519524SHoward Hinnant    // __len >= 1
2561*3e519524SHoward Hinnant    if (__len == 1)
2562*3e519524SHoward Hinnant        return __first;
2563*3e519524SHoward Hinnant    if (__len == 2)
2564*3e519524SHoward Hinnant    {
2565*3e519524SHoward Hinnant        _ForwardIterator __m = __first;
2566*3e519524SHoward Hinnant        if (__pred(*++__m))
2567*3e519524SHoward Hinnant        {
2568*3e519524SHoward Hinnant            swap(*__first, *__m);
2569*3e519524SHoward Hinnant            return __m;
2570*3e519524SHoward Hinnant        }
2571*3e519524SHoward Hinnant        return __first;
2572*3e519524SHoward Hinnant    }
2573*3e519524SHoward Hinnant    if (__len <= __p.second)
2574*3e519524SHoward Hinnant    {   // The buffer is big enough to use
2575*3e519524SHoward Hinnant        typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2576*3e519524SHoward Hinnant        __destruct_n __d(0);
2577*3e519524SHoward Hinnant        unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
2578*3e519524SHoward Hinnant        // Move the falses into the temporary buffer, and the trues to the front of the line
2579*3e519524SHoward Hinnant        // Update __first to always point to the end of the trues
2580*3e519524SHoward Hinnant        value_type* __t = __p.first;
2581*3e519524SHoward Hinnant        ::new(__t) value_type(_STD::move(*__first));
2582*3e519524SHoward Hinnant        __d.__incr((value_type*)0);
2583*3e519524SHoward Hinnant        ++__t;
2584*3e519524SHoward Hinnant        _ForwardIterator __i = __first;
2585*3e519524SHoward Hinnant        while (++__i != __last)
2586*3e519524SHoward Hinnant        {
2587*3e519524SHoward Hinnant            if (__pred(*__i))
2588*3e519524SHoward Hinnant            {
2589*3e519524SHoward Hinnant                *__first = _STD::move(*__i);
2590*3e519524SHoward Hinnant                ++__first;
2591*3e519524SHoward Hinnant            }
2592*3e519524SHoward Hinnant            else
2593*3e519524SHoward Hinnant            {
2594*3e519524SHoward Hinnant                ::new(__t) value_type(_STD::move(*__i));
2595*3e519524SHoward Hinnant                __d.__incr((value_type*)0);
2596*3e519524SHoward Hinnant                ++__t;
2597*3e519524SHoward Hinnant            }
2598*3e519524SHoward Hinnant        }
2599*3e519524SHoward Hinnant        // All trues now at start of range, all falses in buffer
2600*3e519524SHoward Hinnant        // Move falses back into range, but don't mess up __first which points to first false
2601*3e519524SHoward Hinnant        __i = __first;
2602*3e519524SHoward Hinnant        for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
2603*3e519524SHoward Hinnant            *__i = _STD::move(*__t2);
2604*3e519524SHoward Hinnant        // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
2605*3e519524SHoward Hinnant        return __first;
2606*3e519524SHoward Hinnant    }
2607*3e519524SHoward Hinnant    // Else not enough buffer, do in place
2608*3e519524SHoward Hinnant    // __len >= 3
2609*3e519524SHoward Hinnant    _ForwardIterator __m = __first;
2610*3e519524SHoward Hinnant    _Distance __len2 = __len / 2;  // __len2 >= 2
2611*3e519524SHoward Hinnant    _STD::advance(__m, __len2);
2612*3e519524SHoward Hinnant    // recurse on [__first, __m), *__first know to be false
2613*3e519524SHoward Hinnant    // F?????????????????
2614*3e519524SHoward Hinnant    // f       m         l
2615*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
2616*3e519524SHoward Hinnant    _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit);
2617*3e519524SHoward Hinnant    // TTTFFFFF??????????
2618*3e519524SHoward Hinnant    // f  ff   m         l
2619*3e519524SHoward Hinnant    // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
2620*3e519524SHoward Hinnant    _ForwardIterator __m1 = __m;
2621*3e519524SHoward Hinnant    _ForwardIterator __second_false = __last;
2622*3e519524SHoward Hinnant    _Distance __len_half = __len - __len2;
2623*3e519524SHoward Hinnant    while (__pred(*__m1))
2624*3e519524SHoward Hinnant    {
2625*3e519524SHoward Hinnant        if (++__m1 == __last)
2626*3e519524SHoward Hinnant            goto __second_half_done;
2627*3e519524SHoward Hinnant        --__len_half;
2628*3e519524SHoward Hinnant    }
2629*3e519524SHoward Hinnant    // TTTFFFFFTTTF??????
2630*3e519524SHoward Hinnant    // f  ff   m  m1     l
2631*3e519524SHoward Hinnant    __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit);
2632*3e519524SHoward Hinnant__second_half_done:
2633*3e519524SHoward Hinnant    // TTTFFFFFTTTTTFFFFF
2634*3e519524SHoward Hinnant    // f  ff   m    sf   l
2635*3e519524SHoward Hinnant    return _STD::rotate(__first_false, __m, __second_false);
2636*3e519524SHoward Hinnant    // TTTTTTTTFFFFFFFFFF
2637*3e519524SHoward Hinnant    //         |
2638*3e519524SHoward Hinnant}
2639*3e519524SHoward Hinnant
2640*3e519524SHoward Hinnantstruct __return_temporary_buffer
2641*3e519524SHoward Hinnant{
2642*3e519524SHoward Hinnant    template <class _Tp>
2643*3e519524SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_STD::return_temporary_buffer(__p);}
2644*3e519524SHoward Hinnant};
2645*3e519524SHoward Hinnant
2646*3e519524SHoward Hinnanttemplate <class _Predicate, class _ForwardIterator>
2647*3e519524SHoward Hinnant_ForwardIterator
2648*3e519524SHoward Hinnant__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
2649*3e519524SHoward Hinnant                   forward_iterator_tag)
2650*3e519524SHoward Hinnant{
2651*3e519524SHoward Hinnant    const unsigned __alloc_limit = 3;  // might want to make this a function of trivial assignment
2652*3e519524SHoward Hinnant    // Either prove all true and return __first or point to first false
2653*3e519524SHoward Hinnant    while (true)
2654*3e519524SHoward Hinnant    {
2655*3e519524SHoward Hinnant        if (__first == __last)
2656*3e519524SHoward Hinnant            return __first;
2657*3e519524SHoward Hinnant        if (!__pred(*__first))
2658*3e519524SHoward Hinnant            break;
2659*3e519524SHoward Hinnant        ++__first;
2660*3e519524SHoward Hinnant    }
2661*3e519524SHoward Hinnant    // We now have a reduced range [__first, __last)
2662*3e519524SHoward Hinnant    // *__first is known to be false
2663*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
2664*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2665*3e519524SHoward Hinnant    difference_type __len = _STD::distance(__first, __last);
2666*3e519524SHoward Hinnant    pair<value_type*, ptrdiff_t> __p(0, 0);
2667*3e519524SHoward Hinnant    unique_ptr<value_type, __return_temporary_buffer> __h;
2668*3e519524SHoward Hinnant    if (__len >= __alloc_limit)
2669*3e519524SHoward Hinnant    {
2670*3e519524SHoward Hinnant        __p = _STD::get_temporary_buffer<value_type>(__len);
2671*3e519524SHoward Hinnant        __h.reset(__p.first);
2672*3e519524SHoward Hinnant    }
2673*3e519524SHoward Hinnant    return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
2674*3e519524SHoward Hinnant                             (__first, __last, __pred, __len, __p, forward_iterator_tag());
2675*3e519524SHoward Hinnant}
2676*3e519524SHoward Hinnant
2677*3e519524SHoward Hinnanttemplate <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair>
2678*3e519524SHoward Hinnant_BidirectionalIterator
2679*3e519524SHoward Hinnant__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
2680*3e519524SHoward Hinnant                   _Distance __len, _Pair __p, bidirectional_iterator_tag __bit)
2681*3e519524SHoward Hinnant{
2682*3e519524SHoward Hinnant    // *__first is known to be false
2683*3e519524SHoward Hinnant    // *__last is known to be true
2684*3e519524SHoward Hinnant    // __len >= 2
2685*3e519524SHoward Hinnant    if (__len == 2)
2686*3e519524SHoward Hinnant    {
2687*3e519524SHoward Hinnant        swap(*__first, *__last);
2688*3e519524SHoward Hinnant        return __last;
2689*3e519524SHoward Hinnant    }
2690*3e519524SHoward Hinnant    if (__len == 3)
2691*3e519524SHoward Hinnant    {
2692*3e519524SHoward Hinnant        _BidirectionalIterator __m = __first;
2693*3e519524SHoward Hinnant        if (__pred(*++__m))
2694*3e519524SHoward Hinnant        {
2695*3e519524SHoward Hinnant            swap(*__first, *__m);
2696*3e519524SHoward Hinnant            swap(*__m, *__last);
2697*3e519524SHoward Hinnant            return __last;
2698*3e519524SHoward Hinnant        }
2699*3e519524SHoward Hinnant        swap(*__m, *__last);
2700*3e519524SHoward Hinnant        swap(*__first, *__m);
2701*3e519524SHoward Hinnant        return __m;
2702*3e519524SHoward Hinnant    }
2703*3e519524SHoward Hinnant    if (__len <= __p.second)
2704*3e519524SHoward Hinnant    {   // The buffer is big enough to use
2705*3e519524SHoward Hinnant        typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
2706*3e519524SHoward Hinnant        __destruct_n __d(0);
2707*3e519524SHoward Hinnant        unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
2708*3e519524SHoward Hinnant        // Move the falses into the temporary buffer, and the trues to the front of the line
2709*3e519524SHoward Hinnant        // Update __first to always point to the end of the trues
2710*3e519524SHoward Hinnant        value_type* __t = __p.first;
2711*3e519524SHoward Hinnant        ::new(__t) value_type(_STD::move(*__first));
2712*3e519524SHoward Hinnant        __d.__incr((value_type*)0);
2713*3e519524SHoward Hinnant        ++__t;
2714*3e519524SHoward Hinnant        _BidirectionalIterator __i = __first;
2715*3e519524SHoward Hinnant        while (++__i != __last)
2716*3e519524SHoward Hinnant        {
2717*3e519524SHoward Hinnant            if (__pred(*__i))
2718*3e519524SHoward Hinnant            {
2719*3e519524SHoward Hinnant                *__first = _STD::move(*__i);
2720*3e519524SHoward Hinnant                ++__first;
2721*3e519524SHoward Hinnant            }
2722*3e519524SHoward Hinnant            else
2723*3e519524SHoward Hinnant            {
2724*3e519524SHoward Hinnant                ::new(__t) value_type(_STD::move(*__i));
2725*3e519524SHoward Hinnant                __d.__incr((value_type*)0);
2726*3e519524SHoward Hinnant                ++__t;
2727*3e519524SHoward Hinnant            }
2728*3e519524SHoward Hinnant        }
2729*3e519524SHoward Hinnant        // move *__last, known to be true
2730*3e519524SHoward Hinnant        *__first = _STD::move(*__i);
2731*3e519524SHoward Hinnant        __i = ++__first;
2732*3e519524SHoward Hinnant        // All trues now at start of range, all falses in buffer
2733*3e519524SHoward Hinnant        // Move falses back into range, but don't mess up __first which points to first false
2734*3e519524SHoward Hinnant        for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
2735*3e519524SHoward Hinnant            *__i = _STD::move(*__t2);
2736*3e519524SHoward Hinnant        // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
2737*3e519524SHoward Hinnant        return __first;
2738*3e519524SHoward Hinnant    }
2739*3e519524SHoward Hinnant    // Else not enough buffer, do in place
2740*3e519524SHoward Hinnant    // __len >= 4
2741*3e519524SHoward Hinnant    _BidirectionalIterator __m = __first;
2742*3e519524SHoward Hinnant    _Distance __len2 = __len / 2;  // __len2 >= 2
2743*3e519524SHoward Hinnant    _STD::advance(__m, __len2);
2744*3e519524SHoward Hinnant    // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false
2745*3e519524SHoward Hinnant    // F????????????????T
2746*3e519524SHoward Hinnant    // f       m        l
2747*3e519524SHoward Hinnant    _BidirectionalIterator __m1 = __m;
2748*3e519524SHoward Hinnant    _BidirectionalIterator __first_false = __first;
2749*3e519524SHoward Hinnant    _Distance __len_half = __len2;
2750*3e519524SHoward Hinnant    while (!__pred(*--__m1))
2751*3e519524SHoward Hinnant    {
2752*3e519524SHoward Hinnant        if (__m1 == __first)
2753*3e519524SHoward Hinnant            goto __first_half_done;
2754*3e519524SHoward Hinnant        --__len_half;
2755*3e519524SHoward Hinnant    }
2756*3e519524SHoward Hinnant    // F???TFFF?????????T
2757*3e519524SHoward Hinnant    // f   m1  m        l
2758*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
2759*3e519524SHoward Hinnant    __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit);
2760*3e519524SHoward Hinnant__first_half_done:
2761*3e519524SHoward Hinnant    // TTTFFFFF?????????T
2762*3e519524SHoward Hinnant    // f  ff   m        l
2763*3e519524SHoward Hinnant    // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
2764*3e519524SHoward Hinnant    __m1 = __m;
2765*3e519524SHoward Hinnant    _BidirectionalIterator __second_false = __last;
2766*3e519524SHoward Hinnant    ++__second_false;
2767*3e519524SHoward Hinnant    __len_half = __len - __len2;
2768*3e519524SHoward Hinnant    while (__pred(*__m1))
2769*3e519524SHoward Hinnant    {
2770*3e519524SHoward Hinnant        if (++__m1 == __last)
2771*3e519524SHoward Hinnant            goto __second_half_done;
2772*3e519524SHoward Hinnant        --__len_half;
2773*3e519524SHoward Hinnant    }
2774*3e519524SHoward Hinnant    // TTTFFFFFTTTF?????T
2775*3e519524SHoward Hinnant    // f  ff   m  m1    l
2776*3e519524SHoward Hinnant    __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit);
2777*3e519524SHoward Hinnant__second_half_done:
2778*3e519524SHoward Hinnant    // TTTFFFFFTTTTTFFFFF
2779*3e519524SHoward Hinnant    // f  ff   m    sf  l
2780*3e519524SHoward Hinnant    return _STD::rotate(__first_false, __m, __second_false);
2781*3e519524SHoward Hinnant    // TTTTTTTTFFFFFFFFFF
2782*3e519524SHoward Hinnant    //         |
2783*3e519524SHoward Hinnant}
2784*3e519524SHoward Hinnant
2785*3e519524SHoward Hinnanttemplate <class _Predicate, class _BidirectionalIterator>
2786*3e519524SHoward Hinnant_BidirectionalIterator
2787*3e519524SHoward Hinnant__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
2788*3e519524SHoward Hinnant                   bidirectional_iterator_tag)
2789*3e519524SHoward Hinnant{
2790*3e519524SHoward Hinnant    typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
2791*3e519524SHoward Hinnant    typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
2792*3e519524SHoward Hinnant    const difference_type __alloc_limit = 4;  // might want to make this a function of trivial assignment
2793*3e519524SHoward Hinnant    // Either prove all true and return __first or point to first false
2794*3e519524SHoward Hinnant    while (true)
2795*3e519524SHoward Hinnant    {
2796*3e519524SHoward Hinnant        if (__first == __last)
2797*3e519524SHoward Hinnant            return __first;
2798*3e519524SHoward Hinnant        if (!__pred(*__first))
2799*3e519524SHoward Hinnant            break;
2800*3e519524SHoward Hinnant        ++__first;
2801*3e519524SHoward Hinnant    }
2802*3e519524SHoward Hinnant    // __first points to first false, everything prior to __first is already set.
2803*3e519524SHoward Hinnant    // Either prove [__first, __last) is all false and return __first, or point __last to last true
2804*3e519524SHoward Hinnant    do
2805*3e519524SHoward Hinnant    {
2806*3e519524SHoward Hinnant        if (__first == --__last)
2807*3e519524SHoward Hinnant            return __first;
2808*3e519524SHoward Hinnant    } while (!__pred(*__last));
2809*3e519524SHoward Hinnant    // We now have a reduced range [__first, __last]
2810*3e519524SHoward Hinnant    // *__first is known to be false
2811*3e519524SHoward Hinnant    // *__last is known to be true
2812*3e519524SHoward Hinnant    // __len >= 2
2813*3e519524SHoward Hinnant    difference_type __len = _STD::distance(__first, __last) + 1;
2814*3e519524SHoward Hinnant    pair<value_type*, ptrdiff_t> __p(0, 0);
2815*3e519524SHoward Hinnant    unique_ptr<value_type, __return_temporary_buffer> __h;
2816*3e519524SHoward Hinnant    if (__len >= __alloc_limit)
2817*3e519524SHoward Hinnant    {
2818*3e519524SHoward Hinnant        __p = _STD::get_temporary_buffer<value_type>(__len);
2819*3e519524SHoward Hinnant        __h.reset(__p.first);
2820*3e519524SHoward Hinnant    }
2821*3e519524SHoward Hinnant    return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
2822*3e519524SHoward Hinnant                             (__first, __last, __pred, __len, __p, bidirectional_iterator_tag());
2823*3e519524SHoward Hinnant}
2824*3e519524SHoward Hinnant
2825*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Predicate>
2826*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2827*3e519524SHoward Hinnant_ForwardIterator
2828*3e519524SHoward Hinnantstable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2829*3e519524SHoward Hinnant{
2830*3e519524SHoward Hinnant    return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
2831*3e519524SHoward Hinnant                             (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
2832*3e519524SHoward Hinnant}
2833*3e519524SHoward Hinnant
2834*3e519524SHoward Hinnant// is_sorted_until
2835*3e519524SHoward Hinnant
2836*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Compare>
2837*3e519524SHoward Hinnant_ForwardIterator
2838*3e519524SHoward Hinnantis_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2839*3e519524SHoward Hinnant{
2840*3e519524SHoward Hinnant    if (__first != __last)
2841*3e519524SHoward Hinnant    {
2842*3e519524SHoward Hinnant        _ForwardIterator __i = __first;
2843*3e519524SHoward Hinnant        while (++__i != __last)
2844*3e519524SHoward Hinnant        {
2845*3e519524SHoward Hinnant            if (__comp(*__i, *__first))
2846*3e519524SHoward Hinnant                return __i;
2847*3e519524SHoward Hinnant            __first = __i;
2848*3e519524SHoward Hinnant        }
2849*3e519524SHoward Hinnant    }
2850*3e519524SHoward Hinnant    return __last;
2851*3e519524SHoward Hinnant}
2852*3e519524SHoward Hinnant
2853*3e519524SHoward Hinnanttemplate<class _ForwardIterator>
2854*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2855*3e519524SHoward Hinnant_ForwardIterator
2856*3e519524SHoward Hinnantis_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
2857*3e519524SHoward Hinnant{
2858*3e519524SHoward Hinnant    return _STD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
2859*3e519524SHoward Hinnant}
2860*3e519524SHoward Hinnant
2861*3e519524SHoward Hinnant// is_sorted
2862*3e519524SHoward Hinnant
2863*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Compare>
2864*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2865*3e519524SHoward Hinnantbool
2866*3e519524SHoward Hinnantis_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2867*3e519524SHoward Hinnant{
2868*3e519524SHoward Hinnant    return _STD::is_sorted_until(__first, __last, __comp) == __last;
2869*3e519524SHoward Hinnant}
2870*3e519524SHoward Hinnant
2871*3e519524SHoward Hinnanttemplate<class _ForwardIterator>
2872*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2873*3e519524SHoward Hinnantbool
2874*3e519524SHoward Hinnantis_sorted(_ForwardIterator __first, _ForwardIterator __last)
2875*3e519524SHoward Hinnant{
2876*3e519524SHoward Hinnant    return _STD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
2877*3e519524SHoward Hinnant}
2878*3e519524SHoward Hinnant
2879*3e519524SHoward Hinnant// sort
2880*3e519524SHoward Hinnant
2881*3e519524SHoward Hinnant// stable, 2-3 compares, 0-2 swaps
2882*3e519524SHoward Hinnant
2883*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator>
2884*3e519524SHoward Hinnantunsigned
2885*3e519524SHoward Hinnant__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c)
2886*3e519524SHoward Hinnant{
2887*3e519524SHoward Hinnant    unsigned __r = 0;
2888*3e519524SHoward Hinnant    if (!__c(*__y, *__x))          // if x <= y
2889*3e519524SHoward Hinnant    {
2890*3e519524SHoward Hinnant        if (!__c(*__z, *__y))      // if y <= z
2891*3e519524SHoward Hinnant            return __r;            // x <= y && y <= z
2892*3e519524SHoward Hinnant                                   // x <= y && y > z
2893*3e519524SHoward Hinnant        swap(*__y, *__z);          // x <= z && y < z
2894*3e519524SHoward Hinnant        __r = 1;
2895*3e519524SHoward Hinnant        if (__c(*__y, *__x))       // if x > y
2896*3e519524SHoward Hinnant        {
2897*3e519524SHoward Hinnant            swap(*__x, *__y);      // x < y && y <= z
2898*3e519524SHoward Hinnant            __r = 2;
2899*3e519524SHoward Hinnant        }
2900*3e519524SHoward Hinnant        return __r;                // x <= y && y < z
2901*3e519524SHoward Hinnant    }
2902*3e519524SHoward Hinnant    if (__c(*__z, *__y))           // x > y, if y > z
2903*3e519524SHoward Hinnant    {
2904*3e519524SHoward Hinnant        swap(*__x, *__z);          // x < y && y < z
2905*3e519524SHoward Hinnant        __r = 1;
2906*3e519524SHoward Hinnant        return __r;
2907*3e519524SHoward Hinnant    }
2908*3e519524SHoward Hinnant    swap(*__x, *__y);              // x > y && y <= z
2909*3e519524SHoward Hinnant    __r = 1;                       // x < y && x <= z
2910*3e519524SHoward Hinnant    if (__c(*__z, *__y))           // if y > z
2911*3e519524SHoward Hinnant    {
2912*3e519524SHoward Hinnant        swap(*__y, *__z);          // x <= y && y < z
2913*3e519524SHoward Hinnant        __r = 2;
2914*3e519524SHoward Hinnant    }
2915*3e519524SHoward Hinnant    return __r;
2916*3e519524SHoward Hinnant}                                  // x <= y && y <= z
2917*3e519524SHoward Hinnant
2918*3e519524SHoward Hinnant// stable, 3-6 compares, 0-5 swaps
2919*3e519524SHoward Hinnant
2920*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator>
2921*3e519524SHoward Hinnantunsigned
2922*3e519524SHoward Hinnant__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
2923*3e519524SHoward Hinnant            _ForwardIterator __x4, _Compare __c)
2924*3e519524SHoward Hinnant{
2925*3e519524SHoward Hinnant    unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c);
2926*3e519524SHoward Hinnant    if (__c(*__x4, *__x3))
2927*3e519524SHoward Hinnant    {
2928*3e519524SHoward Hinnant        swap(*__x3, *__x4);
2929*3e519524SHoward Hinnant        ++__r;
2930*3e519524SHoward Hinnant        if (__c(*__x3, *__x2))
2931*3e519524SHoward Hinnant        {
2932*3e519524SHoward Hinnant            swap(*__x2, *__x3);
2933*3e519524SHoward Hinnant            ++__r;
2934*3e519524SHoward Hinnant            if (__c(*__x2, *__x1))
2935*3e519524SHoward Hinnant            {
2936*3e519524SHoward Hinnant                swap(*__x1, *__x2);
2937*3e519524SHoward Hinnant                ++__r;
2938*3e519524SHoward Hinnant            }
2939*3e519524SHoward Hinnant        }
2940*3e519524SHoward Hinnant    }
2941*3e519524SHoward Hinnant    return __r;
2942*3e519524SHoward Hinnant}
2943*3e519524SHoward Hinnant
2944*3e519524SHoward Hinnant// stable, 4-10 compares, 0-9 swaps
2945*3e519524SHoward Hinnant
2946*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator>
2947*3e519524SHoward Hinnantunsigned
2948*3e519524SHoward Hinnant__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
2949*3e519524SHoward Hinnant            _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c)
2950*3e519524SHoward Hinnant{
2951*3e519524SHoward Hinnant    unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c);
2952*3e519524SHoward Hinnant    if (__c(*__x5, *__x4))
2953*3e519524SHoward Hinnant    {
2954*3e519524SHoward Hinnant        swap(*__x4, *__x5);
2955*3e519524SHoward Hinnant        ++__r;
2956*3e519524SHoward Hinnant        if (__c(*__x4, *__x3))
2957*3e519524SHoward Hinnant        {
2958*3e519524SHoward Hinnant            swap(*__x3, *__x4);
2959*3e519524SHoward Hinnant            ++__r;
2960*3e519524SHoward Hinnant            if (__c(*__x3, *__x2))
2961*3e519524SHoward Hinnant            {
2962*3e519524SHoward Hinnant                swap(*__x2, *__x3);
2963*3e519524SHoward Hinnant                ++__r;
2964*3e519524SHoward Hinnant                if (__c(*__x2, *__x1))
2965*3e519524SHoward Hinnant                {
2966*3e519524SHoward Hinnant                    swap(*__x1, *__x2);
2967*3e519524SHoward Hinnant                    ++__r;
2968*3e519524SHoward Hinnant                }
2969*3e519524SHoward Hinnant            }
2970*3e519524SHoward Hinnant        }
2971*3e519524SHoward Hinnant    }
2972*3e519524SHoward Hinnant    return __r;
2973*3e519524SHoward Hinnant}
2974*3e519524SHoward Hinnant
2975*3e519524SHoward Hinnant// Assumes size > 0
2976*3e519524SHoward Hinnanttemplate <class _Compare, class _BirdirectionalIterator>
2977*3e519524SHoward Hinnantvoid
2978*3e519524SHoward Hinnant__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
2979*3e519524SHoward Hinnant{
2980*3e519524SHoward Hinnant    _BirdirectionalIterator __lm1 = __last;
2981*3e519524SHoward Hinnant    for (--__lm1; __first != __lm1; ++__first)
2982*3e519524SHoward Hinnant    {
2983*3e519524SHoward Hinnant        _BirdirectionalIterator __i = _STD::min_element<_BirdirectionalIterator,
2984*3e519524SHoward Hinnant                                                        typename add_lvalue_reference<_Compare>::type>
2985*3e519524SHoward Hinnant                                                       (__first, __last, __comp);
2986*3e519524SHoward Hinnant        if (__i != __first)
2987*3e519524SHoward Hinnant            swap(*__first, *__i);
2988*3e519524SHoward Hinnant    }
2989*3e519524SHoward Hinnant}
2990*3e519524SHoward Hinnant
2991*3e519524SHoward Hinnanttemplate <class _Compare, class _BirdirectionalIterator>
2992*3e519524SHoward Hinnantvoid
2993*3e519524SHoward Hinnant__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
2994*3e519524SHoward Hinnant{
2995*3e519524SHoward Hinnant    typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
2996*3e519524SHoward Hinnant    if (__first != __last)
2997*3e519524SHoward Hinnant    {
2998*3e519524SHoward Hinnant        _BirdirectionalIterator __i = __first;
2999*3e519524SHoward Hinnant        for (++__i; __i != __last; ++__i)
3000*3e519524SHoward Hinnant        {
3001*3e519524SHoward Hinnant            _BirdirectionalIterator __j = __i;
3002*3e519524SHoward Hinnant            value_type __t(_STD::move(*__j));
3003*3e519524SHoward Hinnant            for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t,  *--__k); --__j)
3004*3e519524SHoward Hinnant                *__j = _STD::move(*__k);
3005*3e519524SHoward Hinnant            *__j = _STD::move(__t);
3006*3e519524SHoward Hinnant        }
3007*3e519524SHoward Hinnant    }
3008*3e519524SHoward Hinnant}
3009*3e519524SHoward Hinnant
3010*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator>
3011*3e519524SHoward Hinnantvoid
3012*3e519524SHoward Hinnant__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3013*3e519524SHoward Hinnant{
3014*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3015*3e519524SHoward Hinnant    _RandomAccessIterator __j = __first+2;
3016*3e519524SHoward Hinnant    __sort3<_Compare>(__first, __first+1, __j, __comp);
3017*3e519524SHoward Hinnant    for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3018*3e519524SHoward Hinnant    {
3019*3e519524SHoward Hinnant        if (__comp(*__i, *__j))
3020*3e519524SHoward Hinnant        {
3021*3e519524SHoward Hinnant            value_type __t(_STD::move(*__i));
3022*3e519524SHoward Hinnant            _RandomAccessIterator __k = __j;
3023*3e519524SHoward Hinnant            __j = __i;
3024*3e519524SHoward Hinnant            do
3025*3e519524SHoward Hinnant            {
3026*3e519524SHoward Hinnant                *__j = _STD::move(*__k);
3027*3e519524SHoward Hinnant                __j = __k;
3028*3e519524SHoward Hinnant            } while (__j != __first && __comp(__t, *--__k));
3029*3e519524SHoward Hinnant            *__j = _STD::move(__t);
3030*3e519524SHoward Hinnant        }
3031*3e519524SHoward Hinnant        __j = __i;
3032*3e519524SHoward Hinnant    }
3033*3e519524SHoward Hinnant}
3034*3e519524SHoward Hinnant
3035*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator>
3036*3e519524SHoward Hinnantbool
3037*3e519524SHoward Hinnant__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3038*3e519524SHoward Hinnant{
3039*3e519524SHoward Hinnant    switch (__last - __first)
3040*3e519524SHoward Hinnant    {
3041*3e519524SHoward Hinnant    case 0:
3042*3e519524SHoward Hinnant    case 1:
3043*3e519524SHoward Hinnant        return true;
3044*3e519524SHoward Hinnant    case 2:
3045*3e519524SHoward Hinnant        if (__comp(*--__last, *__first))
3046*3e519524SHoward Hinnant            swap(*__first, *__last);
3047*3e519524SHoward Hinnant        return true;
3048*3e519524SHoward Hinnant    case 3:
3049*3e519524SHoward Hinnant        _STD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
3050*3e519524SHoward Hinnant        return true;
3051*3e519524SHoward Hinnant    case 4:
3052*3e519524SHoward Hinnant        _STD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
3053*3e519524SHoward Hinnant        return true;
3054*3e519524SHoward Hinnant    case 5:
3055*3e519524SHoward Hinnant        _STD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
3056*3e519524SHoward Hinnant        return true;
3057*3e519524SHoward Hinnant    }
3058*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3059*3e519524SHoward Hinnant    _RandomAccessIterator __j = __first+2;
3060*3e519524SHoward Hinnant    __sort3<_Compare>(__first, __first+1, __j, __comp);
3061*3e519524SHoward Hinnant    const unsigned __limit = 8;
3062*3e519524SHoward Hinnant    unsigned __count = 0;
3063*3e519524SHoward Hinnant    for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3064*3e519524SHoward Hinnant    {
3065*3e519524SHoward Hinnant        if (__comp(*__i, *__j))
3066*3e519524SHoward Hinnant        {
3067*3e519524SHoward Hinnant            value_type __t(_STD::move(*__i));
3068*3e519524SHoward Hinnant            _RandomAccessIterator __k = __j;
3069*3e519524SHoward Hinnant            __j = __i;
3070*3e519524SHoward Hinnant            do
3071*3e519524SHoward Hinnant            {
3072*3e519524SHoward Hinnant                *__j = _STD::move(*__k);
3073*3e519524SHoward Hinnant                __j = __k;
3074*3e519524SHoward Hinnant            } while (__j != __first && __comp(__t, *--__k));
3075*3e519524SHoward Hinnant            *__j = _STD::move(__t);
3076*3e519524SHoward Hinnant            if (++__count == __limit)
3077*3e519524SHoward Hinnant                return ++__i == __last;
3078*3e519524SHoward Hinnant        }
3079*3e519524SHoward Hinnant        __j = __i;
3080*3e519524SHoward Hinnant    }
3081*3e519524SHoward Hinnant    return true;
3082*3e519524SHoward Hinnant}
3083*3e519524SHoward Hinnant
3084*3e519524SHoward Hinnanttemplate <class _Compare, class _BirdirectionalIterator>
3085*3e519524SHoward Hinnantvoid
3086*3e519524SHoward Hinnant__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1,
3087*3e519524SHoward Hinnant                      typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp)
3088*3e519524SHoward Hinnant{
3089*3e519524SHoward Hinnant    typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3090*3e519524SHoward Hinnant    if (__first1 != __last1)
3091*3e519524SHoward Hinnant    {
3092*3e519524SHoward Hinnant        __destruct_n __d(0);
3093*3e519524SHoward Hinnant        unique_ptr<value_type, __destruct_n&> __h(__first2, __d);
3094*3e519524SHoward Hinnant        value_type* __last2 = __first2;
3095*3e519524SHoward Hinnant        ::new(__last2) value_type(_STD::move(*__first1));
3096*3e519524SHoward Hinnant        __d.__incr((value_type*)0);
3097*3e519524SHoward Hinnant        for (++__last2; ++__first1 != __last1; ++__last2)
3098*3e519524SHoward Hinnant        {
3099*3e519524SHoward Hinnant            value_type* __j2 = __last2;
3100*3e519524SHoward Hinnant            value_type* __i2 = __j2;
3101*3e519524SHoward Hinnant            if (__comp(*__first1, *--__i2))
3102*3e519524SHoward Hinnant            {
3103*3e519524SHoward Hinnant                ::new(__j2) value_type(_STD::move(*__i2));
3104*3e519524SHoward Hinnant                __d.__incr((value_type*)0);
3105*3e519524SHoward Hinnant                for (--__j2; __i2 != __first2 && __comp(*__first1,  *--__i2); --__j2)
3106*3e519524SHoward Hinnant                    *__j2 = _STD::move(*__i2);
3107*3e519524SHoward Hinnant                *__j2 = _STD::move(*__first1);
3108*3e519524SHoward Hinnant            }
3109*3e519524SHoward Hinnant            else
3110*3e519524SHoward Hinnant            {
3111*3e519524SHoward Hinnant                ::new(__j2) value_type(_STD::move(*__first1));
3112*3e519524SHoward Hinnant                __d.__incr((value_type*)0);
3113*3e519524SHoward Hinnant            }
3114*3e519524SHoward Hinnant        }
3115*3e519524SHoward Hinnant        __h.release();
3116*3e519524SHoward Hinnant    }
3117*3e519524SHoward Hinnant}
3118*3e519524SHoward Hinnant
3119*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator>
3120*3e519524SHoward Hinnantvoid
3121*3e519524SHoward Hinnant__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3122*3e519524SHoward Hinnant{
3123*3e519524SHoward Hinnant    // _Compare is known to be a reference type
3124*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3125*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3126*3e519524SHoward Hinnant    const difference_type __limit = has_trivial_copy_constructor<value_type>::value &&
3127*3e519524SHoward Hinnant                                    has_trivial_copy_assign<value_type>::value ? 30 : 6;
3128*3e519524SHoward Hinnant    while (true)
3129*3e519524SHoward Hinnant    {
3130*3e519524SHoward Hinnant    __restart:
3131*3e519524SHoward Hinnant        difference_type __len = __last - __first;
3132*3e519524SHoward Hinnant        switch (__len)
3133*3e519524SHoward Hinnant        {
3134*3e519524SHoward Hinnant        case 0:
3135*3e519524SHoward Hinnant        case 1:
3136*3e519524SHoward Hinnant            return;
3137*3e519524SHoward Hinnant        case 2:
3138*3e519524SHoward Hinnant            if (__comp(*--__last, *__first))
3139*3e519524SHoward Hinnant                swap(*__first, *__last);
3140*3e519524SHoward Hinnant            return;
3141*3e519524SHoward Hinnant        case 3:
3142*3e519524SHoward Hinnant            _STD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
3143*3e519524SHoward Hinnant            return;
3144*3e519524SHoward Hinnant        case 4:
3145*3e519524SHoward Hinnant            _STD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
3146*3e519524SHoward Hinnant            return;
3147*3e519524SHoward Hinnant        case 5:
3148*3e519524SHoward Hinnant            _STD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
3149*3e519524SHoward Hinnant            return;
3150*3e519524SHoward Hinnant        }
3151*3e519524SHoward Hinnant        if (__len <= __limit)
3152*3e519524SHoward Hinnant        {
3153*3e519524SHoward Hinnant            _STD::__insertion_sort_3<_Compare>(__first, __last, __comp);
3154*3e519524SHoward Hinnant            return;
3155*3e519524SHoward Hinnant        }
3156*3e519524SHoward Hinnant        // __len > 5
3157*3e519524SHoward Hinnant        _RandomAccessIterator __m = __first;
3158*3e519524SHoward Hinnant        _RandomAccessIterator __lm1 = __last;
3159*3e519524SHoward Hinnant        --__lm1;
3160*3e519524SHoward Hinnant        unsigned __n_swaps;
3161*3e519524SHoward Hinnant        {
3162*3e519524SHoward Hinnant        difference_type __delta;
3163*3e519524SHoward Hinnant        if (__len >= 1000)
3164*3e519524SHoward Hinnant        {
3165*3e519524SHoward Hinnant            __delta = __len/2;
3166*3e519524SHoward Hinnant            __m += __delta;
3167*3e519524SHoward Hinnant            __delta /= 2;
3168*3e519524SHoward Hinnant            __n_swaps = _STD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp);
3169*3e519524SHoward Hinnant        }
3170*3e519524SHoward Hinnant        else
3171*3e519524SHoward Hinnant        {
3172*3e519524SHoward Hinnant            __delta = __len/2;
3173*3e519524SHoward Hinnant            __m += __delta;
3174*3e519524SHoward Hinnant            __n_swaps = _STD::__sort3<_Compare>(__first, __m, __lm1, __comp);
3175*3e519524SHoward Hinnant        }
3176*3e519524SHoward Hinnant        }
3177*3e519524SHoward Hinnant        // *__m is median
3178*3e519524SHoward Hinnant        // partition [__first, __m) < *__m and *__m <= [__m, __last)
3179*3e519524SHoward Hinnant        // (this inhibits tossing elements equivalent to __m around unnecessarily)
3180*3e519524SHoward Hinnant        _RandomAccessIterator __i = __first;
3181*3e519524SHoward Hinnant        _RandomAccessIterator __j = __lm1;
3182*3e519524SHoward Hinnant        // j points beyond range to be tested, *__m is known to be <= *__lm1
3183*3e519524SHoward Hinnant        // The search going up is known to be guarded but the search coming down isn't.
3184*3e519524SHoward Hinnant        // Prime the downward search with a guard.
3185*3e519524SHoward Hinnant        if (!__comp(*__i, *__m))  // if *__first == *__m
3186*3e519524SHoward Hinnant        {
3187*3e519524SHoward Hinnant            // *__first == *__m, *__first doesn't go in first part
3188*3e519524SHoward Hinnant            // manually guard downward moving __j against __i
3189*3e519524SHoward Hinnant            while (true)
3190*3e519524SHoward Hinnant            {
3191*3e519524SHoward Hinnant                if (__i == --__j)
3192*3e519524SHoward Hinnant                {
3193*3e519524SHoward Hinnant                    // *__first == *__m, *__m <= all other elements
3194*3e519524SHoward Hinnant                    // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
3195*3e519524SHoward Hinnant                    ++__i;  // __first + 1
3196*3e519524SHoward Hinnant                    __j = __last;
3197*3e519524SHoward Hinnant                    if (!__comp(*__first, *--__j))  // we need a guard if *__first == *(__last-1)
3198*3e519524SHoward Hinnant                    {
3199*3e519524SHoward Hinnant                        while (true)
3200*3e519524SHoward Hinnant                        {
3201*3e519524SHoward Hinnant                            if (__i == __j)
3202*3e519524SHoward Hinnant                                return;  // [__first, __last) all equivalent elements
3203*3e519524SHoward Hinnant                            if (__comp(*__first, *__i))
3204*3e519524SHoward Hinnant                            {
3205*3e519524SHoward Hinnant                                swap(*__i, *__j);
3206*3e519524SHoward Hinnant                                ++__n_swaps;
3207*3e519524SHoward Hinnant                                ++__i;
3208*3e519524SHoward Hinnant                                break;
3209*3e519524SHoward Hinnant                            }
3210*3e519524SHoward Hinnant                            ++__i;
3211*3e519524SHoward Hinnant                        }
3212*3e519524SHoward Hinnant                    }
3213*3e519524SHoward Hinnant                    // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
3214*3e519524SHoward Hinnant                    if (__i == __j)
3215*3e519524SHoward Hinnant                        return;
3216*3e519524SHoward Hinnant                    while (true)
3217*3e519524SHoward Hinnant                    {
3218*3e519524SHoward Hinnant                        while (!__comp(*__first, *__i))
3219*3e519524SHoward Hinnant                            ++__i;
3220*3e519524SHoward Hinnant                        while (__comp(*__first, *--__j))
3221*3e519524SHoward Hinnant                            ;
3222*3e519524SHoward Hinnant                        if (__i >= __j)
3223*3e519524SHoward Hinnant                            break;
3224*3e519524SHoward Hinnant                        swap(*__i, *__j);
3225*3e519524SHoward Hinnant                        ++__n_swaps;
3226*3e519524SHoward Hinnant                        ++__i;
3227*3e519524SHoward Hinnant                    }
3228*3e519524SHoward Hinnant                    // [__first, __i) == *__first and *__first < [__i, __last)
3229*3e519524SHoward Hinnant                    // The first part is sorted, sort the secod part
3230*3e519524SHoward Hinnant                    // _STD::__sort<_Compare>(__i, __last, __comp);
3231*3e519524SHoward Hinnant                    __first = __i;
3232*3e519524SHoward Hinnant                    goto __restart;
3233*3e519524SHoward Hinnant                }
3234*3e519524SHoward Hinnant                if (__comp(*__j, *__m))
3235*3e519524SHoward Hinnant                {
3236*3e519524SHoward Hinnant                    swap(*__i, *__j);
3237*3e519524SHoward Hinnant                    ++__n_swaps;
3238*3e519524SHoward Hinnant                    break;  // found guard for downward moving __j, now use unguarded partition
3239*3e519524SHoward Hinnant                }
3240*3e519524SHoward Hinnant            }
3241*3e519524SHoward Hinnant        }
3242*3e519524SHoward Hinnant        // It is known that *__i < *__m
3243*3e519524SHoward Hinnant        ++__i;
3244*3e519524SHoward Hinnant        // j points beyond range to be tested, *__m is known to be <= *__lm1
3245*3e519524SHoward Hinnant        // if not yet partitioned...
3246*3e519524SHoward Hinnant        if (__i < __j)
3247*3e519524SHoward Hinnant        {
3248*3e519524SHoward Hinnant            // known that *(__i - 1) < *__m
3249*3e519524SHoward Hinnant            // known that __i <= __m
3250*3e519524SHoward Hinnant            while (true)
3251*3e519524SHoward Hinnant            {
3252*3e519524SHoward Hinnant                // __m still guards upward moving __i
3253*3e519524SHoward Hinnant                while (__comp(*__i, *__m))
3254*3e519524SHoward Hinnant                    ++__i;
3255*3e519524SHoward Hinnant                // It is now known that a guard exists for downward moving __j
3256*3e519524SHoward Hinnant                while (!__comp(*--__j, *__m))
3257*3e519524SHoward Hinnant                    ;
3258*3e519524SHoward Hinnant                if (__i > __j)
3259*3e519524SHoward Hinnant                    break;
3260*3e519524SHoward Hinnant                swap(*__i, *__j);
3261*3e519524SHoward Hinnant                ++__n_swaps;
3262*3e519524SHoward Hinnant                // It is known that __m != __j
3263*3e519524SHoward Hinnant                // If __m just moved, follow it
3264*3e519524SHoward Hinnant                if (__m == __i)
3265*3e519524SHoward Hinnant                    __m = __j;
3266*3e519524SHoward Hinnant                ++__i;
3267*3e519524SHoward Hinnant            }
3268*3e519524SHoward Hinnant        }
3269*3e519524SHoward Hinnant        // [__first, __i) < *__m and *__m <= [__i, __last)
3270*3e519524SHoward Hinnant        if (__i != __m && __comp(*__m, *__i))
3271*3e519524SHoward Hinnant        {
3272*3e519524SHoward Hinnant            swap(*__i, *__m);
3273*3e519524SHoward Hinnant            ++__n_swaps;
3274*3e519524SHoward Hinnant        }
3275*3e519524SHoward Hinnant        // [__first, __i) < *__i and *__i <= [__i+1, __last)
3276*3e519524SHoward Hinnant        // If we were given a perfect partition, see if insertion sort is quick...
3277*3e519524SHoward Hinnant        if (__n_swaps == 0)
3278*3e519524SHoward Hinnant        {
3279*3e519524SHoward Hinnant            bool __fs = _STD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp);
3280*3e519524SHoward Hinnant            if (_STD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp))
3281*3e519524SHoward Hinnant            {
3282*3e519524SHoward Hinnant                if (__fs)
3283*3e519524SHoward Hinnant                    return;
3284*3e519524SHoward Hinnant                __last = __i;
3285*3e519524SHoward Hinnant                continue;
3286*3e519524SHoward Hinnant            }
3287*3e519524SHoward Hinnant            else
3288*3e519524SHoward Hinnant            {
3289*3e519524SHoward Hinnant                if (__fs)
3290*3e519524SHoward Hinnant                {
3291*3e519524SHoward Hinnant                    __first = ++__i;
3292*3e519524SHoward Hinnant                    continue;
3293*3e519524SHoward Hinnant                }
3294*3e519524SHoward Hinnant            }
3295*3e519524SHoward Hinnant        }
3296*3e519524SHoward Hinnant        // sort smaller range with recursive call and larger with tail recursion elimination
3297*3e519524SHoward Hinnant        if (__i - __first < __last - __i)
3298*3e519524SHoward Hinnant        {
3299*3e519524SHoward Hinnant            _STD::__sort<_Compare>(__first, __i, __comp);
3300*3e519524SHoward Hinnant            // _STD::__sort<_Compare>(__i+1, __last, __comp);
3301*3e519524SHoward Hinnant            __first = ++__i;
3302*3e519524SHoward Hinnant        }
3303*3e519524SHoward Hinnant        else
3304*3e519524SHoward Hinnant        {
3305*3e519524SHoward Hinnant            _STD::__sort<_Compare>(__i+1, __last, __comp);
3306*3e519524SHoward Hinnant            // _STD::__sort<_Compare>(__first, __i, __comp);
3307*3e519524SHoward Hinnant            __last = __i;
3308*3e519524SHoward Hinnant        }
3309*3e519524SHoward Hinnant    }
3310*3e519524SHoward Hinnant}
3311*3e519524SHoward Hinnant
3312*3e519524SHoward Hinnant// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
3313*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare>
3314*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3315*3e519524SHoward Hinnantvoid
3316*3e519524SHoward Hinnantsort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3317*3e519524SHoward Hinnant{
3318*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
3319*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3320*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
3321*3e519524SHoward Hinnant    __sort<_Comp_ref>(__first, __last, __c);
3322*3e519524SHoward Hinnant#else
3323*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3324*3e519524SHoward Hinnant    __sort<_Comp_ref>(__first, __last, __comp);
3325*3e519524SHoward Hinnant#endif
3326*3e519524SHoward Hinnant}
3327*3e519524SHoward Hinnant
3328*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator>
3329*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3330*3e519524SHoward Hinnantvoid
3331*3e519524SHoward Hinnantsort(_RandomAccessIterator __first, _RandomAccessIterator __last)
3332*3e519524SHoward Hinnant{
3333*3e519524SHoward Hinnant    _STD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
3334*3e519524SHoward Hinnant}
3335*3e519524SHoward Hinnant
3336*3e519524SHoward Hinnanttemplate <class _Tp>
3337*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3338*3e519524SHoward Hinnantvoid
3339*3e519524SHoward Hinnantsort(_Tp** __first, _Tp** __last)
3340*3e519524SHoward Hinnant{
3341*3e519524SHoward Hinnant    _STD::sort((size_t*)__first, (size_t*)__last, __less<size_t>());
3342*3e519524SHoward Hinnant}
3343*3e519524SHoward Hinnant
3344*3e519524SHoward Hinnanttemplate <class _Tp>
3345*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3346*3e519524SHoward Hinnantvoid
3347*3e519524SHoward Hinnantsort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
3348*3e519524SHoward Hinnant{
3349*3e519524SHoward Hinnant    _STD::sort(__first.base(), __last.base());
3350*3e519524SHoward Hinnant}
3351*3e519524SHoward Hinnant
3352*3e519524SHoward Hinnantextern template void __sort<__less<char>&, char*>(char*, char*, __less<char>&);
3353*3e519524SHoward Hinnantextern template void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&);
3354*3e519524SHoward Hinnantextern template void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&);
3355*3e519524SHoward Hinnantextern template void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&);
3356*3e519524SHoward Hinnantextern template void __sort<__less<short>&, short*>(short*, short*, __less<short>&);
3357*3e519524SHoward Hinnantextern template void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&);
3358*3e519524SHoward Hinnantextern template void __sort<__less<int>&, int*>(int*, int*, __less<int>&);
3359*3e519524SHoward Hinnantextern template void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&);
3360*3e519524SHoward Hinnantextern template void __sort<__less<long>&, long*>(long*, long*, __less<long>&);
3361*3e519524SHoward Hinnantextern template void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&);
3362*3e519524SHoward Hinnantextern template void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&);
3363*3e519524SHoward Hinnantextern template void __sort<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&);
3364*3e519524SHoward Hinnantextern template void __sort<__less<float>&, float*>(float*, float*, __less<float>&);
3365*3e519524SHoward Hinnantextern template void __sort<__less<double>&, double*>(double*, double*, __less<double>&);
3366*3e519524SHoward Hinnantextern template void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&);
3367*3e519524SHoward Hinnant
3368*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&);
3369*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&);
3370*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&);
3371*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&);
3372*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&);
3373*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&);
3374*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&);
3375*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&);
3376*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&);
3377*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&);
3378*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&);
3379*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&);
3380*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&);
3381*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&);
3382*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&);
3383*3e519524SHoward Hinnant
3384*3e519524SHoward Hinnantextern template unsigned __sort5<__less<long double>&, long double*>(long double*, long double*, long double*, long double*, long double*, __less<long double>&);
3385*3e519524SHoward Hinnant
3386*3e519524SHoward Hinnant// lower_bound
3387*3e519524SHoward Hinnant
3388*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator, class _Tp>
3389*3e519524SHoward Hinnant_ForwardIterator
3390*3e519524SHoward Hinnant__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3391*3e519524SHoward Hinnant{
3392*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
3393*3e519524SHoward Hinnant    difference_type __len = _STD::distance(__first, __last);
3394*3e519524SHoward Hinnant    while (__len != 0)
3395*3e519524SHoward Hinnant    {
3396*3e519524SHoward Hinnant        difference_type __l2 = __len / 2;
3397*3e519524SHoward Hinnant        _ForwardIterator __m = __first;
3398*3e519524SHoward Hinnant        _STD::advance(__m, __l2);
3399*3e519524SHoward Hinnant        if (__comp(*__m, __value))
3400*3e519524SHoward Hinnant        {
3401*3e519524SHoward Hinnant            __first = ++__m;
3402*3e519524SHoward Hinnant            __len -= __l2 + 1;
3403*3e519524SHoward Hinnant        }
3404*3e519524SHoward Hinnant        else
3405*3e519524SHoward Hinnant            __len = __l2;
3406*3e519524SHoward Hinnant    }
3407*3e519524SHoward Hinnant    return __first;
3408*3e519524SHoward Hinnant}
3409*3e519524SHoward Hinnant
3410*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp, class _Compare>
3411*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3412*3e519524SHoward Hinnant_ForwardIterator
3413*3e519524SHoward Hinnantlower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3414*3e519524SHoward Hinnant{
3415*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
3416*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3417*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
3418*3e519524SHoward Hinnant    return __lower_bound<_Comp_ref>(__first, __last, __value, __c);
3419*3e519524SHoward Hinnant#else
3420*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3421*3e519524SHoward Hinnant    return __lower_bound<_Comp_ref>(__first, __last, __value, __comp);
3422*3e519524SHoward Hinnant#endif
3423*3e519524SHoward Hinnant}
3424*3e519524SHoward Hinnant
3425*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp>
3426*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3427*3e519524SHoward Hinnant_ForwardIterator
3428*3e519524SHoward Hinnantlower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
3429*3e519524SHoward Hinnant{
3430*3e519524SHoward Hinnant    return _STD::lower_bound(__first, __last, __value,
3431*3e519524SHoward Hinnant                             __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3432*3e519524SHoward Hinnant}
3433*3e519524SHoward Hinnant
3434*3e519524SHoward Hinnant// upper_bound
3435*3e519524SHoward Hinnant
3436*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator, class _Tp>
3437*3e519524SHoward Hinnant_ForwardIterator
3438*3e519524SHoward Hinnant__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3439*3e519524SHoward Hinnant{
3440*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
3441*3e519524SHoward Hinnant    difference_type __len = _STD::distance(__first, __last);
3442*3e519524SHoward Hinnant    while (__len != 0)
3443*3e519524SHoward Hinnant    {
3444*3e519524SHoward Hinnant        difference_type __l2 = __len / 2;
3445*3e519524SHoward Hinnant        _ForwardIterator __m = __first;
3446*3e519524SHoward Hinnant        _STD::advance(__m, __l2);
3447*3e519524SHoward Hinnant        if (__comp(__value, *__m))
3448*3e519524SHoward Hinnant            __len = __l2;
3449*3e519524SHoward Hinnant        else
3450*3e519524SHoward Hinnant        {
3451*3e519524SHoward Hinnant            __first = ++__m;
3452*3e519524SHoward Hinnant            __len -= __l2 + 1;
3453*3e519524SHoward Hinnant        }
3454*3e519524SHoward Hinnant    }
3455*3e519524SHoward Hinnant    return __first;
3456*3e519524SHoward Hinnant}
3457*3e519524SHoward Hinnant
3458*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp, class _Compare>
3459*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3460*3e519524SHoward Hinnant_ForwardIterator
3461*3e519524SHoward Hinnantupper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3462*3e519524SHoward Hinnant{
3463*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
3464*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3465*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
3466*3e519524SHoward Hinnant    return __upper_bound<_Comp_ref>(__first, __last, __value, __c);
3467*3e519524SHoward Hinnant#else
3468*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3469*3e519524SHoward Hinnant    return __upper_bound<_Comp_ref>(__first, __last, __value, __comp);
3470*3e519524SHoward Hinnant#endif
3471*3e519524SHoward Hinnant}
3472*3e519524SHoward Hinnant
3473*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp>
3474*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3475*3e519524SHoward Hinnant_ForwardIterator
3476*3e519524SHoward Hinnantupper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
3477*3e519524SHoward Hinnant{
3478*3e519524SHoward Hinnant    return _STD::upper_bound(__first, __last, __value,
3479*3e519524SHoward Hinnant                             __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>());
3480*3e519524SHoward Hinnant}
3481*3e519524SHoward Hinnant
3482*3e519524SHoward Hinnant// equal_range
3483*3e519524SHoward Hinnant
3484*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator, class _Tp>
3485*3e519524SHoward Hinnantpair<_ForwardIterator, _ForwardIterator>
3486*3e519524SHoward Hinnant__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3487*3e519524SHoward Hinnant{
3488*3e519524SHoward Hinnant    typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
3489*3e519524SHoward Hinnant    difference_type __len = _STD::distance(__first, __last);
3490*3e519524SHoward Hinnant    while (__len != 0)
3491*3e519524SHoward Hinnant    {
3492*3e519524SHoward Hinnant        difference_type __l2 = __len / 2;
3493*3e519524SHoward Hinnant        _ForwardIterator __m = __first;
3494*3e519524SHoward Hinnant        _STD::advance(__m, __l2);
3495*3e519524SHoward Hinnant        if (__comp(*__m, __value))
3496*3e519524SHoward Hinnant        {
3497*3e519524SHoward Hinnant            __first = ++__m;
3498*3e519524SHoward Hinnant            __len -= __l2 + 1;
3499*3e519524SHoward Hinnant        }
3500*3e519524SHoward Hinnant        else if (__comp(__value, *__m))
3501*3e519524SHoward Hinnant        {
3502*3e519524SHoward Hinnant            __last = __m;
3503*3e519524SHoward Hinnant            __len = __l2;
3504*3e519524SHoward Hinnant        }
3505*3e519524SHoward Hinnant        else
3506*3e519524SHoward Hinnant        {
3507*3e519524SHoward Hinnant            _ForwardIterator __mp1 = __m;
3508*3e519524SHoward Hinnant            return pair<_ForwardIterator, _ForwardIterator>
3509*3e519524SHoward Hinnant                   (
3510*3e519524SHoward Hinnant                      __lower_bound<_Compare>(__first, __m, __value, __comp),
3511*3e519524SHoward Hinnant                      __upper_bound<_Compare>(++__mp1, __last, __value, __comp)
3512*3e519524SHoward Hinnant                   );
3513*3e519524SHoward Hinnant        }
3514*3e519524SHoward Hinnant    }
3515*3e519524SHoward Hinnant    return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
3516*3e519524SHoward Hinnant}
3517*3e519524SHoward Hinnant
3518*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp, class _Compare>
3519*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3520*3e519524SHoward Hinnantpair<_ForwardIterator, _ForwardIterator>
3521*3e519524SHoward Hinnantequal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3522*3e519524SHoward Hinnant{
3523*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
3524*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3525*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
3526*3e519524SHoward Hinnant    return __equal_range<_Comp_ref>(__first, __last, __value, __c);
3527*3e519524SHoward Hinnant#else
3528*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3529*3e519524SHoward Hinnant    return __equal_range<_Comp_ref>(__first, __last, __value, __comp);
3530*3e519524SHoward Hinnant#endif
3531*3e519524SHoward Hinnant}
3532*3e519524SHoward Hinnant
3533*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp>
3534*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3535*3e519524SHoward Hinnantpair<_ForwardIterator, _ForwardIterator>
3536*3e519524SHoward Hinnantequal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
3537*3e519524SHoward Hinnant{
3538*3e519524SHoward Hinnant    return _STD::equal_range(__first, __last, __value,
3539*3e519524SHoward Hinnant                             __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3540*3e519524SHoward Hinnant}
3541*3e519524SHoward Hinnant
3542*3e519524SHoward Hinnant// binary_search
3543*3e519524SHoward Hinnant
3544*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator, class _Tp>
3545*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3546*3e519524SHoward Hinnantbool
3547*3e519524SHoward Hinnant__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3548*3e519524SHoward Hinnant{
3549*3e519524SHoward Hinnant    __first = __lower_bound<_Compare>(__first, __last, __value, __comp);
3550*3e519524SHoward Hinnant    return __first != __last && !__comp(__value, *__first);
3551*3e519524SHoward Hinnant}
3552*3e519524SHoward Hinnant
3553*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp, class _Compare>
3554*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3555*3e519524SHoward Hinnantbool
3556*3e519524SHoward Hinnantbinary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
3557*3e519524SHoward Hinnant{
3558*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
3559*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3560*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
3561*3e519524SHoward Hinnant    return __binary_search<_Comp_ref>(__first, __last, __value, __c);
3562*3e519524SHoward Hinnant#else
3563*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3564*3e519524SHoward Hinnant    return __binary_search<_Comp_ref>(__first, __last, __value, __comp);
3565*3e519524SHoward Hinnant#endif
3566*3e519524SHoward Hinnant}
3567*3e519524SHoward Hinnant
3568*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp>
3569*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3570*3e519524SHoward Hinnantbool
3571*3e519524SHoward Hinnantbinary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
3572*3e519524SHoward Hinnant{
3573*3e519524SHoward Hinnant    return _STD::binary_search(__first, __last, __value,
3574*3e519524SHoward Hinnant                             __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3575*3e519524SHoward Hinnant}
3576*3e519524SHoward Hinnant
3577*3e519524SHoward Hinnant// merge
3578*3e519524SHoward Hinnant
3579*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
3580*3e519524SHoward Hinnant_OutputIterator
3581*3e519524SHoward Hinnant__merge(_InputIterator1 __first1, _InputIterator1 __last1,
3582*3e519524SHoward Hinnant        _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
3583*3e519524SHoward Hinnant{
3584*3e519524SHoward Hinnant    for (; __first1 != __last1; ++__result)
3585*3e519524SHoward Hinnant    {
3586*3e519524SHoward Hinnant        if (__first2 == __last2)
3587*3e519524SHoward Hinnant            return _STD::copy(__first1, __last1, __result);
3588*3e519524SHoward Hinnant        if (__comp(*__first2, *__first1))
3589*3e519524SHoward Hinnant        {
3590*3e519524SHoward Hinnant            *__result = *__first2;
3591*3e519524SHoward Hinnant            ++__first2;
3592*3e519524SHoward Hinnant        }
3593*3e519524SHoward Hinnant        else
3594*3e519524SHoward Hinnant        {
3595*3e519524SHoward Hinnant            *__result = *__first1;
3596*3e519524SHoward Hinnant            ++__first1;
3597*3e519524SHoward Hinnant        }
3598*3e519524SHoward Hinnant    }
3599*3e519524SHoward Hinnant    return _STD::copy(__first2, __last2, __result);
3600*3e519524SHoward Hinnant}
3601*3e519524SHoward Hinnant
3602*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
3603*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3604*3e519524SHoward Hinnant_OutputIterator
3605*3e519524SHoward Hinnantmerge(_InputIterator1 __first1, _InputIterator1 __last1,
3606*3e519524SHoward Hinnant      _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
3607*3e519524SHoward Hinnant{
3608*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
3609*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3610*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
3611*3e519524SHoward Hinnant    return _STD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
3612*3e519524SHoward Hinnant#else
3613*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3614*3e519524SHoward Hinnant    return _STD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
3615*3e519524SHoward Hinnant#endif
3616*3e519524SHoward Hinnant}
3617*3e519524SHoward Hinnant
3618*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator>
3619*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3620*3e519524SHoward Hinnant_OutputIterator
3621*3e519524SHoward Hinnantmerge(_InputIterator1 __first1, _InputIterator1 __last1,
3622*3e519524SHoward Hinnant      _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
3623*3e519524SHoward Hinnant{
3624*3e519524SHoward Hinnant    typedef typename iterator_traits<_InputIterator1>::value_type __v1;
3625*3e519524SHoward Hinnant    typedef typename iterator_traits<_InputIterator2>::value_type __v2;
3626*3e519524SHoward Hinnant    return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>());
3627*3e519524SHoward Hinnant}
3628*3e519524SHoward Hinnant
3629*3e519524SHoward Hinnant// inplace_merge
3630*3e519524SHoward Hinnant
3631*3e519524SHoward Hinnanttemplate <class _Compare, class _BidirectionalIterator>
3632*3e519524SHoward Hinnantvoid
3633*3e519524SHoward Hinnant__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
3634*3e519524SHoward Hinnant                _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
3635*3e519524SHoward Hinnant                                 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
3636*3e519524SHoward Hinnant                typename iterator_traits<_BidirectionalIterator>::value_type* __buff)
3637*3e519524SHoward Hinnant{
3638*3e519524SHoward Hinnant    typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3639*3e519524SHoward Hinnant    typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3640*3e519524SHoward Hinnant    typedef typename iterator_traits<_BidirectionalIterator>::pointer pointer;
3641*3e519524SHoward Hinnant    __destruct_n __d(0);
3642*3e519524SHoward Hinnant    unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
3643*3e519524SHoward Hinnant    if (__len1 <= __len2)
3644*3e519524SHoward Hinnant    {
3645*3e519524SHoward Hinnant        value_type* __p = __buff;
3646*3e519524SHoward Hinnant        for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), ++__i, ++__p)
3647*3e519524SHoward Hinnant            ::new(__p) value_type(_STD::move(*__i));
3648*3e519524SHoward Hinnant        __merge<_Compare>(move_iterator<value_type*>(__buff),
3649*3e519524SHoward Hinnant                          move_iterator<value_type*>(__p),
3650*3e519524SHoward Hinnant                          move_iterator<_BidirectionalIterator>(__middle),
3651*3e519524SHoward Hinnant                          move_iterator<_BidirectionalIterator>(__last),
3652*3e519524SHoward Hinnant                          __first, __comp);
3653*3e519524SHoward Hinnant    }
3654*3e519524SHoward Hinnant    else
3655*3e519524SHoward Hinnant    {
3656*3e519524SHoward Hinnant        value_type* __p = __buff;
3657*3e519524SHoward Hinnant        for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), ++__i, ++__p)
3658*3e519524SHoward Hinnant            ::new(__p) value_type(_STD::move(*__i));
3659*3e519524SHoward Hinnant        typedef reverse_iterator<_BidirectionalIterator> _RBi;
3660*3e519524SHoward Hinnant        typedef reverse_iterator<value_type*> _Rv;
3661*3e519524SHoward Hinnant        __merge(move_iterator<_RBi>(_RBi(__middle)), move_iterator<_RBi>(_RBi(__first)),
3662*3e519524SHoward Hinnant                move_iterator<_Rv>(_Rv(__p)), move_iterator<_Rv>(_Rv(__buff)),
3663*3e519524SHoward Hinnant                _RBi(__last), __negate<_Compare>(__comp));
3664*3e519524SHoward Hinnant    }
3665*3e519524SHoward Hinnant}
3666*3e519524SHoward Hinnant
3667*3e519524SHoward Hinnanttemplate <class _Compare, class _BidirectionalIterator>
3668*3e519524SHoward Hinnantvoid
3669*3e519524SHoward Hinnant__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
3670*3e519524SHoward Hinnant                _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
3671*3e519524SHoward Hinnant                                 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
3672*3e519524SHoward Hinnant                typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size)
3673*3e519524SHoward Hinnant{
3674*3e519524SHoward Hinnant    typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3675*3e519524SHoward Hinnant    typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3676*3e519524SHoward Hinnant    while (true)
3677*3e519524SHoward Hinnant    {
3678*3e519524SHoward Hinnant        // if __middle == __last, we're done
3679*3e519524SHoward Hinnant        if (__len2 == 0)
3680*3e519524SHoward Hinnant            return;
3681*3e519524SHoward Hinnant        // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
3682*3e519524SHoward Hinnant        for (; true; ++__first, --__len1)
3683*3e519524SHoward Hinnant        {
3684*3e519524SHoward Hinnant            if (__len1 == 0)
3685*3e519524SHoward Hinnant                return;
3686*3e519524SHoward Hinnant            if (__comp(*__middle, *__first))
3687*3e519524SHoward Hinnant                break;
3688*3e519524SHoward Hinnant        }
3689*3e519524SHoward Hinnant        if (__len1 <= __buff_size || __len2 <= __buff_size)
3690*3e519524SHoward Hinnant        {
3691*3e519524SHoward Hinnant            __buffered_inplace_merge<_Compare>(__first, __middle, __last, __comp, __len1, __len2, __buff);
3692*3e519524SHoward Hinnant            return;
3693*3e519524SHoward Hinnant        }
3694*3e519524SHoward Hinnant        // __first < __middle < __last
3695*3e519524SHoward Hinnant        // *__first > *__middle
3696*3e519524SHoward Hinnant        // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that
3697*3e519524SHoward Hinnant        //     all elements in:
3698*3e519524SHoward Hinnant        //         [__first, __m1)  <= [__middle, __m2)
3699*3e519524SHoward Hinnant        //         [__middle, __m2) <  [__m1, __middle)
3700*3e519524SHoward Hinnant        //         [__m1, __middle) <= [__m2, __last)
3701*3e519524SHoward Hinnant        //     and __m1 or __m2 is in the middle of its range
3702*3e519524SHoward Hinnant        _BidirectionalIterator __m1;  // "median" of [__first, __middle)
3703*3e519524SHoward Hinnant        _BidirectionalIterator __m2;  // "median" of [__middle, __last)
3704*3e519524SHoward Hinnant        difference_type __len11;      // distance(__first, __m1)
3705*3e519524SHoward Hinnant        difference_type __len21;      // distance(__middle, __m2)
3706*3e519524SHoward Hinnant        // binary search smaller range
3707*3e519524SHoward Hinnant        if (__len1 < __len2)
3708*3e519524SHoward Hinnant        {   // __len >= 1, __len2 >= 2
3709*3e519524SHoward Hinnant            __len21 = __len2 / 2;
3710*3e519524SHoward Hinnant            __m2 = __middle;
3711*3e519524SHoward Hinnant            _STD::advance(__m2, __len21);
3712*3e519524SHoward Hinnant            __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp);
3713*3e519524SHoward Hinnant            __len11 = _STD::distance(__first, __m1);
3714*3e519524SHoward Hinnant        }
3715*3e519524SHoward Hinnant        else
3716*3e519524SHoward Hinnant        {
3717*3e519524SHoward Hinnant            if (__len1 == 1)
3718*3e519524SHoward Hinnant            {   // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1
3719*3e519524SHoward Hinnant                // It is known *__first > *__middle
3720*3e519524SHoward Hinnant                swap(*__first, *__middle);
3721*3e519524SHoward Hinnant                return;
3722*3e519524SHoward Hinnant            }
3723*3e519524SHoward Hinnant            // __len1 >= 2, __len2 >= 1
3724*3e519524SHoward Hinnant            __len11 = __len1 / 2;
3725*3e519524SHoward Hinnant            __m1 = __first;
3726*3e519524SHoward Hinnant            _STD::advance(__m1, __len11);
3727*3e519524SHoward Hinnant            __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp);
3728*3e519524SHoward Hinnant            __len21 = _STD::distance(__middle, __m2);
3729*3e519524SHoward Hinnant        }
3730*3e519524SHoward Hinnant        difference_type __len12 = __len1 - __len11;  // distance(__m1, __middle)
3731*3e519524SHoward Hinnant        difference_type __len22 = __len2 - __len21;  // distance(__m2, __last)
3732*3e519524SHoward Hinnant        // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last)
3733*3e519524SHoward Hinnant        // swap middle two partitions
3734*3e519524SHoward Hinnant        __middle = _STD::rotate(__m1, __middle, __m2);
3735*3e519524SHoward Hinnant        // __len12 and __len21 now have swapped meanings
3736*3e519524SHoward Hinnant        // merge smaller range with recurisve call and larger with tail recursion elimination
3737*3e519524SHoward Hinnant        if (__len11 + __len21 < __len12 + __len22)
3738*3e519524SHoward Hinnant        {
3739*3e519524SHoward Hinnant            __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
3740*3e519524SHoward Hinnant//          __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
3741*3e519524SHoward Hinnant            __first = __middle;
3742*3e519524SHoward Hinnant            __middle = __m2;
3743*3e519524SHoward Hinnant            __len1 = __len12;
3744*3e519524SHoward Hinnant            __len2 = __len22;
3745*3e519524SHoward Hinnant        }
3746*3e519524SHoward Hinnant        else
3747*3e519524SHoward Hinnant        {
3748*3e519524SHoward Hinnant            __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
3749*3e519524SHoward Hinnant//          __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
3750*3e519524SHoward Hinnant            __last = __middle;
3751*3e519524SHoward Hinnant            __middle = __m1;
3752*3e519524SHoward Hinnant            __len1 = __len11;
3753*3e519524SHoward Hinnant            __len2 = __len21;
3754*3e519524SHoward Hinnant        }
3755*3e519524SHoward Hinnant    }
3756*3e519524SHoward Hinnant}
3757*3e519524SHoward Hinnant
3758*3e519524SHoward Hinnanttemplate <class _Tp>
3759*3e519524SHoward Hinnantstruct __inplace_merge_switch
3760*3e519524SHoward Hinnant{
3761*3e519524SHoward Hinnant    static const unsigned value = has_trivial_copy_assign<_Tp>::value;
3762*3e519524SHoward Hinnant};
3763*3e519524SHoward Hinnant
3764*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator, class _Compare>
3765*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3766*3e519524SHoward Hinnantvoid
3767*3e519524SHoward Hinnantinplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
3768*3e519524SHoward Hinnant              _Compare __comp)
3769*3e519524SHoward Hinnant{
3770*3e519524SHoward Hinnant    typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3771*3e519524SHoward Hinnant    typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3772*3e519524SHoward Hinnant    difference_type __len1 = _STD::distance(__first, __middle);
3773*3e519524SHoward Hinnant    difference_type __len2 = _STD::distance(__middle, __last);
3774*3e519524SHoward Hinnant    difference_type __buf_size = _STD::min(__len1, __len2);
3775*3e519524SHoward Hinnant    pair<value_type*, ptrdiff_t> __buf(0, 0);
3776*3e519524SHoward Hinnant    unique_ptr<value_type, __return_temporary_buffer> __h;
3777*3e519524SHoward Hinnant    if (__inplace_merge_switch<value_type>::value && __buf_size > 8)
3778*3e519524SHoward Hinnant    {
3779*3e519524SHoward Hinnant        __buf = _STD::get_temporary_buffer<value_type>(__buf_size);
3780*3e519524SHoward Hinnant        __h.reset(__buf.first);
3781*3e519524SHoward Hinnant    }
3782*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
3783*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3784*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
3785*3e519524SHoward Hinnant    return _STD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2,
3786*3e519524SHoward Hinnant                                            __buf.first, __buf.second);
3787*3e519524SHoward Hinnant#else
3788*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3789*3e519524SHoward Hinnant    return _STD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
3790*3e519524SHoward Hinnant                                            __buf.first, __buf.second);
3791*3e519524SHoward Hinnant#endif
3792*3e519524SHoward Hinnant}
3793*3e519524SHoward Hinnant
3794*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator>
3795*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3796*3e519524SHoward Hinnantvoid
3797*3e519524SHoward Hinnantinplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last)
3798*3e519524SHoward Hinnant{
3799*3e519524SHoward Hinnant    _STD::inplace_merge(__first, __middle, __last,
3800*3e519524SHoward Hinnant                        __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
3801*3e519524SHoward Hinnant}
3802*3e519524SHoward Hinnant
3803*3e519524SHoward Hinnant// stable_sort
3804*3e519524SHoward Hinnant
3805*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2>
3806*3e519524SHoward Hinnantvoid
3807*3e519524SHoward Hinnant__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1,
3808*3e519524SHoward Hinnant        _InputIterator2 __first2, _InputIterator2 __last2,
3809*3e519524SHoward Hinnant        typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp)
3810*3e519524SHoward Hinnant{
3811*3e519524SHoward Hinnant    typedef typename iterator_traits<_InputIterator1>::value_type value_type;
3812*3e519524SHoward Hinnant    __destruct_n __d(0);
3813*3e519524SHoward Hinnant    unique_ptr<value_type, __destruct_n&> __h(__result, __d);
3814*3e519524SHoward Hinnant    for (; true; ++__result)
3815*3e519524SHoward Hinnant    {
3816*3e519524SHoward Hinnant        if (__first1 == __last1)
3817*3e519524SHoward Hinnant        {
3818*3e519524SHoward Hinnant            for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0))
3819*3e519524SHoward Hinnant                ::new (__result) value_type(_STD::move(*__first2));
3820*3e519524SHoward Hinnant            __h.release();
3821*3e519524SHoward Hinnant            return;
3822*3e519524SHoward Hinnant        }
3823*3e519524SHoward Hinnant        if (__first2 == __last2)
3824*3e519524SHoward Hinnant        {
3825*3e519524SHoward Hinnant            for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0))
3826*3e519524SHoward Hinnant                ::new (__result) value_type(_STD::move(*__first1));
3827*3e519524SHoward Hinnant            __h.release();
3828*3e519524SHoward Hinnant            return;
3829*3e519524SHoward Hinnant        }
3830*3e519524SHoward Hinnant        if (__comp(*__first2, *__first1))
3831*3e519524SHoward Hinnant        {
3832*3e519524SHoward Hinnant            ::new (__result) value_type(_STD::move(*__first2));
3833*3e519524SHoward Hinnant            __d.__incr((value_type*)0);
3834*3e519524SHoward Hinnant            ++__first2;
3835*3e519524SHoward Hinnant        }
3836*3e519524SHoward Hinnant        else
3837*3e519524SHoward Hinnant        {
3838*3e519524SHoward Hinnant            ::new (__result) value_type(_STD::move(*__first1));
3839*3e519524SHoward Hinnant            __d.__incr((value_type*)0);
3840*3e519524SHoward Hinnant            ++__first1;
3841*3e519524SHoward Hinnant        }
3842*3e519524SHoward Hinnant    }
3843*3e519524SHoward Hinnant}
3844*3e519524SHoward Hinnant
3845*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
3846*3e519524SHoward Hinnantvoid
3847*3e519524SHoward Hinnant__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1,
3848*3e519524SHoward Hinnant        _InputIterator2 __first2, _InputIterator2 __last2,
3849*3e519524SHoward Hinnant        _OutputIterator __result, _Compare __comp)
3850*3e519524SHoward Hinnant{
3851*3e519524SHoward Hinnant    for (; __first1 != __last1; ++__result)
3852*3e519524SHoward Hinnant    {
3853*3e519524SHoward Hinnant        if (__first2 == __last2)
3854*3e519524SHoward Hinnant        {
3855*3e519524SHoward Hinnant            for (; __first1 != __last1; ++__first1, ++__result)
3856*3e519524SHoward Hinnant                *__result = _STD::move(*__first1);
3857*3e519524SHoward Hinnant            return;
3858*3e519524SHoward Hinnant        }
3859*3e519524SHoward Hinnant        if (__comp(*__first2, *__first1))
3860*3e519524SHoward Hinnant        {
3861*3e519524SHoward Hinnant            *__result = _STD::move(*__first2);
3862*3e519524SHoward Hinnant            ++__first2;
3863*3e519524SHoward Hinnant        }
3864*3e519524SHoward Hinnant        else
3865*3e519524SHoward Hinnant        {
3866*3e519524SHoward Hinnant            *__result = _STD::move(*__first1);
3867*3e519524SHoward Hinnant            ++__first1;
3868*3e519524SHoward Hinnant        }
3869*3e519524SHoward Hinnant    }
3870*3e519524SHoward Hinnant    for (; __first2 != __last2; ++__first2, ++__result)
3871*3e519524SHoward Hinnant        *__result = _STD::move(*__first2);
3872*3e519524SHoward Hinnant}
3873*3e519524SHoward Hinnant
3874*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator>
3875*3e519524SHoward Hinnantvoid
3876*3e519524SHoward Hinnant__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
3877*3e519524SHoward Hinnant              typename iterator_traits<_RandomAccessIterator>::difference_type __len,
3878*3e519524SHoward Hinnant              typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size);
3879*3e519524SHoward Hinnant
3880*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator>
3881*3e519524SHoward Hinnantvoid
3882*3e519524SHoward Hinnant__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp,
3883*3e519524SHoward Hinnant                   typename iterator_traits<_RandomAccessIterator>::difference_type __len,
3884*3e519524SHoward Hinnant                   typename iterator_traits<_RandomAccessIterator>::value_type* __first2)
3885*3e519524SHoward Hinnant{
3886*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3887*3e519524SHoward Hinnant    switch (__len)
3888*3e519524SHoward Hinnant    {
3889*3e519524SHoward Hinnant    case 0:
3890*3e519524SHoward Hinnant        return;
3891*3e519524SHoward Hinnant    case 1:
3892*3e519524SHoward Hinnant        ::new(__first2) value_type(_STD::move(*__first1));
3893*3e519524SHoward Hinnant        return;
3894*3e519524SHoward Hinnant    case 2:
3895*3e519524SHoward Hinnant       __destruct_n __d(0);
3896*3e519524SHoward Hinnant        unique_ptr<value_type, __destruct_n&> __h2(__first2, __d);
3897*3e519524SHoward Hinnant         if (__comp(*--__last1, *__first1))
3898*3e519524SHoward Hinnant        {
3899*3e519524SHoward Hinnant            ::new(__first2) value_type(_STD::move(*__last1));
3900*3e519524SHoward Hinnant            __d.__incr((value_type*)0);
3901*3e519524SHoward Hinnant            ++__first2;
3902*3e519524SHoward Hinnant            ::new(__first2) value_type(_STD::move(*__first1));
3903*3e519524SHoward Hinnant        }
3904*3e519524SHoward Hinnant        else
3905*3e519524SHoward Hinnant        {
3906*3e519524SHoward Hinnant            ::new(__first2) value_type(_STD::move(*__first1));
3907*3e519524SHoward Hinnant            __d.__incr((value_type*)0);
3908*3e519524SHoward Hinnant            ++__first2;
3909*3e519524SHoward Hinnant            ::new(__first2) value_type(_STD::move(*__last1));
3910*3e519524SHoward Hinnant        }
3911*3e519524SHoward Hinnant        __h2.release();
3912*3e519524SHoward Hinnant        return;
3913*3e519524SHoward Hinnant    }
3914*3e519524SHoward Hinnant    if (__len <= 8)
3915*3e519524SHoward Hinnant    {
3916*3e519524SHoward Hinnant        __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp);
3917*3e519524SHoward Hinnant        return;
3918*3e519524SHoward Hinnant    }
3919*3e519524SHoward Hinnant    typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
3920*3e519524SHoward Hinnant    _RandomAccessIterator __m = __first1 + __l2;
3921*3e519524SHoward Hinnant    __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2);
3922*3e519524SHoward Hinnant    __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
3923*3e519524SHoward Hinnant    __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp);
3924*3e519524SHoward Hinnant}
3925*3e519524SHoward Hinnant
3926*3e519524SHoward Hinnanttemplate <class _Tp>
3927*3e519524SHoward Hinnantstruct __stable_sort_switch
3928*3e519524SHoward Hinnant{
3929*3e519524SHoward Hinnant    static const unsigned value = 128*has_trivial_copy_assign<_Tp>::value;
3930*3e519524SHoward Hinnant};
3931*3e519524SHoward Hinnant
3932*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator>
3933*3e519524SHoward Hinnantvoid
3934*3e519524SHoward Hinnant__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
3935*3e519524SHoward Hinnant              typename iterator_traits<_RandomAccessIterator>::difference_type __len,
3936*3e519524SHoward Hinnant              typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size)
3937*3e519524SHoward Hinnant{
3938*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3939*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3940*3e519524SHoward Hinnant    switch (__len)
3941*3e519524SHoward Hinnant    {
3942*3e519524SHoward Hinnant    case 0:
3943*3e519524SHoward Hinnant    case 1:
3944*3e519524SHoward Hinnant        return;
3945*3e519524SHoward Hinnant    case 2:
3946*3e519524SHoward Hinnant        if (__comp(*--__last, *__first))
3947*3e519524SHoward Hinnant            swap(*__first, *__last);
3948*3e519524SHoward Hinnant        return;
3949*3e519524SHoward Hinnant    }
3950*3e519524SHoward Hinnant    if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value))
3951*3e519524SHoward Hinnant    {
3952*3e519524SHoward Hinnant        __insertion_sort<_Compare>(__first, __last, __comp);
3953*3e519524SHoward Hinnant        return;
3954*3e519524SHoward Hinnant    }
3955*3e519524SHoward Hinnant    typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
3956*3e519524SHoward Hinnant    _RandomAccessIterator __m = __first + __l2;
3957*3e519524SHoward Hinnant    if (__len <= __buff_size)
3958*3e519524SHoward Hinnant    {
3959*3e519524SHoward Hinnant        __destruct_n __d(0);
3960*3e519524SHoward Hinnant        unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
3961*3e519524SHoward Hinnant        __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff);
3962*3e519524SHoward Hinnant        __d.__set(__l2, (value_type*)0);
3963*3e519524SHoward Hinnant        __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
3964*3e519524SHoward Hinnant        __d.__set(__len, (value_type*)0);
3965*3e519524SHoward Hinnant        __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
3966*3e519524SHoward Hinnant//         __merge<_Compare>(move_iterator<value_type*>(__buff),
3967*3e519524SHoward Hinnant//                           move_iterator<value_type*>(__buff + __l2),
3968*3e519524SHoward Hinnant//                           move_iterator<_RandomAccessIterator>(__buff + __l2),
3969*3e519524SHoward Hinnant//                           move_iterator<_RandomAccessIterator>(__buff + __len),
3970*3e519524SHoward Hinnant//                           __first, __comp);
3971*3e519524SHoward Hinnant        return;
3972*3e519524SHoward Hinnant    }
3973*3e519524SHoward Hinnant    __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
3974*3e519524SHoward Hinnant    __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
3975*3e519524SHoward Hinnant    __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
3976*3e519524SHoward Hinnant}
3977*3e519524SHoward Hinnant
3978*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare>
3979*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
3980*3e519524SHoward Hinnantvoid
3981*3e519524SHoward Hinnantstable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3982*3e519524SHoward Hinnant{
3983*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3984*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3985*3e519524SHoward Hinnant    difference_type __len = __last - __first;
3986*3e519524SHoward Hinnant    pair<value_type*, ptrdiff_t> __buf(0, 0);
3987*3e519524SHoward Hinnant    unique_ptr<value_type, __return_temporary_buffer> __h;
3988*3e519524SHoward Hinnant    if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value))
3989*3e519524SHoward Hinnant    {
3990*3e519524SHoward Hinnant        __buf = _STD::get_temporary_buffer<value_type>(__len);
3991*3e519524SHoward Hinnant        __h.reset(__buf.first);
3992*3e519524SHoward Hinnant    }
3993*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
3994*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3995*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
3996*3e519524SHoward Hinnant    __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second);
3997*3e519524SHoward Hinnant#else
3998*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3999*3e519524SHoward Hinnant    __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
4000*3e519524SHoward Hinnant#endif
4001*3e519524SHoward Hinnant}
4002*3e519524SHoward Hinnant
4003*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator>
4004*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4005*3e519524SHoward Hinnantvoid
4006*3e519524SHoward Hinnantstable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4007*3e519524SHoward Hinnant{
4008*3e519524SHoward Hinnant    _STD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4009*3e519524SHoward Hinnant}
4010*3e519524SHoward Hinnant
4011*3e519524SHoward Hinnant// is_heap_until
4012*3e519524SHoward Hinnant
4013*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare>
4014*3e519524SHoward Hinnant_RandomAccessIterator
4015*3e519524SHoward Hinnantis_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4016*3e519524SHoward Hinnant{
4017*3e519524SHoward Hinnant    typedef typename _STD::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4018*3e519524SHoward Hinnant    difference_type __len = __last - __first;
4019*3e519524SHoward Hinnant    difference_type __p = 0;
4020*3e519524SHoward Hinnant    difference_type __c = 1;
4021*3e519524SHoward Hinnant    _RandomAccessIterator __pp = __first;
4022*3e519524SHoward Hinnant    while (__c < __len)
4023*3e519524SHoward Hinnant    {
4024*3e519524SHoward Hinnant        _RandomAccessIterator __cp = __first + __c;
4025*3e519524SHoward Hinnant        if (__comp(*__pp, *__cp))
4026*3e519524SHoward Hinnant            return __cp;
4027*3e519524SHoward Hinnant        ++__c;
4028*3e519524SHoward Hinnant        ++__cp;
4029*3e519524SHoward Hinnant        if (__c == __len)
4030*3e519524SHoward Hinnant            return __last;
4031*3e519524SHoward Hinnant        if (__comp(*__pp, *__cp))
4032*3e519524SHoward Hinnant            return __cp;
4033*3e519524SHoward Hinnant        ++__p;
4034*3e519524SHoward Hinnant        ++__pp;
4035*3e519524SHoward Hinnant        __c = 2 * __p + 1;
4036*3e519524SHoward Hinnant    }
4037*3e519524SHoward Hinnant    return __last;
4038*3e519524SHoward Hinnant}
4039*3e519524SHoward Hinnant
4040*3e519524SHoward Hinnanttemplate<class _RandomAccessIterator>
4041*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4042*3e519524SHoward Hinnant_RandomAccessIterator
4043*3e519524SHoward Hinnantis_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
4044*3e519524SHoward Hinnant{
4045*3e519524SHoward Hinnant    return _STD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4046*3e519524SHoward Hinnant}
4047*3e519524SHoward Hinnant
4048*3e519524SHoward Hinnant// is_heap
4049*3e519524SHoward Hinnant
4050*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare>
4051*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4052*3e519524SHoward Hinnantbool
4053*3e519524SHoward Hinnantis_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4054*3e519524SHoward Hinnant{
4055*3e519524SHoward Hinnant    return _STD::is_heap_until(__first, __last, __comp) == __last;
4056*3e519524SHoward Hinnant}
4057*3e519524SHoward Hinnant
4058*3e519524SHoward Hinnanttemplate<class _RandomAccessIterator>
4059*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4060*3e519524SHoward Hinnantbool
4061*3e519524SHoward Hinnantis_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4062*3e519524SHoward Hinnant{
4063*3e519524SHoward Hinnant    return _STD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4064*3e519524SHoward Hinnant}
4065*3e519524SHoward Hinnant
4066*3e519524SHoward Hinnant// push_heap
4067*3e519524SHoward Hinnant
4068*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator>
4069*3e519524SHoward Hinnantvoid
4070*3e519524SHoward Hinnant__push_heap_front(_RandomAccessIterator __first, _RandomAccessIterator, _Compare __comp,
4071*3e519524SHoward Hinnant                  typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4072*3e519524SHoward Hinnant{
4073*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4074*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4075*3e519524SHoward Hinnant    if (__len > 1)
4076*3e519524SHoward Hinnant    {
4077*3e519524SHoward Hinnant        difference_type __p = 0;
4078*3e519524SHoward Hinnant        _RandomAccessIterator __pp = __first;
4079*3e519524SHoward Hinnant        difference_type __c = 2;
4080*3e519524SHoward Hinnant        _RandomAccessIterator __cp = __first + __c;
4081*3e519524SHoward Hinnant        if (__c == __len || __comp(*__cp, *(__cp - 1)))
4082*3e519524SHoward Hinnant        {
4083*3e519524SHoward Hinnant            --__c;
4084*3e519524SHoward Hinnant            --__cp;
4085*3e519524SHoward Hinnant        }
4086*3e519524SHoward Hinnant        if (__comp(*__pp, *__cp))
4087*3e519524SHoward Hinnant        {
4088*3e519524SHoward Hinnant            value_type __t(_STD::move(*__pp));
4089*3e519524SHoward Hinnant            do
4090*3e519524SHoward Hinnant            {
4091*3e519524SHoward Hinnant                *__pp = _STD::move(*__cp);
4092*3e519524SHoward Hinnant                __pp = __cp;
4093*3e519524SHoward Hinnant                __p = __c;
4094*3e519524SHoward Hinnant                __c = (__p + 1) * 2;
4095*3e519524SHoward Hinnant                if (__c > __len)
4096*3e519524SHoward Hinnant                    break;
4097*3e519524SHoward Hinnant                __cp = __first + __c;
4098*3e519524SHoward Hinnant                if (__c == __len || __comp(*__cp, *(__cp - 1)))
4099*3e519524SHoward Hinnant                {
4100*3e519524SHoward Hinnant                    --__c;
4101*3e519524SHoward Hinnant                    --__cp;
4102*3e519524SHoward Hinnant                }
4103*3e519524SHoward Hinnant            } while (__comp(__t, *__cp));
4104*3e519524SHoward Hinnant            *__pp = _STD::move(__t);
4105*3e519524SHoward Hinnant        }
4106*3e519524SHoward Hinnant    }
4107*3e519524SHoward Hinnant}
4108*3e519524SHoward Hinnant
4109*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator>
4110*3e519524SHoward Hinnantvoid
4111*3e519524SHoward Hinnant__push_heap_back(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4112*3e519524SHoward Hinnant                 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4113*3e519524SHoward Hinnant{
4114*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4115*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4116*3e519524SHoward Hinnant    if (__len > 1)
4117*3e519524SHoward Hinnant    {
4118*3e519524SHoward Hinnant        __len = (__len - 2) / 2;
4119*3e519524SHoward Hinnant        _RandomAccessIterator __ptr = __first + __len;
4120*3e519524SHoward Hinnant        if (__comp(*__ptr, *--__last))
4121*3e519524SHoward Hinnant        {
4122*3e519524SHoward Hinnant            value_type __t(_STD::move(*__last));
4123*3e519524SHoward Hinnant            do
4124*3e519524SHoward Hinnant            {
4125*3e519524SHoward Hinnant                *__last = _STD::move(*__ptr);
4126*3e519524SHoward Hinnant                __last = __ptr;
4127*3e519524SHoward Hinnant                if (__len == 0)
4128*3e519524SHoward Hinnant                    break;
4129*3e519524SHoward Hinnant                __len = (__len - 1) / 2;
4130*3e519524SHoward Hinnant                __ptr = __first + __len;
4131*3e519524SHoward Hinnant            } while (__comp(*__ptr, __t));
4132*3e519524SHoward Hinnant            *__last = _STD::move(__t);
4133*3e519524SHoward Hinnant        }
4134*3e519524SHoward Hinnant    }
4135*3e519524SHoward Hinnant}
4136*3e519524SHoward Hinnant
4137*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare>
4138*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4139*3e519524SHoward Hinnantvoid
4140*3e519524SHoward Hinnantpush_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4141*3e519524SHoward Hinnant{
4142*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4143*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4144*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4145*3e519524SHoward Hinnant    __push_heap_back<_Comp_ref>(__first, __last, __c, __last - __first);
4146*3e519524SHoward Hinnant#else
4147*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4148*3e519524SHoward Hinnant    __push_heap_back<_Comp_ref>(__first, __last, __comp, __last - __first);
4149*3e519524SHoward Hinnant#endif
4150*3e519524SHoward Hinnant}
4151*3e519524SHoward Hinnant
4152*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator>
4153*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4154*3e519524SHoward Hinnantvoid
4155*3e519524SHoward Hinnantpush_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4156*3e519524SHoward Hinnant{
4157*3e519524SHoward Hinnant    _STD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4158*3e519524SHoward Hinnant}
4159*3e519524SHoward Hinnant
4160*3e519524SHoward Hinnant// pop_heap
4161*3e519524SHoward Hinnant
4162*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator>
4163*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4164*3e519524SHoward Hinnantvoid
4165*3e519524SHoward Hinnant__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4166*3e519524SHoward Hinnant           typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4167*3e519524SHoward Hinnant{
4168*3e519524SHoward Hinnant    if (__len > 1)
4169*3e519524SHoward Hinnant    {
4170*3e519524SHoward Hinnant        swap(*__first, *--__last);
4171*3e519524SHoward Hinnant        __push_heap_front<_Compare>(__first, __last, __comp, __len-1);
4172*3e519524SHoward Hinnant    }
4173*3e519524SHoward Hinnant}
4174*3e519524SHoward Hinnant
4175*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare>
4176*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4177*3e519524SHoward Hinnantvoid
4178*3e519524SHoward Hinnantpop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4179*3e519524SHoward Hinnant{
4180*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4181*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4182*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4183*3e519524SHoward Hinnant    __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first);
4184*3e519524SHoward Hinnant#else
4185*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4186*3e519524SHoward Hinnant    __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
4187*3e519524SHoward Hinnant#endif
4188*3e519524SHoward Hinnant}
4189*3e519524SHoward Hinnant
4190*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator>
4191*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4192*3e519524SHoward Hinnantvoid
4193*3e519524SHoward Hinnantpop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4194*3e519524SHoward Hinnant{
4195*3e519524SHoward Hinnant    _STD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4196*3e519524SHoward Hinnant}
4197*3e519524SHoward Hinnant
4198*3e519524SHoward Hinnant// make_heap
4199*3e519524SHoward Hinnant
4200*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator>
4201*3e519524SHoward Hinnantvoid
4202*3e519524SHoward Hinnant__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4203*3e519524SHoward Hinnant{
4204*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4205*3e519524SHoward Hinnant    difference_type __n = __last - __first;
4206*3e519524SHoward Hinnant    if (__n > 1)
4207*3e519524SHoward Hinnant    {
4208*3e519524SHoward Hinnant        __last = __first;
4209*3e519524SHoward Hinnant        ++__last;
4210*3e519524SHoward Hinnant        for (difference_type __i = 1; __i < __n;)
4211*3e519524SHoward Hinnant            __push_heap_back<_Compare>(__first, ++__last, __comp, ++__i);
4212*3e519524SHoward Hinnant    }
4213*3e519524SHoward Hinnant}
4214*3e519524SHoward Hinnant
4215*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare>
4216*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4217*3e519524SHoward Hinnantvoid
4218*3e519524SHoward Hinnantmake_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4219*3e519524SHoward Hinnant{
4220*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4221*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4222*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4223*3e519524SHoward Hinnant    __make_heap<_Comp_ref>(__first, __last, __c);
4224*3e519524SHoward Hinnant#else
4225*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4226*3e519524SHoward Hinnant    __make_heap<_Comp_ref>(__first, __last, __comp);
4227*3e519524SHoward Hinnant#endif
4228*3e519524SHoward Hinnant}
4229*3e519524SHoward Hinnant
4230*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator>
4231*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4232*3e519524SHoward Hinnantvoid
4233*3e519524SHoward Hinnantmake_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4234*3e519524SHoward Hinnant{
4235*3e519524SHoward Hinnant    _STD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4236*3e519524SHoward Hinnant}
4237*3e519524SHoward Hinnant
4238*3e519524SHoward Hinnant// sort_heap
4239*3e519524SHoward Hinnant
4240*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator>
4241*3e519524SHoward Hinnantvoid
4242*3e519524SHoward Hinnant__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4243*3e519524SHoward Hinnant{
4244*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4245*3e519524SHoward Hinnant    for (difference_type __n = __last - __first; __n > 1; --__last, --__n)
4246*3e519524SHoward Hinnant        __pop_heap<_Compare>(__first, __last, __comp, __n);
4247*3e519524SHoward Hinnant}
4248*3e519524SHoward Hinnant
4249*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare>
4250*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4251*3e519524SHoward Hinnantvoid
4252*3e519524SHoward Hinnantsort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4253*3e519524SHoward Hinnant{
4254*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4255*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4256*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4257*3e519524SHoward Hinnant    __sort_heap<_Comp_ref>(__first, __last, __c);
4258*3e519524SHoward Hinnant#else
4259*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4260*3e519524SHoward Hinnant    __sort_heap<_Comp_ref>(__first, __last, __comp);
4261*3e519524SHoward Hinnant#endif
4262*3e519524SHoward Hinnant}
4263*3e519524SHoward Hinnant
4264*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator>
4265*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4266*3e519524SHoward Hinnantvoid
4267*3e519524SHoward Hinnantsort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4268*3e519524SHoward Hinnant{
4269*3e519524SHoward Hinnant    _STD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4270*3e519524SHoward Hinnant}
4271*3e519524SHoward Hinnant
4272*3e519524SHoward Hinnant// partial_sort
4273*3e519524SHoward Hinnant
4274*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator>
4275*3e519524SHoward Hinnantvoid
4276*3e519524SHoward Hinnant__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4277*3e519524SHoward Hinnant             _Compare __comp)
4278*3e519524SHoward Hinnant{
4279*3e519524SHoward Hinnant    __make_heap<_Compare>(__first, __middle, __comp);
4280*3e519524SHoward Hinnant    typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first;
4281*3e519524SHoward Hinnant    for (_RandomAccessIterator __i = __middle; __i != __last; ++__i)
4282*3e519524SHoward Hinnant    {
4283*3e519524SHoward Hinnant        if (__comp(*__i, *__first))
4284*3e519524SHoward Hinnant        {
4285*3e519524SHoward Hinnant            swap(*__i, *__first);
4286*3e519524SHoward Hinnant            __push_heap_front<_Compare>(__first, __middle, __comp, __len);
4287*3e519524SHoward Hinnant        }
4288*3e519524SHoward Hinnant    }
4289*3e519524SHoward Hinnant    __sort_heap<_Compare>(__first, __middle, __comp);
4290*3e519524SHoward Hinnant}
4291*3e519524SHoward Hinnant
4292*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare>
4293*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4294*3e519524SHoward Hinnantvoid
4295*3e519524SHoward Hinnantpartial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4296*3e519524SHoward Hinnant             _Compare __comp)
4297*3e519524SHoward Hinnant{
4298*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4299*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4300*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4301*3e519524SHoward Hinnant    __partial_sort<_Comp_ref>(__first, __middle, __last, __c);
4302*3e519524SHoward Hinnant#else
4303*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4304*3e519524SHoward Hinnant    __partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
4305*3e519524SHoward Hinnant#endif
4306*3e519524SHoward Hinnant}
4307*3e519524SHoward Hinnant
4308*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator>
4309*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4310*3e519524SHoward Hinnantvoid
4311*3e519524SHoward Hinnantpartial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
4312*3e519524SHoward Hinnant{
4313*3e519524SHoward Hinnant    _STD::partial_sort(__first, __middle, __last,
4314*3e519524SHoward Hinnant                       __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4315*3e519524SHoward Hinnant}
4316*3e519524SHoward Hinnant
4317*3e519524SHoward Hinnant// partial_sort_copy
4318*3e519524SHoward Hinnant
4319*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator, class _RandomAccessIterator>
4320*3e519524SHoward Hinnant_RandomAccessIterator
4321*3e519524SHoward Hinnant__partial_sort_copy(_InputIterator __first, _InputIterator __last,
4322*3e519524SHoward Hinnant                    _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
4323*3e519524SHoward Hinnant{
4324*3e519524SHoward Hinnant    _RandomAccessIterator __r = __result_first;
4325*3e519524SHoward Hinnant    if (__r != __result_last)
4326*3e519524SHoward Hinnant    {
4327*3e519524SHoward Hinnant        typename iterator_traits<_RandomAccessIterator>::difference_type __len = 0;
4328*3e519524SHoward Hinnant        for (; __first != __last && __r != __result_last; ++__first, ++__r, ++__len)
4329*3e519524SHoward Hinnant            *__r = *__first;
4330*3e519524SHoward Hinnant        __make_heap<_Compare>(__result_first, __r, __comp);
4331*3e519524SHoward Hinnant        for (; __first != __last; ++__first)
4332*3e519524SHoward Hinnant            if (__comp(*__first, *__result_first))
4333*3e519524SHoward Hinnant            {
4334*3e519524SHoward Hinnant                *__result_first = *__first;
4335*3e519524SHoward Hinnant                __push_heap_front<_Compare>(__result_first, __r, __comp, __len);
4336*3e519524SHoward Hinnant            }
4337*3e519524SHoward Hinnant        __sort_heap<_Compare>(__result_first, __r, __comp);
4338*3e519524SHoward Hinnant    }
4339*3e519524SHoward Hinnant    return __r;
4340*3e519524SHoward Hinnant}
4341*3e519524SHoward Hinnant
4342*3e519524SHoward Hinnanttemplate <class _InputIterator, class _RandomAccessIterator, class _Compare>
4343*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4344*3e519524SHoward Hinnant_RandomAccessIterator
4345*3e519524SHoward Hinnantpartial_sort_copy(_InputIterator __first, _InputIterator __last,
4346*3e519524SHoward Hinnant                  _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
4347*3e519524SHoward Hinnant{
4348*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4349*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4350*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4351*3e519524SHoward Hinnant    return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c);
4352*3e519524SHoward Hinnant#else
4353*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4354*3e519524SHoward Hinnant    return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
4355*3e519524SHoward Hinnant#endif
4356*3e519524SHoward Hinnant}
4357*3e519524SHoward Hinnant
4358*3e519524SHoward Hinnanttemplate <class _InputIterator, class _RandomAccessIterator>
4359*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4360*3e519524SHoward Hinnant_RandomAccessIterator
4361*3e519524SHoward Hinnantpartial_sort_copy(_InputIterator __first, _InputIterator __last,
4362*3e519524SHoward Hinnant                  _RandomAccessIterator __result_first, _RandomAccessIterator __result_last)
4363*3e519524SHoward Hinnant{
4364*3e519524SHoward Hinnant    return _STD::partial_sort_copy(__first, __last, __result_first, __result_last,
4365*3e519524SHoward Hinnant                                   __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4366*3e519524SHoward Hinnant}
4367*3e519524SHoward Hinnant
4368*3e519524SHoward Hinnant// nth_element
4369*3e519524SHoward Hinnant
4370*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator>
4371*3e519524SHoward Hinnantvoid
4372*3e519524SHoward Hinnant__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
4373*3e519524SHoward Hinnant{
4374*3e519524SHoward Hinnant    // _Compare is known to be a reference type
4375*3e519524SHoward Hinnant    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4376*3e519524SHoward Hinnant    const difference_type __limit = 7;
4377*3e519524SHoward Hinnant    while (true)
4378*3e519524SHoward Hinnant    {
4379*3e519524SHoward Hinnant    __restart:
4380*3e519524SHoward Hinnant        difference_type __len = __last - __first;
4381*3e519524SHoward Hinnant        switch (__len)
4382*3e519524SHoward Hinnant        {
4383*3e519524SHoward Hinnant        case 0:
4384*3e519524SHoward Hinnant        case 1:
4385*3e519524SHoward Hinnant            return;
4386*3e519524SHoward Hinnant        case 2:
4387*3e519524SHoward Hinnant            if (__comp(*--__last, *__first))
4388*3e519524SHoward Hinnant                swap(*__first, *__last);
4389*3e519524SHoward Hinnant            return;
4390*3e519524SHoward Hinnant        case 3:
4391*3e519524SHoward Hinnant            {
4392*3e519524SHoward Hinnant            _RandomAccessIterator __m = __first;
4393*3e519524SHoward Hinnant            _STD::__sort3<_Compare>(__first, ++__m, --__last, __comp);
4394*3e519524SHoward Hinnant            return;
4395*3e519524SHoward Hinnant            }
4396*3e519524SHoward Hinnant        }
4397*3e519524SHoward Hinnant        if (__len <= __limit)
4398*3e519524SHoward Hinnant        {
4399*3e519524SHoward Hinnant            __selection_sort<_Compare>(__first, __last, __comp);
4400*3e519524SHoward Hinnant            return;
4401*3e519524SHoward Hinnant        }
4402*3e519524SHoward Hinnant        // __len > __limit >= 3
4403*3e519524SHoward Hinnant        _RandomAccessIterator __m = __first + __len/2;
4404*3e519524SHoward Hinnant        _RandomAccessIterator __lm1 = __last;
4405*3e519524SHoward Hinnant        unsigned __n_swaps = _STD::__sort3<_Compare>(__first, __m, --__lm1, __comp);
4406*3e519524SHoward Hinnant        // *__m is median
4407*3e519524SHoward Hinnant        // partition [__first, __m) < *__m and *__m <= [__m, __last)
4408*3e519524SHoward Hinnant        // (this inhibits tossing elements equivalent to __m around unnecessarily)
4409*3e519524SHoward Hinnant        _RandomAccessIterator __i = __first;
4410*3e519524SHoward Hinnant        _RandomAccessIterator __j = __lm1;
4411*3e519524SHoward Hinnant        // j points beyond range to be tested, *__lm1 is known to be <= *__m
4412*3e519524SHoward Hinnant        // The search going up is known to be guarded but the search coming down isn't.
4413*3e519524SHoward Hinnant        // Prime the downward search with a guard.
4414*3e519524SHoward Hinnant        if (!__comp(*__i, *__m))  // if *__first == *__m
4415*3e519524SHoward Hinnant        {
4416*3e519524SHoward Hinnant            // *__first == *__m, *__first doesn't go in first part
4417*3e519524SHoward Hinnant            // manually guard downward moving __j against __i
4418*3e519524SHoward Hinnant            while (true)
4419*3e519524SHoward Hinnant            {
4420*3e519524SHoward Hinnant                if (__i == --__j)
4421*3e519524SHoward Hinnant                {
4422*3e519524SHoward Hinnant                    // *__first == *__m, *__m <= all other elements
4423*3e519524SHoward Hinnant                    // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
4424*3e519524SHoward Hinnant                    ++__i;  // __first + 1
4425*3e519524SHoward Hinnant                    __j = __last;
4426*3e519524SHoward Hinnant                    if (!__comp(*__first, *--__j))  // we need a guard if *__first == *(__last-1)
4427*3e519524SHoward Hinnant                    {
4428*3e519524SHoward Hinnant                        while (true)
4429*3e519524SHoward Hinnant                        {
4430*3e519524SHoward Hinnant                            if (__i == __j)
4431*3e519524SHoward Hinnant                                return;  // [__first, __last) all equivalent elements
4432*3e519524SHoward Hinnant                            if (__comp(*__first, *__i))
4433*3e519524SHoward Hinnant                            {
4434*3e519524SHoward Hinnant                                swap(*__i, *__j);
4435*3e519524SHoward Hinnant                                ++__n_swaps;
4436*3e519524SHoward Hinnant                                ++__i;
4437*3e519524SHoward Hinnant                                break;
4438*3e519524SHoward Hinnant                            }
4439*3e519524SHoward Hinnant                            ++__i;
4440*3e519524SHoward Hinnant                        }
4441*3e519524SHoward Hinnant                    }
4442*3e519524SHoward Hinnant                    // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
4443*3e519524SHoward Hinnant                    if (__i == __j)
4444*3e519524SHoward Hinnant                        return;
4445*3e519524SHoward Hinnant                    while (true)
4446*3e519524SHoward Hinnant                    {
4447*3e519524SHoward Hinnant                        while (!__comp(*__first, *__i))
4448*3e519524SHoward Hinnant                            ++__i;
4449*3e519524SHoward Hinnant                        while (__comp(*__first, *--__j))
4450*3e519524SHoward Hinnant                            ;
4451*3e519524SHoward Hinnant                        if (__i >= __j)
4452*3e519524SHoward Hinnant                            break;
4453*3e519524SHoward Hinnant                        swap(*__i, *__j);
4454*3e519524SHoward Hinnant                        ++__n_swaps;
4455*3e519524SHoward Hinnant                        ++__i;
4456*3e519524SHoward Hinnant                    }
4457*3e519524SHoward Hinnant                    // [__first, __i) == *__first and *__first < [__i, __last)
4458*3e519524SHoward Hinnant                    // The first part is sorted,
4459*3e519524SHoward Hinnant                    if (__nth < __i)
4460*3e519524SHoward Hinnant                        return;
4461*3e519524SHoward Hinnant                    // __nth_element the secod part
4462*3e519524SHoward Hinnant                    // __nth_element<_Compare>(__i, __nth, __last, __comp);
4463*3e519524SHoward Hinnant                    __first = __i;
4464*3e519524SHoward Hinnant                    goto __restart;
4465*3e519524SHoward Hinnant                }
4466*3e519524SHoward Hinnant                if (__comp(*__j, *__m))
4467*3e519524SHoward Hinnant                {
4468*3e519524SHoward Hinnant                    swap(*__i, *__j);
4469*3e519524SHoward Hinnant                    ++__n_swaps;
4470*3e519524SHoward Hinnant                    break;  // found guard for downward moving __j, now use unguarded partition
4471*3e519524SHoward Hinnant                }
4472*3e519524SHoward Hinnant            }
4473*3e519524SHoward Hinnant        }
4474*3e519524SHoward Hinnant        ++__i;
4475*3e519524SHoward Hinnant        // j points beyond range to be tested, *__lm1 is known to be <= *__m
4476*3e519524SHoward Hinnant        // if not yet partitioned...
4477*3e519524SHoward Hinnant        if (__i < __j)
4478*3e519524SHoward Hinnant        {
4479*3e519524SHoward Hinnant            // known that *(__i - 1) < *__m
4480*3e519524SHoward Hinnant            while (true)
4481*3e519524SHoward Hinnant            {
4482*3e519524SHoward Hinnant                // __m still guards upward moving __i
4483*3e519524SHoward Hinnant                while (__comp(*__i, *__m))
4484*3e519524SHoward Hinnant                    ++__i;
4485*3e519524SHoward Hinnant                // It is now known that a guard exists for downward moving __j
4486*3e519524SHoward Hinnant                while (!__comp(*--__j, *__m))
4487*3e519524SHoward Hinnant                    ;
4488*3e519524SHoward Hinnant                if (__i >= __j)
4489*3e519524SHoward Hinnant                    break;
4490*3e519524SHoward Hinnant                swap(*__i, *__j);
4491*3e519524SHoward Hinnant                ++__n_swaps;
4492*3e519524SHoward Hinnant                // It is known that __m != __j
4493*3e519524SHoward Hinnant                // If __m just moved, follow it
4494*3e519524SHoward Hinnant                if (__m == __i)
4495*3e519524SHoward Hinnant                    __m = __j;
4496*3e519524SHoward Hinnant                ++__i;
4497*3e519524SHoward Hinnant            }
4498*3e519524SHoward Hinnant        }
4499*3e519524SHoward Hinnant        // [__first, __i) < *__m and *__m <= [__i, __last)
4500*3e519524SHoward Hinnant        if (__i != __m && __comp(*__m, *__i))
4501*3e519524SHoward Hinnant        {
4502*3e519524SHoward Hinnant            swap(*__i, *__m);
4503*3e519524SHoward Hinnant            ++__n_swaps;
4504*3e519524SHoward Hinnant        }
4505*3e519524SHoward Hinnant        // [__first, __i) < *__i and *__i <= [__i+1, __last)
4506*3e519524SHoward Hinnant        if (__nth == __i)
4507*3e519524SHoward Hinnant            return;
4508*3e519524SHoward Hinnant        if (__n_swaps == 0)
4509*3e519524SHoward Hinnant        {
4510*3e519524SHoward Hinnant            // We were given a perfectly partitioned sequence.  Coincidence?
4511*3e519524SHoward Hinnant            if (__nth < __i)
4512*3e519524SHoward Hinnant            {
4513*3e519524SHoward Hinnant                // Check for [__first, __i) already sorted
4514*3e519524SHoward Hinnant                __j = __m = __first;
4515*3e519524SHoward Hinnant                while (++__j != __i)
4516*3e519524SHoward Hinnant                {
4517*3e519524SHoward Hinnant                    if (__comp(*__j, *__m))
4518*3e519524SHoward Hinnant                        // not yet sorted, so sort
4519*3e519524SHoward Hinnant                        goto not_sorted;
4520*3e519524SHoward Hinnant                    __m = __j;
4521*3e519524SHoward Hinnant                }
4522*3e519524SHoward Hinnant                // [__first, __i) sorted
4523*3e519524SHoward Hinnant                return;
4524*3e519524SHoward Hinnant            }
4525*3e519524SHoward Hinnant            else
4526*3e519524SHoward Hinnant            {
4527*3e519524SHoward Hinnant                // Check for [__i, __last) already sorted
4528*3e519524SHoward Hinnant                __j = __m = __i;
4529*3e519524SHoward Hinnant                while (++__j != __last)
4530*3e519524SHoward Hinnant                {
4531*3e519524SHoward Hinnant                    if (__comp(*__j, *__m))
4532*3e519524SHoward Hinnant                        // not yet sorted, so sort
4533*3e519524SHoward Hinnant                        goto not_sorted;
4534*3e519524SHoward Hinnant                    __m = __j;
4535*3e519524SHoward Hinnant                }
4536*3e519524SHoward Hinnant                // [__i, __last) sorted
4537*3e519524SHoward Hinnant                return;
4538*3e519524SHoward Hinnant            }
4539*3e519524SHoward Hinnant        }
4540*3e519524SHoward Hinnantnot_sorted:
4541*3e519524SHoward Hinnant        // __nth_element on range containing __nth
4542*3e519524SHoward Hinnant        if (__nth < __i)
4543*3e519524SHoward Hinnant        {
4544*3e519524SHoward Hinnant            // __nth_element<_Compare>(__first, __nth, __i, __comp);
4545*3e519524SHoward Hinnant            __last = __i;
4546*3e519524SHoward Hinnant        }
4547*3e519524SHoward Hinnant        else
4548*3e519524SHoward Hinnant        {
4549*3e519524SHoward Hinnant            // __nth_element<_Compare>(__i+1, __nth, __last, __comp);
4550*3e519524SHoward Hinnant            __first = ++__i;
4551*3e519524SHoward Hinnant        }
4552*3e519524SHoward Hinnant    }
4553*3e519524SHoward Hinnant}
4554*3e519524SHoward Hinnant
4555*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare>
4556*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4557*3e519524SHoward Hinnantvoid
4558*3e519524SHoward Hinnantnth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
4559*3e519524SHoward Hinnant{
4560*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4561*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4562*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4563*3e519524SHoward Hinnant    __nth_element<_Comp_ref>(__first, __nth, __last, __c);
4564*3e519524SHoward Hinnant#else
4565*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4566*3e519524SHoward Hinnant    __nth_element<_Comp_ref>(__first, __nth, __last, __comp);
4567*3e519524SHoward Hinnant#endif
4568*3e519524SHoward Hinnant}
4569*3e519524SHoward Hinnant
4570*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator>
4571*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4572*3e519524SHoward Hinnantvoid
4573*3e519524SHoward Hinnantnth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last)
4574*3e519524SHoward Hinnant{
4575*3e519524SHoward Hinnant    _STD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4576*3e519524SHoward Hinnant}
4577*3e519524SHoward Hinnant
4578*3e519524SHoward Hinnant// includes
4579*3e519524SHoward Hinnant
4580*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2>
4581*3e519524SHoward Hinnantbool
4582*3e519524SHoward Hinnant__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
4583*3e519524SHoward Hinnant           _Compare __comp)
4584*3e519524SHoward Hinnant{
4585*3e519524SHoward Hinnant    for (; __first2 != __last2; ++__first1)
4586*3e519524SHoward Hinnant    {
4587*3e519524SHoward Hinnant        if (__first1 == __last1 || __comp(*__first2, *__first1))
4588*3e519524SHoward Hinnant            return false;
4589*3e519524SHoward Hinnant        if (!__comp(*__first1, *__first2))
4590*3e519524SHoward Hinnant            ++__first2;
4591*3e519524SHoward Hinnant    }
4592*3e519524SHoward Hinnant    return true;
4593*3e519524SHoward Hinnant}
4594*3e519524SHoward Hinnant
4595*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _Compare>
4596*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4597*3e519524SHoward Hinnantbool
4598*3e519524SHoward Hinnantincludes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
4599*3e519524SHoward Hinnant         _Compare __comp)
4600*3e519524SHoward Hinnant{
4601*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4602*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4603*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4604*3e519524SHoward Hinnant    return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
4605*3e519524SHoward Hinnant#else
4606*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4607*3e519524SHoward Hinnant    return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
4608*3e519524SHoward Hinnant#endif
4609*3e519524SHoward Hinnant}
4610*3e519524SHoward Hinnant
4611*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2>
4612*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4613*3e519524SHoward Hinnantbool
4614*3e519524SHoward Hinnantincludes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
4615*3e519524SHoward Hinnant{
4616*3e519524SHoward Hinnant    return _STD::includes(__first1, __last1, __first2, __last2,
4617*3e519524SHoward Hinnant                          __less<typename iterator_traits<_InputIterator1>::value_type,
4618*3e519524SHoward Hinnant                                 typename iterator_traits<_InputIterator2>::value_type>());
4619*3e519524SHoward Hinnant}
4620*3e519524SHoward Hinnant
4621*3e519524SHoward Hinnant// set_union
4622*3e519524SHoward Hinnant
4623*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4624*3e519524SHoward Hinnant_OutputIterator
4625*3e519524SHoward Hinnant__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
4626*3e519524SHoward Hinnant            _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4627*3e519524SHoward Hinnant{
4628*3e519524SHoward Hinnant    for (; __first1 != __last1; ++__result)
4629*3e519524SHoward Hinnant    {
4630*3e519524SHoward Hinnant        if (__first2 == __last2)
4631*3e519524SHoward Hinnant            return _STD::copy(__first1, __last1, __result);
4632*3e519524SHoward Hinnant        if (__comp(*__first2, *__first1))
4633*3e519524SHoward Hinnant        {
4634*3e519524SHoward Hinnant            *__result = *__first2;
4635*3e519524SHoward Hinnant            ++__first2;
4636*3e519524SHoward Hinnant        }
4637*3e519524SHoward Hinnant        else
4638*3e519524SHoward Hinnant        {
4639*3e519524SHoward Hinnant            *__result = *__first1;
4640*3e519524SHoward Hinnant            if (!__comp(*__first1, *__first2))
4641*3e519524SHoward Hinnant                ++__first2;
4642*3e519524SHoward Hinnant            ++__first1;
4643*3e519524SHoward Hinnant        }
4644*3e519524SHoward Hinnant    }
4645*3e519524SHoward Hinnant    return _STD::copy(__first2, __last2, __result);
4646*3e519524SHoward Hinnant}
4647*3e519524SHoward Hinnant
4648*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4649*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4650*3e519524SHoward Hinnant_OutputIterator
4651*3e519524SHoward Hinnantset_union(_InputIterator1 __first1, _InputIterator1 __last1,
4652*3e519524SHoward Hinnant          _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4653*3e519524SHoward Hinnant{
4654*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4655*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4656*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4657*3e519524SHoward Hinnant    return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
4658*3e519524SHoward Hinnant#else
4659*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4660*3e519524SHoward Hinnant    return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
4661*3e519524SHoward Hinnant#endif
4662*3e519524SHoward Hinnant}
4663*3e519524SHoward Hinnant
4664*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator>
4665*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4666*3e519524SHoward Hinnant_OutputIterator
4667*3e519524SHoward Hinnantset_union(_InputIterator1 __first1, _InputIterator1 __last1,
4668*3e519524SHoward Hinnant          _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
4669*3e519524SHoward Hinnant{
4670*3e519524SHoward Hinnant    return _STD::set_union(__first1, __last1, __first2, __last2, __result,
4671*3e519524SHoward Hinnant                          __less<typename iterator_traits<_InputIterator1>::value_type,
4672*3e519524SHoward Hinnant                                 typename iterator_traits<_InputIterator2>::value_type>());
4673*3e519524SHoward Hinnant}
4674*3e519524SHoward Hinnant
4675*3e519524SHoward Hinnant// set_intersection
4676*3e519524SHoward Hinnant
4677*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4678*3e519524SHoward Hinnant_OutputIterator
4679*3e519524SHoward Hinnant__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
4680*3e519524SHoward Hinnant                   _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4681*3e519524SHoward Hinnant{
4682*3e519524SHoward Hinnant    while (__first1 != __last1 && __first2 != __last2)
4683*3e519524SHoward Hinnant    {
4684*3e519524SHoward Hinnant        if (__comp(*__first1, *__first2))
4685*3e519524SHoward Hinnant            ++__first1;
4686*3e519524SHoward Hinnant        else
4687*3e519524SHoward Hinnant        {
4688*3e519524SHoward Hinnant            if (!__comp(*__first2, *__first1))
4689*3e519524SHoward Hinnant            {
4690*3e519524SHoward Hinnant                *__result = *__first1;
4691*3e519524SHoward Hinnant                ++__result;
4692*3e519524SHoward Hinnant                ++__first1;
4693*3e519524SHoward Hinnant            }
4694*3e519524SHoward Hinnant            ++__first2;
4695*3e519524SHoward Hinnant        }
4696*3e519524SHoward Hinnant    }
4697*3e519524SHoward Hinnant    return __result;
4698*3e519524SHoward Hinnant}
4699*3e519524SHoward Hinnant
4700*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4701*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4702*3e519524SHoward Hinnant_OutputIterator
4703*3e519524SHoward Hinnantset_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
4704*3e519524SHoward Hinnant                 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4705*3e519524SHoward Hinnant{
4706*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4707*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4708*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4709*3e519524SHoward Hinnant    return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
4710*3e519524SHoward Hinnant#else
4711*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4712*3e519524SHoward Hinnant    return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
4713*3e519524SHoward Hinnant#endif
4714*3e519524SHoward Hinnant}
4715*3e519524SHoward Hinnant
4716*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator>
4717*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4718*3e519524SHoward Hinnant_OutputIterator
4719*3e519524SHoward Hinnantset_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
4720*3e519524SHoward Hinnant                 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
4721*3e519524SHoward Hinnant{
4722*3e519524SHoward Hinnant    return _STD::set_intersection(__first1, __last1, __first2, __last2, __result,
4723*3e519524SHoward Hinnant                                  __less<typename iterator_traits<_InputIterator1>::value_type,
4724*3e519524SHoward Hinnant                                         typename iterator_traits<_InputIterator2>::value_type>());
4725*3e519524SHoward Hinnant}
4726*3e519524SHoward Hinnant
4727*3e519524SHoward Hinnant// set_difference
4728*3e519524SHoward Hinnant
4729*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4730*3e519524SHoward Hinnant_OutputIterator
4731*3e519524SHoward Hinnant__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
4732*3e519524SHoward Hinnant                 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4733*3e519524SHoward Hinnant{
4734*3e519524SHoward Hinnant    while (__first1 != __last1)
4735*3e519524SHoward Hinnant    {
4736*3e519524SHoward Hinnant        if (__first2 == __last2)
4737*3e519524SHoward Hinnant            return _STD::copy(__first1, __last1, __result);
4738*3e519524SHoward Hinnant        if (__comp(*__first1, *__first2))
4739*3e519524SHoward Hinnant        {
4740*3e519524SHoward Hinnant            *__result = *__first1;
4741*3e519524SHoward Hinnant            ++__result;
4742*3e519524SHoward Hinnant            ++__first1;
4743*3e519524SHoward Hinnant        }
4744*3e519524SHoward Hinnant        else
4745*3e519524SHoward Hinnant        {
4746*3e519524SHoward Hinnant            if (!__comp(*__first2, *__first1))
4747*3e519524SHoward Hinnant                ++__first1;
4748*3e519524SHoward Hinnant            ++__first2;
4749*3e519524SHoward Hinnant        }
4750*3e519524SHoward Hinnant    }
4751*3e519524SHoward Hinnant    return __result;
4752*3e519524SHoward Hinnant}
4753*3e519524SHoward Hinnant
4754*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4755*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4756*3e519524SHoward Hinnant_OutputIterator
4757*3e519524SHoward Hinnantset_difference(_InputIterator1 __first1, _InputIterator1 __last1,
4758*3e519524SHoward Hinnant               _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4759*3e519524SHoward Hinnant{
4760*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4761*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4762*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4763*3e519524SHoward Hinnant    return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
4764*3e519524SHoward Hinnant#else
4765*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4766*3e519524SHoward Hinnant    return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
4767*3e519524SHoward Hinnant#endif
4768*3e519524SHoward Hinnant}
4769*3e519524SHoward Hinnant
4770*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator>
4771*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4772*3e519524SHoward Hinnant_OutputIterator
4773*3e519524SHoward Hinnantset_difference(_InputIterator1 __first1, _InputIterator1 __last1,
4774*3e519524SHoward Hinnant               _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
4775*3e519524SHoward Hinnant{
4776*3e519524SHoward Hinnant    return _STD::set_difference(__first1, __last1, __first2, __last2, __result,
4777*3e519524SHoward Hinnant                                __less<typename iterator_traits<_InputIterator1>::value_type,
4778*3e519524SHoward Hinnant                                       typename iterator_traits<_InputIterator2>::value_type>());
4779*3e519524SHoward Hinnant}
4780*3e519524SHoward Hinnant
4781*3e519524SHoward Hinnant// set_symmetric_difference
4782*3e519524SHoward Hinnant
4783*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4784*3e519524SHoward Hinnant_OutputIterator
4785*3e519524SHoward Hinnant__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
4786*3e519524SHoward Hinnant                           _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4787*3e519524SHoward Hinnant{
4788*3e519524SHoward Hinnant    while (__first1 != __last1)
4789*3e519524SHoward Hinnant    {
4790*3e519524SHoward Hinnant        if (__first2 == __last2)
4791*3e519524SHoward Hinnant            return _STD::copy(__first1, __last1, __result);
4792*3e519524SHoward Hinnant        if (__comp(*__first1, *__first2))
4793*3e519524SHoward Hinnant        {
4794*3e519524SHoward Hinnant            *__result = *__first1;
4795*3e519524SHoward Hinnant            ++__result;
4796*3e519524SHoward Hinnant            ++__first1;
4797*3e519524SHoward Hinnant        }
4798*3e519524SHoward Hinnant        else
4799*3e519524SHoward Hinnant        {
4800*3e519524SHoward Hinnant            if (__comp(*__first2, *__first1))
4801*3e519524SHoward Hinnant            {
4802*3e519524SHoward Hinnant                *__result = *__first2;
4803*3e519524SHoward Hinnant                ++__result;
4804*3e519524SHoward Hinnant            }
4805*3e519524SHoward Hinnant            else
4806*3e519524SHoward Hinnant                ++__first1;
4807*3e519524SHoward Hinnant            ++__first2;
4808*3e519524SHoward Hinnant        }
4809*3e519524SHoward Hinnant    }
4810*3e519524SHoward Hinnant    return _STD::copy(__first2, __last2, __result);
4811*3e519524SHoward Hinnant}
4812*3e519524SHoward Hinnant
4813*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4814*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4815*3e519524SHoward Hinnant_OutputIterator
4816*3e519524SHoward Hinnantset_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
4817*3e519524SHoward Hinnant                         _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4818*3e519524SHoward Hinnant{
4819*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4820*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4821*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4822*3e519524SHoward Hinnant    return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
4823*3e519524SHoward Hinnant#else
4824*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4825*3e519524SHoward Hinnant    return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
4826*3e519524SHoward Hinnant#endif
4827*3e519524SHoward Hinnant}
4828*3e519524SHoward Hinnant
4829*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator>
4830*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4831*3e519524SHoward Hinnant_OutputIterator
4832*3e519524SHoward Hinnantset_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
4833*3e519524SHoward Hinnant                         _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
4834*3e519524SHoward Hinnant{
4835*3e519524SHoward Hinnant    return _STD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
4836*3e519524SHoward Hinnant                                          __less<typename iterator_traits<_InputIterator1>::value_type,
4837*3e519524SHoward Hinnant                                                 typename iterator_traits<_InputIterator2>::value_type>());
4838*3e519524SHoward Hinnant}
4839*3e519524SHoward Hinnant
4840*3e519524SHoward Hinnant// lexicographical_compare
4841*3e519524SHoward Hinnant
4842*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2>
4843*3e519524SHoward Hinnantbool
4844*3e519524SHoward Hinnant__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
4845*3e519524SHoward Hinnant                          _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
4846*3e519524SHoward Hinnant{
4847*3e519524SHoward Hinnant    for (; __first2 != __last2; ++__first1, ++__first2)
4848*3e519524SHoward Hinnant    {
4849*3e519524SHoward Hinnant        if (__first1 == __last1 || __comp(*__first1, *__first2))
4850*3e519524SHoward Hinnant            return true;
4851*3e519524SHoward Hinnant        if (__comp(*__first2, *__first1))
4852*3e519524SHoward Hinnant            return false;
4853*3e519524SHoward Hinnant    }
4854*3e519524SHoward Hinnant    return false;
4855*3e519524SHoward Hinnant}
4856*3e519524SHoward Hinnant
4857*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _Compare>
4858*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4859*3e519524SHoward Hinnantbool
4860*3e519524SHoward Hinnantlexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
4861*3e519524SHoward Hinnant                        _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
4862*3e519524SHoward Hinnant{
4863*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4864*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4865*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4866*3e519524SHoward Hinnant    return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
4867*3e519524SHoward Hinnant#else
4868*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4869*3e519524SHoward Hinnant    return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
4870*3e519524SHoward Hinnant#endif
4871*3e519524SHoward Hinnant}
4872*3e519524SHoward Hinnant
4873*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2>
4874*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4875*3e519524SHoward Hinnantbool
4876*3e519524SHoward Hinnantlexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
4877*3e519524SHoward Hinnant                        _InputIterator2 __first2, _InputIterator2 __last2)
4878*3e519524SHoward Hinnant{
4879*3e519524SHoward Hinnant    return _STD::lexicographical_compare(__first1, __last1, __first2, __last2,
4880*3e519524SHoward Hinnant                                         __less<typename iterator_traits<_InputIterator1>::value_type,
4881*3e519524SHoward Hinnant                                                typename iterator_traits<_InputIterator2>::value_type>());
4882*3e519524SHoward Hinnant}
4883*3e519524SHoward Hinnant
4884*3e519524SHoward Hinnant// next_permutation
4885*3e519524SHoward Hinnant
4886*3e519524SHoward Hinnanttemplate <class _Compare, class _BidirectionalIterator>
4887*3e519524SHoward Hinnantbool
4888*3e519524SHoward Hinnant__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
4889*3e519524SHoward Hinnant{
4890*3e519524SHoward Hinnant    _BidirectionalIterator __i = __last;
4891*3e519524SHoward Hinnant    if (__first == __last || __first == --__i)
4892*3e519524SHoward Hinnant        return false;
4893*3e519524SHoward Hinnant    while (true)
4894*3e519524SHoward Hinnant    {
4895*3e519524SHoward Hinnant        _BidirectionalIterator __ip1 = __i;
4896*3e519524SHoward Hinnant        if (__comp(*--__i, *__ip1))
4897*3e519524SHoward Hinnant        {
4898*3e519524SHoward Hinnant            _BidirectionalIterator __j = __last;
4899*3e519524SHoward Hinnant            while (!__comp(*__i, *--__j))
4900*3e519524SHoward Hinnant                ;
4901*3e519524SHoward Hinnant            swap(*__i, *__j);
4902*3e519524SHoward Hinnant            _STD::reverse(__ip1, __last);
4903*3e519524SHoward Hinnant            return true;
4904*3e519524SHoward Hinnant        }
4905*3e519524SHoward Hinnant        if (__i == __first)
4906*3e519524SHoward Hinnant        {
4907*3e519524SHoward Hinnant            _STD::reverse(__first, __last);
4908*3e519524SHoward Hinnant            return false;
4909*3e519524SHoward Hinnant        }
4910*3e519524SHoward Hinnant    }
4911*3e519524SHoward Hinnant}
4912*3e519524SHoward Hinnant
4913*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator, class _Compare>
4914*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4915*3e519524SHoward Hinnantbool
4916*3e519524SHoward Hinnantnext_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
4917*3e519524SHoward Hinnant{
4918*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4919*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4920*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4921*3e519524SHoward Hinnant    return __next_permutation<_Comp_ref>(__first, __last, __c);
4922*3e519524SHoward Hinnant#else
4923*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4924*3e519524SHoward Hinnant    return __next_permutation<_Comp_ref>(__first, __last, __comp);
4925*3e519524SHoward Hinnant#endif
4926*3e519524SHoward Hinnant}
4927*3e519524SHoward Hinnant
4928*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator>
4929*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4930*3e519524SHoward Hinnantbool
4931*3e519524SHoward Hinnantnext_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
4932*3e519524SHoward Hinnant{
4933*3e519524SHoward Hinnant    return _STD::next_permutation(__first, __last,
4934*3e519524SHoward Hinnant                                  __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
4935*3e519524SHoward Hinnant}
4936*3e519524SHoward Hinnant
4937*3e519524SHoward Hinnant// prev_permutation
4938*3e519524SHoward Hinnant
4939*3e519524SHoward Hinnanttemplate <class _Compare, class _BidirectionalIterator>
4940*3e519524SHoward Hinnantbool
4941*3e519524SHoward Hinnant__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
4942*3e519524SHoward Hinnant{
4943*3e519524SHoward Hinnant    _BidirectionalIterator __i = __last;
4944*3e519524SHoward Hinnant    if (__first == __last || __first == --__i)
4945*3e519524SHoward Hinnant        return false;
4946*3e519524SHoward Hinnant    while (true)
4947*3e519524SHoward Hinnant    {
4948*3e519524SHoward Hinnant        _BidirectionalIterator __ip1 = __i;
4949*3e519524SHoward Hinnant        if (__comp(*__ip1, *--__i))
4950*3e519524SHoward Hinnant        {
4951*3e519524SHoward Hinnant            _BidirectionalIterator __j = __last;
4952*3e519524SHoward Hinnant            while (!__comp(*--__j, *__i))
4953*3e519524SHoward Hinnant                ;
4954*3e519524SHoward Hinnant            swap(*__i, *__j);
4955*3e519524SHoward Hinnant            _STD::reverse(__ip1, __last);
4956*3e519524SHoward Hinnant            return true;
4957*3e519524SHoward Hinnant        }
4958*3e519524SHoward Hinnant        if (__i == __first)
4959*3e519524SHoward Hinnant        {
4960*3e519524SHoward Hinnant            _STD::reverse(__first, __last);
4961*3e519524SHoward Hinnant            return false;
4962*3e519524SHoward Hinnant        }
4963*3e519524SHoward Hinnant    }
4964*3e519524SHoward Hinnant}
4965*3e519524SHoward Hinnant
4966*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator, class _Compare>
4967*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4968*3e519524SHoward Hinnantbool
4969*3e519524SHoward Hinnantprev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
4970*3e519524SHoward Hinnant{
4971*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG
4972*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4973*3e519524SHoward Hinnant    __debug_less<_Compare> __c(__comp);
4974*3e519524SHoward Hinnant    return __prev_permutation<_Comp_ref>(__first, __last, __c);
4975*3e519524SHoward Hinnant#else
4976*3e519524SHoward Hinnant    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4977*3e519524SHoward Hinnant    return __prev_permutation<_Comp_ref>(__first, __last, __comp);
4978*3e519524SHoward Hinnant#endif
4979*3e519524SHoward Hinnant}
4980*3e519524SHoward Hinnant
4981*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator>
4982*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4983*3e519524SHoward Hinnantbool
4984*3e519524SHoward Hinnantprev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
4985*3e519524SHoward Hinnant{
4986*3e519524SHoward Hinnant    return _STD::prev_permutation(__first, __last,
4987*3e519524SHoward Hinnant                                  __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
4988*3e519524SHoward Hinnant}
4989*3e519524SHoward Hinnant
4990*3e519524SHoward Hinnanttemplate <class _Tp>
4991*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
4992*3e519524SHoward Hinnanttypename enable_if
4993*3e519524SHoward Hinnant<
4994*3e519524SHoward Hinnant    is_integral<_Tp>::value,
4995*3e519524SHoward Hinnant    _Tp
4996*3e519524SHoward Hinnant>::type
4997*3e519524SHoward Hinnant__rotate_left(_Tp __t, _Tp __n = 1)
4998*3e519524SHoward Hinnant{
4999*3e519524SHoward Hinnant    const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5000*3e519524SHoward Hinnant    __n &= __bits;
5001*3e519524SHoward Hinnant    return static_cast<_Tp>((__t << __n) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> (__bits - __n)));
5002*3e519524SHoward Hinnant}
5003*3e519524SHoward Hinnant
5004*3e519524SHoward Hinnanttemplate <class _Tp>
5005*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5006*3e519524SHoward Hinnanttypename enable_if
5007*3e519524SHoward Hinnant<
5008*3e519524SHoward Hinnant    is_integral<_Tp>::value,
5009*3e519524SHoward Hinnant    _Tp
5010*3e519524SHoward Hinnant>::type
5011*3e519524SHoward Hinnant__rotate_right(_Tp __t, _Tp __n = 1)
5012*3e519524SHoward Hinnant{
5013*3e519524SHoward Hinnant    const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5014*3e519524SHoward Hinnant    __n &= __bits;
5015*3e519524SHoward Hinnant    return static_cast<_Tp>((__t << (__bits - __n)) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> __n));
5016*3e519524SHoward Hinnant}
5017*3e519524SHoward Hinnant
5018*3e519524SHoward Hinnant// Precondition:  __x != 0
5019*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY unsigned           __ctz(unsigned           __x) {return __builtin_ctz  (__x);}
5020*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY unsigned      long __ctz(unsigned      long __x) {return __builtin_ctzl (__x);}
5021*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY unsigned long long __ctz(unsigned long long __x) {return __builtin_ctzll(__x);}
5022*3e519524SHoward Hinnant
5023*3e519524SHoward Hinnant// Precondition:  __x != 0
5024*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY unsigned           __clz(unsigned           __x) {return __builtin_clz  (__x);}
5025*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY unsigned      long __clz(unsigned      long __x) {return __builtin_clzl (__x);}
5026*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY unsigned long long __clz(unsigned long long __x) {return __builtin_clzll(__x);}
5027*3e519524SHoward Hinnant
5028*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned           __x) {return __builtin_popcount  (__x);}
5029*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned      long __x) {return __builtin_popcountl (__x);}
5030*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long long __x) {return __builtin_popcountll(__x);}
5031*3e519524SHoward Hinnant
5032*3e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
5033*3e519524SHoward Hinnant
5034*3e519524SHoward Hinnant#endif  // _LIBCPP_ALGORITHM
5035