algorithm revision 227825
1227825Stheraven// -*- C++ -*-
2227825Stheraven//===-------------------------- algorithm ---------------------------------===//
3227825Stheraven//
4227825Stheraven//                     The LLVM Compiler Infrastructure
5227825Stheraven//
6227825Stheraven// This file is dual licensed under the MIT and the University of Illinois Open
7227825Stheraven// Source Licenses. See LICENSE.TXT for details.
8227825Stheraven//
9227825Stheraven//===----------------------------------------------------------------------===//
10227825Stheraven
11227825Stheraven#ifndef _LIBCPP_ALGORITHM
12227825Stheraven#define _LIBCPP_ALGORITHM
13227825Stheraven
14227825Stheraven/*
15227825Stheraven    algorithm synopsis
16227825Stheraven
17227825Stheraven#include <initializer_list>
18227825Stheraven
19227825Stheravennamespace std
20227825Stheraven{
21227825Stheraven
22227825Stheraventemplate <class InputIterator, class Predicate>
23227825Stheraven    bool
24227825Stheraven    all_of(InputIterator first, InputIterator last, Predicate pred);
25227825Stheraven
26227825Stheraventemplate <class InputIterator, class Predicate>
27227825Stheraven    bool
28227825Stheraven    any_of(InputIterator first, InputIterator last, Predicate pred);
29227825Stheraven
30227825Stheraventemplate <class InputIterator, class Predicate>
31227825Stheraven    bool
32227825Stheraven    none_of(InputIterator first, InputIterator last, Predicate pred);
33227825Stheraven
34227825Stheraventemplate <class InputIterator, class Function>
35227825Stheraven    Function
36227825Stheraven    for_each(InputIterator first, InputIterator last, Function f);
37227825Stheraven
38227825Stheraventemplate <class InputIterator, class T>
39227825Stheraven    InputIterator
40227825Stheraven    find(InputIterator first, InputIterator last, const T& value);
41227825Stheraven
42227825Stheraventemplate <class InputIterator, class Predicate>
43227825Stheraven    InputIterator
44227825Stheraven    find_if(InputIterator first, InputIterator last, Predicate pred);
45227825Stheraven
46227825Stheraventemplate<class InputIterator, class Predicate>
47227825Stheraven    InputIterator
48227825Stheraven    find_if_not(InputIterator first, InputIterator last, Predicate pred);
49227825Stheraven
50227825Stheraventemplate <class ForwardIterator1, class ForwardIterator2>
51227825Stheraven    ForwardIterator1
52227825Stheraven    find_end(ForwardIterator1 first1, ForwardIterator1 last1,
53227825Stheraven             ForwardIterator2 first2, ForwardIterator2 last2);
54227825Stheraven
55227825Stheraventemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
56227825Stheraven    ForwardIterator1
57227825Stheraven    find_end(ForwardIterator1 first1, ForwardIterator1 last1,
58227825Stheraven             ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
59227825Stheraven
60227825Stheraventemplate <class ForwardIterator1, class ForwardIterator2>
61227825Stheraven    ForwardIterator1
62227825Stheraven    find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
63227825Stheraven                  ForwardIterator2 first2, ForwardIterator2 last2);
64227825Stheraven
65227825Stheraventemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
66227825Stheraven    ForwardIterator1
67227825Stheraven    find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
68227825Stheraven                  ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
69227825Stheraven
70227825Stheraventemplate <class ForwardIterator>
71227825Stheraven    ForwardIterator
72227825Stheraven    adjacent_find(ForwardIterator first, ForwardIterator last);
73227825Stheraven
74227825Stheraventemplate <class ForwardIterator, class BinaryPredicate>
75227825Stheraven    ForwardIterator
76227825Stheraven    adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
77227825Stheraven
78227825Stheraventemplate <class InputIterator, class T>
79227825Stheraven    typename iterator_traits<InputIterator>::difference_type
80227825Stheraven    count(InputIterator first, InputIterator last, const T& value);
81227825Stheraven
82227825Stheraventemplate <class InputIterator, class Predicate>
83227825Stheraven    typename iterator_traits<InputIterator>::difference_type
84227825Stheraven    count_if(InputIterator first, InputIterator last, Predicate pred);
85227825Stheraven
86227825Stheraventemplate <class InputIterator1, class InputIterator2>
87227825Stheraven    pair<InputIterator1, InputIterator2>
88227825Stheraven    mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
89227825Stheraven
90227825Stheraventemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
91227825Stheraven    pair<InputIterator1, InputIterator2>
92227825Stheraven    mismatch(InputIterator1 first1, InputIterator1 last1,
93227825Stheraven             InputIterator2 first2, BinaryPredicate pred);
94227825Stheraven
95227825Stheraventemplate <class InputIterator1, class InputIterator2>
96227825Stheraven    bool
97227825Stheraven    equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
98227825Stheraven
99227825Stheraventemplate <class InputIterator1, class InputIterator2, class BinaryPredicate>
100227825Stheraven    bool
101227825Stheraven    equal(InputIterator1 first1, InputIterator1 last1,
102227825Stheraven          InputIterator2 first2, BinaryPredicate pred);
103227825Stheraven
104227825Stheraventemplate<class ForwardIterator1, class ForwardIterator2>
105227825Stheraven    bool
106227825Stheraven    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
107227825Stheraven                   ForwardIterator2 first2);
108227825Stheraven
109227825Stheraventemplate<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
110227825Stheraven    bool
111227825Stheraven    is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
112227825Stheraven                   ForwardIterator2 first2, BinaryPredicate pred);
113227825Stheraven
114227825Stheraventemplate <class ForwardIterator1, class ForwardIterator2>
115227825Stheraven    ForwardIterator1
116227825Stheraven    search(ForwardIterator1 first1, ForwardIterator1 last1,
117227825Stheraven           ForwardIterator2 first2, ForwardIterator2 last2);
118227825Stheraven
119227825Stheraventemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
120227825Stheraven    ForwardIterator1
121227825Stheraven    search(ForwardIterator1 first1, ForwardIterator1 last1,
122227825Stheraven           ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
123227825Stheraven
124227825Stheraventemplate <class ForwardIterator, class Size, class T>
125227825Stheraven    ForwardIterator
126227825Stheraven    search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
127227825Stheraven
128227825Stheraventemplate <class ForwardIterator, class Size, class T, class BinaryPredicate>
129227825Stheraven    ForwardIterator
130227825Stheraven    search_n(ForwardIterator first, ForwardIterator last,
131227825Stheraven             Size count, const T& value, BinaryPredicate pred);
132227825Stheraven
133227825Stheraventemplate <class InputIterator, class OutputIterator>
134227825Stheraven    OutputIterator
135227825Stheraven    copy(InputIterator first, InputIterator last, OutputIterator result);
136227825Stheraven
137227825Stheraventemplate<class InputIterator, class OutputIterator, class Predicate>
138227825Stheraven    OutputIterator
139227825Stheraven    copy_if(InputIterator first, InputIterator last,
140227825Stheraven            OutputIterator result, Predicate pred);
141227825Stheraven
142227825Stheraventemplate<class InputIterator, class Size, class OutputIterator>
143227825Stheraven    OutputIterator
144227825Stheraven    copy_n(InputIterator first, Size n, OutputIterator result);
145227825Stheraven
146227825Stheraventemplate <class BidirectionalIterator1, class BidirectionalIterator2>
147227825Stheraven    BidirectionalIterator2
148227825Stheraven    copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
149227825Stheraven                  BidirectionalIterator2 result);
150227825Stheraven
151227825Stheraventemplate <class ForwardIterator1, class ForwardIterator2>
152227825Stheraven    ForwardIterator2
153227825Stheraven    swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
154227825Stheraven
155227825Stheraventemplate <class ForwardIterator1, class ForwardIterator2>
156227825Stheraven    void
157227825Stheraven    iter_swap(ForwardIterator1 a, ForwardIterator2 b);
158227825Stheraven
159227825Stheraventemplate <class InputIterator, class OutputIterator, class UnaryOperation>
160227825Stheraven    OutputIterator
161227825Stheraven    transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
162227825Stheraven
163227825Stheraventemplate <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
164227825Stheraven    OutputIterator
165227825Stheraven    transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
166227825Stheraven              OutputIterator result, BinaryOperation binary_op);
167227825Stheraven
168227825Stheraventemplate <class ForwardIterator, class T>
169227825Stheraven    void
170227825Stheraven    replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
171227825Stheraven
172227825Stheraventemplate <class ForwardIterator, class Predicate, class T>
173227825Stheraven    void
174227825Stheraven    replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
175227825Stheraven
176227825Stheraventemplate <class InputIterator, class OutputIterator, class T>
177227825Stheraven    OutputIterator
178227825Stheraven    replace_copy(InputIterator first, InputIterator last, OutputIterator result,
179227825Stheraven                 const T& old_value, const T& new_value);
180227825Stheraven
181227825Stheraventemplate <class InputIterator, class OutputIterator, class Predicate, class T>
182227825Stheraven    OutputIterator
183227825Stheraven    replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
184227825Stheraven
185227825Stheraventemplate <class ForwardIterator, class T>
186227825Stheraven    void
187227825Stheraven    fill(ForwardIterator first, ForwardIterator last, const T& value);
188227825Stheraven
189227825Stheraventemplate <class OutputIterator, class Size, class T>
190227825Stheraven    OutputIterator
191227825Stheraven    fill_n(OutputIterator first, Size n, const T& value);
192227825Stheraven
193227825Stheraventemplate <class ForwardIterator, class Generator>
194227825Stheraven    void
195227825Stheraven    generate(ForwardIterator first, ForwardIterator last, Generator gen);
196227825Stheraven
197227825Stheraventemplate <class OutputIterator, class Size, class Generator>
198227825Stheraven    OutputIterator
199227825Stheraven    generate_n(OutputIterator first, Size n, Generator gen);
200227825Stheraven
201227825Stheraventemplate <class ForwardIterator, class T>
202227825Stheraven    ForwardIterator
203227825Stheraven    remove(ForwardIterator first, ForwardIterator last, const T& value);
204227825Stheraven
205227825Stheraventemplate <class ForwardIterator, class Predicate>
206227825Stheraven    ForwardIterator
207227825Stheraven    remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
208227825Stheraven
209227825Stheraventemplate <class InputIterator, class OutputIterator, class T>
210227825Stheraven    OutputIterator
211227825Stheraven    remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
212227825Stheraven
213227825Stheraventemplate <class InputIterator, class OutputIterator, class Predicate>
214227825Stheraven    OutputIterator
215227825Stheraven    remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);
216227825Stheraven
217227825Stheraventemplate <class ForwardIterator>
218227825Stheraven    ForwardIterator
219227825Stheraven    unique(ForwardIterator first, ForwardIterator last);
220227825Stheraven
221227825Stheraventemplate <class ForwardIterator, class BinaryPredicate>
222227825Stheraven    ForwardIterator
223227825Stheraven    unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
224227825Stheraven
225227825Stheraventemplate <class InputIterator, class OutputIterator>
226227825Stheraven    OutputIterator
227227825Stheraven    unique_copy(InputIterator first, InputIterator last, OutputIterator result);
228227825Stheraven
229227825Stheraventemplate <class InputIterator, class OutputIterator, class BinaryPredicate>
230227825Stheraven    OutputIterator
231227825Stheraven    unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
232227825Stheraven
233227825Stheraventemplate <class BidirectionalIterator>
234227825Stheraven    void
235227825Stheraven    reverse(BidirectionalIterator first, BidirectionalIterator last);
236227825Stheraven
237227825Stheraventemplate <class BidirectionalIterator, class OutputIterator>
238227825Stheraven    OutputIterator
239227825Stheraven    reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
240227825Stheraven
241227825Stheraventemplate <class ForwardIterator>
242227825Stheraven    ForwardIterator
243227825Stheraven    rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
244227825Stheraven
245227825Stheraventemplate <class ForwardIterator, class OutputIterator>
246227825Stheraven    OutputIterator
247227825Stheraven    rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
248227825Stheraven
249227825Stheraventemplate <class RandomAccessIterator>
250227825Stheraven    void
251227825Stheraven    random_shuffle(RandomAccessIterator first, RandomAccessIterator last);
252227825Stheraven
253227825Stheraventemplate <class RandomAccessIterator, class RandomNumberGenerator>
254227825Stheraven    void
255227825Stheraven    random_shuffle(RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator& rand);
256227825Stheraven
257227825Stheraventemplate<class RandomAccessIterator, class UniformRandomNumberGenerator>
258227825Stheraven    void shuffle(RandomAccessIterator first, RandomAccessIterator last,
259227825Stheraven                 UniformRandomNumberGenerator&& g);
260227825Stheraven
261227825Stheraventemplate <class InputIterator, class Predicate>
262227825Stheraven    bool
263227825Stheraven    is_partitioned(InputIterator first, InputIterator last, Predicate pred);
264227825Stheraven
265227825Stheraventemplate <class ForwardIterator, class Predicate>
266227825Stheraven    ForwardIterator
267227825Stheraven    partition(ForwardIterator first, ForwardIterator last, Predicate pred);
268227825Stheraven
269227825Stheraventemplate <class InputIterator, class OutputIterator1,
270227825Stheraven          class OutputIterator2, class Predicate>
271227825Stheraven    pair<OutputIterator1, OutputIterator2>
272227825Stheraven    partition_copy(InputIterator first, InputIterator last,
273227825Stheraven                   OutputIterator1 out_true, OutputIterator2 out_false,
274227825Stheraven                   Predicate pred);
275227825Stheraven
276227825Stheraventemplate <class ForwardIterator, class Predicate>
277227825Stheraven    ForwardIterator
278227825Stheraven    stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);
279227825Stheraven
280227825Stheraventemplate<class ForwardIterator, class Predicate>
281227825Stheraven    ForwardIterator
282227825Stheraven    partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
283227825Stheraven
284227825Stheraventemplate <class ForwardIterator>
285227825Stheraven    bool
286227825Stheraven    is_sorted(ForwardIterator first, ForwardIterator last);
287227825Stheraven
288227825Stheraventemplate <class ForwardIterator, class Compare>
289227825Stheraven    bool
290227825Stheraven    is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);
291227825Stheraven
292227825Stheraventemplate<class ForwardIterator>
293227825Stheraven    ForwardIterator
294227825Stheraven    is_sorted_until(ForwardIterator first, ForwardIterator last);
295227825Stheraven
296227825Stheraventemplate <class ForwardIterator, class Compare>
297227825Stheraven    ForwardIterator
298227825Stheraven    is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
299227825Stheraven
300227825Stheraventemplate <class RandomAccessIterator>
301227825Stheraven    void
302227825Stheraven    sort(RandomAccessIterator first, RandomAccessIterator last);
303227825Stheraven
304227825Stheraventemplate <class RandomAccessIterator, class Compare>
305227825Stheraven    void
306227825Stheraven    sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
307227825Stheraven
308227825Stheraventemplate <class RandomAccessIterator>
309227825Stheraven    void
310227825Stheraven    stable_sort(RandomAccessIterator first, RandomAccessIterator last);
311227825Stheraven
312227825Stheraventemplate <class RandomAccessIterator, class Compare>
313227825Stheraven    void
314227825Stheraven    stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
315227825Stheraven
316227825Stheraventemplate <class RandomAccessIterator>
317227825Stheraven    void
318227825Stheraven    partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
319227825Stheraven
320227825Stheraventemplate <class RandomAccessIterator, class Compare>
321227825Stheraven    void
322227825Stheraven    partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
323227825Stheraven
324227825Stheraventemplate <class InputIterator, class RandomAccessIterator>
325227825Stheraven    RandomAccessIterator
326227825Stheraven    partial_sort_copy(InputIterator first, InputIterator last,
327227825Stheraven                      RandomAccessIterator result_first, RandomAccessIterator result_last);
328227825Stheraven
329227825Stheraventemplate <class InputIterator, class RandomAccessIterator, class Compare>
330227825Stheraven    RandomAccessIterator
331227825Stheraven    partial_sort_copy(InputIterator first, InputIterator last,
332227825Stheraven                      RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);
333227825Stheraven
334227825Stheraventemplate <class RandomAccessIterator>
335227825Stheraven    void
336227825Stheraven    nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
337227825Stheraven
338227825Stheraventemplate <class RandomAccessIterator, class Compare>
339227825Stheraven    void
340227825Stheraven    nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
341227825Stheraven
342227825Stheraventemplate <class ForwardIterator, class T>
343227825Stheraven    ForwardIterator
344227825Stheraven    lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
345227825Stheraven
346227825Stheraventemplate <class ForwardIterator, class T, class Compare>
347227825Stheraven    ForwardIterator
348227825Stheraven    lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
349227825Stheraven
350227825Stheraventemplate <class ForwardIterator, class T>
351227825Stheraven    ForwardIterator
352227825Stheraven    upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
353227825Stheraven
354227825Stheraventemplate <class ForwardIterator, class T, class Compare>
355227825Stheraven    ForwardIterator
356227825Stheraven    upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
357227825Stheraven
358227825Stheraventemplate <class ForwardIterator, class T>
359227825Stheraven    pair<ForwardIterator, ForwardIterator>
360227825Stheraven    equal_range(ForwardIterator first, ForwardIterator last, const T& value);
361227825Stheraven
362227825Stheraventemplate <class ForwardIterator, class T, class Compare>
363227825Stheraven    pair<ForwardIterator, ForwardIterator>
364227825Stheraven    equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
365227825Stheraven
366227825Stheraventemplate <class ForwardIterator, class T>
367227825Stheraven    bool
368227825Stheraven    binary_search(ForwardIterator first, ForwardIterator last, const T& value);
369227825Stheraven
370227825Stheraventemplate <class ForwardIterator, class T, class Compare>
371227825Stheraven    bool
372227825Stheraven    binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
373227825Stheraven
374227825Stheraventemplate <class InputIterator1, class InputIterator2, class OutputIterator>
375227825Stheraven    OutputIterator
376227825Stheraven    merge(InputIterator1 first1, InputIterator1 last1,
377227825Stheraven          InputIterator2 first2, InputIterator2 last2, OutputIterator result);
378227825Stheraven
379227825Stheraventemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
380227825Stheraven    OutputIterator
381227825Stheraven    merge(InputIterator1 first1, InputIterator1 last1,
382227825Stheraven          InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
383227825Stheraven
384227825Stheraventemplate <class BidirectionalIterator>
385227825Stheraven    void
386227825Stheraven    inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
387227825Stheraven
388227825Stheraventemplate <class BidirectionalIterator, class Compare>
389227825Stheraven    void
390227825Stheraven    inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
391227825Stheraven
392227825Stheraventemplate <class InputIterator1, class InputIterator2>
393227825Stheraven    bool
394227825Stheraven    includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
395227825Stheraven
396227825Stheraventemplate <class InputIterator1, class InputIterator2, class Compare>
397227825Stheraven    bool
398227825Stheraven    includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
399227825Stheraven
400227825Stheraventemplate <class InputIterator1, class InputIterator2, class OutputIterator>
401227825Stheraven    OutputIterator
402227825Stheraven    set_union(InputIterator1 first1, InputIterator1 last1,
403227825Stheraven              InputIterator2 first2, InputIterator2 last2, OutputIterator result);
404227825Stheraven
405227825Stheraventemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
406227825Stheraven    OutputIterator
407227825Stheraven    set_union(InputIterator1 first1, InputIterator1 last1,
408227825Stheraven              InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
409227825Stheraven
410227825Stheraventemplate <class InputIterator1, class InputIterator2, class OutputIterator>
411227825Stheraven    OutputIterator
412227825Stheraven    set_intersection(InputIterator1 first1, InputIterator1 last1,
413227825Stheraven                     InputIterator2 first2, InputIterator2 last2, OutputIterator result);
414227825Stheraven
415227825Stheraventemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
416227825Stheraven    OutputIterator
417227825Stheraven    set_intersection(InputIterator1 first1, InputIterator1 last1,
418227825Stheraven                     InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
419227825Stheraven
420227825Stheraventemplate <class InputIterator1, class InputIterator2, class OutputIterator>
421227825Stheraven    OutputIterator
422227825Stheraven    set_difference(InputIterator1 first1, InputIterator1 last1,
423227825Stheraven                   InputIterator2 first2, InputIterator2 last2, OutputIterator result);
424227825Stheraven
425227825Stheraventemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
426227825Stheraven    OutputIterator
427227825Stheraven    set_difference(InputIterator1 first1, InputIterator1 last1,
428227825Stheraven                   InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
429227825Stheraven
430227825Stheraventemplate <class InputIterator1, class InputIterator2, class OutputIterator>
431227825Stheraven    OutputIterator
432227825Stheraven    set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
433227825Stheraven                             InputIterator2 first2, InputIterator2 last2, OutputIterator result);
434227825Stheraven
435227825Stheraventemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
436227825Stheraven    OutputIterator
437227825Stheraven    set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
438227825Stheraven                             InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
439227825Stheraven
440227825Stheraventemplate <class RandomAccessIterator>
441227825Stheraven    void
442227825Stheraven    push_heap(RandomAccessIterator first, RandomAccessIterator last);
443227825Stheraven
444227825Stheraventemplate <class RandomAccessIterator, class Compare>
445227825Stheraven    void
446227825Stheraven    push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
447227825Stheraven
448227825Stheraventemplate <class RandomAccessIterator>
449227825Stheraven    void
450227825Stheraven    pop_heap(RandomAccessIterator first, RandomAccessIterator last);
451227825Stheraven
452227825Stheraventemplate <class RandomAccessIterator, class Compare>
453227825Stheraven    void
454227825Stheraven    pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
455227825Stheraven
456227825Stheraventemplate <class RandomAccessIterator>
457227825Stheraven    void
458227825Stheraven    make_heap(RandomAccessIterator first, RandomAccessIterator last);
459227825Stheraven
460227825Stheraventemplate <class RandomAccessIterator, class Compare>
461227825Stheraven    void
462227825Stheraven    make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
463227825Stheraven
464227825Stheraventemplate <class RandomAccessIterator>
465227825Stheraven    void
466227825Stheraven    sort_heap(RandomAccessIterator first, RandomAccessIterator last);
467227825Stheraven
468227825Stheraventemplate <class RandomAccessIterator, class Compare>
469227825Stheraven    void
470227825Stheraven    sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
471227825Stheraven
472227825Stheraventemplate <class RandomAccessIterator>
473227825Stheraven    bool
474227825Stheraven    is_heap(RandomAccessIterator first, RandomAccessiterator last);
475227825Stheraven
476227825Stheraventemplate <class RandomAccessIterator, class Compare>
477227825Stheraven    bool
478227825Stheraven    is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
479227825Stheraven
480227825Stheraventemplate <class RandomAccessIterator>
481227825Stheraven    RandomAccessIterator
482227825Stheraven    is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
483227825Stheraven
484227825Stheraventemplate <class RandomAccessIterator, class Compare>
485227825Stheraven    RandomAccessIterator
486227825Stheraven    is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
487227825Stheraven
488227825Stheraventemplate <class ForwardIterator>
489227825Stheraven    ForwardIterator
490227825Stheraven    min_element(ForwardIterator first, ForwardIterator last);
491227825Stheraven
492227825Stheraventemplate <class ForwardIterator, class Compare>
493227825Stheraven    ForwardIterator
494227825Stheraven    min_element(ForwardIterator first, ForwardIterator last, Compare comp);
495227825Stheraven
496227825Stheraventemplate <class T>
497227825Stheraven    const T&
498227825Stheraven    min(const T& a, const T& b);
499227825Stheraven
500227825Stheraventemplate <class T, class Compare>
501227825Stheraven    const T&
502227825Stheraven    min(const T& a, const T& b, Compare comp);
503227825Stheraven
504227825Stheraventemplate<class T>
505227825Stheraven    T
506227825Stheraven    min(initializer_list<T> t);
507227825Stheraven
508227825Stheraventemplate<class T, class Compare>
509227825Stheraven    T
510227825Stheraven    min(initializer_list<T> t, Compare comp);
511227825Stheraven
512227825Stheraventemplate <class ForwardIterator>
513227825Stheraven    ForwardIterator
514227825Stheraven    max_element(ForwardIterator first, ForwardIterator last);
515227825Stheraven
516227825Stheraventemplate <class ForwardIterator, class Compare>
517227825Stheraven    ForwardIterator
518227825Stheraven    max_element(ForwardIterator first, ForwardIterator last, Compare comp);
519227825Stheraven
520227825Stheraventemplate <class T>
521227825Stheraven    const T&
522227825Stheraven    max(const T& a, const T& b);
523227825Stheraven
524227825Stheraventemplate <class T, class Compare>
525227825Stheraven    const T&
526227825Stheraven    max(const T& a, const T& b, Compare comp);
527227825Stheraven
528227825Stheraventemplate<class T>
529227825Stheraven    T
530227825Stheraven    max(initializer_list<T> t);
531227825Stheraven
532227825Stheraventemplate<class T, class Compare>
533227825Stheraven    T
534227825Stheraven    max(initializer_list<T> t, Compare comp);
535227825Stheraven
536227825Stheraventemplate<class ForwardIterator>
537227825Stheraven    pair<ForwardIterator, ForwardIterator>
538227825Stheraven    minmax_element(ForwardIterator first, ForwardIterator last);
539227825Stheraven
540227825Stheraventemplate<class ForwardIterator, class Compare>
541227825Stheraven    pair<ForwardIterator, ForwardIterator>
542227825Stheraven    minmax_element(ForwardIterator first, ForwardIterator last, Compare comp);
543227825Stheraven
544227825Stheraventemplate<class T>
545227825Stheraven    pair<const T&, const T&>
546227825Stheraven    minmax(const T& a, const T& b);
547227825Stheraven
548227825Stheraventemplate<class T, class Compare>
549227825Stheraven    pair<const T&, const T&>
550227825Stheraven    minmax(const T& a, const T& b, Compare comp);
551227825Stheraven
552227825Stheraventemplate<class T>
553227825Stheraven    pair<T, T>
554227825Stheraven    minmax(initializer_list<T> t);
555227825Stheraven
556227825Stheraventemplate<class T, class Compare>
557227825Stheraven    pair<T, T>
558227825Stheraven    minmax(initializer_list<T> t, Compare comp);
559227825Stheraven
560227825Stheraventemplate <class InputIterator1, class InputIterator2>
561227825Stheraven    bool
562227825Stheraven    lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
563227825Stheraven
564227825Stheraventemplate <class InputIterator1, class InputIterator2, class Compare>
565227825Stheraven    bool
566227825Stheraven    lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
567227825Stheraven                            InputIterator2 first2, InputIterator2 last2, Compare comp);
568227825Stheraven
569227825Stheraventemplate <class BidirectionalIterator>
570227825Stheraven    bool
571227825Stheraven    next_permutation(BidirectionalIterator first, BidirectionalIterator last);
572227825Stheraven
573227825Stheraventemplate <class BidirectionalIterator, class Compare>
574227825Stheraven    bool
575227825Stheraven    next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
576227825Stheraven
577227825Stheraventemplate <class BidirectionalIterator>
578227825Stheraven    bool
579227825Stheraven    prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
580227825Stheraven
581227825Stheraventemplate <class BidirectionalIterator, class Compare>
582227825Stheraven    bool
583227825Stheraven    prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
584227825Stheraven
585227825Stheraven}  // std
586227825Stheraven
587227825Stheraven*/
588227825Stheraven
589227825Stheraven#include <__config>
590227825Stheraven#include <initializer_list>
591227825Stheraven#include <type_traits>
592227825Stheraven#include <cstring>
593227825Stheraven#include <utility>
594227825Stheraven#include <memory>
595227825Stheraven#include <iterator>
596227825Stheraven#include <cstdlib>
597227825Stheraven
598227825Stheraven#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
599227825Stheraven#pragma GCC system_header
600227825Stheraven#endif
601227825Stheraven
602227825Stheraven_LIBCPP_BEGIN_NAMESPACE_STD
603227825Stheraven
604227825Stheraventemplate <class _T1, class _T2 = _T1>
605227825Stheravenstruct __equal_to
606227825Stheraven{
607227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
608227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;}
609227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;}
610227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;}
611227825Stheraven};
612227825Stheraven
613227825Stheraventemplate <class _T1>
614227825Stheravenstruct __equal_to<_T1, _T1>
615227825Stheraven{
616227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
617227825Stheraven};
618227825Stheraven
619227825Stheraventemplate <class _T1>
620227825Stheravenstruct __equal_to<const _T1, _T1>
621227825Stheraven{
622227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
623227825Stheraven};
624227825Stheraven
625227825Stheraventemplate <class _T1>
626227825Stheravenstruct __equal_to<_T1, const _T1>
627227825Stheraven{
628227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
629227825Stheraven};
630227825Stheraven
631227825Stheraventemplate <class _T1, class _T2 = _T1>
632227825Stheravenstruct __less
633227825Stheraven{
634227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
635227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
636227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
637227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
638227825Stheraven};
639227825Stheraven
640227825Stheraventemplate <class _T1>
641227825Stheravenstruct __less<_T1, _T1>
642227825Stheraven{
643227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
644227825Stheraven};
645227825Stheraven
646227825Stheraventemplate <class _T1>
647227825Stheravenstruct __less<const _T1, _T1>
648227825Stheraven{
649227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
650227825Stheraven};
651227825Stheraven
652227825Stheraventemplate <class _T1>
653227825Stheravenstruct __less<_T1, const _T1>
654227825Stheraven{
655227825Stheraven    _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
656227825Stheraven};
657227825Stheraven
658227825Stheraventemplate <class _Predicate>
659227825Stheravenclass __negate
660227825Stheraven{
661227825Stheravenprivate:
662227825Stheraven    _Predicate __p_;
663227825Stheravenpublic:
664227825Stheraven    _LIBCPP_INLINE_VISIBILITY __negate() {}
665227825Stheraven
666227825Stheraven    _LIBCPP_INLINE_VISIBILITY
667227825Stheraven    explicit __negate(_Predicate __p) : __p_(__p) {}
668227825Stheraven
669227825Stheraven    template <class _T1>
670227825Stheraven    _LIBCPP_INLINE_VISIBILITY
671227825Stheraven    bool operator()(const _T1& __x) {return !__p_(__x);}
672227825Stheraven
673227825Stheraven    template <class _T1, class _T2>
674227825Stheraven    _LIBCPP_INLINE_VISIBILITY
675227825Stheraven    bool operator()(const _T1& __x, const _T2& __y) {return !__p_(__x, __y);}
676227825Stheraven};
677227825Stheraven
678227825Stheraven#ifdef _LIBCPP_DEBUG2
679227825Stheraven
680227825Stheraventemplate <class _Compare>
681227825Stheravenstruct __debug_less
682227825Stheraven{
683227825Stheraven    _Compare __comp_;
684227825Stheraven    __debug_less(_Compare& __c) : __comp_(__c) {}
685227825Stheraven    template <class _Tp, class _Up>
686227825Stheraven    bool operator()(const _Tp& __x, const _Up& __y)
687227825Stheraven    {
688227825Stheraven        bool __r = __comp_(__x, __y);
689227825Stheraven        if (__r)
690227825Stheraven            _LIBCPP_ASSERT(!__comp_(__y, __x), "Comparator does not induce a strict weak ordering");
691227825Stheraven        return __r;
692227825Stheraven    }
693227825Stheraven};
694227825Stheraven
695227825Stheraven#endif  // _LIBCPP_DEBUG2
696227825Stheraven
697227825Stheraven// Precondition:  __x != 0
698227825Stheraveninline _LIBCPP_INLINE_VISIBILITY unsigned           __ctz(unsigned           __x) {return __builtin_ctz  (__x);}
699227825Stheraveninline _LIBCPP_INLINE_VISIBILITY unsigned      long __ctz(unsigned      long __x) {return __builtin_ctzl (__x);}
700227825Stheraveninline _LIBCPP_INLINE_VISIBILITY unsigned long long __ctz(unsigned long long __x) {return __builtin_ctzll(__x);}
701227825Stheraven
702227825Stheraven// Precondition:  __x != 0
703227825Stheraveninline _LIBCPP_INLINE_VISIBILITY unsigned           __clz(unsigned           __x) {return __builtin_clz  (__x);}
704227825Stheraveninline _LIBCPP_INLINE_VISIBILITY unsigned      long __clz(unsigned      long __x) {return __builtin_clzl (__x);}
705227825Stheraveninline _LIBCPP_INLINE_VISIBILITY unsigned long long __clz(unsigned long long __x) {return __builtin_clzll(__x);}
706227825Stheraven
707227825Stheraveninline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned           __x) {return __builtin_popcount  (__x);}
708227825Stheraveninline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned      long __x) {return __builtin_popcountl (__x);}
709227825Stheraveninline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long long __x) {return __builtin_popcountll(__x);}
710227825Stheraven
711227825Stheraven// all_of
712227825Stheraven
713227825Stheraventemplate <class _InputIterator, class _Predicate>
714227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
715227825Stheravenbool
716227825Stheravenall_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
717227825Stheraven{
718227825Stheraven    for (; __first != __last; ++__first)
719227825Stheraven        if (!__pred(*__first))
720227825Stheraven            return false;
721227825Stheraven    return true;
722227825Stheraven}
723227825Stheraven
724227825Stheraven// any_of
725227825Stheraven
726227825Stheraventemplate <class _InputIterator, class _Predicate>
727227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
728227825Stheravenbool
729227825Stheravenany_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
730227825Stheraven{
731227825Stheraven    for (; __first != __last; ++__first)
732227825Stheraven        if (__pred(*__first))
733227825Stheraven            return true;
734227825Stheraven    return false;
735227825Stheraven}
736227825Stheraven
737227825Stheraven// none_of
738227825Stheraven
739227825Stheraventemplate <class _InputIterator, class _Predicate>
740227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
741227825Stheravenbool
742227825Stheravennone_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
743227825Stheraven{
744227825Stheraven    for (; __first != __last; ++__first)
745227825Stheraven        if (__pred(*__first))
746227825Stheraven            return false;
747227825Stheraven    return true;
748227825Stheraven}
749227825Stheraven
750227825Stheraven// for_each
751227825Stheraven
752227825Stheraventemplate <class _InputIterator, class _Function>
753227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
754227825Stheraven_Function
755227825Stheravenfor_each(_InputIterator __first, _InputIterator __last, _Function __f)
756227825Stheraven{
757227825Stheraven    for (; __first != __last; ++__first)
758227825Stheraven        __f(*__first);
759227825Stheraven    return _VSTD::move(__f);
760227825Stheraven}
761227825Stheraven
762227825Stheraven// find
763227825Stheraven
764227825Stheraventemplate <class _InputIterator, class _Tp>
765227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
766227825Stheraven_InputIterator
767227825Stheravenfind(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
768227825Stheraven{
769227825Stheraven    for (; __first != __last; ++__first)
770227825Stheraven        if (*__first == __value_)
771227825Stheraven            break;
772227825Stheraven    return __first;
773227825Stheraven}
774227825Stheraven
775227825Stheraven// find_if
776227825Stheraven
777227825Stheraventemplate <class _InputIterator, class _Predicate>
778227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
779227825Stheraven_InputIterator
780227825Stheravenfind_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
781227825Stheraven{
782227825Stheraven    for (; __first != __last; ++__first)
783227825Stheraven        if (__pred(*__first))
784227825Stheraven            break;
785227825Stheraven    return __first;
786227825Stheraven}
787227825Stheraven
788227825Stheraven// find_if_not
789227825Stheraven
790227825Stheraventemplate<class _InputIterator, class _Predicate>
791227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
792227825Stheraven_InputIterator
793227825Stheravenfind_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
794227825Stheraven{
795227825Stheraven    for (; __first != __last; ++__first)
796227825Stheraven        if (!__pred(*__first))
797227825Stheraven            break;
798227825Stheraven    return __first;
799227825Stheraven}
800227825Stheraven
801227825Stheraven// find_end
802227825Stheraven
803227825Stheraventemplate <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
804227825Stheraven_ForwardIterator1
805227825Stheraven__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
806227825Stheraven           _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
807227825Stheraven           forward_iterator_tag, forward_iterator_tag)
808227825Stheraven{
809227825Stheraven    // modeled after search algorithm
810227825Stheraven    _ForwardIterator1 __r = __last1;  // __last1 is the "default" answer
811227825Stheraven    if (__first2 == __last2)
812227825Stheraven        return __r;
813227825Stheraven    while (true)
814227825Stheraven    {
815227825Stheraven        while (true)
816227825Stheraven        {
817227825Stheraven            if (__first1 == __last1)         // if source exhausted return last correct answer
818227825Stheraven                return __r;                  //    (or __last1 if never found)
819227825Stheraven            if (__pred(*__first1, *__first2))
820227825Stheraven                break;
821227825Stheraven            ++__first1;
822227825Stheraven        }
823227825Stheraven        // *__first1 matches *__first2, now match elements after here
824227825Stheraven        _ForwardIterator1 __m1 = __first1;
825227825Stheraven        _ForwardIterator2 __m2 = __first2;
826227825Stheraven        while (true)
827227825Stheraven        {
828227825Stheraven            if (++__m2 == __last2)
829227825Stheraven            {                         // Pattern exhaused, record answer and search for another one
830227825Stheraven                __r = __first1;
831227825Stheraven                ++__first1;
832227825Stheraven                break;
833227825Stheraven            }
834227825Stheraven            if (++__m1 == __last1)     // Source exhausted, return last answer
835227825Stheraven                return __r;
836227825Stheraven            if (!__pred(*__m1, *__m2))  // mismatch, restart with a new __first
837227825Stheraven            {
838227825Stheraven                ++__first1;
839227825Stheraven                break;
840227825Stheraven            }  // else there is a match, check next elements
841227825Stheraven        }
842227825Stheraven    }
843227825Stheraven}
844227825Stheraven
845227825Stheraventemplate <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2>
846227825Stheraven_BidirectionalIterator1
847227825Stheraven__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1,
848227825Stheraven           _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred,
849227825Stheraven           bidirectional_iterator_tag, bidirectional_iterator_tag)
850227825Stheraven{
851227825Stheraven    // modeled after search algorithm (in reverse)
852227825Stheraven    if (__first2 == __last2)
853227825Stheraven        return __last1;  // Everything matches an empty sequence
854227825Stheraven    _BidirectionalIterator1 __l1 = __last1;
855227825Stheraven    _BidirectionalIterator2 __l2 = __last2;
856227825Stheraven    --__l2;
857227825Stheraven    while (true)
858227825Stheraven    {
859227825Stheraven        // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks
860227825Stheraven        while (true)
861227825Stheraven        {
862227825Stheraven            if (__first1 == __l1)  // return __last1 if no element matches *__first2
863227825Stheraven                return __last1;
864227825Stheraven            if (__pred(*--__l1, *__l2))
865227825Stheraven                break;
866227825Stheraven        }
867227825Stheraven        // *__l1 matches *__l2, now match elements before here
868227825Stheraven        _BidirectionalIterator1 __m1 = __l1;
869227825Stheraven        _BidirectionalIterator2 __m2 = __l2;
870227825Stheraven        while (true)
871227825Stheraven        {
872227825Stheraven            if (__m2 == __first2)  // If pattern exhausted, __m1 is the answer (works for 1 element pattern)
873227825Stheraven                return __m1;
874227825Stheraven            if (__m1 == __first1)  // Otherwise if source exhaused, pattern not found
875227825Stheraven                return __last1;
876227825Stheraven            if (!__pred(*--__m1, *--__m2))  // if there is a mismatch, restart with a new __l1
877227825Stheraven            {
878227825Stheraven                break;
879227825Stheraven            }  // else there is a match, check next elements
880227825Stheraven        }
881227825Stheraven    }
882227825Stheraven}
883227825Stheraven
884227825Stheraventemplate <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
885227825Stheraven_RandomAccessIterator1
886227825Stheraven__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
887227825Stheraven           _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
888227825Stheraven           random_access_iterator_tag, random_access_iterator_tag)
889227825Stheraven{
890227825Stheraven    // Take advantage of knowing source and pattern lengths.  Stop short when source is smaller than pattern
891227825Stheraven    typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2;
892227825Stheraven    if (__len2 == 0)
893227825Stheraven        return __last1;
894227825Stheraven    typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1;
895227825Stheraven    if (__len1 < __len2)
896227825Stheraven        return __last1;
897227825Stheraven    const _RandomAccessIterator1 __s = __first1 + (__len2 - 1);  // End of pattern match can't go before here
898227825Stheraven    _RandomAccessIterator1 __l1 = __last1;
899227825Stheraven    _RandomAccessIterator2 __l2 = __last2;
900227825Stheraven    --__l2;
901227825Stheraven    while (true)
902227825Stheraven    {
903227825Stheraven        while (true)
904227825Stheraven        {
905227825Stheraven            if (__s == __l1)
906227825Stheraven                return __last1;
907227825Stheraven            if (__pred(*--__l1, *__l2))
908227825Stheraven                break;
909227825Stheraven        }
910227825Stheraven        _RandomAccessIterator1 __m1 = __l1;
911227825Stheraven        _RandomAccessIterator2 __m2 = __l2;
912227825Stheraven        while (true)
913227825Stheraven        {
914227825Stheraven            if (__m2 == __first2)
915227825Stheraven                return __m1;
916227825Stheraven                                 // no need to check range on __m1 because __s guarantees we have enough source
917227825Stheraven            if (!__pred(*--__m1, *--__m2))
918227825Stheraven            {
919227825Stheraven                break;
920227825Stheraven            }
921227825Stheraven        }
922227825Stheraven    }
923227825Stheraven}
924227825Stheraven
925227825Stheraventemplate <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
926227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
927227825Stheraven_ForwardIterator1
928227825Stheravenfind_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
929227825Stheraven         _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
930227825Stheraven{
931227825Stheraven    return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type>
932227825Stheraven                         (__first1, __last1, __first2, __last2, __pred,
933227825Stheraven                          typename iterator_traits<_ForwardIterator1>::iterator_category(),
934227825Stheraven                          typename iterator_traits<_ForwardIterator2>::iterator_category());
935227825Stheraven}
936227825Stheraven
937227825Stheraventemplate <class _ForwardIterator1, class _ForwardIterator2>
938227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
939227825Stheraven_ForwardIterator1
940227825Stheravenfind_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
941227825Stheraven         _ForwardIterator2 __first2, _ForwardIterator2 __last2)
942227825Stheraven{
943227825Stheraven    typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
944227825Stheraven    typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
945227825Stheraven    return _VSTD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
946227825Stheraven}
947227825Stheraven
948227825Stheraven// find_first_of
949227825Stheraven
950227825Stheraventemplate <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
951227825Stheraven_ForwardIterator1
952227825Stheravenfind_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
953227825Stheraven              _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
954227825Stheraven{
955227825Stheraven    for (; __first1 != __last1; ++__first1)
956227825Stheraven        for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
957227825Stheraven            if (__pred(*__first1, *__j))
958227825Stheraven                return __first1;
959227825Stheraven    return __last1;
960227825Stheraven}
961227825Stheraven
962227825Stheraventemplate <class _ForwardIterator1, class _ForwardIterator2>
963227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
964227825Stheraven_ForwardIterator1
965227825Stheravenfind_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
966227825Stheraven              _ForwardIterator2 __first2, _ForwardIterator2 __last2)
967227825Stheraven{
968227825Stheraven    typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
969227825Stheraven    typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
970227825Stheraven    return _VSTD::find_first_of(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
971227825Stheraven}
972227825Stheraven
973227825Stheraven// adjacent_find
974227825Stheraven
975227825Stheraventemplate <class _ForwardIterator, class _BinaryPredicate>
976227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
977227825Stheraven_ForwardIterator
978227825Stheravenadjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
979227825Stheraven{
980227825Stheraven    if (__first != __last)
981227825Stheraven    {
982227825Stheraven        _ForwardIterator __i = __first;
983227825Stheraven        while (++__i != __last)
984227825Stheraven        {
985227825Stheraven            if (__pred(*__first, *__i))
986227825Stheraven                return __first;
987227825Stheraven            __first = __i;
988227825Stheraven        }
989227825Stheraven    }
990227825Stheraven    return __last;
991227825Stheraven}
992227825Stheraven
993227825Stheraventemplate <class _ForwardIterator>
994227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
995227825Stheraven_ForwardIterator
996227825Stheravenadjacent_find(_ForwardIterator __first, _ForwardIterator __last)
997227825Stheraven{
998227825Stheraven    typedef typename iterator_traits<_ForwardIterator>::value_type __v;
999227825Stheraven    return _VSTD::adjacent_find(__first, __last, __equal_to<__v>());
1000227825Stheraven}
1001227825Stheraven
1002227825Stheraven// count
1003227825Stheraven
1004227825Stheraventemplate <class _InputIterator, class _Tp>
1005227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1006227825Stheraventypename iterator_traits<_InputIterator>::difference_type
1007227825Stheravencount(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
1008227825Stheraven{
1009227825Stheraven    typename iterator_traits<_InputIterator>::difference_type __r(0);
1010227825Stheraven    for (; __first != __last; ++__first)
1011227825Stheraven        if (*__first == __value_)
1012227825Stheraven            ++__r;
1013227825Stheraven    return __r;
1014227825Stheraven}
1015227825Stheraven
1016227825Stheraven// count_if
1017227825Stheraven
1018227825Stheraventemplate <class _InputIterator, class _Predicate>
1019227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1020227825Stheraventypename iterator_traits<_InputIterator>::difference_type
1021227825Stheravencount_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
1022227825Stheraven{
1023227825Stheraven    typename iterator_traits<_InputIterator>::difference_type __r(0);
1024227825Stheraven    for (; __first != __last; ++__first)
1025227825Stheraven        if (__pred(*__first))
1026227825Stheraven            ++__r;
1027227825Stheraven    return __r;
1028227825Stheraven}
1029227825Stheraven
1030227825Stheraven// mismatch
1031227825Stheraven
1032227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1033227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1034227825Stheravenpair<_InputIterator1, _InputIterator2>
1035227825Stheravenmismatch(_InputIterator1 __first1, _InputIterator1 __last1,
1036227825Stheraven         _InputIterator2 __first2, _BinaryPredicate __pred)
1037227825Stheraven{
1038227825Stheraven    for (; __first1 != __last1; ++__first1, ++__first2)
1039227825Stheraven        if (!__pred(*__first1, *__first2))
1040227825Stheraven            break;
1041227825Stheraven    return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
1042227825Stheraven}
1043227825Stheraven
1044227825Stheraventemplate <class _InputIterator1, class _InputIterator2>
1045227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1046227825Stheravenpair<_InputIterator1, _InputIterator2>
1047227825Stheravenmismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1048227825Stheraven{
1049227825Stheraven    typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1050227825Stheraven    typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1051227825Stheraven    return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
1052227825Stheraven}
1053227825Stheraven
1054227825Stheraven// equal
1055227825Stheraven
1056227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
1057227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1058227825Stheravenbool
1059227825Stheravenequal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred)
1060227825Stheraven{
1061227825Stheraven    for (; __first1 != __last1; ++__first1, ++__first2)
1062227825Stheraven        if (!__pred(*__first1, *__first2))
1063227825Stheraven            return false;
1064227825Stheraven    return true;
1065227825Stheraven}
1066227825Stheraven
1067227825Stheraventemplate <class _InputIterator1, class _InputIterator2>
1068227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1069227825Stheravenbool
1070227825Stheravenequal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2)
1071227825Stheraven{
1072227825Stheraven    typedef typename iterator_traits<_InputIterator1>::value_type __v1;
1073227825Stheraven    typedef typename iterator_traits<_InputIterator2>::value_type __v2;
1074227825Stheraven    return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
1075227825Stheraven}
1076227825Stheraven
1077227825Stheraven// is_permutation
1078227825Stheraven
1079227825Stheraventemplate<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1080227825Stheravenbool
1081227825Stheravenis_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1082227825Stheraven               _ForwardIterator2 __first2, _BinaryPredicate __pred)
1083227825Stheraven{
1084227825Stheraven    // shorten sequences as much as possible by lopping of any equal parts
1085227825Stheraven    for (; __first1 != __last1; ++__first1, ++__first2)
1086227825Stheraven        if (!__pred(*__first1, *__first2))
1087227825Stheraven            goto __not_done;
1088227825Stheraven    return true;
1089227825Stheraven__not_done:
1090227825Stheraven    // __first1 != __last1 && *__first1 != *__first2
1091227825Stheraven    typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
1092227825Stheraven    _D1 __l1 = _VSTD::distance(__first1, __last1);
1093227825Stheraven    if (__l1 == _D1(1))
1094227825Stheraven        return false;
1095227825Stheraven    _ForwardIterator2 __last2 = _VSTD::next(__first2, __l1);
1096227825Stheraven    // For each element in [f1, l1) see if there are the same number of
1097227825Stheraven    //    equal elements in [f2, l2)
1098227825Stheraven    for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
1099227825Stheraven    {
1100227825Stheraven        // Have we already counted the number of *__i in [f1, l1)?
1101227825Stheraven        for (_ForwardIterator1 __j = __first1; __j != __i; ++__j)
1102227825Stheraven            if (__pred(*__j, *__i))
1103227825Stheraven                goto __next_iter;
1104227825Stheraven        {
1105227825Stheraven            // Count number of *__i in [f2, l2)
1106227825Stheraven            _D1 __c2 = 0;
1107227825Stheraven            for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
1108227825Stheraven                if (__pred(*__i, *__j))
1109227825Stheraven                    ++__c2;
1110227825Stheraven            if (__c2 == 0)
1111227825Stheraven                return false;
1112227825Stheraven            // Count number of *__i in [__i, l1) (we can start with 1)
1113227825Stheraven            _D1 __c1 = 1;
1114227825Stheraven            for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
1115227825Stheraven                if (__pred(*__i, *__j))
1116227825Stheraven                    ++__c1;
1117227825Stheraven            if (__c1 != __c2)
1118227825Stheraven                return false;
1119227825Stheraven        }
1120227825Stheraven__next_iter:;
1121227825Stheraven    }
1122227825Stheraven    return true;
1123227825Stheraven}
1124227825Stheraven
1125227825Stheraventemplate<class _ForwardIterator1, class _ForwardIterator2>
1126227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1127227825Stheravenbool
1128227825Stheravenis_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1129227825Stheraven               _ForwardIterator2 __first2)
1130227825Stheraven{
1131227825Stheraven    typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
1132227825Stheraven    typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
1133227825Stheraven    return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
1134227825Stheraven}
1135227825Stheraven
1136227825Stheraven// search
1137227825Stheraven
1138227825Stheraventemplate <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
1139227825Stheraven_ForwardIterator1
1140227825Stheraven__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1141227825Stheraven         _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
1142227825Stheraven         forward_iterator_tag, forward_iterator_tag)
1143227825Stheraven{
1144227825Stheraven    if (__first2 == __last2)
1145227825Stheraven        return __first1;  // Everything matches an empty sequence
1146227825Stheraven    while (true)
1147227825Stheraven    {
1148227825Stheraven        // Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks
1149227825Stheraven        while (true)
1150227825Stheraven        {
1151227825Stheraven            if (__first1 == __last1)  // return __last1 if no element matches *__first2
1152227825Stheraven                return __last1;
1153227825Stheraven            if (__pred(*__first1, *__first2))
1154227825Stheraven                break;
1155227825Stheraven            ++__first1;
1156227825Stheraven        }
1157227825Stheraven        // *__first1 matches *__first2, now match elements after here
1158227825Stheraven        _ForwardIterator1 __m1 = __first1;
1159227825Stheraven        _ForwardIterator2 __m2 = __first2;
1160227825Stheraven        while (true)
1161227825Stheraven        {
1162227825Stheraven            if (++__m2 == __last2)  // If pattern exhausted, __first1 is the answer (works for 1 element pattern)
1163227825Stheraven                return __first1;
1164227825Stheraven            if (++__m1 == __last1)  // Otherwise if source exhaused, pattern not found
1165227825Stheraven                return __last1;
1166227825Stheraven            if (!__pred(*__m1, *__m2))  // if there is a mismatch, restart with a new __first1
1167227825Stheraven            {
1168227825Stheraven                ++__first1;
1169227825Stheraven                break;
1170227825Stheraven            }  // else there is a match, check next elements
1171227825Stheraven        }
1172227825Stheraven    }
1173227825Stheraven}
1174227825Stheraven
1175227825Stheraventemplate <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
1176227825Stheraven_RandomAccessIterator1
1177227825Stheraven__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
1178227825Stheraven           _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
1179227825Stheraven           random_access_iterator_tag, random_access_iterator_tag)
1180227825Stheraven{
1181227825Stheraven    typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type _D1;
1182227825Stheraven    typedef typename std::iterator_traits<_RandomAccessIterator2>::difference_type _D2;
1183227825Stheraven    // Take advantage of knowing source and pattern lengths.  Stop short when source is smaller than pattern
1184227825Stheraven    _D2 __len2 = __last2 - __first2;
1185227825Stheraven    if (__len2 == 0)
1186227825Stheraven        return __first1;
1187227825Stheraven    _D1 __len1 = __last1 - __first1;
1188227825Stheraven    if (__len1 < __len2)
1189227825Stheraven        return __last1;
1190227825Stheraven    const _RandomAccessIterator1 __s = __last1 - (__len2 - 1);  // Start of pattern match can't go beyond here
1191227825Stheraven    while (true)
1192227825Stheraven    {
1193227825Stheraven#if !_LIBCPP_UNROLL_LOOPS
1194227825Stheraven        while (true)
1195227825Stheraven        {
1196227825Stheraven            if (__first1 == __s)
1197227825Stheraven                return __last1;
1198227825Stheraven            if (__pred(*__first1, *__first2))
1199227825Stheraven                break;
1200227825Stheraven            ++__first1;
1201227825Stheraven        }
1202227825Stheraven#else  // !_LIBCPP_UNROLL_LOOPS
1203227825Stheraven        for (_D1 __loop_unroll = (__s - __first1) / 4; __loop_unroll > 0; --__loop_unroll)
1204227825Stheraven        {
1205227825Stheraven            if (__pred(*__first1, *__first2))
1206227825Stheraven                goto __phase2;
1207227825Stheraven            if (__pred(*++__first1, *__first2))
1208227825Stheraven                goto __phase2;
1209227825Stheraven            if (__pred(*++__first1, *__first2))
1210227825Stheraven                goto __phase2;
1211227825Stheraven            if (__pred(*++__first1, *__first2))
1212227825Stheraven                goto __phase2;
1213227825Stheraven            ++__first1;
1214227825Stheraven        }
1215227825Stheraven        switch (__s - __first1)
1216227825Stheraven        {
1217227825Stheraven        case 3:
1218227825Stheraven            if (__pred(*__first1, *__first2))
1219227825Stheraven                break;
1220227825Stheraven            ++__first1;
1221227825Stheraven        case 2:
1222227825Stheraven            if (__pred(*__first1, *__first2))
1223227825Stheraven                break;
1224227825Stheraven            ++__first1;
1225227825Stheraven        case 1:
1226227825Stheraven            if (__pred(*__first1, *__first2))
1227227825Stheraven                break;
1228227825Stheraven        case 0:
1229227825Stheraven            return __last1;
1230227825Stheraven        }
1231227825Stheraven    __phase2:
1232227825Stheraven#endif  // !_LIBCPP_UNROLL_LOOPS
1233227825Stheraven        _RandomAccessIterator1 __m1 = __first1;
1234227825Stheraven        _RandomAccessIterator2 __m2 = __first2;
1235227825Stheraven#if !_LIBCPP_UNROLL_LOOPS
1236227825Stheraven         while (true)
1237227825Stheraven         {
1238227825Stheraven             if (++__m2 == __last2)
1239227825Stheraven                 return __first1;
1240227825Stheraven             ++__m1;          // no need to check range on __m1 because __s guarantees we have enough source
1241227825Stheraven             if (!__pred(*__m1, *__m2))
1242227825Stheraven             {
1243227825Stheraven                 ++__first1;
1244227825Stheraven                 break;
1245227825Stheraven             }
1246227825Stheraven         }
1247227825Stheraven#else  // !_LIBCPP_UNROLL_LOOPS
1248227825Stheraven        ++__m2;
1249227825Stheraven        ++__m1;
1250227825Stheraven        for (_D2 __loop_unroll = (__last2 - __m2) / 4; __loop_unroll > 0; --__loop_unroll)
1251227825Stheraven        {
1252227825Stheraven            if (!__pred(*__m1, *__m2))
1253227825Stheraven                goto __continue;
1254227825Stheraven            if (!__pred(*++__m1, *++__m2))
1255227825Stheraven                goto __continue;
1256227825Stheraven            if (!__pred(*++__m1, *++__m2))
1257227825Stheraven                goto __continue;
1258227825Stheraven            if (!__pred(*++__m1, *++__m2))
1259227825Stheraven                goto __continue;
1260227825Stheraven            ++__m1;
1261227825Stheraven            ++__m2;
1262227825Stheraven        }
1263227825Stheraven        switch (__last2 - __m2)
1264227825Stheraven        {
1265227825Stheraven        case 3:
1266227825Stheraven            if (!__pred(*__m1, *__m2))
1267227825Stheraven                break;
1268227825Stheraven            ++__m1;
1269227825Stheraven            ++__m2;
1270227825Stheraven        case 2:
1271227825Stheraven            if (!__pred(*__m1, *__m2))
1272227825Stheraven                break;
1273227825Stheraven            ++__m1;
1274227825Stheraven            ++__m2;
1275227825Stheraven        case 1:
1276227825Stheraven            if (!__pred(*__m1, *__m2))
1277227825Stheraven                break;
1278227825Stheraven        case 0:
1279227825Stheraven            return __first1;
1280227825Stheraven        }
1281227825Stheraven    __continue:
1282227825Stheraven        ++__first1;
1283227825Stheraven#endif  // !_LIBCPP_UNROLL_LOOPS
1284227825Stheraven    }
1285227825Stheraven}
1286227825Stheraven
1287227825Stheraventemplate <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
1288227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1289227825Stheraven_ForwardIterator1
1290227825Stheravensearch(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1291227825Stheraven       _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred)
1292227825Stheraven{
1293227825Stheraven    return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
1294227825Stheraven                         (__first1, __last1, __first2, __last2, __pred,
1295227825Stheraven                          typename std::iterator_traits<_ForwardIterator1>::iterator_category(),
1296227825Stheraven                          typename std::iterator_traits<_ForwardIterator2>::iterator_category());
1297227825Stheraven}
1298227825Stheraven
1299227825Stheraventemplate <class _ForwardIterator1, class _ForwardIterator2>
1300227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1301227825Stheraven_ForwardIterator1
1302227825Stheravensearch(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
1303227825Stheraven       _ForwardIterator2 __first2, _ForwardIterator2 __last2)
1304227825Stheraven{
1305227825Stheraven    typedef typename std::iterator_traits<_ForwardIterator1>::value_type __v1;
1306227825Stheraven    typedef typename std::iterator_traits<_ForwardIterator2>::value_type __v2;
1307227825Stheraven    return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
1308227825Stheraven}
1309227825Stheraven
1310227825Stheraven// search_n
1311227825Stheraven
1312227825Stheraventemplate <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp>
1313227825Stheraven_ForwardIterator
1314227825Stheraven__search_n(_ForwardIterator __first, _ForwardIterator __last,
1315227825Stheraven           _Size __count, const _Tp& __value_, _BinaryPredicate __pred, forward_iterator_tag)
1316227825Stheraven{
1317227825Stheraven    if (__count <= 0)
1318227825Stheraven        return __first;
1319227825Stheraven    while (true)
1320227825Stheraven    {
1321227825Stheraven        // Find first element in sequence that matchs __value_, with a mininum of loop checks
1322227825Stheraven        while (true)
1323227825Stheraven        {
1324227825Stheraven            if (__first == __last)  // return __last if no element matches __value_
1325227825Stheraven                return __last;
1326227825Stheraven            if (__pred(*__first, __value_))
1327227825Stheraven                break;
1328227825Stheraven            ++__first;
1329227825Stheraven        }
1330227825Stheraven        // *__first matches __value_, now match elements after here
1331227825Stheraven        _ForwardIterator __m = __first;
1332227825Stheraven        _Size __c(0);
1333227825Stheraven        while (true)
1334227825Stheraven        {
1335227825Stheraven            if (++__c == __count)  // If pattern exhausted, __first is the answer (works for 1 element pattern)
1336227825Stheraven                return __first;
1337227825Stheraven            if (++__m == __last)  // Otherwise if source exhaused, pattern not found
1338227825Stheraven                return __last;
1339227825Stheraven            if (!__pred(*__m, __value_))  // if there is a mismatch, restart with a new __first
1340227825Stheraven            {
1341227825Stheraven                __first = __m;
1342227825Stheraven                ++__first;
1343227825Stheraven                break;
1344227825Stheraven            }  // else there is a match, check next elements
1345227825Stheraven        }
1346227825Stheraven    }
1347227825Stheraven}
1348227825Stheraven
1349227825Stheraventemplate <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp>
1350227825Stheraven_RandomAccessIterator
1351227825Stheraven__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last,
1352227825Stheraven           _Size __count, const _Tp& __value_, _BinaryPredicate __pred, random_access_iterator_tag)
1353227825Stheraven{
1354227825Stheraven    if (__count <= 0)
1355227825Stheraven        return __first;
1356227825Stheraven    _Size __len = static_cast<_Size>(__last - __first);
1357227825Stheraven    if (__len < __count)
1358227825Stheraven        return __last;
1359227825Stheraven    const _RandomAccessIterator __s = __last - (__count - 1);  // Start of pattern match can't go beyond here
1360227825Stheraven    while (true)
1361227825Stheraven    {
1362227825Stheraven        // Find first element in sequence that matchs __value_, with a mininum of loop checks
1363227825Stheraven        while (true)
1364227825Stheraven        {
1365227825Stheraven            if (__first == __s)  // return __last if no element matches __value_
1366227825Stheraven                return __last;
1367227825Stheraven            if (__pred(*__first, __value_))
1368227825Stheraven                break;
1369227825Stheraven            ++__first;
1370227825Stheraven        }
1371227825Stheraven        // *__first matches __value_, now match elements after here
1372227825Stheraven        _RandomAccessIterator __m = __first;
1373227825Stheraven        _Size __c(0);
1374227825Stheraven        while (true)
1375227825Stheraven        {
1376227825Stheraven            if (++__c == __count)  // If pattern exhausted, __first is the answer (works for 1 element pattern)
1377227825Stheraven                return __first;
1378227825Stheraven             ++__m;          // no need to check range on __m because __s guarantees we have enough source
1379227825Stheraven            if (!__pred(*__m, __value_))  // if there is a mismatch, restart with a new __first
1380227825Stheraven            {
1381227825Stheraven                __first = __m;
1382227825Stheraven                ++__first;
1383227825Stheraven                break;
1384227825Stheraven            }  // else there is a match, check next elements
1385227825Stheraven        }
1386227825Stheraven    }
1387227825Stheraven}
1388227825Stheraven
1389227825Stheraventemplate <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate>
1390227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1391227825Stheraven_ForwardIterator
1392227825Stheravensearch_n(_ForwardIterator __first, _ForwardIterator __last,
1393227825Stheraven         _Size __count, const _Tp& __value_, _BinaryPredicate __pred)
1394227825Stheraven{
1395227825Stheraven    return _VSTD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type>
1396227825Stheraven           (__first, __last, __count, __value_, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
1397227825Stheraven}
1398227825Stheraven
1399227825Stheraventemplate <class _ForwardIterator, class _Size, class _Tp>
1400227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1401227825Stheraven_ForwardIterator
1402227825Stheravensearch_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value_)
1403227825Stheraven{
1404227825Stheraven    typedef typename iterator_traits<_ForwardIterator>::value_type __v;
1405227825Stheraven    return _VSTD::search_n(__first, __last, __count, __value_, __equal_to<__v, _Tp>());
1406227825Stheraven}
1407227825Stheraven
1408227825Stheraven// copy
1409227825Stheraven
1410227825Stheraventemplate <class _Iter>
1411227825Stheravenstruct __libcpp_is_trivial_iterator
1412227825Stheraven{
1413227825Stheraven    static const bool value = is_pointer<_Iter>::value;
1414227825Stheraven};
1415227825Stheraven
1416227825Stheraventemplate <class _Iter>
1417227825Stheravenstruct __libcpp_is_trivial_iterator<move_iterator<_Iter> >
1418227825Stheraven{
1419227825Stheraven    static const bool value = is_pointer<_Iter>::value;
1420227825Stheraven};
1421227825Stheraven
1422227825Stheraventemplate <class _Iter>
1423227825Stheravenstruct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> >
1424227825Stheraven{
1425227825Stheraven    static const bool value = is_pointer<_Iter>::value;
1426227825Stheraven};
1427227825Stheraven
1428227825Stheraventemplate <class _Iter>
1429227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1430227825Stheraven_Iter
1431227825Stheraven__unwrap_iter(_Iter __i)
1432227825Stheraven{
1433227825Stheraven    return __i;
1434227825Stheraven}
1435227825Stheraven
1436227825Stheraventemplate <class _Tp>
1437227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1438227825Stheraventypename enable_if
1439227825Stheraven<
1440227825Stheraven    is_trivially_copy_assignable<_Tp>::value,
1441227825Stheraven    _Tp*
1442227825Stheraven>::type
1443227825Stheraven__unwrap_iter(move_iterator<_Tp*> __i)
1444227825Stheraven{
1445227825Stheraven    return __i.base();
1446227825Stheraven}
1447227825Stheraven
1448227825Stheraventemplate <class _Tp>
1449227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1450227825Stheraventypename enable_if
1451227825Stheraven<
1452227825Stheraven    is_trivially_copy_assignable<_Tp>::value,
1453227825Stheraven    _Tp*
1454227825Stheraven>::type
1455227825Stheraven__unwrap_iter(__wrap_iter<_Tp*> __i)
1456227825Stheraven{
1457227825Stheraven    return __i.base();
1458227825Stheraven}
1459227825Stheraven
1460227825Stheraventemplate <class _InputIterator, class _OutputIterator>
1461227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1462227825Stheraven_OutputIterator
1463227825Stheraven__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1464227825Stheraven{
1465227825Stheraven    for (; __first != __last; ++__first, ++__result)
1466227825Stheraven        *__result = *__first;
1467227825Stheraven    return __result;
1468227825Stheraven}
1469227825Stheraven
1470227825Stheraventemplate <class _Tp, class _Up>
1471227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1472227825Stheraventypename enable_if
1473227825Stheraven<
1474227825Stheraven    is_same<typename remove_const<_Tp>::type, _Up>::value &&
1475227825Stheraven    is_trivially_copy_assignable<_Up>::value,
1476227825Stheraven    _Up*
1477227825Stheraven>::type
1478227825Stheraven__copy(_Tp* __first, _Tp* __last, _Up* __result)
1479227825Stheraven{
1480227825Stheraven    const size_t __n = static_cast<size_t>(__last - __first);
1481227825Stheraven    _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1482227825Stheraven    return __result + __n;
1483227825Stheraven}
1484227825Stheraven
1485227825Stheraventemplate <class _InputIterator, class _OutputIterator>
1486227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1487227825Stheraven_OutputIterator
1488227825Stheravencopy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1489227825Stheraven{
1490227825Stheraven    return _VSTD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
1491227825Stheraven}
1492227825Stheraven
1493227825Stheraven// copy_backward
1494227825Stheraven
1495227825Stheraventemplate <class _InputIterator, class _OutputIterator>
1496227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1497227825Stheraven_OutputIterator
1498227825Stheraven__copy_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1499227825Stheraven{
1500227825Stheraven    while (__first != __last)
1501227825Stheraven        *--__result = *--__last;
1502227825Stheraven    return __result;
1503227825Stheraven}
1504227825Stheraven
1505227825Stheraventemplate <class _Tp, class _Up>
1506227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1507227825Stheraventypename enable_if
1508227825Stheraven<
1509227825Stheraven    is_same<typename remove_const<_Tp>::type, _Up>::value &&
1510227825Stheraven    is_trivially_copy_assignable<_Up>::value,
1511227825Stheraven    _Up*
1512227825Stheraven>::type
1513227825Stheraven__copy_backward(_Tp* __first, _Tp* __last, _Up* __result)
1514227825Stheraven{
1515227825Stheraven    const size_t __n = static_cast<size_t>(__last - __first);
1516227825Stheraven    __result -= __n;
1517227825Stheraven    _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1518227825Stheraven    return __result;
1519227825Stheraven}
1520227825Stheraven
1521227825Stheraventemplate <class _BidirectionalIterator1, class _BidirectionalIterator2>
1522227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1523227825Stheraven_BidirectionalIterator2
1524227825Stheravencopy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1525227825Stheraven              _BidirectionalIterator2 __result)
1526227825Stheraven{
1527227825Stheraven    return _VSTD::__copy_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
1528227825Stheraven}
1529227825Stheraven
1530227825Stheraven// copy_if
1531227825Stheraven
1532227825Stheraventemplate<class _InputIterator, class _OutputIterator, class _Predicate>
1533227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1534227825Stheraven_OutputIterator
1535227825Stheravencopy_if(_InputIterator __first, _InputIterator __last,
1536227825Stheraven        _OutputIterator __result, _Predicate __pred)
1537227825Stheraven{
1538227825Stheraven    for (; __first != __last; ++__first)
1539227825Stheraven    {
1540227825Stheraven        if (__pred(*__first))
1541227825Stheraven        {
1542227825Stheraven            *__result = *__first;
1543227825Stheraven            ++__result;
1544227825Stheraven        }
1545227825Stheraven    }
1546227825Stheraven    return __result;
1547227825Stheraven}
1548227825Stheraven
1549227825Stheraven// copy_n
1550227825Stheraven
1551227825Stheraventemplate<class _InputIterator, class _Size, class _OutputIterator>
1552227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1553227825Stheraventypename enable_if
1554227825Stheraven<
1555227825Stheraven    __is_input_iterator<_InputIterator>::value &&
1556227825Stheraven   !__is_random_access_iterator<_InputIterator>::value,
1557227825Stheraven    _OutputIterator
1558227825Stheraven>::type
1559227825Stheravencopy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1560227825Stheraven{
1561227825Stheraven    if (__n > 0)
1562227825Stheraven    {
1563227825Stheraven        *__result = *__first;
1564227825Stheraven        ++__result;
1565227825Stheraven        for (--__n; __n > 0; --__n)
1566227825Stheraven        {
1567227825Stheraven            ++__first;
1568227825Stheraven            *__result = *__first;
1569227825Stheraven            ++__result;
1570227825Stheraven        }
1571227825Stheraven    }
1572227825Stheraven    return __result;
1573227825Stheraven}
1574227825Stheraven
1575227825Stheraventemplate<class _InputIterator, class _Size, class _OutputIterator>
1576227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1577227825Stheraventypename enable_if
1578227825Stheraven<
1579227825Stheraven    __is_random_access_iterator<_InputIterator>::value,
1580227825Stheraven    _OutputIterator
1581227825Stheraven>::type
1582227825Stheravencopy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1583227825Stheraven{
1584227825Stheraven    return _VSTD::copy(__first, __first + __n, __result);
1585227825Stheraven}
1586227825Stheraven
1587227825Stheraven// move
1588227825Stheraven
1589227825Stheraventemplate <class _InputIterator, class _OutputIterator>
1590227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1591227825Stheraven_OutputIterator
1592227825Stheraven__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1593227825Stheraven{
1594227825Stheraven    for (; __first != __last; ++__first, ++__result)
1595227825Stheraven        *__result = _VSTD::move(*__first);
1596227825Stheraven    return __result;
1597227825Stheraven}
1598227825Stheraven
1599227825Stheraventemplate <class _Tp, class _Up>
1600227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1601227825Stheraventypename enable_if
1602227825Stheraven<
1603227825Stheraven    is_same<typename remove_const<_Tp>::type, _Up>::value &&
1604227825Stheraven    is_trivially_copy_assignable<_Up>::value,
1605227825Stheraven    _Up*
1606227825Stheraven>::type
1607227825Stheraven__move(_Tp* __first, _Tp* __last, _Up* __result)
1608227825Stheraven{
1609227825Stheraven    const size_t __n = static_cast<size_t>(__last - __first);
1610227825Stheraven    _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1611227825Stheraven    return __result + __n;
1612227825Stheraven}
1613227825Stheraven
1614227825Stheraventemplate <class _InputIterator, class _OutputIterator>
1615227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1616227825Stheraven_OutputIterator
1617227825Stheravenmove(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1618227825Stheraven{
1619227825Stheraven    return _VSTD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
1620227825Stheraven}
1621227825Stheraven
1622227825Stheraven// move_backward
1623227825Stheraven
1624227825Stheraventemplate <class _InputIterator, class _OutputIterator>
1625227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1626227825Stheraven_OutputIterator
1627227825Stheraven__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
1628227825Stheraven{
1629227825Stheraven    while (__first != __last)
1630227825Stheraven        *--__result = _VSTD::move(*--__last);
1631227825Stheraven    return __result;
1632227825Stheraven}
1633227825Stheraven
1634227825Stheraventemplate <class _Tp, class _Up>
1635227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1636227825Stheraventypename enable_if
1637227825Stheraven<
1638227825Stheraven    is_same<typename remove_const<_Tp>::type, _Up>::value &&
1639227825Stheraven    is_trivially_copy_assignable<_Up>::value,
1640227825Stheraven    _Up*
1641227825Stheraven>::type
1642227825Stheraven__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
1643227825Stheraven{
1644227825Stheraven    const size_t __n = static_cast<size_t>(__last - __first);
1645227825Stheraven    __result -= __n;
1646227825Stheraven    _VSTD::memmove(__result, __first, __n * sizeof(_Up));
1647227825Stheraven    return __result;
1648227825Stheraven}
1649227825Stheraven
1650227825Stheraventemplate <class _BidirectionalIterator1, class _BidirectionalIterator2>
1651227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1652227825Stheraven_BidirectionalIterator2
1653227825Stheravenmove_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
1654227825Stheraven              _BidirectionalIterator2 __result)
1655227825Stheraven{
1656227825Stheraven    return _VSTD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
1657227825Stheraven}
1658227825Stheraven
1659227825Stheraven// iter_swap
1660227825Stheraven
1661227825Stheraven// moved to <type_traits> for better swap / noexcept support
1662227825Stheraven
1663227825Stheraven// transform
1664227825Stheraven
1665227825Stheraventemplate <class _InputIterator, class _OutputIterator, class _UnaryOperation>
1666227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1667227825Stheraven_OutputIterator
1668227825Stheraventransform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
1669227825Stheraven{
1670227825Stheraven    for (; __first != __last; ++__first, ++__result)
1671227825Stheraven        *__result = __op(*__first);
1672227825Stheraven    return __result;
1673227825Stheraven}
1674227825Stheraven
1675227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation>
1676227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1677227825Stheraven_OutputIterator
1678227825Stheraventransform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2,
1679227825Stheraven          _OutputIterator __result, _BinaryOperation __binary_op)
1680227825Stheraven{
1681227825Stheraven    for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
1682227825Stheraven        *__result = __binary_op(*__first1, *__first2);
1683227825Stheraven    return __result;
1684227825Stheraven}
1685227825Stheraven
1686227825Stheraven// replace
1687227825Stheraven
1688227825Stheraventemplate <class _ForwardIterator, class _Tp>
1689227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1690227825Stheravenvoid
1691227825Stheravenreplace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value)
1692227825Stheraven{
1693227825Stheraven    for (; __first != __last; ++__first)
1694227825Stheraven        if (*__first == __old_value)
1695227825Stheraven            *__first = __new_value;
1696227825Stheraven}
1697227825Stheraven
1698227825Stheraven// replace_if
1699227825Stheraven
1700227825Stheraventemplate <class _ForwardIterator, class _Predicate, class _Tp>
1701227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1702227825Stheravenvoid
1703227825Stheravenreplace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value)
1704227825Stheraven{
1705227825Stheraven    for (; __first != __last; ++__first)
1706227825Stheraven        if (__pred(*__first))
1707227825Stheraven            *__first = __new_value;
1708227825Stheraven}
1709227825Stheraven
1710227825Stheraven// replace_copy
1711227825Stheraven
1712227825Stheraventemplate <class _InputIterator, class _OutputIterator, class _Tp>
1713227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1714227825Stheraven_OutputIterator
1715227825Stheravenreplace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1716227825Stheraven             const _Tp& __old_value, const _Tp& __new_value)
1717227825Stheraven{
1718227825Stheraven    for (; __first != __last; ++__first, ++__result)
1719227825Stheraven        if (*__first == __old_value)
1720227825Stheraven            *__result = __new_value;
1721227825Stheraven        else
1722227825Stheraven            *__result = *__first;
1723227825Stheraven    return __result;
1724227825Stheraven}
1725227825Stheraven
1726227825Stheraven// replace_copy_if
1727227825Stheraven
1728227825Stheraventemplate <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp>
1729227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1730227825Stheraven_OutputIterator
1731227825Stheravenreplace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result,
1732227825Stheraven                _Predicate __pred, const _Tp& __new_value)
1733227825Stheraven{
1734227825Stheraven    for (; __first != __last; ++__first, ++__result)
1735227825Stheraven        if (__pred(*__first))
1736227825Stheraven            *__result = __new_value;
1737227825Stheraven        else
1738227825Stheraven            *__result = *__first;
1739227825Stheraven    return __result;
1740227825Stheraven}
1741227825Stheraven
1742227825Stheraven// fill_n
1743227825Stheraven
1744227825Stheraventemplate <class _OutputIterator, class _Size, class _Tp>
1745227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1746227825Stheraven_OutputIterator
1747227825Stheraven__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_, false_type)
1748227825Stheraven{
1749227825Stheraven    for (; __n > 0; ++__first, --__n)
1750227825Stheraven        *__first = __value_;
1751227825Stheraven    return __first;
1752227825Stheraven}
1753227825Stheraven
1754227825Stheraventemplate <class _OutputIterator, class _Size, class _Tp>
1755227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1756227825Stheraven_OutputIterator
1757227825Stheraven__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_, true_type)
1758227825Stheraven{
1759227825Stheraven    if (__n > 0)
1760227825Stheraven        _VSTD::memset(__first, (unsigned char)__value_, (size_t)(__n));
1761227825Stheraven    return __first + __n;
1762227825Stheraven}
1763227825Stheraven
1764227825Stheraventemplate <class _OutputIterator, class _Size, class _Tp>
1765227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1766227825Stheraven_OutputIterator
1767227825Stheravenfill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
1768227825Stheraven{
1769227825Stheraven   return _VSTD::__fill_n(__first, __n, __value_, integral_constant<bool,
1770227825Stheraven                                              is_pointer<_OutputIterator>::value &&
1771227825Stheraven                                              is_trivially_copy_assignable<_Tp>::value     &&
1772227825Stheraven                                              sizeof(_Tp) == 1>());
1773227825Stheraven}
1774227825Stheraven
1775227825Stheraven// fill
1776227825Stheraven
1777227825Stheraventemplate <class _ForwardIterator, class _Tp>
1778227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1779227825Stheravenvoid
1780227825Stheraven__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, forward_iterator_tag)
1781227825Stheraven{
1782227825Stheraven    for (; __first != __last; ++__first)
1783227825Stheraven        *__first = __value_;
1784227825Stheraven}
1785227825Stheraven
1786227825Stheraventemplate <class _RandomAccessIterator, class _Tp>
1787227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1788227825Stheravenvoid
1789227825Stheraven__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value_, random_access_iterator_tag)
1790227825Stheraven{
1791227825Stheraven    _VSTD::fill_n(__first, __last - __first, __value_);
1792227825Stheraven}
1793227825Stheraven
1794227825Stheraventemplate <class _ForwardIterator, class _Tp>
1795227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1796227825Stheravenvoid
1797227825Stheravenfill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
1798227825Stheraven{
1799227825Stheraven    _VSTD::__fill(__first, __last, __value_, typename iterator_traits<_ForwardIterator>::iterator_category());
1800227825Stheraven}
1801227825Stheraven
1802227825Stheraven// generate
1803227825Stheraven
1804227825Stheraventemplate <class _ForwardIterator, class _Generator>
1805227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1806227825Stheravenvoid
1807227825Stheravengenerate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
1808227825Stheraven{
1809227825Stheraven    for (; __first != __last; ++__first)
1810227825Stheraven        *__first = __gen();
1811227825Stheraven}
1812227825Stheraven
1813227825Stheraven// generate_n
1814227825Stheraven
1815227825Stheraventemplate <class _OutputIterator, class _Size, class _Generator>
1816227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1817227825Stheraven_OutputIterator
1818227825Stheravengenerate_n(_OutputIterator __first, _Size __n, _Generator __gen)
1819227825Stheraven{
1820227825Stheraven    for (; __n > 0; ++__first, --__n)
1821227825Stheraven        *__first = __gen();
1822227825Stheraven    return __first;
1823227825Stheraven}
1824227825Stheraven
1825227825Stheraven// remove
1826227825Stheraven
1827227825Stheraventemplate <class _ForwardIterator, class _Tp>
1828227825Stheraven_ForwardIterator
1829227825Stheravenremove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
1830227825Stheraven{
1831227825Stheraven    __first = _VSTD::find(__first, __last, __value_);
1832227825Stheraven    if (__first != __last)
1833227825Stheraven    {
1834227825Stheraven        _ForwardIterator __i = __first;
1835227825Stheraven        while (++__i != __last)
1836227825Stheraven        {
1837227825Stheraven            if (!(*__i == __value_))
1838227825Stheraven            {
1839227825Stheraven                *__first = _VSTD::move(*__i);
1840227825Stheraven                ++__first;
1841227825Stheraven            }
1842227825Stheraven        }
1843227825Stheraven    }
1844227825Stheraven    return __first;
1845227825Stheraven}
1846227825Stheraven
1847227825Stheraven// remove_if
1848227825Stheraven
1849227825Stheraventemplate <class _ForwardIterator, class _Predicate>
1850227825Stheraven_ForwardIterator
1851227825Stheravenremove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
1852227825Stheraven{
1853227825Stheraven    __first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type>
1854227825Stheraven                           (__first, __last, __pred);
1855227825Stheraven    if (__first != __last)
1856227825Stheraven    {
1857227825Stheraven        _ForwardIterator __i = __first;
1858227825Stheraven        while (++__i != __last)
1859227825Stheraven        {
1860227825Stheraven            if (!__pred(*__i))
1861227825Stheraven            {
1862227825Stheraven                *__first = _VSTD::move(*__i);
1863227825Stheraven                ++__first;
1864227825Stheraven            }
1865227825Stheraven        }
1866227825Stheraven    }
1867227825Stheraven    return __first;
1868227825Stheraven}
1869227825Stheraven
1870227825Stheraven// remove_copy
1871227825Stheraven
1872227825Stheraventemplate <class _InputIterator, class _OutputIterator, class _Tp>
1873227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1874227825Stheraven_OutputIterator
1875227825Stheravenremove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value_)
1876227825Stheraven{
1877227825Stheraven    for (; __first != __last; ++__first)
1878227825Stheraven    {
1879227825Stheraven        if (!(*__first == __value_))
1880227825Stheraven        {
1881227825Stheraven            *__result = *__first;
1882227825Stheraven            ++__result;
1883227825Stheraven        }
1884227825Stheraven    }
1885227825Stheraven    return __result;
1886227825Stheraven}
1887227825Stheraven
1888227825Stheraven// remove_copy_if
1889227825Stheraven
1890227825Stheraventemplate <class _InputIterator, class _OutputIterator, class _Predicate>
1891227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1892227825Stheraven_OutputIterator
1893227825Stheravenremove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred)
1894227825Stheraven{
1895227825Stheraven    for (; __first != __last; ++__first)
1896227825Stheraven    {
1897227825Stheraven        if (!__pred(*__first))
1898227825Stheraven        {
1899227825Stheraven            *__result = *__first;
1900227825Stheraven            ++__result;
1901227825Stheraven        }
1902227825Stheraven    }
1903227825Stheraven    return __result;
1904227825Stheraven}
1905227825Stheraven
1906227825Stheraven// unique
1907227825Stheraven
1908227825Stheraventemplate <class _ForwardIterator, class _BinaryPredicate>
1909227825Stheraven_ForwardIterator
1910227825Stheravenunique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred)
1911227825Stheraven{
1912227825Stheraven    __first = _VSTD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type>
1913227825Stheraven                                 (__first, __last, __pred);
1914227825Stheraven    if (__first != __last)
1915227825Stheraven    {
1916227825Stheraven        // ...  a  a  ?  ...
1917227825Stheraven        //      f     i
1918227825Stheraven        _ForwardIterator __i = __first;
1919227825Stheraven        for (++__i; ++__i != __last;)
1920227825Stheraven            if (!__pred(*__first, *__i))
1921227825Stheraven                *++__first = _VSTD::move(*__i);
1922227825Stheraven        ++__first;
1923227825Stheraven    }
1924227825Stheraven    return __first;
1925227825Stheraven}
1926227825Stheraven
1927227825Stheraventemplate <class _ForwardIterator>
1928227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
1929227825Stheraven_ForwardIterator
1930227825Stheravenunique(_ForwardIterator __first, _ForwardIterator __last)
1931227825Stheraven{
1932227825Stheraven    typedef typename iterator_traits<_ForwardIterator>::value_type __v;
1933227825Stheraven    return _VSTD::unique(__first, __last, __equal_to<__v>());
1934227825Stheraven}
1935227825Stheraven
1936227825Stheraven// unique_copy
1937227825Stheraven
1938227825Stheraventemplate <class _BinaryPredicate, class _InputIterator, class _OutputIterator>
1939227825Stheraven_OutputIterator
1940227825Stheraven__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
1941227825Stheraven              input_iterator_tag, output_iterator_tag)
1942227825Stheraven{
1943227825Stheraven    if (__first != __last)
1944227825Stheraven    {
1945227825Stheraven        typename iterator_traits<_InputIterator>::value_type __t(*__first);
1946227825Stheraven        *__result = __t;
1947227825Stheraven        ++__result;
1948227825Stheraven        while (++__first != __last)
1949227825Stheraven        {
1950227825Stheraven            if (!__pred(__t, *__first))
1951227825Stheraven            {
1952227825Stheraven                __t = *__first;
1953227825Stheraven                *__result = __t;
1954227825Stheraven                ++__result;
1955227825Stheraven            }
1956227825Stheraven        }
1957227825Stheraven    }
1958227825Stheraven    return __result;
1959227825Stheraven}
1960227825Stheraven
1961227825Stheraventemplate <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator>
1962227825Stheraven_OutputIterator
1963227825Stheraven__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred,
1964227825Stheraven              forward_iterator_tag, output_iterator_tag)
1965227825Stheraven{
1966227825Stheraven    if (__first != __last)
1967227825Stheraven    {
1968227825Stheraven        _ForwardIterator __i = __first;
1969227825Stheraven        *__result = *__i;
1970227825Stheraven        ++__result;
1971227825Stheraven        while (++__first != __last)
1972227825Stheraven        {
1973227825Stheraven            if (!__pred(*__i, *__first))
1974227825Stheraven            {
1975227825Stheraven                *__result = *__first;
1976227825Stheraven                ++__result;
1977227825Stheraven                __i = __first;
1978227825Stheraven            }
1979227825Stheraven        }
1980227825Stheraven    }
1981227825Stheraven    return __result;
1982227825Stheraven}
1983227825Stheraven
1984227825Stheraventemplate <class _BinaryPredicate, class _InputIterator, class _ForwardIterator>
1985227825Stheraven_ForwardIterator
1986227825Stheraven__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred,
1987227825Stheraven              input_iterator_tag, forward_iterator_tag)
1988227825Stheraven{
1989227825Stheraven    if (__first != __last)
1990227825Stheraven    {
1991227825Stheraven        *__result = *__first;
1992227825Stheraven        while (++__first != __last)
1993227825Stheraven            if (!__pred(*__result, *__first))
1994227825Stheraven                *++__result = *__first;
1995227825Stheraven        ++__result;
1996227825Stheraven    }
1997227825Stheraven    return __result;
1998227825Stheraven}
1999227825Stheraven
2000227825Stheraventemplate <class _InputIterator, class _OutputIterator, class _BinaryPredicate>
2001227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2002227825Stheraven_OutputIterator
2003227825Stheravenunique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred)
2004227825Stheraven{
2005227825Stheraven    return _VSTD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type>
2006227825Stheraven                              (__first, __last, __result, __pred,
2007227825Stheraven                               typename iterator_traits<_InputIterator>::iterator_category(),
2008227825Stheraven                               typename iterator_traits<_OutputIterator>::iterator_category());
2009227825Stheraven}
2010227825Stheraven
2011227825Stheraventemplate <class _InputIterator, class _OutputIterator>
2012227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2013227825Stheraven_OutputIterator
2014227825Stheravenunique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
2015227825Stheraven{
2016227825Stheraven    typedef typename iterator_traits<_InputIterator>::value_type __v;
2017227825Stheraven    return _VSTD::unique_copy(__first, __last, __result, __equal_to<__v>());
2018227825Stheraven}
2019227825Stheraven
2020227825Stheraven// reverse
2021227825Stheraven
2022227825Stheraventemplate <class _BidirectionalIterator>
2023227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2024227825Stheravenvoid
2025227825Stheraven__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
2026227825Stheraven{
2027227825Stheraven    while (__first != __last)
2028227825Stheraven    {
2029227825Stheraven        if (__first == --__last)
2030227825Stheraven            break;
2031227825Stheraven        swap(*__first, *__last);
2032227825Stheraven        ++__first;
2033227825Stheraven    }
2034227825Stheraven}
2035227825Stheraven
2036227825Stheraventemplate <class _RandomAccessIterator>
2037227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2038227825Stheravenvoid
2039227825Stheraven__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
2040227825Stheraven{
2041227825Stheraven    if (__first != __last)
2042227825Stheraven        for (; __first < --__last; ++__first)
2043227825Stheraven            swap(*__first, *__last);
2044227825Stheraven}
2045227825Stheraven
2046227825Stheraventemplate <class _BidirectionalIterator>
2047227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2048227825Stheravenvoid
2049227825Stheravenreverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
2050227825Stheraven{
2051227825Stheraven    _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category());
2052227825Stheraven}
2053227825Stheraven
2054227825Stheraven// reverse_copy
2055227825Stheraven
2056227825Stheraventemplate <class _BidirectionalIterator, class _OutputIterator>
2057227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2058227825Stheraven_OutputIterator
2059227825Stheravenreverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
2060227825Stheraven{
2061227825Stheraven    for (; __first != __last; ++__result)
2062227825Stheraven        *__result = *--__last;
2063227825Stheraven    return __result;
2064227825Stheraven}
2065227825Stheraven
2066227825Stheraven// rotate
2067227825Stheraven
2068227825Stheraventemplate <class _ForwardIterator>
2069227825Stheraven_ForwardIterator
2070227825Stheraven__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, false_type)
2071227825Stheraven{
2072227825Stheraven    if (__first == __middle)
2073227825Stheraven        return __last;
2074227825Stheraven    if (__middle == __last)
2075227825Stheraven        return __first;
2076227825Stheraven    _ForwardIterator __i = __middle;
2077227825Stheraven    while (true)
2078227825Stheraven    {
2079227825Stheraven        swap(*__first, *__i);
2080227825Stheraven        ++__first;
2081227825Stheraven        if (++__i == __last)
2082227825Stheraven            break;
2083227825Stheraven        if (__first == __middle)
2084227825Stheraven            __middle = __i;
2085227825Stheraven    }
2086227825Stheraven    _ForwardIterator __r = __first;
2087227825Stheraven    if (__first != __middle)
2088227825Stheraven    {
2089227825Stheraven        __i = __middle;
2090227825Stheraven        while (true)
2091227825Stheraven        {
2092227825Stheraven            swap(*__first, *__i);
2093227825Stheraven            ++__first;
2094227825Stheraven            if (++__i == __last)
2095227825Stheraven            {
2096227825Stheraven                if (__first == __middle)
2097227825Stheraven                    break;
2098227825Stheraven                __i = __middle;
2099227825Stheraven            }
2100227825Stheraven            else if (__first == __middle)
2101227825Stheraven                __middle = __i;
2102227825Stheraven        }
2103227825Stheraven    }
2104227825Stheraven    return __r;
2105227825Stheraven}
2106227825Stheraven
2107227825Stheraventemplate<typename _Integral>
2108227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2109227825Stheraven_Integral
2110227825Stheraven__gcd(_Integral __x, _Integral __y)
2111227825Stheraven{
2112227825Stheraven    do
2113227825Stheraven    {
2114227825Stheraven        _Integral __t = __x % __y;
2115227825Stheraven        __x = __y;
2116227825Stheraven        __y = __t;
2117227825Stheraven    } while (__y);
2118227825Stheraven    return __x;
2119227825Stheraven}
2120227825Stheraven
2121227825Stheraventemplate<typename _RandomAccessIterator>
2122227825Stheraven_RandomAccessIterator
2123227825Stheraven__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, true_type)
2124227825Stheraven{
2125227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2126227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
2127227825Stheraven
2128227825Stheraven    if (__first == __middle)
2129227825Stheraven        return __last;
2130227825Stheraven    if (__middle == __last)
2131227825Stheraven        return __first;
2132227825Stheraven    const difference_type __m1 = __middle - __first;
2133227825Stheraven    const difference_type __m2 = __last - __middle;
2134227825Stheraven    if (__m1 == __m2)
2135227825Stheraven    {
2136227825Stheraven        _VSTD::swap_ranges(__first, __middle, __middle);
2137227825Stheraven        return __middle;
2138227825Stheraven    }
2139227825Stheraven    const difference_type __g = __gcd(__m1, __m2);
2140227825Stheraven    for (_RandomAccessIterator __p = __first + __g; __p != __first;)
2141227825Stheraven    {
2142227825Stheraven        value_type __t(*--__p);
2143227825Stheraven        _RandomAccessIterator __p1 = __p;
2144227825Stheraven        _RandomAccessIterator __p2 = __p1 + __m1;
2145227825Stheraven        do
2146227825Stheraven        {
2147227825Stheraven            *__p1 = *__p2;
2148227825Stheraven            __p1 = __p2;
2149227825Stheraven            const difference_type __d = __last - __p2;
2150227825Stheraven            if (__m1 < __d)
2151227825Stheraven                __p2 += __m1;
2152227825Stheraven            else
2153227825Stheraven                __p2 = __first + (__m1 - __d);
2154227825Stheraven        } while (__p2 != __p);
2155227825Stheraven        *__p1 = __t;
2156227825Stheraven    }
2157227825Stheraven    return __first + __m2;
2158227825Stheraven}
2159227825Stheraven
2160227825Stheraventemplate <class _ForwardIterator>
2161227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2162227825Stheraven_ForwardIterator
2163227825Stheravenrotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
2164227825Stheraven{
2165227825Stheraven    return _VSTD::__rotate(__first, __middle, __last,
2166227825Stheraven                          integral_constant
2167227825Stheraven                          <
2168227825Stheraven                               bool,
2169227825Stheraven                               is_convertible
2170227825Stheraven                               <
2171227825Stheraven                                   typename iterator_traits<_ForwardIterator>::iterator_category,
2172227825Stheraven                                   random_access_iterator_tag
2173227825Stheraven                               >::value &&
2174227825Stheraven                               is_trivially_copy_assignable
2175227825Stheraven                               <
2176227825Stheraven                                   typename iterator_traits<_ForwardIterator>::value_type
2177227825Stheraven                               >::value
2178227825Stheraven                           >());
2179227825Stheraven}
2180227825Stheraven
2181227825Stheraven// rotate_copy
2182227825Stheraven
2183227825Stheraventemplate <class _ForwardIterator, class _OutputIterator>
2184227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2185227825Stheraven_OutputIterator
2186227825Stheravenrotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result)
2187227825Stheraven{
2188227825Stheraven    return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result));
2189227825Stheraven}
2190227825Stheraven
2191227825Stheraven// min_element
2192227825Stheraven
2193227825Stheraventemplate <class _ForwardIterator, class _Compare>
2194227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2195227825Stheraven_ForwardIterator
2196227825Stheravenmin_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2197227825Stheraven{
2198227825Stheraven    if (__first != __last)
2199227825Stheraven    {
2200227825Stheraven        _ForwardIterator __i = __first;
2201227825Stheraven        while (++__i != __last)
2202227825Stheraven            if (__comp(*__i, *__first))
2203227825Stheraven                __first = __i;
2204227825Stheraven    }
2205227825Stheraven    return __first;
2206227825Stheraven}
2207227825Stheraven
2208227825Stheraventemplate <class _ForwardIterator>
2209227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2210227825Stheraven_ForwardIterator
2211227825Stheravenmin_element(_ForwardIterator __first, _ForwardIterator __last)
2212227825Stheraven{
2213227825Stheraven    return _VSTD::min_element(__first, __last,
2214227825Stheraven              __less<typename iterator_traits<_ForwardIterator>::value_type>());
2215227825Stheraven}
2216227825Stheraven
2217227825Stheraven// min
2218227825Stheraven
2219227825Stheraventemplate <class _Tp, class _Compare>
2220227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2221227825Stheravenconst _Tp&
2222227825Stheravenmin(const _Tp& __a, const _Tp& __b, _Compare __comp)
2223227825Stheraven{
2224227825Stheraven    return __comp(__b, __a) ? __b : __a;
2225227825Stheraven}
2226227825Stheraven
2227227825Stheraventemplate <class _Tp>
2228227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2229227825Stheravenconst _Tp&
2230227825Stheravenmin(const _Tp& __a, const _Tp& __b)
2231227825Stheraven{
2232227825Stheraven    return _VSTD::min(__a, __b, __less<_Tp>());
2233227825Stheraven}
2234227825Stheraven
2235227825Stheraven#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2236227825Stheraven
2237227825Stheraventemplate<class _Tp, class _Compare>
2238227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2239227825Stheraven_Tp
2240227825Stheravenmin(initializer_list<_Tp> __t, _Compare __comp)
2241227825Stheraven{
2242227825Stheraven    return *_VSTD::min_element(__t.begin(), __t.end(), __comp);
2243227825Stheraven}
2244227825Stheraven
2245227825Stheraventemplate<class _Tp>
2246227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2247227825Stheraven_Tp
2248227825Stheravenmin(initializer_list<_Tp> __t)
2249227825Stheraven{
2250227825Stheraven    return *_VSTD::min_element(__t.begin(), __t.end());
2251227825Stheraven}
2252227825Stheraven
2253227825Stheraven#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2254227825Stheraven
2255227825Stheraven// max_element
2256227825Stheraven
2257227825Stheraventemplate <class _ForwardIterator, class _Compare>
2258227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2259227825Stheraven_ForwardIterator
2260227825Stheravenmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2261227825Stheraven{
2262227825Stheraven    if (__first != __last)
2263227825Stheraven    {
2264227825Stheraven        _ForwardIterator __i = __first;
2265227825Stheraven        while (++__i != __last)
2266227825Stheraven            if (__comp(*__first, *__i))
2267227825Stheraven                __first = __i;
2268227825Stheraven    }
2269227825Stheraven    return __first;
2270227825Stheraven}
2271227825Stheraven
2272227825Stheraventemplate <class _ForwardIterator>
2273227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2274227825Stheraven_ForwardIterator
2275227825Stheravenmax_element(_ForwardIterator __first, _ForwardIterator __last)
2276227825Stheraven{
2277227825Stheraven    return _VSTD::max_element(__first, __last,
2278227825Stheraven              __less<typename iterator_traits<_ForwardIterator>::value_type>());
2279227825Stheraven}
2280227825Stheraven
2281227825Stheraven// max
2282227825Stheraven
2283227825Stheraventemplate <class _Tp, class _Compare>
2284227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2285227825Stheravenconst _Tp&
2286227825Stheravenmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
2287227825Stheraven{
2288227825Stheraven    return __comp(__a, __b) ? __b : __a;
2289227825Stheraven}
2290227825Stheraven
2291227825Stheraventemplate <class _Tp>
2292227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2293227825Stheravenconst _Tp&
2294227825Stheravenmax(const _Tp& __a, const _Tp& __b)
2295227825Stheraven{
2296227825Stheraven    return _VSTD::max(__a, __b, __less<_Tp>());
2297227825Stheraven}
2298227825Stheraven
2299227825Stheraven#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2300227825Stheraven
2301227825Stheraventemplate<class _Tp, class _Compare>
2302227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2303227825Stheraven_Tp
2304227825Stheravenmax(initializer_list<_Tp> __t, _Compare __comp)
2305227825Stheraven{
2306227825Stheraven    return *_VSTD::max_element(__t.begin(), __t.end(), __comp);
2307227825Stheraven}
2308227825Stheraven
2309227825Stheraventemplate<class _Tp>
2310227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2311227825Stheraven_Tp
2312227825Stheravenmax(initializer_list<_Tp> __t)
2313227825Stheraven{
2314227825Stheraven    return *_VSTD::max_element(__t.begin(), __t.end());
2315227825Stheraven}
2316227825Stheraven
2317227825Stheraven#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2318227825Stheraven
2319227825Stheraven// minmax_element
2320227825Stheraven
2321227825Stheraventemplate <class _ForwardIterator, class _Compare>
2322227825Stheravenstd::pair<_ForwardIterator, _ForwardIterator>
2323227825Stheravenminmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
2324227825Stheraven{
2325227825Stheraven  std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first);
2326227825Stheraven  if (__first != __last)
2327227825Stheraven  {
2328227825Stheraven      if (++__first != __last)
2329227825Stheraven      {
2330227825Stheraven          if (__comp(*__first, *__result.first))
2331227825Stheraven          {
2332227825Stheraven              __result.second = __result.first;
2333227825Stheraven              __result.first = __first;
2334227825Stheraven          }
2335227825Stheraven          else
2336227825Stheraven              __result.second = __first;
2337227825Stheraven          while (++__first != __last)
2338227825Stheraven          {
2339227825Stheraven              _ForwardIterator __i = __first;
2340227825Stheraven              if (++__first == __last)
2341227825Stheraven              {
2342227825Stheraven                  if (__comp(*__i, *__result.first))
2343227825Stheraven                      __result.first = __i;
2344227825Stheraven                  else if (!__comp(*__i, *__result.second))
2345227825Stheraven                      __result.second = __i;
2346227825Stheraven                  break;
2347227825Stheraven              }
2348227825Stheraven              else
2349227825Stheraven              {
2350227825Stheraven                  if (__comp(*__first, *__i))
2351227825Stheraven                  {
2352227825Stheraven                      if (__comp(*__first, *__result.first))
2353227825Stheraven                          __result.first = __first;
2354227825Stheraven                      if (!__comp(*__i, *__result.second))
2355227825Stheraven                          __result.second = __i;
2356227825Stheraven                  }
2357227825Stheraven                  else
2358227825Stheraven                  {
2359227825Stheraven                      if (__comp(*__i, *__result.first))
2360227825Stheraven                          __result.first = __i;
2361227825Stheraven                      if (!__comp(*__first, *__result.second))
2362227825Stheraven                          __result.second = __first;
2363227825Stheraven                  }
2364227825Stheraven              }
2365227825Stheraven          }
2366227825Stheraven      }
2367227825Stheraven  }
2368227825Stheraven  return __result;
2369227825Stheraven}
2370227825Stheraven
2371227825Stheraventemplate <class _ForwardIterator>
2372227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2373227825Stheravenstd::pair<_ForwardIterator, _ForwardIterator>
2374227825Stheravenminmax_element(_ForwardIterator __first, _ForwardIterator __last)
2375227825Stheraven{
2376227825Stheraven    return _VSTD::minmax_element(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
2377227825Stheraven}
2378227825Stheraven
2379227825Stheraven// minmax
2380227825Stheraven
2381227825Stheraventemplate<class _Tp, class _Compare>
2382227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2383227825Stheravenpair<const _Tp&, const _Tp&>
2384227825Stheravenminmax(const _Tp& __a, const _Tp& __b, _Compare __comp)
2385227825Stheraven{
2386227825Stheraven    return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) :
2387227825Stheraven                              pair<const _Tp&, const _Tp&>(__a, __b);
2388227825Stheraven}
2389227825Stheraven
2390227825Stheraventemplate<class _Tp>
2391227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2392227825Stheravenpair<const _Tp&, const _Tp&>
2393227825Stheravenminmax(const _Tp& __a, const _Tp& __b)
2394227825Stheraven{
2395227825Stheraven    return _VSTD::minmax(__a, __b, __less<_Tp>());
2396227825Stheraven}
2397227825Stheraven
2398227825Stheraven#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2399227825Stheraven
2400227825Stheraventemplate<class _Tp>
2401227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2402227825Stheravenpair<_Tp, _Tp>
2403227825Stheravenminmax(initializer_list<_Tp> __t)
2404227825Stheraven{
2405227825Stheraven    pair<const _Tp*, const _Tp*> __p =
2406227825Stheraven                                   _VSTD::minmax_element(__t.begin(), __t.end());
2407227825Stheraven    return pair<_Tp, _Tp>(*__p.first, *__p.second);
2408227825Stheraven}
2409227825Stheraven
2410227825Stheraventemplate<class _Tp, class _Compare>
2411227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2412227825Stheravenpair<_Tp, _Tp>
2413227825Stheravenminmax(initializer_list<_Tp> __t, _Compare __comp)
2414227825Stheraven{
2415227825Stheraven    pair<const _Tp*, const _Tp*> __p =
2416227825Stheraven                           _VSTD::minmax_element(__t.begin(), __t.end(), __comp);
2417227825Stheraven    return pair<_Tp, _Tp>(*__p.first, *__p.second);
2418227825Stheraven}
2419227825Stheraven
2420227825Stheraven#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2421227825Stheraven
2422227825Stheraven// random_shuffle
2423227825Stheraven
2424227825Stheraven// __independent_bits_engine
2425227825Stheraven
2426227825Stheraventemplate <unsigned long long _X, size_t _R>
2427227825Stheravenstruct __log2_imp
2428227825Stheraven{
2429227825Stheraven    static const size_t value = _X & ((unsigned long long)(1) << _R) ? _R
2430227825Stheraven                                           : __log2_imp<_X, _R - 1>::value;
2431227825Stheraven};
2432227825Stheraven
2433227825Stheraventemplate <unsigned long long _X>
2434227825Stheravenstruct __log2_imp<_X, 0>
2435227825Stheraven{
2436227825Stheraven    static const size_t value = 0;
2437227825Stheraven};
2438227825Stheraven
2439227825Stheraventemplate <size_t _R>
2440227825Stheravenstruct __log2_imp<0, _R>
2441227825Stheraven{
2442227825Stheraven    static const size_t value = _R + 1;
2443227825Stheraven};
2444227825Stheraven
2445227825Stheraventemplate <class _UI, _UI _X>
2446227825Stheravenstruct __log2
2447227825Stheraven{
2448227825Stheraven    static const size_t value = __log2_imp<_X,
2449227825Stheraven                                         sizeof(_UI) * __CHAR_BIT__ - 1>::value;
2450227825Stheraven};
2451227825Stheraven
2452227825Stheraventemplate<class _Engine, class _UIntType>
2453227825Stheravenclass __independent_bits_engine
2454227825Stheraven{
2455227825Stheravenpublic:
2456227825Stheraven    // types
2457227825Stheraven    typedef _UIntType result_type;
2458227825Stheraven
2459227825Stheravenprivate:
2460227825Stheraven    typedef typename _Engine::result_type _Engine_result_type;
2461227825Stheraven    typedef typename conditional
2462227825Stheraven        <
2463227825Stheraven            sizeof(_Engine_result_type) <= sizeof(result_type),
2464227825Stheraven                result_type,
2465227825Stheraven                _Engine_result_type
2466227825Stheraven        >::type _Working_result_type;
2467227825Stheraven
2468227825Stheraven    _Engine& __e_;
2469227825Stheraven    size_t __w_;
2470227825Stheraven    size_t __w0_;
2471227825Stheraven    size_t __n_;
2472227825Stheraven    size_t __n0_;
2473227825Stheraven    _Working_result_type __y0_;
2474227825Stheraven    _Working_result_type __y1_;
2475227825Stheraven    _Engine_result_type __mask0_;
2476227825Stheraven    _Engine_result_type __mask1_;
2477227825Stheraven
2478227825Stheraven    static const _Working_result_type _R = _Engine::_Max - _Engine::_Min
2479227825Stheraven                                                         + _Working_result_type(1);
2480227825Stheraven    static const size_t __m = __log2<_Working_result_type, _R>::value;
2481227825Stheraven    static const size_t _WDt = numeric_limits<_Working_result_type>::digits;
2482227825Stheraven    static const size_t _EDt = numeric_limits<_Engine_result_type>::digits;
2483227825Stheraven
2484227825Stheravenpublic:
2485227825Stheraven    // constructors and seeding functions
2486227825Stheraven    __independent_bits_engine(_Engine& __e, size_t __w);
2487227825Stheraven
2488227825Stheraven    // generating functions
2489227825Stheraven    result_type operator()() {return __eval(integral_constant<bool, _R != 0>());}
2490227825Stheraven
2491227825Stheravenprivate:
2492227825Stheraven    result_type __eval(false_type);
2493227825Stheraven    result_type __eval(true_type);
2494227825Stheraven};
2495227825Stheraven
2496227825Stheraventemplate<class _Engine, class _UIntType>
2497227825Stheraven__independent_bits_engine<_Engine, _UIntType>
2498227825Stheraven    ::__independent_bits_engine(_Engine& __e, size_t __w)
2499227825Stheraven        : __e_(__e),
2500227825Stheraven          __w_(__w)
2501227825Stheraven{
2502227825Stheraven    __n_ = __w_ / __m + (__w_ % __m != 0);
2503227825Stheraven    __w0_ = __w_ / __n_;
2504227825Stheraven    if (_R == 0)
2505227825Stheraven        __y0_ = _R;
2506227825Stheraven    else if (__w0_ < _WDt)
2507227825Stheraven        __y0_ = (_R >> __w0_) << __w0_;
2508227825Stheraven    else
2509227825Stheraven        __y0_ = 0;
2510227825Stheraven    if (_R - __y0_ > __y0_ / __n_)
2511227825Stheraven    {
2512227825Stheraven        ++__n_;
2513227825Stheraven        __w0_ = __w_ / __n_;
2514227825Stheraven        if (__w0_ < _WDt)
2515227825Stheraven            __y0_ = (_R >> __w0_) << __w0_;
2516227825Stheraven        else
2517227825Stheraven            __y0_ = 0;
2518227825Stheraven    }
2519227825Stheraven    __n0_ = __n_ - __w_ % __n_;
2520227825Stheraven    if (__w0_ < _WDt - 1)
2521227825Stheraven        __y1_ = (_R >> (__w0_ + 1)) << (__w0_ + 1);
2522227825Stheraven    else
2523227825Stheraven        __y1_ = 0;
2524227825Stheraven    __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) :
2525227825Stheraven                          _Engine_result_type(0);
2526227825Stheraven    __mask1_ = __w0_ < _EDt - 1 ?
2527227825Stheraven                               _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) :
2528227825Stheraven                               _Engine_result_type(~0);
2529227825Stheraven}
2530227825Stheraven
2531227825Stheraventemplate<class _Engine, class _UIntType>
2532227825Stheraveninline
2533227825Stheraven_UIntType
2534227825Stheraven__independent_bits_engine<_Engine, _UIntType>::__eval(false_type)
2535227825Stheraven{
2536227825Stheraven    return static_cast<result_type>(__e_() & __mask0_);
2537227825Stheraven}
2538227825Stheraven
2539227825Stheraventemplate<class _Engine, class _UIntType>
2540227825Stheraven_UIntType
2541227825Stheraven__independent_bits_engine<_Engine, _UIntType>::__eval(true_type)
2542227825Stheraven{
2543227825Stheraven    result_type _S = 0;
2544227825Stheraven    for (size_t __k = 0; __k < __n0_; ++__k)
2545227825Stheraven    {
2546227825Stheraven        _Engine_result_type __u;
2547227825Stheraven        do
2548227825Stheraven        {
2549227825Stheraven            __u = __e_() - _Engine::min();
2550227825Stheraven        } while (__u >= __y0_);
2551227825Stheraven        if (__w0_ < _WDt)
2552227825Stheraven            _S <<= __w0_;
2553227825Stheraven        else
2554227825Stheraven            _S = 0;
2555227825Stheraven        _S += __u & __mask0_;
2556227825Stheraven    }
2557227825Stheraven    for (size_t __k = __n0_; __k < __n_; ++__k)
2558227825Stheraven    {
2559227825Stheraven        _Engine_result_type __u;
2560227825Stheraven        do
2561227825Stheraven        {
2562227825Stheraven            __u = __e_() - _Engine::min();
2563227825Stheraven        } while (__u >= __y1_);
2564227825Stheraven        if (__w0_ < _WDt - 1)
2565227825Stheraven            _S <<= __w0_ + 1;
2566227825Stheraven        else
2567227825Stheraven            _S = 0;
2568227825Stheraven        _S += __u & __mask1_;
2569227825Stheraven    }
2570227825Stheraven    return _S;
2571227825Stheraven}
2572227825Stheraven
2573227825Stheraven// uniform_int_distribution
2574227825Stheraven
2575227825Stheraventemplate<class _IntType = int>
2576227825Stheravenclass uniform_int_distribution
2577227825Stheraven{
2578227825Stheravenpublic:
2579227825Stheraven    // types
2580227825Stheraven    typedef _IntType result_type;
2581227825Stheraven
2582227825Stheraven    class param_type
2583227825Stheraven    {
2584227825Stheraven        result_type __a_;
2585227825Stheraven        result_type __b_;
2586227825Stheraven    public:
2587227825Stheraven        typedef uniform_int_distribution distribution_type;
2588227825Stheraven
2589227825Stheraven        explicit param_type(result_type __a = 0,
2590227825Stheraven                            result_type __b = numeric_limits<result_type>::max())
2591227825Stheraven            : __a_(__a), __b_(__b) {}
2592227825Stheraven
2593227825Stheraven        result_type a() const {return __a_;}
2594227825Stheraven        result_type b() const {return __b_;}
2595227825Stheraven
2596227825Stheraven        friend bool operator==(const param_type& __x, const param_type& __y)
2597227825Stheraven            {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;}
2598227825Stheraven        friend bool operator!=(const param_type& __x, const param_type& __y)
2599227825Stheraven            {return !(__x == __y);}
2600227825Stheraven    };
2601227825Stheraven
2602227825Stheravenprivate:
2603227825Stheraven    param_type __p_;
2604227825Stheraven
2605227825Stheravenpublic:
2606227825Stheraven    // constructors and reset functions
2607227825Stheraven    explicit uniform_int_distribution(result_type __a = 0,
2608227825Stheraven                                      result_type __b = numeric_limits<result_type>::max())
2609227825Stheraven        : __p_(param_type(__a, __b)) {}
2610227825Stheraven    explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {}
2611227825Stheraven    void reset() {}
2612227825Stheraven
2613227825Stheraven    // generating functions
2614227825Stheraven    template<class _URNG> result_type operator()(_URNG& __g)
2615227825Stheraven        {return (*this)(__g, __p_);}
2616227825Stheraven    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p);
2617227825Stheraven
2618227825Stheraven    // property functions
2619227825Stheraven    result_type a() const {return __p_.a();}
2620227825Stheraven    result_type b() const {return __p_.b();}
2621227825Stheraven
2622227825Stheraven    param_type param() const {return __p_;}
2623227825Stheraven    void param(const param_type& __p) {__p_ = __p;}
2624227825Stheraven
2625227825Stheraven    result_type min() const {return a();}
2626227825Stheraven    result_type max() const {return b();}
2627227825Stheraven
2628227825Stheraven    friend bool operator==(const uniform_int_distribution& __x,
2629227825Stheraven                           const uniform_int_distribution& __y)
2630227825Stheraven        {return __x.__p_ == __y.__p_;}
2631227825Stheraven    friend bool operator!=(const uniform_int_distribution& __x,
2632227825Stheraven                           const uniform_int_distribution& __y)
2633227825Stheraven            {return !(__x == __y);}
2634227825Stheraven};
2635227825Stheraven
2636227825Stheraventemplate<class _IntType>
2637227825Stheraventemplate<class _URNG>
2638227825Stheraventypename uniform_int_distribution<_IntType>::result_type
2639227825Stheravenuniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)
2640227825Stheraven{
2641227825Stheraven    typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t),
2642227825Stheraven                                            uint32_t, uint64_t>::type _UIntType;
2643227825Stheraven    const _UIntType _R = __p.b() - __p.a() + _UIntType(1);
2644227825Stheraven    if (_R == 1)
2645227825Stheraven        return __p.a();
2646227825Stheraven    const size_t _Dt = numeric_limits<_UIntType>::digits;
2647227825Stheraven    typedef __independent_bits_engine<_URNG, _UIntType> _Eng;
2648227825Stheraven    if (_R == 0)
2649227825Stheraven        return static_cast<result_type>(_Eng(__g, _Dt)());
2650227825Stheraven    size_t __w = _Dt - __clz(_R) - 1;
2651227825Stheraven    if ((_R & (_UIntType(~0) >> (_Dt - __w))) != 0)
2652227825Stheraven        ++__w;
2653227825Stheraven    _Eng __e(__g, __w);
2654227825Stheraven    _UIntType __u;
2655227825Stheraven    do
2656227825Stheraven    {
2657227825Stheraven        __u = __e();
2658227825Stheraven    } while (__u >= _R);
2659227825Stheraven    return static_cast<result_type>(__u + __p.a());
2660227825Stheraven}
2661227825Stheraven
2662227825Stheravenclass __rs_default;
2663227825Stheraven
2664227825Stheraven__rs_default __rs_get();
2665227825Stheraven
2666227825Stheravenclass __rs_default
2667227825Stheraven{
2668227825Stheraven    static unsigned __c_;
2669227825Stheraven
2670227825Stheraven    __rs_default();
2671227825Stheravenpublic:
2672227825Stheraven    typedef unsigned result_type;
2673227825Stheraven
2674227825Stheraven    static const result_type _Min = 0;
2675227825Stheraven    static const result_type _Max = 0xFFFFFFFF;
2676227825Stheraven
2677227825Stheraven    __rs_default(const __rs_default&);
2678227825Stheraven    ~__rs_default();
2679227825Stheraven
2680227825Stheraven    result_type operator()();
2681227825Stheraven
2682227825Stheraven    static const/*expr*/ result_type min() {return _Min;}
2683227825Stheraven    static const/*expr*/ result_type max() {return _Max;}
2684227825Stheraven
2685227825Stheraven    friend __rs_default __rs_get();
2686227825Stheraven};
2687227825Stheraven
2688227825Stheraven__rs_default __rs_get();
2689227825Stheraven
2690227825Stheraventemplate <class _RandomAccessIterator>
2691227825Stheravenvoid
2692227825Stheravenrandom_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
2693227825Stheraven{
2694227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2695227825Stheraven    typedef uniform_int_distribution<ptrdiff_t> _D;
2696227825Stheraven    typedef typename _D::param_type _P;
2697227825Stheraven    difference_type __d = __last - __first;
2698227825Stheraven    if (__d > 1)
2699227825Stheraven    {
2700227825Stheraven        _D __uid;
2701227825Stheraven        __rs_default __g = __rs_get();
2702227825Stheraven        for (--__last, --__d; __first < __last; ++__first, --__d)
2703227825Stheraven        {
2704227825Stheraven            difference_type __i = __uid(__g, _P(0, __d));
2705227825Stheraven            if (__i != difference_type(0))
2706227825Stheraven                swap(*__first, *(__first + __i));
2707227825Stheraven        }
2708227825Stheraven    }
2709227825Stheraven}
2710227825Stheraven
2711227825Stheraventemplate <class _RandomAccessIterator, class _RandomNumberGenerator>
2712227825Stheravenvoid
2713227825Stheravenrandom_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
2714227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2715227825Stheraven               _RandomNumberGenerator&& __rand)
2716227825Stheraven#else
2717227825Stheraven               _RandomNumberGenerator& __rand)
2718227825Stheraven#endif
2719227825Stheraven{
2720227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2721227825Stheraven    difference_type __d = __last - __first;
2722227825Stheraven    if (__d > 1)
2723227825Stheraven    {
2724227825Stheraven        for (--__last; __first < __last; ++__first, --__d)
2725227825Stheraven        {
2726227825Stheraven            difference_type __i = __rand(__d);
2727227825Stheraven            swap(*__first, *(__first + __i));
2728227825Stheraven        }
2729227825Stheraven    }
2730227825Stheraven}
2731227825Stheraven
2732227825Stheraventemplate<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
2733227825Stheraven    void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
2734227825Stheraven#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2735227825Stheraven                 _UniformRandomNumberGenerator&& __g)
2736227825Stheraven#else
2737227825Stheraven                 _UniformRandomNumberGenerator& __g)
2738227825Stheraven#endif
2739227825Stheraven{
2740227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
2741227825Stheraven    typedef uniform_int_distribution<ptrdiff_t> _D;
2742227825Stheraven    typedef typename _D::param_type _P;
2743227825Stheraven    difference_type __d = __last - __first;
2744227825Stheraven    if (__d > 1)
2745227825Stheraven    {
2746227825Stheraven        _D __uid;
2747227825Stheraven        for (--__last, --__d; __first < __last; ++__first, --__d)
2748227825Stheraven        {
2749227825Stheraven            difference_type __i = __uid(__g, _P(0, __d));
2750227825Stheraven            if (__i != difference_type(0))
2751227825Stheraven                swap(*__first, *(__first + __i));
2752227825Stheraven        }
2753227825Stheraven    }
2754227825Stheraven}
2755227825Stheraven
2756227825Stheraventemplate <class _InputIterator, class _Predicate>
2757227825Stheravenbool
2758227825Stheravenis_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
2759227825Stheraven{
2760227825Stheraven    for (; __first != __last; ++__first)
2761227825Stheraven        if (!__pred(*__first))
2762227825Stheraven            break;
2763227825Stheraven    for (; __first != __last; ++__first)
2764227825Stheraven        if (__pred(*__first))
2765227825Stheraven            return false;
2766227825Stheraven    return true;
2767227825Stheraven}
2768227825Stheraven
2769227825Stheraven// partition
2770227825Stheraven
2771227825Stheraventemplate <class _Predicate, class _ForwardIterator>
2772227825Stheraven_ForwardIterator
2773227825Stheraven__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
2774227825Stheraven{
2775227825Stheraven    while (true)
2776227825Stheraven    {
2777227825Stheraven        if (__first == __last)
2778227825Stheraven            return __first;
2779227825Stheraven        if (!__pred(*__first))
2780227825Stheraven            break;
2781227825Stheraven        ++__first;
2782227825Stheraven    }
2783227825Stheraven    for (_ForwardIterator __p = __first; ++__p != __last;)
2784227825Stheraven    {
2785227825Stheraven        if (__pred(*__p))
2786227825Stheraven        {
2787227825Stheraven            swap(*__first, *__p);
2788227825Stheraven            ++__first;
2789227825Stheraven        }
2790227825Stheraven    }
2791227825Stheraven    return __first;
2792227825Stheraven}
2793227825Stheraven
2794227825Stheraventemplate <class _Predicate, class _BidirectionalIterator>
2795227825Stheraven_BidirectionalIterator
2796227825Stheraven__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
2797227825Stheraven            bidirectional_iterator_tag)
2798227825Stheraven{
2799227825Stheraven    while (true)
2800227825Stheraven    {
2801227825Stheraven        while (true)
2802227825Stheraven        {
2803227825Stheraven            if (__first == __last)
2804227825Stheraven                return __first;
2805227825Stheraven            if (!__pred(*__first))
2806227825Stheraven                break;
2807227825Stheraven            ++__first;
2808227825Stheraven        }
2809227825Stheraven        do
2810227825Stheraven        {
2811227825Stheraven            if (__first == --__last)
2812227825Stheraven                return __first;
2813227825Stheraven        } while (!__pred(*__last));
2814227825Stheraven        swap(*__first, *__last);
2815227825Stheraven        ++__first;
2816227825Stheraven    }
2817227825Stheraven}
2818227825Stheraven
2819227825Stheraventemplate <class _ForwardIterator, class _Predicate>
2820227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
2821227825Stheraven_ForwardIterator
2822227825Stheravenpartition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2823227825Stheraven{
2824227825Stheraven    return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type>
2825227825Stheraven                            (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
2826227825Stheraven}
2827227825Stheraven
2828227825Stheraven// partition_copy
2829227825Stheraven
2830227825Stheraventemplate <class _InputIterator, class _OutputIterator1,
2831227825Stheraven          class _OutputIterator2, class _Predicate>
2832227825Stheravenpair<_OutputIterator1, _OutputIterator2>
2833227825Stheravenpartition_copy(_InputIterator __first, _InputIterator __last,
2834227825Stheraven               _OutputIterator1 __out_true, _OutputIterator2 __out_false,
2835227825Stheraven               _Predicate __pred)
2836227825Stheraven{
2837227825Stheraven    for (; __first != __last; ++__first)
2838227825Stheraven    {
2839227825Stheraven        if (__pred(*__first))
2840227825Stheraven        {
2841227825Stheraven            *__out_true = *__first;
2842227825Stheraven            ++__out_true;
2843227825Stheraven        }
2844227825Stheraven        else
2845227825Stheraven        {
2846227825Stheraven            *__out_false = *__first;
2847227825Stheraven            ++__out_false;
2848227825Stheraven        }
2849227825Stheraven    }
2850227825Stheraven    return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
2851227825Stheraven}
2852227825Stheraven
2853227825Stheraven// partition_point
2854227825Stheraven
2855227825Stheraventemplate<class _ForwardIterator, class _Predicate>
2856227825Stheraven_ForwardIterator
2857227825Stheravenpartition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
2858227825Stheraven{
2859227825Stheraven    typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
2860227825Stheraven    difference_type __len = _VSTD::distance(__first, __last);
2861227825Stheraven    while (__len != 0)
2862227825Stheraven    {
2863227825Stheraven        difference_type __l2 = __len / 2;
2864227825Stheraven        _ForwardIterator __m = __first;
2865227825Stheraven        _VSTD::advance(__m, __l2);
2866227825Stheraven        if (__pred(*__m))
2867227825Stheraven        {
2868227825Stheraven            __first = ++__m;
2869227825Stheraven            __len -= __l2 + 1;
2870227825Stheraven        }
2871227825Stheraven        else
2872227825Stheraven            __len = __l2;
2873227825Stheraven    }
2874227825Stheraven    return __first;
2875227825Stheraven}
2876227825Stheraven
2877227825Stheraven// stable_partition
2878227825Stheraven
2879227825Stheraventemplate <class _Predicate, class _ForwardIterator, class _Distance, class _Pair>
2880227825Stheraven_ForwardIterator
2881227825Stheraven__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
2882227825Stheraven                   _Distance __len, _Pair __p, forward_iterator_tag __fit)
2883227825Stheraven{
2884227825Stheraven    // *__first is known to be false
2885227825Stheraven    // __len >= 1
2886227825Stheraven    if (__len == 1)
2887227825Stheraven        return __first;
2888227825Stheraven    if (__len == 2)
2889227825Stheraven    {
2890227825Stheraven        _ForwardIterator __m = __first;
2891227825Stheraven        if (__pred(*++__m))
2892227825Stheraven        {
2893227825Stheraven            swap(*__first, *__m);
2894227825Stheraven            return __m;
2895227825Stheraven        }
2896227825Stheraven        return __first;
2897227825Stheraven    }
2898227825Stheraven    if (__len <= __p.second)
2899227825Stheraven    {   // The buffer is big enough to use
2900227825Stheraven        typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2901227825Stheraven        __destruct_n __d(0);
2902227825Stheraven        unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
2903227825Stheraven        // Move the falses into the temporary buffer, and the trues to the front of the line
2904227825Stheraven        // Update __first to always point to the end of the trues
2905227825Stheraven        value_type* __t = __p.first;
2906227825Stheraven        ::new(__t) value_type(_VSTD::move(*__first));
2907227825Stheraven        __d.__incr((value_type*)0);
2908227825Stheraven        ++__t;
2909227825Stheraven        _ForwardIterator __i = __first;
2910227825Stheraven        while (++__i != __last)
2911227825Stheraven        {
2912227825Stheraven            if (__pred(*__i))
2913227825Stheraven            {
2914227825Stheraven                *__first = _VSTD::move(*__i);
2915227825Stheraven                ++__first;
2916227825Stheraven            }
2917227825Stheraven            else
2918227825Stheraven            {
2919227825Stheraven                ::new(__t) value_type(_VSTD::move(*__i));
2920227825Stheraven                __d.__incr((value_type*)0);
2921227825Stheraven                ++__t;
2922227825Stheraven            }
2923227825Stheraven        }
2924227825Stheraven        // All trues now at start of range, all falses in buffer
2925227825Stheraven        // Move falses back into range, but don't mess up __first which points to first false
2926227825Stheraven        __i = __first;
2927227825Stheraven        for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
2928227825Stheraven            *__i = _VSTD::move(*__t2);
2929227825Stheraven        // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
2930227825Stheraven        return __first;
2931227825Stheraven    }
2932227825Stheraven    // Else not enough buffer, do in place
2933227825Stheraven    // __len >= 3
2934227825Stheraven    _ForwardIterator __m = __first;
2935227825Stheraven    _Distance __len2 = __len / 2;  // __len2 >= 2
2936227825Stheraven    _VSTD::advance(__m, __len2);
2937227825Stheraven    // recurse on [__first, __m), *__first know to be false
2938227825Stheraven    // F?????????????????
2939227825Stheraven    // f       m         l
2940227825Stheraven    typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
2941227825Stheraven    _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit);
2942227825Stheraven    // TTTFFFFF??????????
2943227825Stheraven    // f  ff   m         l
2944227825Stheraven    // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
2945227825Stheraven    _ForwardIterator __m1 = __m;
2946227825Stheraven    _ForwardIterator __second_false = __last;
2947227825Stheraven    _Distance __len_half = __len - __len2;
2948227825Stheraven    while (__pred(*__m1))
2949227825Stheraven    {
2950227825Stheraven        if (++__m1 == __last)
2951227825Stheraven            goto __second_half_done;
2952227825Stheraven        --__len_half;
2953227825Stheraven    }
2954227825Stheraven    // TTTFFFFFTTTF??????
2955227825Stheraven    // f  ff   m  m1     l
2956227825Stheraven    __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit);
2957227825Stheraven__second_half_done:
2958227825Stheraven    // TTTFFFFFTTTTTFFFFF
2959227825Stheraven    // f  ff   m    sf   l
2960227825Stheraven    return _VSTD::rotate(__first_false, __m, __second_false);
2961227825Stheraven    // TTTTTTTTFFFFFFFFFF
2962227825Stheraven    //         |
2963227825Stheraven}
2964227825Stheraven
2965227825Stheravenstruct __return_temporary_buffer
2966227825Stheraven{
2967227825Stheraven    template <class _Tp>
2968227825Stheraven    _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);}
2969227825Stheraven};
2970227825Stheraven
2971227825Stheraventemplate <class _Predicate, class _ForwardIterator>
2972227825Stheraven_ForwardIterator
2973227825Stheraven__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred,
2974227825Stheraven                   forward_iterator_tag)
2975227825Stheraven{
2976227825Stheraven    const unsigned __alloc_limit = 3;  // might want to make this a function of trivial assignment
2977227825Stheraven    // Either prove all true and return __first or point to first false
2978227825Stheraven    while (true)
2979227825Stheraven    {
2980227825Stheraven        if (__first == __last)
2981227825Stheraven            return __first;
2982227825Stheraven        if (!__pred(*__first))
2983227825Stheraven            break;
2984227825Stheraven        ++__first;
2985227825Stheraven    }
2986227825Stheraven    // We now have a reduced range [__first, __last)
2987227825Stheraven    // *__first is known to be false
2988227825Stheraven    typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
2989227825Stheraven    typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
2990227825Stheraven    difference_type __len = _VSTD::distance(__first, __last);
2991227825Stheraven    pair<value_type*, ptrdiff_t> __p(0, 0);
2992227825Stheraven    unique_ptr<value_type, __return_temporary_buffer> __h;
2993227825Stheraven    if (__len >= __alloc_limit)
2994227825Stheraven    {
2995227825Stheraven        __p = _VSTD::get_temporary_buffer<value_type>(__len);
2996227825Stheraven        __h.reset(__p.first);
2997227825Stheraven    }
2998227825Stheraven    return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
2999227825Stheraven                             (__first, __last, __pred, __len, __p, forward_iterator_tag());
3000227825Stheraven}
3001227825Stheraven
3002227825Stheraventemplate <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair>
3003227825Stheraven_BidirectionalIterator
3004227825Stheraven__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3005227825Stheraven                   _Distance __len, _Pair __p, bidirectional_iterator_tag __bit)
3006227825Stheraven{
3007227825Stheraven    // *__first is known to be false
3008227825Stheraven    // *__last is known to be true
3009227825Stheraven    // __len >= 2
3010227825Stheraven    if (__len == 2)
3011227825Stheraven    {
3012227825Stheraven        swap(*__first, *__last);
3013227825Stheraven        return __last;
3014227825Stheraven    }
3015227825Stheraven    if (__len == 3)
3016227825Stheraven    {
3017227825Stheraven        _BidirectionalIterator __m = __first;
3018227825Stheraven        if (__pred(*++__m))
3019227825Stheraven        {
3020227825Stheraven            swap(*__first, *__m);
3021227825Stheraven            swap(*__m, *__last);
3022227825Stheraven            return __last;
3023227825Stheraven        }
3024227825Stheraven        swap(*__m, *__last);
3025227825Stheraven        swap(*__first, *__m);
3026227825Stheraven        return __m;
3027227825Stheraven    }
3028227825Stheraven    if (__len <= __p.second)
3029227825Stheraven    {   // The buffer is big enough to use
3030227825Stheraven        typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3031227825Stheraven        __destruct_n __d(0);
3032227825Stheraven        unique_ptr<value_type, __destruct_n&> __h(__p.first, __d);
3033227825Stheraven        // Move the falses into the temporary buffer, and the trues to the front of the line
3034227825Stheraven        // Update __first to always point to the end of the trues
3035227825Stheraven        value_type* __t = __p.first;
3036227825Stheraven        ::new(__t) value_type(_VSTD::move(*__first));
3037227825Stheraven        __d.__incr((value_type*)0);
3038227825Stheraven        ++__t;
3039227825Stheraven        _BidirectionalIterator __i = __first;
3040227825Stheraven        while (++__i != __last)
3041227825Stheraven        {
3042227825Stheraven            if (__pred(*__i))
3043227825Stheraven            {
3044227825Stheraven                *__first = _VSTD::move(*__i);
3045227825Stheraven                ++__first;
3046227825Stheraven            }
3047227825Stheraven            else
3048227825Stheraven            {
3049227825Stheraven                ::new(__t) value_type(_VSTD::move(*__i));
3050227825Stheraven                __d.__incr((value_type*)0);
3051227825Stheraven                ++__t;
3052227825Stheraven            }
3053227825Stheraven        }
3054227825Stheraven        // move *__last, known to be true
3055227825Stheraven        *__first = _VSTD::move(*__i);
3056227825Stheraven        __i = ++__first;
3057227825Stheraven        // All trues now at start of range, all falses in buffer
3058227825Stheraven        // Move falses back into range, but don't mess up __first which points to first false
3059227825Stheraven        for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i)
3060227825Stheraven            *__i = _VSTD::move(*__t2);
3061227825Stheraven        // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer
3062227825Stheraven        return __first;
3063227825Stheraven    }
3064227825Stheraven    // Else not enough buffer, do in place
3065227825Stheraven    // __len >= 4
3066227825Stheraven    _BidirectionalIterator __m = __first;
3067227825Stheraven    _Distance __len2 = __len / 2;  // __len2 >= 2
3068227825Stheraven    _VSTD::advance(__m, __len2);
3069227825Stheraven    // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false
3070227825Stheraven    // F????????????????T
3071227825Stheraven    // f       m        l
3072227825Stheraven    _BidirectionalIterator __m1 = __m;
3073227825Stheraven    _BidirectionalIterator __first_false = __first;
3074227825Stheraven    _Distance __len_half = __len2;
3075227825Stheraven    while (!__pred(*--__m1))
3076227825Stheraven    {
3077227825Stheraven        if (__m1 == __first)
3078227825Stheraven            goto __first_half_done;
3079227825Stheraven        --__len_half;
3080227825Stheraven    }
3081227825Stheraven    // F???TFFF?????????T
3082227825Stheraven    // f   m1  m        l
3083227825Stheraven    typedef typename add_lvalue_reference<_Predicate>::type _PredRef;
3084227825Stheraven    __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit);
3085227825Stheraven__first_half_done:
3086227825Stheraven    // TTTFFFFF?????????T
3087227825Stheraven    // f  ff   m        l
3088227825Stheraven    // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true
3089227825Stheraven    __m1 = __m;
3090227825Stheraven    _BidirectionalIterator __second_false = __last;
3091227825Stheraven    ++__second_false;
3092227825Stheraven    __len_half = __len - __len2;
3093227825Stheraven    while (__pred(*__m1))
3094227825Stheraven    {
3095227825Stheraven        if (++__m1 == __last)
3096227825Stheraven            goto __second_half_done;
3097227825Stheraven        --__len_half;
3098227825Stheraven    }
3099227825Stheraven    // TTTFFFFFTTTF?????T
3100227825Stheraven    // f  ff   m  m1    l
3101227825Stheraven    __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit);
3102227825Stheraven__second_half_done:
3103227825Stheraven    // TTTFFFFFTTTTTFFFFF
3104227825Stheraven    // f  ff   m    sf  l
3105227825Stheraven    return _VSTD::rotate(__first_false, __m, __second_false);
3106227825Stheraven    // TTTTTTTTFFFFFFFFFF
3107227825Stheraven    //         |
3108227825Stheraven}
3109227825Stheraven
3110227825Stheraventemplate <class _Predicate, class _BidirectionalIterator>
3111227825Stheraven_BidirectionalIterator
3112227825Stheraven__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
3113227825Stheraven                   bidirectional_iterator_tag)
3114227825Stheraven{
3115227825Stheraven    typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3116227825Stheraven    typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3117227825Stheraven    const difference_type __alloc_limit = 4;  // might want to make this a function of trivial assignment
3118227825Stheraven    // Either prove all true and return __first or point to first false
3119227825Stheraven    while (true)
3120227825Stheraven    {
3121227825Stheraven        if (__first == __last)
3122227825Stheraven            return __first;
3123227825Stheraven        if (!__pred(*__first))
3124227825Stheraven            break;
3125227825Stheraven        ++__first;
3126227825Stheraven    }
3127227825Stheraven    // __first points to first false, everything prior to __first is already set.
3128227825Stheraven    // Either prove [__first, __last) is all false and return __first, or point __last to last true
3129227825Stheraven    do
3130227825Stheraven    {
3131227825Stheraven        if (__first == --__last)
3132227825Stheraven            return __first;
3133227825Stheraven    } while (!__pred(*__last));
3134227825Stheraven    // We now have a reduced range [__first, __last]
3135227825Stheraven    // *__first is known to be false
3136227825Stheraven    // *__last is known to be true
3137227825Stheraven    // __len >= 2
3138227825Stheraven    difference_type __len = _VSTD::distance(__first, __last) + 1;
3139227825Stheraven    pair<value_type*, ptrdiff_t> __p(0, 0);
3140227825Stheraven    unique_ptr<value_type, __return_temporary_buffer> __h;
3141227825Stheraven    if (__len >= __alloc_limit)
3142227825Stheraven    {
3143227825Stheraven        __p = _VSTD::get_temporary_buffer<value_type>(__len);
3144227825Stheraven        __h.reset(__p.first);
3145227825Stheraven    }
3146227825Stheraven    return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3147227825Stheraven                             (__first, __last, __pred, __len, __p, bidirectional_iterator_tag());
3148227825Stheraven}
3149227825Stheraven
3150227825Stheraventemplate <class _ForwardIterator, class _Predicate>
3151227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3152227825Stheraven_ForwardIterator
3153227825Stheravenstable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
3154227825Stheraven{
3155227825Stheraven    return __stable_partition<typename add_lvalue_reference<_Predicate>::type>
3156227825Stheraven                             (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category());
3157227825Stheraven}
3158227825Stheraven
3159227825Stheraven// is_sorted_until
3160227825Stheraven
3161227825Stheraventemplate <class _ForwardIterator, class _Compare>
3162227825Stheraven_ForwardIterator
3163227825Stheravenis_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3164227825Stheraven{
3165227825Stheraven    if (__first != __last)
3166227825Stheraven    {
3167227825Stheraven        _ForwardIterator __i = __first;
3168227825Stheraven        while (++__i != __last)
3169227825Stheraven        {
3170227825Stheraven            if (__comp(*__i, *__first))
3171227825Stheraven                return __i;
3172227825Stheraven            __first = __i;
3173227825Stheraven        }
3174227825Stheraven    }
3175227825Stheraven    return __last;
3176227825Stheraven}
3177227825Stheraven
3178227825Stheraventemplate<class _ForwardIterator>
3179227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3180227825Stheraven_ForwardIterator
3181227825Stheravenis_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3182227825Stheraven{
3183227825Stheraven    return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
3184227825Stheraven}
3185227825Stheraven
3186227825Stheraven// is_sorted
3187227825Stheraven
3188227825Stheraventemplate <class _ForwardIterator, class _Compare>
3189227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3190227825Stheravenbool
3191227825Stheravenis_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
3192227825Stheraven{
3193227825Stheraven    return _VSTD::is_sorted_until(__first, __last, __comp) == __last;
3194227825Stheraven}
3195227825Stheraven
3196227825Stheraventemplate<class _ForwardIterator>
3197227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3198227825Stheravenbool
3199227825Stheravenis_sorted(_ForwardIterator __first, _ForwardIterator __last)
3200227825Stheraven{
3201227825Stheraven    return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
3202227825Stheraven}
3203227825Stheraven
3204227825Stheraven// sort
3205227825Stheraven
3206227825Stheraven// stable, 2-3 compares, 0-2 swaps
3207227825Stheraven
3208227825Stheraventemplate <class _Compare, class _ForwardIterator>
3209227825Stheravenunsigned
3210227825Stheraven__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c)
3211227825Stheraven{
3212227825Stheraven    unsigned __r = 0;
3213227825Stheraven    if (!__c(*__y, *__x))          // if x <= y
3214227825Stheraven    {
3215227825Stheraven        if (!__c(*__z, *__y))      // if y <= z
3216227825Stheraven            return __r;            // x <= y && y <= z
3217227825Stheraven                                   // x <= y && y > z
3218227825Stheraven        swap(*__y, *__z);          // x <= z && y < z
3219227825Stheraven        __r = 1;
3220227825Stheraven        if (__c(*__y, *__x))       // if x > y
3221227825Stheraven        {
3222227825Stheraven            swap(*__x, *__y);      // x < y && y <= z
3223227825Stheraven            __r = 2;
3224227825Stheraven        }
3225227825Stheraven        return __r;                // x <= y && y < z
3226227825Stheraven    }
3227227825Stheraven    if (__c(*__z, *__y))           // x > y, if y > z
3228227825Stheraven    {
3229227825Stheraven        swap(*__x, *__z);          // x < y && y < z
3230227825Stheraven        __r = 1;
3231227825Stheraven        return __r;
3232227825Stheraven    }
3233227825Stheraven    swap(*__x, *__y);              // x > y && y <= z
3234227825Stheraven    __r = 1;                       // x < y && x <= z
3235227825Stheraven    if (__c(*__z, *__y))           // if y > z
3236227825Stheraven    {
3237227825Stheraven        swap(*__y, *__z);          // x <= y && y < z
3238227825Stheraven        __r = 2;
3239227825Stheraven    }
3240227825Stheraven    return __r;
3241227825Stheraven}                                  // x <= y && y <= z
3242227825Stheraven
3243227825Stheraven// stable, 3-6 compares, 0-5 swaps
3244227825Stheraven
3245227825Stheraventemplate <class _Compare, class _ForwardIterator>
3246227825Stheravenunsigned
3247227825Stheraven__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3248227825Stheraven            _ForwardIterator __x4, _Compare __c)
3249227825Stheraven{
3250227825Stheraven    unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c);
3251227825Stheraven    if (__c(*__x4, *__x3))
3252227825Stheraven    {
3253227825Stheraven        swap(*__x3, *__x4);
3254227825Stheraven        ++__r;
3255227825Stheraven        if (__c(*__x3, *__x2))
3256227825Stheraven        {
3257227825Stheraven            swap(*__x2, *__x3);
3258227825Stheraven            ++__r;
3259227825Stheraven            if (__c(*__x2, *__x1))
3260227825Stheraven            {
3261227825Stheraven                swap(*__x1, *__x2);
3262227825Stheraven                ++__r;
3263227825Stheraven            }
3264227825Stheraven        }
3265227825Stheraven    }
3266227825Stheraven    return __r;
3267227825Stheraven}
3268227825Stheraven
3269227825Stheraven// stable, 4-10 compares, 0-9 swaps
3270227825Stheraven
3271227825Stheraventemplate <class _Compare, class _ForwardIterator>
3272227825Stheravenunsigned
3273227825Stheraven__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3,
3274227825Stheraven            _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c)
3275227825Stheraven{
3276227825Stheraven    unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c);
3277227825Stheraven    if (__c(*__x5, *__x4))
3278227825Stheraven    {
3279227825Stheraven        swap(*__x4, *__x5);
3280227825Stheraven        ++__r;
3281227825Stheraven        if (__c(*__x4, *__x3))
3282227825Stheraven        {
3283227825Stheraven            swap(*__x3, *__x4);
3284227825Stheraven            ++__r;
3285227825Stheraven            if (__c(*__x3, *__x2))
3286227825Stheraven            {
3287227825Stheraven                swap(*__x2, *__x3);
3288227825Stheraven                ++__r;
3289227825Stheraven                if (__c(*__x2, *__x1))
3290227825Stheraven                {
3291227825Stheraven                    swap(*__x1, *__x2);
3292227825Stheraven                    ++__r;
3293227825Stheraven                }
3294227825Stheraven            }
3295227825Stheraven        }
3296227825Stheraven    }
3297227825Stheraven    return __r;
3298227825Stheraven}
3299227825Stheraven
3300227825Stheraven// Assumes size > 0
3301227825Stheraventemplate <class _Compare, class _BirdirectionalIterator>
3302227825Stheravenvoid
3303227825Stheraven__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3304227825Stheraven{
3305227825Stheraven    _BirdirectionalIterator __lm1 = __last;
3306227825Stheraven    for (--__lm1; __first != __lm1; ++__first)
3307227825Stheraven    {
3308227825Stheraven        _BirdirectionalIterator __i = _VSTD::min_element<_BirdirectionalIterator,
3309227825Stheraven                                                        typename add_lvalue_reference<_Compare>::type>
3310227825Stheraven                                                       (__first, __last, __comp);
3311227825Stheraven        if (__i != __first)
3312227825Stheraven            swap(*__first, *__i);
3313227825Stheraven    }
3314227825Stheraven}
3315227825Stheraven
3316227825Stheraventemplate <class _Compare, class _BirdirectionalIterator>
3317227825Stheravenvoid
3318227825Stheraven__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp)
3319227825Stheraven{
3320227825Stheraven    typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3321227825Stheraven    if (__first != __last)
3322227825Stheraven    {
3323227825Stheraven        _BirdirectionalIterator __i = __first;
3324227825Stheraven        for (++__i; __i != __last; ++__i)
3325227825Stheraven        {
3326227825Stheraven            _BirdirectionalIterator __j = __i;
3327227825Stheraven            value_type __t(_VSTD::move(*__j));
3328227825Stheraven            for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t,  *--__k); --__j)
3329227825Stheraven                *__j = _VSTD::move(*__k);
3330227825Stheraven            *__j = _VSTD::move(__t);
3331227825Stheraven        }
3332227825Stheraven    }
3333227825Stheraven}
3334227825Stheraven
3335227825Stheraventemplate <class _Compare, class _RandomAccessIterator>
3336227825Stheravenvoid
3337227825Stheraven__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3338227825Stheraven{
3339227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3340227825Stheraven    _RandomAccessIterator __j = __first+2;
3341227825Stheraven    __sort3<_Compare>(__first, __first+1, __j, __comp);
3342227825Stheraven    for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3343227825Stheraven    {
3344227825Stheraven        if (__comp(*__i, *__j))
3345227825Stheraven        {
3346227825Stheraven            value_type __t(_VSTD::move(*__i));
3347227825Stheraven            _RandomAccessIterator __k = __j;
3348227825Stheraven            __j = __i;
3349227825Stheraven            do
3350227825Stheraven            {
3351227825Stheraven                *__j = _VSTD::move(*__k);
3352227825Stheraven                __j = __k;
3353227825Stheraven            } while (__j != __first && __comp(__t, *--__k));
3354227825Stheraven            *__j = _VSTD::move(__t);
3355227825Stheraven        }
3356227825Stheraven        __j = __i;
3357227825Stheraven    }
3358227825Stheraven}
3359227825Stheraven
3360227825Stheraventemplate <class _Compare, class _RandomAccessIterator>
3361227825Stheravenbool
3362227825Stheraven__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3363227825Stheraven{
3364227825Stheraven    switch (__last - __first)
3365227825Stheraven    {
3366227825Stheraven    case 0:
3367227825Stheraven    case 1:
3368227825Stheraven        return true;
3369227825Stheraven    case 2:
3370227825Stheraven        if (__comp(*--__last, *__first))
3371227825Stheraven            swap(*__first, *__last);
3372227825Stheraven        return true;
3373227825Stheraven    case 3:
3374227825Stheraven        _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
3375227825Stheraven        return true;
3376227825Stheraven    case 4:
3377227825Stheraven        _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
3378227825Stheraven        return true;
3379227825Stheraven    case 5:
3380227825Stheraven        _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
3381227825Stheraven        return true;
3382227825Stheraven    }
3383227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3384227825Stheraven    _RandomAccessIterator __j = __first+2;
3385227825Stheraven    __sort3<_Compare>(__first, __first+1, __j, __comp);
3386227825Stheraven    const unsigned __limit = 8;
3387227825Stheraven    unsigned __count = 0;
3388227825Stheraven    for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
3389227825Stheraven    {
3390227825Stheraven        if (__comp(*__i, *__j))
3391227825Stheraven        {
3392227825Stheraven            value_type __t(_VSTD::move(*__i));
3393227825Stheraven            _RandomAccessIterator __k = __j;
3394227825Stheraven            __j = __i;
3395227825Stheraven            do
3396227825Stheraven            {
3397227825Stheraven                *__j = _VSTD::move(*__k);
3398227825Stheraven                __j = __k;
3399227825Stheraven            } while (__j != __first && __comp(__t, *--__k));
3400227825Stheraven            *__j = _VSTD::move(__t);
3401227825Stheraven            if (++__count == __limit)
3402227825Stheraven                return ++__i == __last;
3403227825Stheraven        }
3404227825Stheraven        __j = __i;
3405227825Stheraven    }
3406227825Stheraven    return true;
3407227825Stheraven}
3408227825Stheraven
3409227825Stheraventemplate <class _Compare, class _BirdirectionalIterator>
3410227825Stheravenvoid
3411227825Stheraven__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1,
3412227825Stheraven                      typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp)
3413227825Stheraven{
3414227825Stheraven    typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type;
3415227825Stheraven    if (__first1 != __last1)
3416227825Stheraven    {
3417227825Stheraven        __destruct_n __d(0);
3418227825Stheraven        unique_ptr<value_type, __destruct_n&> __h(__first2, __d);
3419227825Stheraven        value_type* __last2 = __first2;
3420227825Stheraven        ::new(__last2) value_type(_VSTD::move(*__first1));
3421227825Stheraven        __d.__incr((value_type*)0);
3422227825Stheraven        for (++__last2; ++__first1 != __last1; ++__last2)
3423227825Stheraven        {
3424227825Stheraven            value_type* __j2 = __last2;
3425227825Stheraven            value_type* __i2 = __j2;
3426227825Stheraven            if (__comp(*__first1, *--__i2))
3427227825Stheraven            {
3428227825Stheraven                ::new(__j2) value_type(_VSTD::move(*__i2));
3429227825Stheraven                __d.__incr((value_type*)0);
3430227825Stheraven                for (--__j2; __i2 != __first2 && __comp(*__first1,  *--__i2); --__j2)
3431227825Stheraven                    *__j2 = _VSTD::move(*__i2);
3432227825Stheraven                *__j2 = _VSTD::move(*__first1);
3433227825Stheraven            }
3434227825Stheraven            else
3435227825Stheraven            {
3436227825Stheraven                ::new(__j2) value_type(_VSTD::move(*__first1));
3437227825Stheraven                __d.__incr((value_type*)0);
3438227825Stheraven            }
3439227825Stheraven        }
3440227825Stheraven        __h.release();
3441227825Stheraven    }
3442227825Stheraven}
3443227825Stheraven
3444227825Stheraventemplate <class _Compare, class _RandomAccessIterator>
3445227825Stheravenvoid
3446227825Stheraven__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3447227825Stheraven{
3448227825Stheraven    // _Compare is known to be a reference type
3449227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
3450227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
3451227825Stheraven    const difference_type __limit = is_trivially_copy_constructible<value_type>::value &&
3452227825Stheraven                                    is_trivially_copy_assignable<value_type>::value ? 30 : 6;
3453227825Stheraven    while (true)
3454227825Stheraven    {
3455227825Stheraven    __restart:
3456227825Stheraven        difference_type __len = __last - __first;
3457227825Stheraven        switch (__len)
3458227825Stheraven        {
3459227825Stheraven        case 0:
3460227825Stheraven        case 1:
3461227825Stheraven            return;
3462227825Stheraven        case 2:
3463227825Stheraven            if (__comp(*--__last, *__first))
3464227825Stheraven                swap(*__first, *__last);
3465227825Stheraven            return;
3466227825Stheraven        case 3:
3467227825Stheraven            _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp);
3468227825Stheraven            return;
3469227825Stheraven        case 4:
3470227825Stheraven            _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp);
3471227825Stheraven            return;
3472227825Stheraven        case 5:
3473227825Stheraven            _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp);
3474227825Stheraven            return;
3475227825Stheraven        }
3476227825Stheraven        if (__len <= __limit)
3477227825Stheraven        {
3478227825Stheraven            _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp);
3479227825Stheraven            return;
3480227825Stheraven        }
3481227825Stheraven        // __len > 5
3482227825Stheraven        _RandomAccessIterator __m = __first;
3483227825Stheraven        _RandomAccessIterator __lm1 = __last;
3484227825Stheraven        --__lm1;
3485227825Stheraven        unsigned __n_swaps;
3486227825Stheraven        {
3487227825Stheraven        difference_type __delta;
3488227825Stheraven        if (__len >= 1000)
3489227825Stheraven        {
3490227825Stheraven            __delta = __len/2;
3491227825Stheraven            __m += __delta;
3492227825Stheraven            __delta /= 2;
3493227825Stheraven            __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp);
3494227825Stheraven        }
3495227825Stheraven        else
3496227825Stheraven        {
3497227825Stheraven            __delta = __len/2;
3498227825Stheraven            __m += __delta;
3499227825Stheraven            __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp);
3500227825Stheraven        }
3501227825Stheraven        }
3502227825Stheraven        // *__m is median
3503227825Stheraven        // partition [__first, __m) < *__m and *__m <= [__m, __last)
3504227825Stheraven        // (this inhibits tossing elements equivalent to __m around unnecessarily)
3505227825Stheraven        _RandomAccessIterator __i = __first;
3506227825Stheraven        _RandomAccessIterator __j = __lm1;
3507227825Stheraven        // j points beyond range to be tested, *__m is known to be <= *__lm1
3508227825Stheraven        // The search going up is known to be guarded but the search coming down isn't.
3509227825Stheraven        // Prime the downward search with a guard.
3510227825Stheraven        if (!__comp(*__i, *__m))  // if *__first == *__m
3511227825Stheraven        {
3512227825Stheraven            // *__first == *__m, *__first doesn't go in first part
3513227825Stheraven            // manually guard downward moving __j against __i
3514227825Stheraven            while (true)
3515227825Stheraven            {
3516227825Stheraven                if (__i == --__j)
3517227825Stheraven                {
3518227825Stheraven                    // *__first == *__m, *__m <= all other elements
3519227825Stheraven                    // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
3520227825Stheraven                    ++__i;  // __first + 1
3521227825Stheraven                    __j = __last;
3522227825Stheraven                    if (!__comp(*__first, *--__j))  // we need a guard if *__first == *(__last-1)
3523227825Stheraven                    {
3524227825Stheraven                        while (true)
3525227825Stheraven                        {
3526227825Stheraven                            if (__i == __j)
3527227825Stheraven                                return;  // [__first, __last) all equivalent elements
3528227825Stheraven                            if (__comp(*__first, *__i))
3529227825Stheraven                            {
3530227825Stheraven                                swap(*__i, *__j);
3531227825Stheraven                                ++__n_swaps;
3532227825Stheraven                                ++__i;
3533227825Stheraven                                break;
3534227825Stheraven                            }
3535227825Stheraven                            ++__i;
3536227825Stheraven                        }
3537227825Stheraven                    }
3538227825Stheraven                    // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
3539227825Stheraven                    if (__i == __j)
3540227825Stheraven                        return;
3541227825Stheraven                    while (true)
3542227825Stheraven                    {
3543227825Stheraven                        while (!__comp(*__first, *__i))
3544227825Stheraven                            ++__i;
3545227825Stheraven                        while (__comp(*__first, *--__j))
3546227825Stheraven                            ;
3547227825Stheraven                        if (__i >= __j)
3548227825Stheraven                            break;
3549227825Stheraven                        swap(*__i, *__j);
3550227825Stheraven                        ++__n_swaps;
3551227825Stheraven                        ++__i;
3552227825Stheraven                    }
3553227825Stheraven                    // [__first, __i) == *__first and *__first < [__i, __last)
3554227825Stheraven                    // The first part is sorted, sort the secod part
3555227825Stheraven                    // _VSTD::__sort<_Compare>(__i, __last, __comp);
3556227825Stheraven                    __first = __i;
3557227825Stheraven                    goto __restart;
3558227825Stheraven                }
3559227825Stheraven                if (__comp(*__j, *__m))
3560227825Stheraven                {
3561227825Stheraven                    swap(*__i, *__j);
3562227825Stheraven                    ++__n_swaps;
3563227825Stheraven                    break;  // found guard for downward moving __j, now use unguarded partition
3564227825Stheraven                }
3565227825Stheraven            }
3566227825Stheraven        }
3567227825Stheraven        // It is known that *__i < *__m
3568227825Stheraven        ++__i;
3569227825Stheraven        // j points beyond range to be tested, *__m is known to be <= *__lm1
3570227825Stheraven        // if not yet partitioned...
3571227825Stheraven        if (__i < __j)
3572227825Stheraven        {
3573227825Stheraven            // known that *(__i - 1) < *__m
3574227825Stheraven            // known that __i <= __m
3575227825Stheraven            while (true)
3576227825Stheraven            {
3577227825Stheraven                // __m still guards upward moving __i
3578227825Stheraven                while (__comp(*__i, *__m))
3579227825Stheraven                    ++__i;
3580227825Stheraven                // It is now known that a guard exists for downward moving __j
3581227825Stheraven                while (!__comp(*--__j, *__m))
3582227825Stheraven                    ;
3583227825Stheraven                if (__i > __j)
3584227825Stheraven                    break;
3585227825Stheraven                swap(*__i, *__j);
3586227825Stheraven                ++__n_swaps;
3587227825Stheraven                // It is known that __m != __j
3588227825Stheraven                // If __m just moved, follow it
3589227825Stheraven                if (__m == __i)
3590227825Stheraven                    __m = __j;
3591227825Stheraven                ++__i;
3592227825Stheraven            }
3593227825Stheraven        }
3594227825Stheraven        // [__first, __i) < *__m and *__m <= [__i, __last)
3595227825Stheraven        if (__i != __m && __comp(*__m, *__i))
3596227825Stheraven        {
3597227825Stheraven            swap(*__i, *__m);
3598227825Stheraven            ++__n_swaps;
3599227825Stheraven        }
3600227825Stheraven        // [__first, __i) < *__i and *__i <= [__i+1, __last)
3601227825Stheraven        // If we were given a perfect partition, see if insertion sort is quick...
3602227825Stheraven        if (__n_swaps == 0)
3603227825Stheraven        {
3604227825Stheraven            bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp);
3605227825Stheraven            if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp))
3606227825Stheraven            {
3607227825Stheraven                if (__fs)
3608227825Stheraven                    return;
3609227825Stheraven                __last = __i;
3610227825Stheraven                continue;
3611227825Stheraven            }
3612227825Stheraven            else
3613227825Stheraven            {
3614227825Stheraven                if (__fs)
3615227825Stheraven                {
3616227825Stheraven                    __first = ++__i;
3617227825Stheraven                    continue;
3618227825Stheraven                }
3619227825Stheraven            }
3620227825Stheraven        }
3621227825Stheraven        // sort smaller range with recursive call and larger with tail recursion elimination
3622227825Stheraven        if (__i - __first < __last - __i)
3623227825Stheraven        {
3624227825Stheraven            _VSTD::__sort<_Compare>(__first, __i, __comp);
3625227825Stheraven            // _VSTD::__sort<_Compare>(__i+1, __last, __comp);
3626227825Stheraven            __first = ++__i;
3627227825Stheraven        }
3628227825Stheraven        else
3629227825Stheraven        {
3630227825Stheraven            _VSTD::__sort<_Compare>(__i+1, __last, __comp);
3631227825Stheraven            // _VSTD::__sort<_Compare>(__first, __i, __comp);
3632227825Stheraven            __last = __i;
3633227825Stheraven        }
3634227825Stheraven    }
3635227825Stheraven}
3636227825Stheraven
3637227825Stheraven// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
3638227825Stheraventemplate <class _RandomAccessIterator, class _Compare>
3639227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3640227825Stheravenvoid
3641227825Stheravensort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
3642227825Stheraven{
3643227825Stheraven#ifdef _LIBCPP_DEBUG2
3644227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3645227825Stheraven    __debug_less<_Compare> __c(__comp);
3646227825Stheraven    __sort<_Comp_ref>(__first, __last, __c);
3647227825Stheraven#else  // _LIBCPP_DEBUG2
3648227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3649227825Stheraven    __sort<_Comp_ref>(__first, __last, __comp);
3650227825Stheraven#endif  // _LIBCPP_DEBUG2
3651227825Stheraven}
3652227825Stheraven
3653227825Stheraventemplate <class _RandomAccessIterator>
3654227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3655227825Stheravenvoid
3656227825Stheravensort(_RandomAccessIterator __first, _RandomAccessIterator __last)
3657227825Stheraven{
3658227825Stheraven    _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
3659227825Stheraven}
3660227825Stheraven
3661227825Stheraventemplate <class _Tp>
3662227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3663227825Stheravenvoid
3664227825Stheravensort(_Tp** __first, _Tp** __last)
3665227825Stheraven{
3666227825Stheraven    _VSTD::sort((size_t*)__first, (size_t*)__last, __less<size_t>());
3667227825Stheraven}
3668227825Stheraven
3669227825Stheraventemplate <class _Tp>
3670227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3671227825Stheravenvoid
3672227825Stheravensort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
3673227825Stheraven{
3674227825Stheraven    _VSTD::sort(__first.base(), __last.base());
3675227825Stheraven}
3676227825Stheraven
3677227825Stheraventemplate <class _Tp, class _Compare>
3678227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3679227825Stheravenvoid
3680227825Stheravensort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp)
3681227825Stheraven{
3682227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3683227825Stheraven    _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
3684227825Stheraven}
3685227825Stheraven
3686227825Stheraven#ifdef _MSC_VER
3687227825Stheraven#pragma warning( push )
3688227825Stheraven#pragma warning( disable: 4231)
3689227825Stheraven#endif // _MSC_VER
3690227825Stheravenextern template void __sort<__less<char>&, char*>(char*, char*, __less<char>&);
3691227825Stheravenextern template void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&);
3692227825Stheravenextern template void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&);
3693227825Stheravenextern template void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&);
3694227825Stheravenextern template void __sort<__less<short>&, short*>(short*, short*, __less<short>&);
3695227825Stheravenextern template void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&);
3696227825Stheravenextern template void __sort<__less<int>&, int*>(int*, int*, __less<int>&);
3697227825Stheravenextern template void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&);
3698227825Stheravenextern template void __sort<__less<long>&, long*>(long*, long*, __less<long>&);
3699227825Stheravenextern template void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&);
3700227825Stheravenextern template void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&);
3701227825Stheravenextern template void __sort<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&);
3702227825Stheravenextern template void __sort<__less<float>&, float*>(float*, float*, __less<float>&);
3703227825Stheravenextern template void __sort<__less<double>&, double*>(double*, double*, __less<double>&);
3704227825Stheravenextern template void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&);
3705227825Stheraven
3706227825Stheravenextern template bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&);
3707227825Stheravenextern template bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&);
3708227825Stheravenextern template bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&);
3709227825Stheravenextern template bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&);
3710227825Stheravenextern template bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&);
3711227825Stheravenextern template bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&);
3712227825Stheravenextern template bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&);
3713227825Stheravenextern template bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&);
3714227825Stheravenextern template bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&);
3715227825Stheravenextern template bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&);
3716227825Stheravenextern template bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&);
3717227825Stheravenextern template bool __insertion_sort_incomplete<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&);
3718227825Stheravenextern template bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&);
3719227825Stheravenextern template bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&);
3720227825Stheravenextern template bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&);
3721227825Stheraven
3722227825Stheravenextern template unsigned __sort5<__less<long double>&, long double*>(long double*, long double*, long double*, long double*, long double*, __less<long double>&);
3723227825Stheraven#ifdef _MSC_VER
3724227825Stheraven#pragma warning( pop )
3725227825Stheraven#endif _MSC_VER
3726227825Stheraven
3727227825Stheraven// lower_bound
3728227825Stheraven
3729227825Stheraventemplate <class _Compare, class _ForwardIterator, class _Tp>
3730227825Stheraven_ForwardIterator
3731227825Stheraven__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
3732227825Stheraven{
3733227825Stheraven    typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
3734227825Stheraven    difference_type __len = _VSTD::distance(__first, __last);
3735227825Stheraven    while (__len != 0)
3736227825Stheraven    {
3737227825Stheraven        difference_type __l2 = __len / 2;
3738227825Stheraven        _ForwardIterator __m = __first;
3739227825Stheraven        _VSTD::advance(__m, __l2);
3740227825Stheraven        if (__comp(*__m, __value_))
3741227825Stheraven        {
3742227825Stheraven            __first = ++__m;
3743227825Stheraven            __len -= __l2 + 1;
3744227825Stheraven        }
3745227825Stheraven        else
3746227825Stheraven            __len = __l2;
3747227825Stheraven    }
3748227825Stheraven    return __first;
3749227825Stheraven}
3750227825Stheraven
3751227825Stheraventemplate <class _ForwardIterator, class _Tp, class _Compare>
3752227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3753227825Stheraven_ForwardIterator
3754227825Stheravenlower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
3755227825Stheraven{
3756227825Stheraven#ifdef _LIBCPP_DEBUG2
3757227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3758227825Stheraven    __debug_less<_Compare> __c(__comp);
3759227825Stheraven    return __lower_bound<_Comp_ref>(__first, __last, __value_, __c);
3760227825Stheraven#else  // _LIBCPP_DEBUG2
3761227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3762227825Stheraven    return __lower_bound<_Comp_ref>(__first, __last, __value_, __comp);
3763227825Stheraven#endif  // _LIBCPP_DEBUG2
3764227825Stheraven}
3765227825Stheraven
3766227825Stheraventemplate <class _ForwardIterator, class _Tp>
3767227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3768227825Stheraven_ForwardIterator
3769227825Stheravenlower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
3770227825Stheraven{
3771227825Stheraven    return _VSTD::lower_bound(__first, __last, __value_,
3772227825Stheraven                             __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3773227825Stheraven}
3774227825Stheraven
3775227825Stheraven// upper_bound
3776227825Stheraven
3777227825Stheraventemplate <class _Compare, class _ForwardIterator, class _Tp>
3778227825Stheraven_ForwardIterator
3779227825Stheraven__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
3780227825Stheraven{
3781227825Stheraven    typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
3782227825Stheraven    difference_type __len = _VSTD::distance(__first, __last);
3783227825Stheraven    while (__len != 0)
3784227825Stheraven    {
3785227825Stheraven        difference_type __l2 = __len / 2;
3786227825Stheraven        _ForwardIterator __m = __first;
3787227825Stheraven        _VSTD::advance(__m, __l2);
3788227825Stheraven        if (__comp(__value_, *__m))
3789227825Stheraven            __len = __l2;
3790227825Stheraven        else
3791227825Stheraven        {
3792227825Stheraven            __first = ++__m;
3793227825Stheraven            __len -= __l2 + 1;
3794227825Stheraven        }
3795227825Stheraven    }
3796227825Stheraven    return __first;
3797227825Stheraven}
3798227825Stheraven
3799227825Stheraventemplate <class _ForwardIterator, class _Tp, class _Compare>
3800227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3801227825Stheraven_ForwardIterator
3802227825Stheravenupper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
3803227825Stheraven{
3804227825Stheraven#ifdef _LIBCPP_DEBUG2
3805227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3806227825Stheraven    __debug_less<_Compare> __c(__comp);
3807227825Stheraven    return __upper_bound<_Comp_ref>(__first, __last, __value_, __c);
3808227825Stheraven#else  // _LIBCPP_DEBUG2
3809227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3810227825Stheraven    return __upper_bound<_Comp_ref>(__first, __last, __value_, __comp);
3811227825Stheraven#endif  // _LIBCPP_DEBUG2
3812227825Stheraven}
3813227825Stheraven
3814227825Stheraventemplate <class _ForwardIterator, class _Tp>
3815227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3816227825Stheraven_ForwardIterator
3817227825Stheravenupper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
3818227825Stheraven{
3819227825Stheraven    return _VSTD::upper_bound(__first, __last, __value_,
3820227825Stheraven                             __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>());
3821227825Stheraven}
3822227825Stheraven
3823227825Stheraven// equal_range
3824227825Stheraven
3825227825Stheraventemplate <class _Compare, class _ForwardIterator, class _Tp>
3826227825Stheravenpair<_ForwardIterator, _ForwardIterator>
3827227825Stheraven__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
3828227825Stheraven{
3829227825Stheraven    typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type;
3830227825Stheraven    difference_type __len = _VSTD::distance(__first, __last);
3831227825Stheraven    while (__len != 0)
3832227825Stheraven    {
3833227825Stheraven        difference_type __l2 = __len / 2;
3834227825Stheraven        _ForwardIterator __m = __first;
3835227825Stheraven        _VSTD::advance(__m, __l2);
3836227825Stheraven        if (__comp(*__m, __value_))
3837227825Stheraven        {
3838227825Stheraven            __first = ++__m;
3839227825Stheraven            __len -= __l2 + 1;
3840227825Stheraven        }
3841227825Stheraven        else if (__comp(__value_, *__m))
3842227825Stheraven        {
3843227825Stheraven            __last = __m;
3844227825Stheraven            __len = __l2;
3845227825Stheraven        }
3846227825Stheraven        else
3847227825Stheraven        {
3848227825Stheraven            _ForwardIterator __mp1 = __m;
3849227825Stheraven            return pair<_ForwardIterator, _ForwardIterator>
3850227825Stheraven                   (
3851227825Stheraven                      __lower_bound<_Compare>(__first, __m, __value_, __comp),
3852227825Stheraven                      __upper_bound<_Compare>(++__mp1, __last, __value_, __comp)
3853227825Stheraven                   );
3854227825Stheraven        }
3855227825Stheraven    }
3856227825Stheraven    return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
3857227825Stheraven}
3858227825Stheraven
3859227825Stheraventemplate <class _ForwardIterator, class _Tp, class _Compare>
3860227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3861227825Stheravenpair<_ForwardIterator, _ForwardIterator>
3862227825Stheravenequal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
3863227825Stheraven{
3864227825Stheraven#ifdef _LIBCPP_DEBUG2
3865227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3866227825Stheraven    __debug_less<_Compare> __c(__comp);
3867227825Stheraven    return __equal_range<_Comp_ref>(__first, __last, __value_, __c);
3868227825Stheraven#else  // _LIBCPP_DEBUG2
3869227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3870227825Stheraven    return __equal_range<_Comp_ref>(__first, __last, __value_, __comp);
3871227825Stheraven#endif  // _LIBCPP_DEBUG2
3872227825Stheraven}
3873227825Stheraven
3874227825Stheraventemplate <class _ForwardIterator, class _Tp>
3875227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3876227825Stheravenpair<_ForwardIterator, _ForwardIterator>
3877227825Stheravenequal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
3878227825Stheraven{
3879227825Stheraven    return _VSTD::equal_range(__first, __last, __value_,
3880227825Stheraven                             __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3881227825Stheraven}
3882227825Stheraven
3883227825Stheraven// binary_search
3884227825Stheraven
3885227825Stheraventemplate <class _Compare, class _ForwardIterator, class _Tp>
3886227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3887227825Stheravenbool
3888227825Stheraven__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
3889227825Stheraven{
3890227825Stheraven    __first = __lower_bound<_Compare>(__first, __last, __value_, __comp);
3891227825Stheraven    return __first != __last && !__comp(__value_, *__first);
3892227825Stheraven}
3893227825Stheraven
3894227825Stheraventemplate <class _ForwardIterator, class _Tp, class _Compare>
3895227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3896227825Stheravenbool
3897227825Stheravenbinary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
3898227825Stheraven{
3899227825Stheraven#ifdef _LIBCPP_DEBUG2
3900227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3901227825Stheraven    __debug_less<_Compare> __c(__comp);
3902227825Stheraven    return __binary_search<_Comp_ref>(__first, __last, __value_, __c);
3903227825Stheraven#else  // _LIBCPP_DEBUG2
3904227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3905227825Stheraven    return __binary_search<_Comp_ref>(__first, __last, __value_, __comp);
3906227825Stheraven#endif  // _LIBCPP_DEBUG2
3907227825Stheraven}
3908227825Stheraven
3909227825Stheraventemplate <class _ForwardIterator, class _Tp>
3910227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3911227825Stheravenbool
3912227825Stheravenbinary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
3913227825Stheraven{
3914227825Stheraven    return _VSTD::binary_search(__first, __last, __value_,
3915227825Stheraven                             __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
3916227825Stheraven}
3917227825Stheraven
3918227825Stheraven// merge
3919227825Stheraven
3920227825Stheraventemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
3921227825Stheraven_OutputIterator
3922227825Stheraven__merge(_InputIterator1 __first1, _InputIterator1 __last1,
3923227825Stheraven        _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
3924227825Stheraven{
3925227825Stheraven    for (; __first1 != __last1; ++__result)
3926227825Stheraven    {
3927227825Stheraven        if (__first2 == __last2)
3928227825Stheraven            return _VSTD::copy(__first1, __last1, __result);
3929227825Stheraven        if (__comp(*__first2, *__first1))
3930227825Stheraven        {
3931227825Stheraven            *__result = *__first2;
3932227825Stheraven            ++__first2;
3933227825Stheraven        }
3934227825Stheraven        else
3935227825Stheraven        {
3936227825Stheraven            *__result = *__first1;
3937227825Stheraven            ++__first1;
3938227825Stheraven        }
3939227825Stheraven    }
3940227825Stheraven    return _VSTD::copy(__first2, __last2, __result);
3941227825Stheraven}
3942227825Stheraven
3943227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
3944227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3945227825Stheraven_OutputIterator
3946227825Stheravenmerge(_InputIterator1 __first1, _InputIterator1 __last1,
3947227825Stheraven      _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
3948227825Stheraven{
3949227825Stheraven#ifdef _LIBCPP_DEBUG2
3950227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
3951227825Stheraven    __debug_less<_Compare> __c(__comp);
3952227825Stheraven    return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
3953227825Stheraven#else  // _LIBCPP_DEBUG2
3954227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
3955227825Stheraven    return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
3956227825Stheraven#endif  // _LIBCPP_DEBUG2
3957227825Stheraven}
3958227825Stheraven
3959227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator>
3960227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
3961227825Stheraven_OutputIterator
3962227825Stheravenmerge(_InputIterator1 __first1, _InputIterator1 __last1,
3963227825Stheraven      _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
3964227825Stheraven{
3965227825Stheraven    typedef typename iterator_traits<_InputIterator1>::value_type __v1;
3966227825Stheraven    typedef typename iterator_traits<_InputIterator2>::value_type __v2;
3967227825Stheraven    return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>());
3968227825Stheraven}
3969227825Stheraven
3970227825Stheraven// inplace_merge
3971227825Stheraven
3972227825Stheraventemplate <class _Compare, class _BidirectionalIterator>
3973227825Stheravenvoid
3974227825Stheraven__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
3975227825Stheraven                _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
3976227825Stheraven                                 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
3977227825Stheraven                typename iterator_traits<_BidirectionalIterator>::value_type* __buff)
3978227825Stheraven{
3979227825Stheraven    typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
3980227825Stheraven    typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
3981227825Stheraven    typedef typename iterator_traits<_BidirectionalIterator>::pointer pointer;
3982227825Stheraven    __destruct_n __d(0);
3983227825Stheraven    unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
3984227825Stheraven    if (__len1 <= __len2)
3985227825Stheraven    {
3986227825Stheraven        value_type* __p = __buff;
3987227825Stheraven        for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), ++__i, ++__p)
3988227825Stheraven            ::new(__p) value_type(_VSTD::move(*__i));
3989227825Stheraven        __merge<_Compare>(move_iterator<value_type*>(__buff),
3990227825Stheraven                          move_iterator<value_type*>(__p),
3991227825Stheraven                          move_iterator<_BidirectionalIterator>(__middle),
3992227825Stheraven                          move_iterator<_BidirectionalIterator>(__last),
3993227825Stheraven                          __first, __comp);
3994227825Stheraven    }
3995227825Stheraven    else
3996227825Stheraven    {
3997227825Stheraven        value_type* __p = __buff;
3998227825Stheraven        for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), ++__i, ++__p)
3999227825Stheraven            ::new(__p) value_type(_VSTD::move(*__i));
4000227825Stheraven        typedef reverse_iterator<_BidirectionalIterator> _RBi;
4001227825Stheraven        typedef reverse_iterator<value_type*> _Rv;
4002227825Stheraven        __merge(move_iterator<_RBi>(_RBi(__middle)), move_iterator<_RBi>(_RBi(__first)),
4003227825Stheraven                move_iterator<_Rv>(_Rv(__p)), move_iterator<_Rv>(_Rv(__buff)),
4004227825Stheraven                _RBi(__last), __negate<_Compare>(__comp));
4005227825Stheraven    }
4006227825Stheraven}
4007227825Stheraven
4008227825Stheraventemplate <class _Compare, class _BidirectionalIterator>
4009227825Stheravenvoid
4010227825Stheraven__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4011227825Stheraven                _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1,
4012227825Stheraven                                 typename iterator_traits<_BidirectionalIterator>::difference_type __len2,
4013227825Stheraven                typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size)
4014227825Stheraven{
4015227825Stheraven    typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4016227825Stheraven    typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
4017227825Stheraven    while (true)
4018227825Stheraven    {
4019227825Stheraven        // if __middle == __last, we're done
4020227825Stheraven        if (__len2 == 0)
4021227825Stheraven            return;
4022227825Stheraven        // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0
4023227825Stheraven        for (; true; ++__first, --__len1)
4024227825Stheraven        {
4025227825Stheraven            if (__len1 == 0)
4026227825Stheraven                return;
4027227825Stheraven            if (__comp(*__middle, *__first))
4028227825Stheraven                break;
4029227825Stheraven        }
4030227825Stheraven        if (__len1 <= __buff_size || __len2 <= __buff_size)
4031227825Stheraven        {
4032227825Stheraven            __buffered_inplace_merge<_Compare>(__first, __middle, __last, __comp, __len1, __len2, __buff);
4033227825Stheraven            return;
4034227825Stheraven        }
4035227825Stheraven        // __first < __middle < __last
4036227825Stheraven        // *__first > *__middle
4037227825Stheraven        // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that
4038227825Stheraven        //     all elements in:
4039227825Stheraven        //         [__first, __m1)  <= [__middle, __m2)
4040227825Stheraven        //         [__middle, __m2) <  [__m1, __middle)
4041227825Stheraven        //         [__m1, __middle) <= [__m2, __last)
4042227825Stheraven        //     and __m1 or __m2 is in the middle of its range
4043227825Stheraven        _BidirectionalIterator __m1;  // "median" of [__first, __middle)
4044227825Stheraven        _BidirectionalIterator __m2;  // "median" of [__middle, __last)
4045227825Stheraven        difference_type __len11;      // distance(__first, __m1)
4046227825Stheraven        difference_type __len21;      // distance(__middle, __m2)
4047227825Stheraven        // binary search smaller range
4048227825Stheraven        if (__len1 < __len2)
4049227825Stheraven        {   // __len >= 1, __len2 >= 2
4050227825Stheraven            __len21 = __len2 / 2;
4051227825Stheraven            __m2 = __middle;
4052227825Stheraven            _VSTD::advance(__m2, __len21);
4053227825Stheraven            __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp);
4054227825Stheraven            __len11 = _VSTD::distance(__first, __m1);
4055227825Stheraven        }
4056227825Stheraven        else
4057227825Stheraven        {
4058227825Stheraven            if (__len1 == 1)
4059227825Stheraven            {   // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1
4060227825Stheraven                // It is known *__first > *__middle
4061227825Stheraven                swap(*__first, *__middle);
4062227825Stheraven                return;
4063227825Stheraven            }
4064227825Stheraven            // __len1 >= 2, __len2 >= 1
4065227825Stheraven            __len11 = __len1 / 2;
4066227825Stheraven            __m1 = __first;
4067227825Stheraven            _VSTD::advance(__m1, __len11);
4068227825Stheraven            __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp);
4069227825Stheraven            __len21 = _VSTD::distance(__middle, __m2);
4070227825Stheraven        }
4071227825Stheraven        difference_type __len12 = __len1 - __len11;  // distance(__m1, __middle)
4072227825Stheraven        difference_type __len22 = __len2 - __len21;  // distance(__m2, __last)
4073227825Stheraven        // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last)
4074227825Stheraven        // swap middle two partitions
4075227825Stheraven        __middle = _VSTD::rotate(__m1, __middle, __m2);
4076227825Stheraven        // __len12 and __len21 now have swapped meanings
4077227825Stheraven        // merge smaller range with recurisve call and larger with tail recursion elimination
4078227825Stheraven        if (__len11 + __len21 < __len12 + __len22)
4079227825Stheraven        {
4080227825Stheraven            __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4081227825Stheraven//          __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4082227825Stheraven            __first = __middle;
4083227825Stheraven            __middle = __m2;
4084227825Stheraven            __len1 = __len12;
4085227825Stheraven            __len2 = __len22;
4086227825Stheraven        }
4087227825Stheraven        else
4088227825Stheraven        {
4089227825Stheraven            __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size);
4090227825Stheraven//          __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size);
4091227825Stheraven            __last = __middle;
4092227825Stheraven            __middle = __m1;
4093227825Stheraven            __len1 = __len11;
4094227825Stheraven            __len2 = __len21;
4095227825Stheraven        }
4096227825Stheraven    }
4097227825Stheraven}
4098227825Stheraven
4099227825Stheraventemplate <class _Tp>
4100227825Stheravenstruct __inplace_merge_switch
4101227825Stheraven{
4102227825Stheraven    static const unsigned value = is_trivially_copy_assignable<_Tp>::value;
4103227825Stheraven};
4104227825Stheraven
4105227825Stheraventemplate <class _BidirectionalIterator, class _Compare>
4106227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4107227825Stheravenvoid
4108227825Stheraveninplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
4109227825Stheraven              _Compare __comp)
4110227825Stheraven{
4111227825Stheraven    typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
4112227825Stheraven    typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
4113227825Stheraven    difference_type __len1 = _VSTD::distance(__first, __middle);
4114227825Stheraven    difference_type __len2 = _VSTD::distance(__middle, __last);
4115227825Stheraven    difference_type __buf_size = _VSTD::min(__len1, __len2);
4116227825Stheraven    pair<value_type*, ptrdiff_t> __buf(0, 0);
4117227825Stheraven    unique_ptr<value_type, __return_temporary_buffer> __h;
4118227825Stheraven    if (__inplace_merge_switch<value_type>::value && __buf_size > 8)
4119227825Stheraven    {
4120227825Stheraven        __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size);
4121227825Stheraven        __h.reset(__buf.first);
4122227825Stheraven    }
4123227825Stheraven#ifdef _LIBCPP_DEBUG2
4124227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4125227825Stheraven    __debug_less<_Compare> __c(__comp);
4126227825Stheraven    return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2,
4127227825Stheraven                                            __buf.first, __buf.second);
4128227825Stheraven#else  // _LIBCPP_DEBUG2
4129227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4130227825Stheraven    return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
4131227825Stheraven                                            __buf.first, __buf.second);
4132227825Stheraven#endif  // _LIBCPP_DEBUG2
4133227825Stheraven}
4134227825Stheraven
4135227825Stheraventemplate <class _BidirectionalIterator>
4136227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4137227825Stheravenvoid
4138227825Stheraveninplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last)
4139227825Stheraven{
4140227825Stheraven    _VSTD::inplace_merge(__first, __middle, __last,
4141227825Stheraven                        __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
4142227825Stheraven}
4143227825Stheraven
4144227825Stheraven// stable_sort
4145227825Stheraven
4146227825Stheraventemplate <class _Compare, class _InputIterator1, class _InputIterator2>
4147227825Stheravenvoid
4148227825Stheraven__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1,
4149227825Stheraven        _InputIterator2 __first2, _InputIterator2 __last2,
4150227825Stheraven        typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp)
4151227825Stheraven{
4152227825Stheraven    typedef typename iterator_traits<_InputIterator1>::value_type value_type;
4153227825Stheraven    __destruct_n __d(0);
4154227825Stheraven    unique_ptr<value_type, __destruct_n&> __h(__result, __d);
4155227825Stheraven    for (; true; ++__result)
4156227825Stheraven    {
4157227825Stheraven        if (__first1 == __last1)
4158227825Stheraven        {
4159227825Stheraven            for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0))
4160227825Stheraven                ::new (__result) value_type(_VSTD::move(*__first2));
4161227825Stheraven            __h.release();
4162227825Stheraven            return;
4163227825Stheraven        }
4164227825Stheraven        if (__first2 == __last2)
4165227825Stheraven        {
4166227825Stheraven            for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0))
4167227825Stheraven                ::new (__result) value_type(_VSTD::move(*__first1));
4168227825Stheraven            __h.release();
4169227825Stheraven            return;
4170227825Stheraven        }
4171227825Stheraven        if (__comp(*__first2, *__first1))
4172227825Stheraven        {
4173227825Stheraven            ::new (__result) value_type(_VSTD::move(*__first2));
4174227825Stheraven            __d.__incr((value_type*)0);
4175227825Stheraven            ++__first2;
4176227825Stheraven        }
4177227825Stheraven        else
4178227825Stheraven        {
4179227825Stheraven            ::new (__result) value_type(_VSTD::move(*__first1));
4180227825Stheraven            __d.__incr((value_type*)0);
4181227825Stheraven            ++__first1;
4182227825Stheraven        }
4183227825Stheraven    }
4184227825Stheraven}
4185227825Stheraven
4186227825Stheraventemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4187227825Stheravenvoid
4188227825Stheraven__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1,
4189227825Stheraven        _InputIterator2 __first2, _InputIterator2 __last2,
4190227825Stheraven        _OutputIterator __result, _Compare __comp)
4191227825Stheraven{
4192227825Stheraven    for (; __first1 != __last1; ++__result)
4193227825Stheraven    {
4194227825Stheraven        if (__first2 == __last2)
4195227825Stheraven        {
4196227825Stheraven            for (; __first1 != __last1; ++__first1, ++__result)
4197227825Stheraven                *__result = _VSTD::move(*__first1);
4198227825Stheraven            return;
4199227825Stheraven        }
4200227825Stheraven        if (__comp(*__first2, *__first1))
4201227825Stheraven        {
4202227825Stheraven            *__result = _VSTD::move(*__first2);
4203227825Stheraven            ++__first2;
4204227825Stheraven        }
4205227825Stheraven        else
4206227825Stheraven        {
4207227825Stheraven            *__result = _VSTD::move(*__first1);
4208227825Stheraven            ++__first1;
4209227825Stheraven        }
4210227825Stheraven    }
4211227825Stheraven    for (; __first2 != __last2; ++__first2, ++__result)
4212227825Stheraven        *__result = _VSTD::move(*__first2);
4213227825Stheraven}
4214227825Stheraven
4215227825Stheraventemplate <class _Compare, class _RandomAccessIterator>
4216227825Stheravenvoid
4217227825Stheraven__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4218227825Stheraven              typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4219227825Stheraven              typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size);
4220227825Stheraven
4221227825Stheraventemplate <class _Compare, class _RandomAccessIterator>
4222227825Stheravenvoid
4223227825Stheraven__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp,
4224227825Stheraven                   typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4225227825Stheraven                   typename iterator_traits<_RandomAccessIterator>::value_type* __first2)
4226227825Stheraven{
4227227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4228227825Stheraven    switch (__len)
4229227825Stheraven    {
4230227825Stheraven    case 0:
4231227825Stheraven        return;
4232227825Stheraven    case 1:
4233227825Stheraven        ::new(__first2) value_type(_VSTD::move(*__first1));
4234227825Stheraven        return;
4235227825Stheraven    case 2:
4236227825Stheraven       __destruct_n __d(0);
4237227825Stheraven        unique_ptr<value_type, __destruct_n&> __h2(__first2, __d);
4238227825Stheraven         if (__comp(*--__last1, *__first1))
4239227825Stheraven        {
4240227825Stheraven            ::new(__first2) value_type(_VSTD::move(*__last1));
4241227825Stheraven            __d.__incr((value_type*)0);
4242227825Stheraven            ++__first2;
4243227825Stheraven            ::new(__first2) value_type(_VSTD::move(*__first1));
4244227825Stheraven        }
4245227825Stheraven        else
4246227825Stheraven        {
4247227825Stheraven            ::new(__first2) value_type(_VSTD::move(*__first1));
4248227825Stheraven            __d.__incr((value_type*)0);
4249227825Stheraven            ++__first2;
4250227825Stheraven            ::new(__first2) value_type(_VSTD::move(*__last1));
4251227825Stheraven        }
4252227825Stheraven        __h2.release();
4253227825Stheraven        return;
4254227825Stheraven    }
4255227825Stheraven    if (__len <= 8)
4256227825Stheraven    {
4257227825Stheraven        __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp);
4258227825Stheraven        return;
4259227825Stheraven    }
4260227825Stheraven    typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4261227825Stheraven    _RandomAccessIterator __m = __first1 + __l2;
4262227825Stheraven    __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2);
4263227825Stheraven    __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
4264227825Stheraven    __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp);
4265227825Stheraven}
4266227825Stheraven
4267227825Stheraventemplate <class _Tp>
4268227825Stheravenstruct __stable_sort_switch
4269227825Stheraven{
4270227825Stheraven    static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value;
4271227825Stheraven};
4272227825Stheraven
4273227825Stheraventemplate <class _Compare, class _RandomAccessIterator>
4274227825Stheravenvoid
4275227825Stheraven__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4276227825Stheraven              typename iterator_traits<_RandomAccessIterator>::difference_type __len,
4277227825Stheraven              typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size)
4278227825Stheraven{
4279227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4280227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4281227825Stheraven    switch (__len)
4282227825Stheraven    {
4283227825Stheraven    case 0:
4284227825Stheraven    case 1:
4285227825Stheraven        return;
4286227825Stheraven    case 2:
4287227825Stheraven        if (__comp(*--__last, *__first))
4288227825Stheraven            swap(*__first, *__last);
4289227825Stheraven        return;
4290227825Stheraven    }
4291227825Stheraven    if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4292227825Stheraven    {
4293227825Stheraven        __insertion_sort<_Compare>(__first, __last, __comp);
4294227825Stheraven        return;
4295227825Stheraven    }
4296227825Stheraven    typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2;
4297227825Stheraven    _RandomAccessIterator __m = __first + __l2;
4298227825Stheraven    if (__len <= __buff_size)
4299227825Stheraven    {
4300227825Stheraven        __destruct_n __d(0);
4301227825Stheraven        unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
4302227825Stheraven        __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff);
4303227825Stheraven        __d.__set(__l2, (value_type*)0);
4304227825Stheraven        __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
4305227825Stheraven        __d.__set(__len, (value_type*)0);
4306227825Stheraven        __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
4307227825Stheraven//         __merge<_Compare>(move_iterator<value_type*>(__buff),
4308227825Stheraven//                           move_iterator<value_type*>(__buff + __l2),
4309227825Stheraven//                           move_iterator<_RandomAccessIterator>(__buff + __l2),
4310227825Stheraven//                           move_iterator<_RandomAccessIterator>(__buff + __len),
4311227825Stheraven//                           __first, __comp);
4312227825Stheraven        return;
4313227825Stheraven    }
4314227825Stheraven    __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
4315227825Stheraven    __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
4316227825Stheraven    __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
4317227825Stheraven}
4318227825Stheraven
4319227825Stheraventemplate <class _RandomAccessIterator, class _Compare>
4320227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4321227825Stheravenvoid
4322227825Stheravenstable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4323227825Stheraven{
4324227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4325227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4326227825Stheraven    difference_type __len = __last - __first;
4327227825Stheraven    pair<value_type*, ptrdiff_t> __buf(0, 0);
4328227825Stheraven    unique_ptr<value_type, __return_temporary_buffer> __h;
4329227825Stheraven    if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value))
4330227825Stheraven    {
4331227825Stheraven        __buf = _VSTD::get_temporary_buffer<value_type>(__len);
4332227825Stheraven        __h.reset(__buf.first);
4333227825Stheraven    }
4334227825Stheraven#ifdef _LIBCPP_DEBUG2
4335227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4336227825Stheraven    __debug_less<_Compare> __c(__comp);
4337227825Stheraven    __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second);
4338227825Stheraven#else  // _LIBCPP_DEBUG2
4339227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4340227825Stheraven    __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
4341227825Stheraven#endif  // _LIBCPP_DEBUG2
4342227825Stheraven}
4343227825Stheraven
4344227825Stheraventemplate <class _RandomAccessIterator>
4345227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4346227825Stheravenvoid
4347227825Stheravenstable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4348227825Stheraven{
4349227825Stheraven    _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4350227825Stheraven}
4351227825Stheraven
4352227825Stheraven// is_heap_until
4353227825Stheraven
4354227825Stheraventemplate <class _RandomAccessIterator, class _Compare>
4355227825Stheraven_RandomAccessIterator
4356227825Stheravenis_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4357227825Stheraven{
4358227825Stheraven    typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4359227825Stheraven    difference_type __len = __last - __first;
4360227825Stheraven    difference_type __p = 0;
4361227825Stheraven    difference_type __c = 1;
4362227825Stheraven    _RandomAccessIterator __pp = __first;
4363227825Stheraven    while (__c < __len)
4364227825Stheraven    {
4365227825Stheraven        _RandomAccessIterator __cp = __first + __c;
4366227825Stheraven        if (__comp(*__pp, *__cp))
4367227825Stheraven            return __cp;
4368227825Stheraven        ++__c;
4369227825Stheraven        ++__cp;
4370227825Stheraven        if (__c == __len)
4371227825Stheraven            return __last;
4372227825Stheraven        if (__comp(*__pp, *__cp))
4373227825Stheraven            return __cp;
4374227825Stheraven        ++__p;
4375227825Stheraven        ++__pp;
4376227825Stheraven        __c = 2 * __p + 1;
4377227825Stheraven    }
4378227825Stheraven    return __last;
4379227825Stheraven}
4380227825Stheraven
4381227825Stheraventemplate<class _RandomAccessIterator>
4382227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4383227825Stheraven_RandomAccessIterator
4384227825Stheravenis_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
4385227825Stheraven{
4386227825Stheraven    return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4387227825Stheraven}
4388227825Stheraven
4389227825Stheraven// is_heap
4390227825Stheraven
4391227825Stheraventemplate <class _RandomAccessIterator, class _Compare>
4392227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4393227825Stheravenbool
4394227825Stheravenis_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4395227825Stheraven{
4396227825Stheraven    return _VSTD::is_heap_until(__first, __last, __comp) == __last;
4397227825Stheraven}
4398227825Stheraven
4399227825Stheraventemplate<class _RandomAccessIterator>
4400227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4401227825Stheravenbool
4402227825Stheravenis_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4403227825Stheraven{
4404227825Stheraven    return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4405227825Stheraven}
4406227825Stheraven
4407227825Stheraven// push_heap
4408227825Stheraven
4409227825Stheraventemplate <class _Compare, class _RandomAccessIterator>
4410227825Stheravenvoid
4411227825Stheraven__push_heap_front(_RandomAccessIterator __first, _RandomAccessIterator, _Compare __comp,
4412227825Stheraven                  typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4413227825Stheraven{
4414227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4415227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4416227825Stheraven    if (__len > 1)
4417227825Stheraven    {
4418227825Stheraven        difference_type __p = 0;
4419227825Stheraven        _RandomAccessIterator __pp = __first;
4420227825Stheraven        difference_type __c = 2;
4421227825Stheraven        _RandomAccessIterator __cp = __first + __c;
4422227825Stheraven        if (__c == __len || __comp(*__cp, *(__cp - 1)))
4423227825Stheraven        {
4424227825Stheraven            --__c;
4425227825Stheraven            --__cp;
4426227825Stheraven        }
4427227825Stheraven        if (__comp(*__pp, *__cp))
4428227825Stheraven        {
4429227825Stheraven            value_type __t(_VSTD::move(*__pp));
4430227825Stheraven            do
4431227825Stheraven            {
4432227825Stheraven                *__pp = _VSTD::move(*__cp);
4433227825Stheraven                __pp = __cp;
4434227825Stheraven                __p = __c;
4435227825Stheraven                __c = (__p + 1) * 2;
4436227825Stheraven                if (__c > __len)
4437227825Stheraven                    break;
4438227825Stheraven                __cp = __first + __c;
4439227825Stheraven                if (__c == __len || __comp(*__cp, *(__cp - 1)))
4440227825Stheraven                {
4441227825Stheraven                    --__c;
4442227825Stheraven                    --__cp;
4443227825Stheraven                }
4444227825Stheraven            } while (__comp(__t, *__cp));
4445227825Stheraven            *__pp = _VSTD::move(__t);
4446227825Stheraven        }
4447227825Stheraven    }
4448227825Stheraven}
4449227825Stheraven
4450227825Stheraventemplate <class _Compare, class _RandomAccessIterator>
4451227825Stheravenvoid
4452227825Stheraven__push_heap_back(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4453227825Stheraven                 typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4454227825Stheraven{
4455227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4456227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
4457227825Stheraven    if (__len > 1)
4458227825Stheraven    {
4459227825Stheraven        __len = (__len - 2) / 2;
4460227825Stheraven        _RandomAccessIterator __ptr = __first + __len;
4461227825Stheraven        if (__comp(*__ptr, *--__last))
4462227825Stheraven        {
4463227825Stheraven            value_type __t(_VSTD::move(*__last));
4464227825Stheraven            do
4465227825Stheraven            {
4466227825Stheraven                *__last = _VSTD::move(*__ptr);
4467227825Stheraven                __last = __ptr;
4468227825Stheraven                if (__len == 0)
4469227825Stheraven                    break;
4470227825Stheraven                __len = (__len - 1) / 2;
4471227825Stheraven                __ptr = __first + __len;
4472227825Stheraven            } while (__comp(*__ptr, __t));
4473227825Stheraven            *__last = _VSTD::move(__t);
4474227825Stheraven        }
4475227825Stheraven    }
4476227825Stheraven}
4477227825Stheraven
4478227825Stheraventemplate <class _RandomAccessIterator, class _Compare>
4479227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4480227825Stheravenvoid
4481227825Stheravenpush_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4482227825Stheraven{
4483227825Stheraven#ifdef _LIBCPP_DEBUG2
4484227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4485227825Stheraven    __debug_less<_Compare> __c(__comp);
4486227825Stheraven    __push_heap_back<_Comp_ref>(__first, __last, __c, __last - __first);
4487227825Stheraven#else  // _LIBCPP_DEBUG2
4488227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4489227825Stheraven    __push_heap_back<_Comp_ref>(__first, __last, __comp, __last - __first);
4490227825Stheraven#endif  // _LIBCPP_DEBUG2
4491227825Stheraven}
4492227825Stheraven
4493227825Stheraventemplate <class _RandomAccessIterator>
4494227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4495227825Stheravenvoid
4496227825Stheravenpush_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4497227825Stheraven{
4498227825Stheraven    _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4499227825Stheraven}
4500227825Stheraven
4501227825Stheraven// pop_heap
4502227825Stheraven
4503227825Stheraventemplate <class _Compare, class _RandomAccessIterator>
4504227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4505227825Stheravenvoid
4506227825Stheraven__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
4507227825Stheraven           typename iterator_traits<_RandomAccessIterator>::difference_type __len)
4508227825Stheraven{
4509227825Stheraven    if (__len > 1)
4510227825Stheraven    {
4511227825Stheraven        swap(*__first, *--__last);
4512227825Stheraven        __push_heap_front<_Compare>(__first, __last, __comp, __len-1);
4513227825Stheraven    }
4514227825Stheraven}
4515227825Stheraven
4516227825Stheraventemplate <class _RandomAccessIterator, class _Compare>
4517227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4518227825Stheravenvoid
4519227825Stheravenpop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4520227825Stheraven{
4521227825Stheraven#ifdef _LIBCPP_DEBUG2
4522227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4523227825Stheraven    __debug_less<_Compare> __c(__comp);
4524227825Stheraven    __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first);
4525227825Stheraven#else  // _LIBCPP_DEBUG2
4526227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4527227825Stheraven    __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
4528227825Stheraven#endif  // _LIBCPP_DEBUG2
4529227825Stheraven}
4530227825Stheraven
4531227825Stheraventemplate <class _RandomAccessIterator>
4532227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4533227825Stheravenvoid
4534227825Stheravenpop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4535227825Stheraven{
4536227825Stheraven    _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4537227825Stheraven}
4538227825Stheraven
4539227825Stheraven// make_heap
4540227825Stheraven
4541227825Stheraventemplate <class _Compare, class _RandomAccessIterator>
4542227825Stheravenvoid
4543227825Stheraven__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4544227825Stheraven{
4545227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4546227825Stheraven    difference_type __n = __last - __first;
4547227825Stheraven    if (__n > 1)
4548227825Stheraven    {
4549227825Stheraven        __last = __first;
4550227825Stheraven        ++__last;
4551227825Stheraven        for (difference_type __i = 1; __i < __n;)
4552227825Stheraven            __push_heap_back<_Compare>(__first, ++__last, __comp, ++__i);
4553227825Stheraven    }
4554227825Stheraven}
4555227825Stheraven
4556227825Stheraventemplate <class _RandomAccessIterator, class _Compare>
4557227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4558227825Stheravenvoid
4559227825Stheravenmake_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4560227825Stheraven{
4561227825Stheraven#ifdef _LIBCPP_DEBUG2
4562227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4563227825Stheraven    __debug_less<_Compare> __c(__comp);
4564227825Stheraven    __make_heap<_Comp_ref>(__first, __last, __c);
4565227825Stheraven#else  // _LIBCPP_DEBUG2
4566227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4567227825Stheraven    __make_heap<_Comp_ref>(__first, __last, __comp);
4568227825Stheraven#endif  // _LIBCPP_DEBUG2
4569227825Stheraven}
4570227825Stheraven
4571227825Stheraventemplate <class _RandomAccessIterator>
4572227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4573227825Stheravenvoid
4574227825Stheravenmake_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4575227825Stheraven{
4576227825Stheraven    _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4577227825Stheraven}
4578227825Stheraven
4579227825Stheraven// sort_heap
4580227825Stheraven
4581227825Stheraventemplate <class _Compare, class _RandomAccessIterator>
4582227825Stheravenvoid
4583227825Stheraven__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4584227825Stheraven{
4585227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4586227825Stheraven    for (difference_type __n = __last - __first; __n > 1; --__last, --__n)
4587227825Stheraven        __pop_heap<_Compare>(__first, __last, __comp, __n);
4588227825Stheraven}
4589227825Stheraven
4590227825Stheraventemplate <class _RandomAccessIterator, class _Compare>
4591227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4592227825Stheravenvoid
4593227825Stheravensort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
4594227825Stheraven{
4595227825Stheraven#ifdef _LIBCPP_DEBUG2
4596227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4597227825Stheraven    __debug_less<_Compare> __c(__comp);
4598227825Stheraven    __sort_heap<_Comp_ref>(__first, __last, __c);
4599227825Stheraven#else  // _LIBCPP_DEBUG2
4600227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4601227825Stheraven    __sort_heap<_Comp_ref>(__first, __last, __comp);
4602227825Stheraven#endif  // _LIBCPP_DEBUG2
4603227825Stheraven}
4604227825Stheraven
4605227825Stheraventemplate <class _RandomAccessIterator>
4606227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4607227825Stheravenvoid
4608227825Stheravensort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
4609227825Stheraven{
4610227825Stheraven    _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4611227825Stheraven}
4612227825Stheraven
4613227825Stheraven// partial_sort
4614227825Stheraven
4615227825Stheraventemplate <class _Compare, class _RandomAccessIterator>
4616227825Stheravenvoid
4617227825Stheraven__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4618227825Stheraven             _Compare __comp)
4619227825Stheraven{
4620227825Stheraven    __make_heap<_Compare>(__first, __middle, __comp);
4621227825Stheraven    typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first;
4622227825Stheraven    for (_RandomAccessIterator __i = __middle; __i != __last; ++__i)
4623227825Stheraven    {
4624227825Stheraven        if (__comp(*__i, *__first))
4625227825Stheraven        {
4626227825Stheraven            swap(*__i, *__first);
4627227825Stheraven            __push_heap_front<_Compare>(__first, __middle, __comp, __len);
4628227825Stheraven        }
4629227825Stheraven    }
4630227825Stheraven    __sort_heap<_Compare>(__first, __middle, __comp);
4631227825Stheraven}
4632227825Stheraven
4633227825Stheraventemplate <class _RandomAccessIterator, class _Compare>
4634227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4635227825Stheravenvoid
4636227825Stheravenpartial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
4637227825Stheraven             _Compare __comp)
4638227825Stheraven{
4639227825Stheraven#ifdef _LIBCPP_DEBUG2
4640227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4641227825Stheraven    __debug_less<_Compare> __c(__comp);
4642227825Stheraven    __partial_sort<_Comp_ref>(__first, __middle, __last, __c);
4643227825Stheraven#else  // _LIBCPP_DEBUG2
4644227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4645227825Stheraven    __partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
4646227825Stheraven#endif  // _LIBCPP_DEBUG2
4647227825Stheraven}
4648227825Stheraven
4649227825Stheraventemplate <class _RandomAccessIterator>
4650227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4651227825Stheravenvoid
4652227825Stheravenpartial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
4653227825Stheraven{
4654227825Stheraven    _VSTD::partial_sort(__first, __middle, __last,
4655227825Stheraven                       __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4656227825Stheraven}
4657227825Stheraven
4658227825Stheraven// partial_sort_copy
4659227825Stheraven
4660227825Stheraventemplate <class _Compare, class _InputIterator, class _RandomAccessIterator>
4661227825Stheraven_RandomAccessIterator
4662227825Stheraven__partial_sort_copy(_InputIterator __first, _InputIterator __last,
4663227825Stheraven                    _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
4664227825Stheraven{
4665227825Stheraven    _RandomAccessIterator __r = __result_first;
4666227825Stheraven    if (__r != __result_last)
4667227825Stheraven    {
4668227825Stheraven        typename iterator_traits<_RandomAccessIterator>::difference_type __len = 0;
4669227825Stheraven        for (; __first != __last && __r != __result_last; ++__first, ++__r, ++__len)
4670227825Stheraven            *__r = *__first;
4671227825Stheraven        __make_heap<_Compare>(__result_first, __r, __comp);
4672227825Stheraven        for (; __first != __last; ++__first)
4673227825Stheraven            if (__comp(*__first, *__result_first))
4674227825Stheraven            {
4675227825Stheraven                *__result_first = *__first;
4676227825Stheraven                __push_heap_front<_Compare>(__result_first, __r, __comp, __len);
4677227825Stheraven            }
4678227825Stheraven        __sort_heap<_Compare>(__result_first, __r, __comp);
4679227825Stheraven    }
4680227825Stheraven    return __r;
4681227825Stheraven}
4682227825Stheraven
4683227825Stheraventemplate <class _InputIterator, class _RandomAccessIterator, class _Compare>
4684227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4685227825Stheraven_RandomAccessIterator
4686227825Stheravenpartial_sort_copy(_InputIterator __first, _InputIterator __last,
4687227825Stheraven                  _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
4688227825Stheraven{
4689227825Stheraven#ifdef _LIBCPP_DEBUG2
4690227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4691227825Stheraven    __debug_less<_Compare> __c(__comp);
4692227825Stheraven    return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c);
4693227825Stheraven#else  // _LIBCPP_DEBUG2
4694227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4695227825Stheraven    return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
4696227825Stheraven#endif  // _LIBCPP_DEBUG2
4697227825Stheraven}
4698227825Stheraven
4699227825Stheraventemplate <class _InputIterator, class _RandomAccessIterator>
4700227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4701227825Stheraven_RandomAccessIterator
4702227825Stheravenpartial_sort_copy(_InputIterator __first, _InputIterator __last,
4703227825Stheraven                  _RandomAccessIterator __result_first, _RandomAccessIterator __result_last)
4704227825Stheraven{
4705227825Stheraven    return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last,
4706227825Stheraven                                   __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4707227825Stheraven}
4708227825Stheraven
4709227825Stheraven// nth_element
4710227825Stheraven
4711227825Stheraventemplate <class _Compare, class _RandomAccessIterator>
4712227825Stheravenvoid
4713227825Stheraven__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
4714227825Stheraven{
4715227825Stheraven    // _Compare is known to be a reference type
4716227825Stheraven    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
4717227825Stheraven    const difference_type __limit = 7;
4718227825Stheraven    while (true)
4719227825Stheraven    {
4720227825Stheraven    __restart:
4721227825Stheraven        difference_type __len = __last - __first;
4722227825Stheraven        switch (__len)
4723227825Stheraven        {
4724227825Stheraven        case 0:
4725227825Stheraven        case 1:
4726227825Stheraven            return;
4727227825Stheraven        case 2:
4728227825Stheraven            if (__comp(*--__last, *__first))
4729227825Stheraven                swap(*__first, *__last);
4730227825Stheraven            return;
4731227825Stheraven        case 3:
4732227825Stheraven            {
4733227825Stheraven            _RandomAccessIterator __m = __first;
4734227825Stheraven            _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp);
4735227825Stheraven            return;
4736227825Stheraven            }
4737227825Stheraven        }
4738227825Stheraven        if (__len <= __limit)
4739227825Stheraven        {
4740227825Stheraven            __selection_sort<_Compare>(__first, __last, __comp);
4741227825Stheraven            return;
4742227825Stheraven        }
4743227825Stheraven        // __len > __limit >= 3
4744227825Stheraven        _RandomAccessIterator __m = __first + __len/2;
4745227825Stheraven        _RandomAccessIterator __lm1 = __last;
4746227825Stheraven        unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __comp);
4747227825Stheraven        // *__m is median
4748227825Stheraven        // partition [__first, __m) < *__m and *__m <= [__m, __last)
4749227825Stheraven        // (this inhibits tossing elements equivalent to __m around unnecessarily)
4750227825Stheraven        _RandomAccessIterator __i = __first;
4751227825Stheraven        _RandomAccessIterator __j = __lm1;
4752227825Stheraven        // j points beyond range to be tested, *__lm1 is known to be <= *__m
4753227825Stheraven        // The search going up is known to be guarded but the search coming down isn't.
4754227825Stheraven        // Prime the downward search with a guard.
4755227825Stheraven        if (!__comp(*__i, *__m))  // if *__first == *__m
4756227825Stheraven        {
4757227825Stheraven            // *__first == *__m, *__first doesn't go in first part
4758227825Stheraven            // manually guard downward moving __j against __i
4759227825Stheraven            while (true)
4760227825Stheraven            {
4761227825Stheraven                if (__i == --__j)
4762227825Stheraven                {
4763227825Stheraven                    // *__first == *__m, *__m <= all other elements
4764227825Stheraven                    // Parition instead into [__first, __i) == *__first and *__first < [__i, __last)
4765227825Stheraven                    ++__i;  // __first + 1
4766227825Stheraven                    __j = __last;
4767227825Stheraven                    if (!__comp(*__first, *--__j))  // we need a guard if *__first == *(__last-1)
4768227825Stheraven                    {
4769227825Stheraven                        while (true)
4770227825Stheraven                        {
4771227825Stheraven                            if (__i == __j)
4772227825Stheraven                                return;  // [__first, __last) all equivalent elements
4773227825Stheraven                            if (__comp(*__first, *__i))
4774227825Stheraven                            {
4775227825Stheraven                                swap(*__i, *__j);
4776227825Stheraven                                ++__n_swaps;
4777227825Stheraven                                ++__i;
4778227825Stheraven                                break;
4779227825Stheraven                            }
4780227825Stheraven                            ++__i;
4781227825Stheraven                        }
4782227825Stheraven                    }
4783227825Stheraven                    // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1
4784227825Stheraven                    if (__i == __j)
4785227825Stheraven                        return;
4786227825Stheraven                    while (true)
4787227825Stheraven                    {
4788227825Stheraven                        while (!__comp(*__first, *__i))
4789227825Stheraven                            ++__i;
4790227825Stheraven                        while (__comp(*__first, *--__j))
4791227825Stheraven                            ;
4792227825Stheraven                        if (__i >= __j)
4793227825Stheraven                            break;
4794227825Stheraven                        swap(*__i, *__j);
4795227825Stheraven                        ++__n_swaps;
4796227825Stheraven                        ++__i;
4797227825Stheraven                    }
4798227825Stheraven                    // [__first, __i) == *__first and *__first < [__i, __last)
4799227825Stheraven                    // The first part is sorted,
4800227825Stheraven                    if (__nth < __i)
4801227825Stheraven                        return;
4802227825Stheraven                    // __nth_element the secod part
4803227825Stheraven                    // __nth_element<_Compare>(__i, __nth, __last, __comp);
4804227825Stheraven                    __first = __i;
4805227825Stheraven                    goto __restart;
4806227825Stheraven                }
4807227825Stheraven                if (__comp(*__j, *__m))
4808227825Stheraven                {
4809227825Stheraven                    swap(*__i, *__j);
4810227825Stheraven                    ++__n_swaps;
4811227825Stheraven                    break;  // found guard for downward moving __j, now use unguarded partition
4812227825Stheraven                }
4813227825Stheraven            }
4814227825Stheraven        }
4815227825Stheraven        ++__i;
4816227825Stheraven        // j points beyond range to be tested, *__lm1 is known to be <= *__m
4817227825Stheraven        // if not yet partitioned...
4818227825Stheraven        if (__i < __j)
4819227825Stheraven        {
4820227825Stheraven            // known that *(__i - 1) < *__m
4821227825Stheraven            while (true)
4822227825Stheraven            {
4823227825Stheraven                // __m still guards upward moving __i
4824227825Stheraven                while (__comp(*__i, *__m))
4825227825Stheraven                    ++__i;
4826227825Stheraven                // It is now known that a guard exists for downward moving __j
4827227825Stheraven                while (!__comp(*--__j, *__m))
4828227825Stheraven                    ;
4829227825Stheraven                if (__i >= __j)
4830227825Stheraven                    break;
4831227825Stheraven                swap(*__i, *__j);
4832227825Stheraven                ++__n_swaps;
4833227825Stheraven                // It is known that __m != __j
4834227825Stheraven                // If __m just moved, follow it
4835227825Stheraven                if (__m == __i)
4836227825Stheraven                    __m = __j;
4837227825Stheraven                ++__i;
4838227825Stheraven            }
4839227825Stheraven        }
4840227825Stheraven        // [__first, __i) < *__m and *__m <= [__i, __last)
4841227825Stheraven        if (__i != __m && __comp(*__m, *__i))
4842227825Stheraven        {
4843227825Stheraven            swap(*__i, *__m);
4844227825Stheraven            ++__n_swaps;
4845227825Stheraven        }
4846227825Stheraven        // [__first, __i) < *__i and *__i <= [__i+1, __last)
4847227825Stheraven        if (__nth == __i)
4848227825Stheraven            return;
4849227825Stheraven        if (__n_swaps == 0)
4850227825Stheraven        {
4851227825Stheraven            // We were given a perfectly partitioned sequence.  Coincidence?
4852227825Stheraven            if (__nth < __i)
4853227825Stheraven            {
4854227825Stheraven                // Check for [__first, __i) already sorted
4855227825Stheraven                __j = __m = __first;
4856227825Stheraven                while (++__j != __i)
4857227825Stheraven                {
4858227825Stheraven                    if (__comp(*__j, *__m))
4859227825Stheraven                        // not yet sorted, so sort
4860227825Stheraven                        goto not_sorted;
4861227825Stheraven                    __m = __j;
4862227825Stheraven                }
4863227825Stheraven                // [__first, __i) sorted
4864227825Stheraven                return;
4865227825Stheraven            }
4866227825Stheraven            else
4867227825Stheraven            {
4868227825Stheraven                // Check for [__i, __last) already sorted
4869227825Stheraven                __j = __m = __i;
4870227825Stheraven                while (++__j != __last)
4871227825Stheraven                {
4872227825Stheraven                    if (__comp(*__j, *__m))
4873227825Stheraven                        // not yet sorted, so sort
4874227825Stheraven                        goto not_sorted;
4875227825Stheraven                    __m = __j;
4876227825Stheraven                }
4877227825Stheraven                // [__i, __last) sorted
4878227825Stheraven                return;
4879227825Stheraven            }
4880227825Stheraven        }
4881227825Stheravennot_sorted:
4882227825Stheraven        // __nth_element on range containing __nth
4883227825Stheraven        if (__nth < __i)
4884227825Stheraven        {
4885227825Stheraven            // __nth_element<_Compare>(__first, __nth, __i, __comp);
4886227825Stheraven            __last = __i;
4887227825Stheraven        }
4888227825Stheraven        else
4889227825Stheraven        {
4890227825Stheraven            // __nth_element<_Compare>(__i+1, __nth, __last, __comp);
4891227825Stheraven            __first = ++__i;
4892227825Stheraven        }
4893227825Stheraven    }
4894227825Stheraven}
4895227825Stheraven
4896227825Stheraventemplate <class _RandomAccessIterator, class _Compare>
4897227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4898227825Stheravenvoid
4899227825Stheravennth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
4900227825Stheraven{
4901227825Stheraven#ifdef _LIBCPP_DEBUG2
4902227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4903227825Stheraven    __debug_less<_Compare> __c(__comp);
4904227825Stheraven    __nth_element<_Comp_ref>(__first, __nth, __last, __c);
4905227825Stheraven#else  // _LIBCPP_DEBUG2
4906227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4907227825Stheraven    __nth_element<_Comp_ref>(__first, __nth, __last, __comp);
4908227825Stheraven#endif  // _LIBCPP_DEBUG2
4909227825Stheraven}
4910227825Stheraven
4911227825Stheraventemplate <class _RandomAccessIterator>
4912227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4913227825Stheravenvoid
4914227825Stheravennth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last)
4915227825Stheraven{
4916227825Stheraven    _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
4917227825Stheraven}
4918227825Stheraven
4919227825Stheraven// includes
4920227825Stheraven
4921227825Stheraventemplate <class _Compare, class _InputIterator1, class _InputIterator2>
4922227825Stheravenbool
4923227825Stheraven__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
4924227825Stheraven           _Compare __comp)
4925227825Stheraven{
4926227825Stheraven    for (; __first2 != __last2; ++__first1)
4927227825Stheraven    {
4928227825Stheraven        if (__first1 == __last1 || __comp(*__first2, *__first1))
4929227825Stheraven            return false;
4930227825Stheraven        if (!__comp(*__first1, *__first2))
4931227825Stheraven            ++__first2;
4932227825Stheraven    }
4933227825Stheraven    return true;
4934227825Stheraven}
4935227825Stheraven
4936227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _Compare>
4937227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4938227825Stheravenbool
4939227825Stheravenincludes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
4940227825Stheraven         _Compare __comp)
4941227825Stheraven{
4942227825Stheraven#ifdef _LIBCPP_DEBUG2
4943227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4944227825Stheraven    __debug_less<_Compare> __c(__comp);
4945227825Stheraven    return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
4946227825Stheraven#else  // _LIBCPP_DEBUG2
4947227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
4948227825Stheraven    return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
4949227825Stheraven#endif  // _LIBCPP_DEBUG2
4950227825Stheraven}
4951227825Stheraven
4952227825Stheraventemplate <class _InputIterator1, class _InputIterator2>
4953227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4954227825Stheravenbool
4955227825Stheravenincludes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2)
4956227825Stheraven{
4957227825Stheraven    return _VSTD::includes(__first1, __last1, __first2, __last2,
4958227825Stheraven                          __less<typename iterator_traits<_InputIterator1>::value_type,
4959227825Stheraven                                 typename iterator_traits<_InputIterator2>::value_type>());
4960227825Stheraven}
4961227825Stheraven
4962227825Stheraven// set_union
4963227825Stheraven
4964227825Stheraventemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4965227825Stheraven_OutputIterator
4966227825Stheraven__set_union(_InputIterator1 __first1, _InputIterator1 __last1,
4967227825Stheraven            _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4968227825Stheraven{
4969227825Stheraven    for (; __first1 != __last1; ++__result)
4970227825Stheraven    {
4971227825Stheraven        if (__first2 == __last2)
4972227825Stheraven            return _VSTD::copy(__first1, __last1, __result);
4973227825Stheraven        if (__comp(*__first2, *__first1))
4974227825Stheraven        {
4975227825Stheraven            *__result = *__first2;
4976227825Stheraven            ++__first2;
4977227825Stheraven        }
4978227825Stheraven        else
4979227825Stheraven        {
4980227825Stheraven            *__result = *__first1;
4981227825Stheraven            if (!__comp(*__first1, *__first2))
4982227825Stheraven                ++__first2;
4983227825Stheraven            ++__first1;
4984227825Stheraven        }
4985227825Stheraven    }
4986227825Stheraven    return _VSTD::copy(__first2, __last2, __result);
4987227825Stheraven}
4988227825Stheraven
4989227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
4990227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
4991227825Stheraven_OutputIterator
4992227825Stheravenset_union(_InputIterator1 __first1, _InputIterator1 __last1,
4993227825Stheraven          _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4994227825Stheraven{
4995227825Stheraven#ifdef _LIBCPP_DEBUG2
4996227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
4997227825Stheraven    __debug_less<_Compare> __c(__comp);
4998227825Stheraven    return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
4999227825Stheraven#else  // _LIBCPP_DEBUG2
5000227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5001227825Stheraven    return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
5002227825Stheraven#endif  // _LIBCPP_DEBUG2
5003227825Stheraven}
5004227825Stheraven
5005227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5006227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5007227825Stheraven_OutputIterator
5008227825Stheravenset_union(_InputIterator1 __first1, _InputIterator1 __last1,
5009227825Stheraven          _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5010227825Stheraven{
5011227825Stheraven    return _VSTD::set_union(__first1, __last1, __first2, __last2, __result,
5012227825Stheraven                          __less<typename iterator_traits<_InputIterator1>::value_type,
5013227825Stheraven                                 typename iterator_traits<_InputIterator2>::value_type>());
5014227825Stheraven}
5015227825Stheraven
5016227825Stheraven// set_intersection
5017227825Stheraven
5018227825Stheraventemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5019227825Stheraven_OutputIterator
5020227825Stheraven__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5021227825Stheraven                   _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5022227825Stheraven{
5023227825Stheraven    while (__first1 != __last1 && __first2 != __last2)
5024227825Stheraven    {
5025227825Stheraven        if (__comp(*__first1, *__first2))
5026227825Stheraven            ++__first1;
5027227825Stheraven        else
5028227825Stheraven        {
5029227825Stheraven            if (!__comp(*__first2, *__first1))
5030227825Stheraven            {
5031227825Stheraven                *__result = *__first1;
5032227825Stheraven                ++__result;
5033227825Stheraven                ++__first1;
5034227825Stheraven            }
5035227825Stheraven            ++__first2;
5036227825Stheraven        }
5037227825Stheraven    }
5038227825Stheraven    return __result;
5039227825Stheraven}
5040227825Stheraven
5041227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5042227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5043227825Stheraven_OutputIterator
5044227825Stheravenset_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5045227825Stheraven                 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5046227825Stheraven{
5047227825Stheraven#ifdef _LIBCPP_DEBUG2
5048227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5049227825Stheraven    __debug_less<_Compare> __c(__comp);
5050227825Stheraven    return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
5051227825Stheraven#else  // _LIBCPP_DEBUG2
5052227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5053227825Stheraven    return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
5054227825Stheraven#endif  // _LIBCPP_DEBUG2
5055227825Stheraven}
5056227825Stheraven
5057227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5058227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5059227825Stheraven_OutputIterator
5060227825Stheravenset_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5061227825Stheraven                 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5062227825Stheraven{
5063227825Stheraven    return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __result,
5064227825Stheraven                                  __less<typename iterator_traits<_InputIterator1>::value_type,
5065227825Stheraven                                         typename iterator_traits<_InputIterator2>::value_type>());
5066227825Stheraven}
5067227825Stheraven
5068227825Stheraven// set_difference
5069227825Stheraven
5070227825Stheraventemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5071227825Stheraven_OutputIterator
5072227825Stheraven__set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5073227825Stheraven                 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5074227825Stheraven{
5075227825Stheraven    while (__first1 != __last1)
5076227825Stheraven    {
5077227825Stheraven        if (__first2 == __last2)
5078227825Stheraven            return _VSTD::copy(__first1, __last1, __result);
5079227825Stheraven        if (__comp(*__first1, *__first2))
5080227825Stheraven        {
5081227825Stheraven            *__result = *__first1;
5082227825Stheraven            ++__result;
5083227825Stheraven            ++__first1;
5084227825Stheraven        }
5085227825Stheraven        else
5086227825Stheraven        {
5087227825Stheraven            if (!__comp(*__first2, *__first1))
5088227825Stheraven                ++__first1;
5089227825Stheraven            ++__first2;
5090227825Stheraven        }
5091227825Stheraven    }
5092227825Stheraven    return __result;
5093227825Stheraven}
5094227825Stheraven
5095227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5096227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5097227825Stheraven_OutputIterator
5098227825Stheravenset_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5099227825Stheraven               _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5100227825Stheraven{
5101227825Stheraven#ifdef _LIBCPP_DEBUG2
5102227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5103227825Stheraven    __debug_less<_Compare> __c(__comp);
5104227825Stheraven    return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
5105227825Stheraven#else  // _LIBCPP_DEBUG2
5106227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5107227825Stheraven    return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
5108227825Stheraven#endif  // _LIBCPP_DEBUG2
5109227825Stheraven}
5110227825Stheraven
5111227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5112227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5113227825Stheraven_OutputIterator
5114227825Stheravenset_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5115227825Stheraven               _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5116227825Stheraven{
5117227825Stheraven    return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result,
5118227825Stheraven                                __less<typename iterator_traits<_InputIterator1>::value_type,
5119227825Stheraven                                       typename iterator_traits<_InputIterator2>::value_type>());
5120227825Stheraven}
5121227825Stheraven
5122227825Stheraven// set_symmetric_difference
5123227825Stheraven
5124227825Stheraventemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
5125227825Stheraven_OutputIterator
5126227825Stheraven__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5127227825Stheraven                           _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5128227825Stheraven{
5129227825Stheraven    while (__first1 != __last1)
5130227825Stheraven    {
5131227825Stheraven        if (__first2 == __last2)
5132227825Stheraven            return _VSTD::copy(__first1, __last1, __result);
5133227825Stheraven        if (__comp(*__first1, *__first2))
5134227825Stheraven        {
5135227825Stheraven            *__result = *__first1;
5136227825Stheraven            ++__result;
5137227825Stheraven            ++__first1;
5138227825Stheraven        }
5139227825Stheraven        else
5140227825Stheraven        {
5141227825Stheraven            if (__comp(*__first2, *__first1))
5142227825Stheraven            {
5143227825Stheraven                *__result = *__first2;
5144227825Stheraven                ++__result;
5145227825Stheraven            }
5146227825Stheraven            else
5147227825Stheraven                ++__first1;
5148227825Stheraven            ++__first2;
5149227825Stheraven        }
5150227825Stheraven    }
5151227825Stheraven    return _VSTD::copy(__first2, __last2, __result);
5152227825Stheraven}
5153227825Stheraven
5154227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare>
5155227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5156227825Stheraven_OutputIterator
5157227825Stheravenset_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5158227825Stheraven                         _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
5159227825Stheraven{
5160227825Stheraven#ifdef _LIBCPP_DEBUG2
5161227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5162227825Stheraven    __debug_less<_Compare> __c(__comp);
5163227825Stheraven    return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
5164227825Stheraven#else  // _LIBCPP_DEBUG2
5165227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5166227825Stheraven    return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
5167227825Stheraven#endif  // _LIBCPP_DEBUG2
5168227825Stheraven}
5169227825Stheraven
5170227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator>
5171227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5172227825Stheraven_OutputIterator
5173227825Stheravenset_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5174227825Stheraven                         _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)
5175227825Stheraven{
5176227825Stheraven    return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
5177227825Stheraven                                          __less<typename iterator_traits<_InputIterator1>::value_type,
5178227825Stheraven                                                 typename iterator_traits<_InputIterator2>::value_type>());
5179227825Stheraven}
5180227825Stheraven
5181227825Stheraven// lexicographical_compare
5182227825Stheraven
5183227825Stheraventemplate <class _Compare, class _InputIterator1, class _InputIterator2>
5184227825Stheravenbool
5185227825Stheraven__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5186227825Stheraven                          _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5187227825Stheraven{
5188227825Stheraven    for (; __first2 != __last2; ++__first1, ++__first2)
5189227825Stheraven    {
5190227825Stheraven        if (__first1 == __last1 || __comp(*__first1, *__first2))
5191227825Stheraven            return true;
5192227825Stheraven        if (__comp(*__first2, *__first1))
5193227825Stheraven            return false;
5194227825Stheraven    }
5195227825Stheraven    return false;
5196227825Stheraven}
5197227825Stheraven
5198227825Stheraventemplate <class _InputIterator1, class _InputIterator2, class _Compare>
5199227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5200227825Stheravenbool
5201227825Stheravenlexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5202227825Stheraven                        _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
5203227825Stheraven{
5204227825Stheraven#ifdef _LIBCPP_DEBUG2
5205227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5206227825Stheraven    __debug_less<_Compare> __c(__comp);
5207227825Stheraven    return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
5208227825Stheraven#else  // _LIBCPP_DEBUG2
5209227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5210227825Stheraven    return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
5211227825Stheraven#endif  // _LIBCPP_DEBUG2
5212227825Stheraven}
5213227825Stheraven
5214227825Stheraventemplate <class _InputIterator1, class _InputIterator2>
5215227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5216227825Stheravenbool
5217227825Stheravenlexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
5218227825Stheraven                        _InputIterator2 __first2, _InputIterator2 __last2)
5219227825Stheraven{
5220227825Stheraven    return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2,
5221227825Stheraven                                         __less<typename iterator_traits<_InputIterator1>::value_type,
5222227825Stheraven                                                typename iterator_traits<_InputIterator2>::value_type>());
5223227825Stheraven}
5224227825Stheraven
5225227825Stheraven// next_permutation
5226227825Stheraven
5227227825Stheraventemplate <class _Compare, class _BidirectionalIterator>
5228227825Stheravenbool
5229227825Stheraven__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5230227825Stheraven{
5231227825Stheraven    _BidirectionalIterator __i = __last;
5232227825Stheraven    if (__first == __last || __first == --__i)
5233227825Stheraven        return false;
5234227825Stheraven    while (true)
5235227825Stheraven    {
5236227825Stheraven        _BidirectionalIterator __ip1 = __i;
5237227825Stheraven        if (__comp(*--__i, *__ip1))
5238227825Stheraven        {
5239227825Stheraven            _BidirectionalIterator __j = __last;
5240227825Stheraven            while (!__comp(*__i, *--__j))
5241227825Stheraven                ;
5242227825Stheraven            swap(*__i, *__j);
5243227825Stheraven            _VSTD::reverse(__ip1, __last);
5244227825Stheraven            return true;
5245227825Stheraven        }
5246227825Stheraven        if (__i == __first)
5247227825Stheraven        {
5248227825Stheraven            _VSTD::reverse(__first, __last);
5249227825Stheraven            return false;
5250227825Stheraven        }
5251227825Stheraven    }
5252227825Stheraven}
5253227825Stheraven
5254227825Stheraventemplate <class _BidirectionalIterator, class _Compare>
5255227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5256227825Stheravenbool
5257227825Stheravennext_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5258227825Stheraven{
5259227825Stheraven#ifdef _LIBCPP_DEBUG2
5260227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5261227825Stheraven    __debug_less<_Compare> __c(__comp);
5262227825Stheraven    return __next_permutation<_Comp_ref>(__first, __last, __c);
5263227825Stheraven#else  // _LIBCPP_DEBUG2
5264227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5265227825Stheraven    return __next_permutation<_Comp_ref>(__first, __last, __comp);
5266227825Stheraven#endif  // _LIBCPP_DEBUG2
5267227825Stheraven}
5268227825Stheraven
5269227825Stheraventemplate <class _BidirectionalIterator>
5270227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5271227825Stheravenbool
5272227825Stheravennext_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5273227825Stheraven{
5274227825Stheraven    return _VSTD::next_permutation(__first, __last,
5275227825Stheraven                                  __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5276227825Stheraven}
5277227825Stheraven
5278227825Stheraven// prev_permutation
5279227825Stheraven
5280227825Stheraventemplate <class _Compare, class _BidirectionalIterator>
5281227825Stheravenbool
5282227825Stheraven__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5283227825Stheraven{
5284227825Stheraven    _BidirectionalIterator __i = __last;
5285227825Stheraven    if (__first == __last || __first == --__i)
5286227825Stheraven        return false;
5287227825Stheraven    while (true)
5288227825Stheraven    {
5289227825Stheraven        _BidirectionalIterator __ip1 = __i;
5290227825Stheraven        if (__comp(*__ip1, *--__i))
5291227825Stheraven        {
5292227825Stheraven            _BidirectionalIterator __j = __last;
5293227825Stheraven            while (!__comp(*--__j, *__i))
5294227825Stheraven                ;
5295227825Stheraven            swap(*__i, *__j);
5296227825Stheraven            _VSTD::reverse(__ip1, __last);
5297227825Stheraven            return true;
5298227825Stheraven        }
5299227825Stheraven        if (__i == __first)
5300227825Stheraven        {
5301227825Stheraven            _VSTD::reverse(__first, __last);
5302227825Stheraven            return false;
5303227825Stheraven        }
5304227825Stheraven    }
5305227825Stheraven}
5306227825Stheraven
5307227825Stheraventemplate <class _BidirectionalIterator, class _Compare>
5308227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5309227825Stheravenbool
5310227825Stheravenprev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
5311227825Stheraven{
5312227825Stheraven#ifdef _LIBCPP_DEBUG2
5313227825Stheraven    typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
5314227825Stheraven    __debug_less<_Compare> __c(__comp);
5315227825Stheraven    return __prev_permutation<_Comp_ref>(__first, __last, __c);
5316227825Stheraven#else  // _LIBCPP_DEBUG2
5317227825Stheraven    typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
5318227825Stheraven    return __prev_permutation<_Comp_ref>(__first, __last, __comp);
5319227825Stheraven#endif  // _LIBCPP_DEBUG2
5320227825Stheraven}
5321227825Stheraven
5322227825Stheraventemplate <class _BidirectionalIterator>
5323227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5324227825Stheravenbool
5325227825Stheravenprev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
5326227825Stheraven{
5327227825Stheraven    return _VSTD::prev_permutation(__first, __last,
5328227825Stheraven                                  __less<typename iterator_traits<_BidirectionalIterator>::value_type>());
5329227825Stheraven}
5330227825Stheraven
5331227825Stheraventemplate <class _Tp>
5332227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5333227825Stheraventypename enable_if
5334227825Stheraven<
5335227825Stheraven    is_integral<_Tp>::value,
5336227825Stheraven    _Tp
5337227825Stheraven>::type
5338227825Stheraven__rotate_left(_Tp __t, _Tp __n = 1)
5339227825Stheraven{
5340227825Stheraven    const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5341227825Stheraven    __n &= __bits;
5342227825Stheraven    return static_cast<_Tp>((__t << __n) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> (__bits - __n)));
5343227825Stheraven}
5344227825Stheraven
5345227825Stheraventemplate <class _Tp>
5346227825Stheraveninline _LIBCPP_INLINE_VISIBILITY
5347227825Stheraventypename enable_if
5348227825Stheraven<
5349227825Stheraven    is_integral<_Tp>::value,
5350227825Stheraven    _Tp
5351227825Stheraven>::type
5352227825Stheraven__rotate_right(_Tp __t, _Tp __n = 1)
5353227825Stheraven{
5354227825Stheraven    const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
5355227825Stheraven    __n &= __bits;
5356227825Stheraven    return static_cast<_Tp>((__t << (__bits - __n)) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> __n));
5357227825Stheraven}
5358227825Stheraven
5359227825Stheraven_LIBCPP_END_NAMESPACE_STD
5360227825Stheraven
5361227825Stheraven#endif  // _LIBCPP_ALGORITHM
5362