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