1 // <algorithm> declarations -*- C++ -*-
3 // Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
25 /** @file bits/algorithmfwd.h
26 * This is an internal header file, included by other library headers.
27 * You should not attempt to use it directly.
30 #ifndef _GLIBCXX_ALGORITHMFWD_H
31 #define _GLIBCXX_ALGORITHMFWD_H 1
33 #pragma GCC system_header
35 #include <bits/c++config.h>
36 #include <bits/stl_pair.h>
37 #include <bits/stl_iterator_base_types.h>
38 #include <initializer_list>
40 _GLIBCXX_BEGIN_NAMESPACE(std)
69 is_partitioned (C++0x)
71 is_sorted_until (C++0x)
73 lexicographical_compare
82 minmax_element (C++0x)
90 partition_copy (C++0x)
91 partition_point (C++0x)
112 set_symmetric_difference
127 * @defgroup algorithms Algorithms
129 * Components for performing algorithmic operations. Includes
130 * non-modifying sequence, modifying (mutating) sequence, sorting,
131 * searching, merge, partition, heap, set, minima, maxima, and
132 * permutation operations.
136 * @defgroup mutating_algorithms Mutating Algorithms
137 * @ingroup algorithms
141 * @defgroup non_mutating_algorithms Non-Mutating Algorithms
142 * @ingroup algorithms
146 * @defgroup sorting_algorithms Sorting Algorithms
147 * @ingroup algorithms
151 * @defgroup set_algorithms Set Operation Algorithms
152 * @ingroup sorting_algorithms
154 * These algorithms are common set operations performed on sequences
155 * that are already sorted. The number of comparisons will be
160 * @defgroup binary_search_algorithms Binary Search Algorithms
161 * @ingroup sorting_algorithms
163 * These algorithms are variations of a classic binary search, and
164 * all assume that the sequence being searched is already sorted.
166 * The number of comparisons will be logarithmic (and as few as
167 * possible). The number of steps through the sequence will be
168 * logarithmic for random-access iterators (e.g., pointers), and
171 * The LWG has passed Defect Report 270, which notes: <em>The
172 * proposed resolution reinterprets binary search. Instead of
173 * thinking about searching for a value in a sorted range, we view
174 * that as an important special case of a more general algorithm:
175 * searching for the partition point in a partitioned range. We
176 * also add a guarantee that the old wording did not: we ensure that
177 * the upper bound is no earlier than the lower bound, that the pair
178 * returned by equal_range is a valid range, and that the first part
179 * of that pair is the lower bound.</em>
181 * The actual effect of the first sentence is that a comparison
182 * functor passed by the user doesn't necessarily need to induce a
183 * strict weak ordering relation. Rather, it partitions the range.
188 #ifdef __GXX_EXPERIMENTAL_CXX0X__
189 template<typename _IIter, typename _Predicate>
191 all_of(_IIter, _IIter, _Predicate);
193 template<typename _IIter, typename _Predicate>
195 any_of(_IIter, _IIter, _Predicate);
198 template<typename _FIter, typename _Tp>
200 binary_search(_FIter, _FIter, const _Tp&);
202 template<typename _FIter, typename _Tp, typename _Compare>
204 binary_search(_FIter, _FIter, const _Tp&, _Compare);
206 template<typename _IIter, typename _OIter>
208 copy(_IIter, _IIter, _OIter);
210 template<typename _BIter1, typename _BIter2>
212 copy_backward(_BIter1, _BIter1, _BIter2);
214 #ifdef __GXX_EXPERIMENTAL_CXX0X__
215 template<typename _IIter, typename _OIter, typename _Predicate>
217 copy_if(_IIter, _IIter, _OIter, _Predicate);
219 template<typename _IIter, typename _Size, typename _OIter>
221 copy_n(_IIter, _Size, _OIter);
227 template<typename _FIter, typename _Tp>
229 equal_range(_FIter, _FIter, const _Tp&);
231 template<typename _FIter, typename _Tp, typename _Compare>
233 equal_range(_FIter, _FIter, const _Tp&, _Compare);
235 template<typename _FIter, typename _Tp>
237 fill(_FIter, _FIter, const _Tp&);
240 XXX NB: return type different from ISO C++.
241 template<typename _OIter, typename _Size, typename _Tp>
243 fill_n(_OIter, _Size, const _Tp&);
246 template<typename _OIter, typename _Size, typename _Tp>
248 fill_n(_OIter, _Size, const _Tp&);
252 template<typename _FIter1, typename _FIter2>
254 find_end(_FIter1, _FIter1, _FIter2, _FIter2);
256 template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
258 find_end(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
263 #ifdef __GXX_EXPERIMENTAL_CXX0X__
264 template<typename _IIter, typename _Predicate>
266 find_if_not(_IIter, _IIter, _Predicate);
273 template<typename _IIter1, typename _IIter2>
275 includes(_IIter1, _IIter1, _IIter2, _IIter2);
277 template<typename _IIter1, typename _IIter2, typename _Compare>
279 includes(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);
281 template<typename _BIter>
283 inplace_merge(_BIter, _BIter, _BIter);
285 template<typename _BIter, typename _Compare>
287 inplace_merge(_BIter, _BIter, _BIter, _Compare);
289 #ifdef __GXX_EXPERIMENTAL_CXX0X__
290 template<typename _RAIter>
292 is_heap(_RAIter, _RAIter);
294 template<typename _RAIter, typename _Compare>
296 is_heap(_RAIter, _RAIter, _Compare);
298 template<typename _RAIter>
300 is_heap_until(_RAIter, _RAIter);
302 template<typename _RAIter, typename _Compare>
304 is_heap_until(_RAIter, _RAIter, _Compare);
306 template<typename _IIter, typename _Predicate>
308 is_partitioned(_IIter, _IIter, _Predicate);
310 template<typename _FIter>
312 is_sorted(_FIter, _FIter);
314 template<typename _FIter, typename _Compare>
316 is_sorted(_FIter, _FIter, _Compare);
318 template<typename _FIter>
320 is_sorted_until(_FIter, _FIter);
322 template<typename _FIter, typename _Compare>
324 is_sorted_until(_FIter, _FIter, _Compare);
327 template<typename _FIter1, typename _FIter2>
329 iter_swap(_FIter1, _FIter2);
331 template<typename _FIter, typename _Tp>
333 lower_bound(_FIter, _FIter, const _Tp&);
335 template<typename _FIter, typename _Tp, typename _Compare>
337 lower_bound(_FIter, _FIter, const _Tp&, _Compare);
339 template<typename _RAIter>
341 make_heap(_RAIter, _RAIter);
343 template<typename _RAIter, typename _Compare>
345 make_heap(_RAIter, _RAIter, _Compare);
347 template<typename _Tp>
349 max(const _Tp&, const _Tp&);
351 template<typename _Tp, typename _Compare>
353 max(const _Tp&, const _Tp&, _Compare);
358 template<typename _Tp>
360 min(const _Tp&, const _Tp&);
362 template<typename _Tp, typename _Compare>
364 min(const _Tp&, const _Tp&, _Compare);
368 #ifdef __GXX_EXPERIMENTAL_CXX0X__
369 template<typename _Tp>
370 pair<const _Tp&, const _Tp&>
371 minmax(const _Tp&, const _Tp&);
373 template<typename _Tp, typename _Compare>
374 pair<const _Tp&, const _Tp&>
375 minmax(const _Tp&, const _Tp&, _Compare);
377 template<typename _FIter>
379 minmax_element(_FIter, _FIter);
381 template<typename _FIter, typename _Compare>
383 minmax_element(_FIter, _FIter, _Compare);
385 template<typename _Tp>
387 min(initializer_list<_Tp>);
389 template<typename _Tp, typename _Compare>
391 min(initializer_list<_Tp>, _Compare);
393 template<typename _Tp>
395 max(initializer_list<_Tp>);
397 template<typename _Tp, typename _Compare>
399 max(initializer_list<_Tp>, _Compare);
401 template<typename _Tp>
403 minmax(initializer_list<_Tp>);
405 template<typename _Tp, typename _Compare>
407 minmax(initializer_list<_Tp>, _Compare);
412 template<typename _BIter>
414 next_permutation(_BIter, _BIter);
416 template<typename _BIter, typename _Compare>
418 next_permutation(_BIter, _BIter, _Compare);
420 #ifdef __GXX_EXPERIMENTAL_CXX0X__
421 template<typename _IIter, typename _Predicate>
423 none_of(_IIter, _IIter, _Predicate);
429 template<typename _IIter, typename _RAIter>
431 partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter);
433 template<typename _IIter, typename _RAIter, typename _Compare>
435 partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter, _Compare);
439 #ifdef __GXX_EXPERIMENTAL_CXX0X__
440 template<typename _IIter, typename _OIter1,
441 typename _OIter2, typename _Predicate>
442 pair<_OIter1, _OIter2>
443 partition_copy(_IIter, _IIter, _OIter1, _OIter2, _Predicate);
445 template<typename _FIter, typename _Predicate>
447 partition_point(_FIter, _FIter, _Predicate);
450 template<typename _RAIter>
452 pop_heap(_RAIter, _RAIter);
454 template<typename _RAIter, typename _Compare>
456 pop_heap(_RAIter, _RAIter, _Compare);
458 template<typename _BIter>
460 prev_permutation(_BIter, _BIter);
462 template<typename _BIter, typename _Compare>
464 prev_permutation(_BIter, _BIter, _Compare);
466 template<typename _RAIter>
468 push_heap(_RAIter, _RAIter);
470 template<typename _RAIter, typename _Compare>
472 push_heap(_RAIter, _RAIter, _Compare);
476 template<typename _FIter, typename _Tp>
478 remove(_FIter, _FIter, const _Tp&);
480 template<typename _FIter, typename _Predicate>
482 remove_if(_FIter, _FIter, _Predicate);
484 template<typename _IIter, typename _OIter, typename _Tp>
486 remove_copy(_IIter, _IIter, _OIter, const _Tp&);
488 template<typename _IIter, typename _OIter, typename _Predicate>
490 remove_copy_if(_IIter, _IIter, _OIter, _Predicate);
494 template<typename _IIter, typename _OIter, typename _Tp>
496 replace_copy(_IIter, _IIter, _OIter, const _Tp&, const _Tp&);
498 template<typename _Iter, typename _OIter, typename _Predicate, typename _Tp>
500 replace_copy_if(_Iter, _Iter, _OIter, _Predicate, const _Tp&);
504 template<typename _BIter>
506 reverse(_BIter, _BIter);
508 template<typename _BIter, typename _OIter>
510 reverse_copy(_BIter, _BIter, _OIter);
512 template<typename _FIter>
514 rotate(_FIter, _FIter, _FIter);
516 template<typename _FIter, typename _OIter>
518 rotate_copy(_FIter, _FIter, _FIter, _OIter);
524 // set_symmetric_difference
527 template<typename _RAIter>
529 sort_heap(_RAIter, _RAIter);
531 template<typename _RAIter, typename _Compare>
533 sort_heap(_RAIter, _RAIter, _Compare);
535 template<typename _BIter, typename _Predicate>
537 stable_partition(_BIter, _BIter, _Predicate);
539 template<typename _Tp>
543 template<typename _Tp, size_t _Nm>
545 swap(_Tp (&)[_Nm], _Tp (&)[_Nm]);
547 template<typename _FIter1, typename _FIter2>
549 swap_ranges(_FIter1, _FIter1, _FIter2);
553 template<typename _FIter>
555 unique(_FIter, _FIter);
557 template<typename _FIter, typename _BinaryPredicate>
559 unique(_FIter, _FIter, _BinaryPredicate);
563 template<typename _FIter, typename _Tp>
565 upper_bound(_FIter, _FIter, const _Tp&);
567 template<typename _FIter, typename _Tp, typename _Compare>
569 upper_bound(_FIter, _FIter, const _Tp&, _Compare);
571 _GLIBCXX_END_NAMESPACE
573 _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_P)
575 template<typename _FIter>
577 adjacent_find(_FIter, _FIter);
579 template<typename _FIter, typename _BinaryPredicate>
581 adjacent_find(_FIter, _FIter, _BinaryPredicate);
583 template<typename _IIter, typename _Tp>
584 typename iterator_traits<_IIter>::difference_type
585 count(_IIter, _IIter, const _Tp&);
587 template<typename _IIter, typename _Predicate>
588 typename iterator_traits<_IIter>::difference_type
589 count_if(_IIter, _IIter, _Predicate);
591 template<typename _IIter1, typename _IIter2>
593 equal(_IIter1, _IIter1, _IIter2);
595 template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
597 equal(_IIter1, _IIter1, _IIter2, _BinaryPredicate);
599 template<typename _IIter, typename _Tp>
601 find(_IIter, _IIter, const _Tp&);
603 template<typename _FIter1, typename _FIter2>
605 find_first_of(_FIter1, _FIter1, _FIter2, _FIter2);
607 template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
609 find_first_of(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
611 template<typename _IIter, typename _Predicate>
613 find_if(_IIter, _IIter, _Predicate);
615 template<typename _IIter, typename _Funct>
617 for_each(_IIter, _IIter, _Funct);
619 template<typename _FIter, typename _Generator>
621 generate(_FIter, _FIter, _Generator);
624 XXX NB: return type different from ISO C++.
625 template<typename _OIter, typename _Size, typename _Tp>
627 generate_n(_OIter, _Size, _Generator);
630 template<typename _OIter, typename _Size, typename _Generator>
632 generate_n(_OIter, _Size, _Generator);
634 template<typename _IIter1, typename _IIter2>
636 lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2);
638 template<typename _IIter1, typename _IIter2, typename _Compare>
640 lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);
642 template<typename _FIter>
644 max_element(_FIter, _FIter);
646 template<typename _FIter, typename _Compare>
648 max_element(_FIter, _FIter, _Compare);
650 template<typename _IIter1, typename _IIter2, typename _OIter>
652 merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
654 template<typename _IIter1, typename _IIter2, typename _OIter,
657 merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
659 template<typename _FIter>
661 min_element(_FIter, _FIter);
663 template<typename _FIter, typename _Compare>
665 min_element(_FIter, _FIter, _Compare);
667 template<typename _IIter1, typename _IIter2>
668 pair<_IIter1, _IIter2>
669 mismatch(_IIter1, _IIter1, _IIter2);
671 template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
672 pair<_IIter1, _IIter2>
673 mismatch(_IIter1, _IIter1, _IIter2, _BinaryPredicate);
675 template<typename _RAIter>
677 nth_element(_RAIter, _RAIter, _RAIter);
679 template<typename _RAIter, typename _Compare>
681 nth_element(_RAIter, _RAIter, _RAIter, _Compare);
683 template<typename _RAIter>
685 partial_sort(_RAIter, _RAIter, _RAIter);
687 template<typename _RAIter, typename _Compare>
689 partial_sort(_RAIter, _RAIter, _RAIter, _Compare);
691 template<typename _BIter, typename _Predicate>
693 partition(_BIter, _BIter, _Predicate);
695 template<typename _RAIter>
697 random_shuffle(_RAIter, _RAIter);
699 template<typename _RAIter, typename _Generator>
701 random_shuffle(_RAIter, _RAIter, _Generator&);
703 template<typename _FIter, typename _Tp>
705 replace(_FIter, _FIter, const _Tp&, const _Tp&);
707 template<typename _FIter, typename _Predicate, typename _Tp>
709 replace_if(_FIter, _FIter, _Predicate, const _Tp&);
711 template<typename _FIter1, typename _FIter2>
713 search(_FIter1, _FIter1, _FIter2, _FIter2);
715 template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
717 search(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
719 template<typename _FIter, typename _Size, typename _Tp>
721 search_n(_FIter, _FIter, _Size, const _Tp&);
723 template<typename _FIter, typename _Size, typename _Tp,
724 typename _BinaryPredicate>
726 search_n(_FIter, _FIter, _Size, const _Tp&, _BinaryPredicate);
728 template<typename _IIter1, typename _IIter2, typename _OIter>
730 set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
732 template<typename _IIter1, typename _IIter2, typename _OIter,
735 set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
737 template<typename _IIter1, typename _IIter2, typename _OIter>
739 set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
741 template<typename _IIter1, typename _IIter2, typename _OIter,
744 set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
746 template<typename _IIter1, typename _IIter2, typename _OIter>
748 set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
750 template<typename _IIter1, typename _IIter2, typename _OIter,
753 set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2,
756 template<typename _IIter1, typename _IIter2, typename _OIter>
758 set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
760 template<typename _IIter1, typename _IIter2, typename _OIter,
763 set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
765 template<typename _RAIter>
767 sort(_RAIter, _RAIter);
769 template<typename _RAIter, typename _Compare>
771 sort(_RAIter, _RAIter, _Compare);
773 template<typename _RAIter>
775 stable_sort(_RAIter, _RAIter);
777 template<typename _RAIter, typename _Compare>
779 stable_sort(_RAIter, _RAIter, _Compare);
781 template<typename _IIter, typename _OIter, typename _UnaryOperation>
783 transform(_IIter, _IIter, _OIter, _UnaryOperation);
785 template<typename _IIter1, typename _IIter2, typename _OIter,
786 typename _BinaryOperation>
788 transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation);
790 template<typename _IIter, typename _OIter>
792 unique_copy(_IIter, _IIter, _OIter);
794 template<typename _IIter, typename _OIter, typename _BinaryPredicate>
796 unique_copy(_IIter, _IIter, _OIter, _BinaryPredicate);
798 _GLIBCXX_END_NESTED_NAMESPACE
800 #ifdef _GLIBCXX_NAMESPACE_ASSOCIATION_PARALLEL
801 # include <parallel/algorithmfwd.h>