1
 
/*      Copyright (C) 2004 Garrett A. Kajmowicz
 
2
 
        This file is part of the uClibc++ Library.
 
3
 
        This library is free software; you can redistribute it and/or
 
4
 
        modify it under the terms of the GNU Lesser General Public
 
5
 
        License as published by the Free Software Foundation; either
 
6
 
        version 2.1 of the License, or (at your option) any later version.
 
8
 
        This library is distributed in the hope that it will be useful,
 
9
 
        but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
11
 
        Lesser General Public License for more details.
 
13
 
        You should have received a copy of the GNU Lesser General Public
 
14
 
        License along with this library; if not, write to the Free Software
 
15
 
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
23
 
#ifndef __STD_HEADER_ALGORITHM
 
24
 
#define __STD_HEADER_ALGORITHM 1
 
26
 
//Elliminate any previously defined macro
 
30
 
#pragma GCC visibility push(default)
 
34
 
        // subclause _lib.alg.nonmodifying_, non-modifying sequence operations:
 
35
 
        template<class InputIterator, class Function> _UCXXEXPORT
 
36
 
                Function for_each(InputIterator first, InputIterator last, Function f)
 
46
 
        template<class InputIterator, class T> _UCXXEXPORT
 
47
 
                InputIterator find(InputIterator first, InputIterator last, const T& value)
 
49
 
                while(first !=last && ! ( *first == value ) ){
 
55
 
        template<class InputIterator, class Predicate> _UCXXEXPORT
 
56
 
                InputIterator find_if(InputIterator first, InputIterator last, Predicate pred)
 
58
 
                while(first !=last && !pred(*first)){
 
64
 
        template<class ForwardIterator1, class ForwardIterator2> _UCXXEXPORT ForwardIterator1
 
65
 
                find_end(ForwardIterator1 first1, ForwardIterator1 last1,
 
66
 
                        ForwardIterator2 first2, ForwardIterator2 last2)
 
68
 
                ForwardIterator1 retval = last1;
 
69
 
                while(first1 !=last1){
 
70
 
                        ForwardIterator1 temp1(first1);
 
71
 
                        ForwardIterator2 temp2(first2);
 
72
 
                        while(temp2!=last2 && temp1!= last1){
 
74
 
                                        break;          //Exit while loop
 
78
 
                                if(temp2 == last2){     //Have successfully checked the whole sequence
 
86
 
        template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> _UCXXEXPORT
 
88
 
                find_end(ForwardIterator1 first1, ForwardIterator1 last1,
 
89
 
                        ForwardIterator2 first2, ForwardIterator2 last2,
 
92
 
                ForwardIterator1 retval = last1;
 
93
 
                while(first1 !=last1){
 
94
 
                        ForwardIterator1 temp1(first1);
 
95
 
                        ForwardIterator2 temp2(first2);
 
96
 
                        while(temp2!=last2 && temp1!= last1){
 
97
 
                                if( ! pred(*temp1, *temp2)){
 
98
 
                                        break;          //Exit while loop
 
102
 
                                if(temp2 == last2){     //Have successfully checked the whole sequence
 
110
 
        template<class ForwardIterator1, class ForwardIterator2> _UCXXEXPORT
 
112
 
                find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
 
113
 
                        ForwardIterator2 first2, ForwardIterator2 last2)
 
115
 
                while(first1 != last1){
 
116
 
                        ForwardIterator2 temp2(first2);
 
117
 
                        while(temp2 != last2 ){
 
118
 
                                if(*temp2 == first1){
 
128
 
        template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> _UCXXEXPORT
 
130
 
                find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,  
 
131
 
                        ForwardIterator2 first2, ForwardIterator2 last2,
 
132
 
                        BinaryPredicate pred)
 
134
 
                while(first1 != last1){
 
135
 
                        ForwardIterator2 temp2(first2);
 
136
 
                        while(temp2 != last2 ){
 
137
 
                                if(*temp2 == first1){
 
147
 
        template<class ForwardIterator> _UCXXEXPORT ForwardIterator
 
148
 
                adjacent_find(ForwardIterator first, ForwardIterator last)
 
150
 
                ForwardIterator temp;
 
151
 
                while(first != last){
 
162
 
        template<class ForwardIterator, class BinaryPredicate> _UCXXEXPORT
 
164
 
                adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred)
 
166
 
                ForwardIterator temp;
 
167
 
                while(first != last){
 
170
 
                        if( pred(*temp, *first)){
 
178
 
        template<class InputIterator, class T> _UCXXEXPORT
 
179
 
                typename iterator_traits<InputIterator>::difference_type
 
180
 
                count(InputIterator first, InputIterator last, const T& value)
 
182
 
                typename iterator_traits<InputIterator>::difference_type i = 0;
 
192
 
        template<class InputIterator, class Predicate> _UCXXEXPORT
 
193
 
                typename iterator_traits<InputIterator>::difference_type
 
194
 
                count_if(InputIterator first, InputIterator last, Predicate pred)
 
196
 
                typename iterator_traits<InputIterator>::difference_type i = 0;
 
206
 
        template<class InputIterator1, class InputIterator2> _UCXXEXPORT
 
207
 
                pair<InputIterator1, InputIterator2>    
 
208
 
                mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)
 
210
 
                while(first1 != last1){
 
211
 
                        if(*first1 != *first2){
 
218
 
                pair<InputIterator1, InputIterator2> retval;
 
219
 
                retval.first = first1;
 
220
 
                retval.second = first2;
 
224
 
        template<class InputIterator1, class InputIterator2, class BinaryPredicate> _UCXXEXPORT
 
225
 
                pair<InputIterator1, InputIterator2>
 
226
 
                mismatch(InputIterator1 first1, InputIterator1 last1,
 
227
 
                        InputIterator2 first2, BinaryPredicate pred)
 
229
 
                while(first1 != last1){
 
230
 
                        if( !pred(*first1, *first2) ){
 
237
 
                pair<InputIterator1, InputIterator2> retval;
 
238
 
                retval.first = first1;
 
239
 
                retval.second = first2;
 
243
 
        template<class InputIterator1, class InputIterator2> _UCXXEXPORT
 
245
 
                equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)
 
247
 
                while(first1 !=last1){
 
248
 
                        if(*first1 != *first2){
 
257
 
        template<class InputIterator1, class InputIterator2, class BinaryPredicate> _UCXXEXPORT
 
259
 
                equal(InputIterator1 first1, InputIterator1 last1,
 
260
 
                        InputIterator2 first2, BinaryPredicate pred)
 
262
 
                while(first1 !=last1){
 
263
 
                        if( !pred(*first1, *first2) ){
 
272
 
        template<class ForwardIterator1, class ForwardIterator2> _UCXXEXPORT
 
273
 
                ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
 
274
 
                        ForwardIterator2 first2, ForwardIterator2 last2)
 
276
 
                equal_to<typename iterator_traits<ForwardIterator1>::value_type> c;
 
277
 
                return search(first1, last1, first2, last2, c);
 
281
 
        template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> _UCXXEXPORT
 
283
 
                search(ForwardIterator1 first1, ForwardIterator1 last1,
 
284
 
                        ForwardIterator2 first2, ForwardIterator2 last2,
 
285
 
                        BinaryPredicate pred)
 
287
 
                while(first1 != last1){
 
288
 
                        ForwardIterator1 temp1(first1);
 
289
 
                        ForwardIterator2 temp2(first2);
 
290
 
                        while(temp2 != last2 && temp1 != last1){
 
291
 
                                if( !pred(*temp2, *temp1) ){
 
306
 
        template<class ForwardIterator, class Size, class T> _UCXXEXPORT
 
308
 
                search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value)
 
310
 
                while( first != last ){
 
312
 
                                ForwardIterator temp(first);
 
314
 
                                ++first;        //Avoid doing the same comparison over again
 
315
 
                                while(i < count && *temp == value){
 
329
 
        template<class ForwardIterator, class Size, class T, class BinaryPredicate> _UCXXEXPORT
 
331
 
                search_n(ForwardIterator first, ForwardIterator last,
 
332
 
                        Size count, const T& value, BinaryPredicate pred)
 
334
 
                while( first != last ){
 
335
 
                        if( pred(*first, value) ){
 
336
 
                                ForwardIterator temp(first);
 
338
 
                                ++first;        //Avoid doing the same comparison over again
 
339
 
                                while(i < count && pred(*temp, value) ){
 
353
 
        // subclause _lib.alg.modifying.operations_, modifying sequence operations:
 
355
 
        template<class InputIterator, class OutputIterator> _UCXXEXPORT
 
357
 
                copy(InputIterator first, InputIterator last, OutputIterator result)
 
359
 
                while(first != last){
 
367
 
        template<class BidirectionalIterator1, class BidirectionalIterator2> _UCXXEXPORT
 
368
 
                BidirectionalIterator2
 
369
 
                copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
 
370
 
                        BidirectionalIterator2 result)
 
372
 
                while(first !=last ){
 
380
 
        template<class T> _UCXXEXPORT void swap(T& a, T& b){
 
386
 
        template<class ForwardIterator1, class ForwardIterator2> _UCXXEXPORT
 
388
 
                swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2)
 
390
 
                while(first1 != last1){
 
391
 
                        iter_swap(first1, first2);
 
399
 
        template<class ForwardIterator1, class ForwardIterator2> _UCXXEXPORT
 
401
 
                iter_swap(ForwardIterator1 a, ForwardIterator2 b)
 
403
 
                typename iterator_traits<ForwardIterator1>::value_type temp(*a);
 
409
 
        template<class InputIterator, class OutputIterator, class UnaryOperation> _UCXXEXPORT
 
411
 
                transform(InputIterator first, InputIterator last,
 
412
 
                        OutputIterator result, UnaryOperation op)
 
414
 
                while(first != last){
 
415
 
                        *result = op(*first);
 
423
 
        template<class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation> _UCXXEXPORT
 
424
 
                OutputIterator transform(InputIterator1 first1, InputIterator1 last1,
 
425
 
                        InputIterator2 first2, OutputIterator result,
 
426
 
                        BinaryOperation binary_op)
 
428
 
                while(first1 != last1){
 
429
 
                        *result = binary_op(*first1, *first2);
 
438
 
        template<class ForwardIterator, class T> _UCXXEXPORT
 
440
 
                replace(ForwardIterator first, ForwardIterator last,
 
441
 
                        const T& old_value, const T& new_value)
 
443
 
                while(first != last){
 
444
 
                        if(*first == old_value){
 
451
 
        template<class ForwardIterator, class Predicate, class T> _UCXXEXPORT
 
453
 
                replace_if(ForwardIterator first, ForwardIterator last,
 
454
 
                        Predicate pred, const T& new_value)
 
456
 
                while(first != last){
 
465
 
        template<class InputIterator, class OutputIterator, class T> _UCXXEXPORT
 
467
 
                replace_copy(InputIterator first, InputIterator last,
 
468
 
                        OutputIterator result, const T& old_value, const T& new_value)
 
470
 
                while(first != last){
 
471
 
                        if(*first == old_value){
 
482
 
        template<class Iterator, class OutputIterator, class Predicate, class T> _UCXXEXPORT
 
484
 
                replace_copy_if(Iterator first, Iterator last,
 
485
 
                        OutputIterator result, Predicate pred, const T& new_value)
 
487
 
                while(first != last){
 
499
 
        template<class ForwardIterator, class T> _UCXXEXPORT
 
501
 
                fill(ForwardIterator first, ForwardIterator last, const T& value)
 
503
 
                while(first != last){
 
509
 
        template<class OutputIterator, class Size, class T> _UCXXEXPORT
 
511
 
                fill_n(OutputIterator first, Size n, const T& value)
 
520
 
        template<class ForwardIterator, class Generator> _UCXXEXPORT
 
522
 
                generate(ForwardIterator first, ForwardIterator last, Generator gen)
 
524
 
                while(first != last){
 
530
 
        template<class OutputIterator, class Size, class Generator> _UCXXEXPORT
 
532
 
                generate_n(OutputIterator first, Size n, Generator gen)
 
541
 
        template<class ForwardIterator, class T> _UCXXEXPORT
 
543
 
                remove(ForwardIterator first, ForwardIterator last, const T& value)
 
545
 
                ForwardIterator temp(first);
 
558
 
        template<class ForwardIterator, class Predicate> _UCXXEXPORT
 
560
 
                remove_if(ForwardIterator first, ForwardIterator last, Predicate pred)
 
562
 
                ForwardIterator temp(first);
 
576
 
        template<class InputIterator, class OutputIterator, class T> _UCXXEXPORT
 
578
 
                remove_copy(InputIterator first, InputIterator last,
 
579
 
                        OutputIterator result, const T& value)
 
591
 
        template<class InputIterator, class OutputIterator, class Predicate> _UCXXEXPORT
 
593
 
                remove_copy_if(InputIterator first, InputIterator last,
 
594
 
                        OutputIterator result, Predicate pred)
 
606
 
        template<class ForwardIterator> _UCXXEXPORT
 
608
 
                unique(ForwardIterator first, ForwardIterator last)
 
610
 
                ForwardIterator new_val(first);
 
611
 
                ForwardIterator old_val(first);
 
613
 
                while(new_val !=last){
 
614
 
                        if(*new_val == *old_val && new_val != old_val){
 
626
 
        template<class ForwardIterator, class BinaryPredicate> _UCXXEXPORT
 
628
 
                unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred)
 
630
 
                ForwardIterator new_val(first);
 
631
 
                ForwardIterator old_val(first);
 
633
 
                while(new_val !=last){
 
634
 
                        if( pred(*new_val, *old_val) && new_val != old_val){
 
646
 
        template<class InputIterator, class OutputIterator> _UCXXEXPORT
 
648
 
                unique_copy(InputIterator first, InputIterator last, OutputIterator result)
 
650
 
                InputIterator temp(first);
 
651
 
                while(first !=last ){
 
652
 
                        if(*first == *temp && first != temp){
 
664
 
        template<class InputIterator, class OutputIterator, class BinaryPredicate> _UCXXEXPORT
 
666
 
                unique_copy(InputIterator first, InputIterator last,
 
667
 
                        OutputIterator result, BinaryPredicate pred)
 
669
 
                InputIterator temp(first);
 
670
 
                while(first !=last ){
 
671
 
                        if( pred(*first, *temp) && first != temp){
 
683
 
        template<class BidirectionalIterator> _UCXXEXPORT
 
685
 
                reverse(BidirectionalIterator first, BidirectionalIterator last)
 
687
 
                --last;         //Don't work with one past the end element
 
689
 
                        iter_swap(first, last);
 
695
 
        template<class BidirectionalIterator, class OutputIterator> _UCXXEXPORT
 
697
 
                reverse_copy(BidirectionalIterator first, BidirectionalIterator last,
 
698
 
                OutputIterator result)
 
708
 
        template<class ForwardIterator> _UCXXEXPORT
 
710
 
                rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last)
 
712
 
                if ((first == middle) || (last  == middle)){
 
716
 
                ForwardIterator first2 = middle;
 
719
 
                        swap(*first, *first2);
 
725
 
                } while(first2 != last);
 
729
 
                while (first2 != last) {
 
730
 
                        swap(*first, *first2);
 
733
 
                        if (first == middle){
 
735
 
                        }else if (first2 == last){
 
741
 
        template<class ForwardIterator, class OutputIterator> _UCXXEXPORT
 
743
 
                rotate_copy(ForwardIterator first, ForwardIterator middle,
 
744
 
                        ForwardIterator last, OutputIterator result)
 
746
 
                ForwardIterator temp(middle);
 
752
 
                while(first != middle){
 
761
 
        template<class RandomAccessIterator> _UCXXEXPORT
 
763
 
                random_shuffle(RandomAccessIterator first, RandomAccessIterator last)
 
766
 
                while(first != last){
 
767
 
                        iter_swap(first, (first + (rand() % (last - first) ) ) );
 
772
 
        template<class RandomAccessIterator, class RandomNumberGenerator> _UCXXEXPORT
 
774
 
                random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
 
775
 
                RandomNumberGenerator& rand)
 
778
 
                while(first != last){
 
779
 
                        iter_swap(first, (first + (rand(last - first) ) ) );
 
784
 
        // _lib.alg.partitions_, partitions:
 
785
 
        template<class BidirectionalIterator, class Predicate> _UCXXEXPORT BidirectionalIterator
 
786
 
                partition(BidirectionalIterator first, BidirectionalIterator last, Predicate pred)
 
788
 
                return stable_partition(first, last, pred);
 
791
 
        template<class BidirectionalIterator, class Predicate> _UCXXEXPORT BidirectionalIterator
 
792
 
                stable_partition(BidirectionalIterator first, BidirectionalIterator last, Predicate pred)
 
794
 
                //first now points to the first non-desired element
 
795
 
                while( first != last && pred(*first) ){
 
799
 
                BidirectionalIterator tempb;
 
800
 
                BidirectionalIterator tempe = first;
 
802
 
                while( tempe != last ){
 
803
 
                        //Find the next desired element
 
804
 
                        while( !pred(*tempe) ){
 
807
 
                                //See if we should exit
 
813
 
                        //Rotate the element back to the begining
 
815
 
                        while(tempb != first){
 
816
 
                                iter_swap(tempb, tempb-1 );
 
819
 
                        //First now has a desired element
 
826
 
        template<class RandomAccessIterator> _UCXXEXPORT
 
827
 
                void sort(RandomAccessIterator first, RandomAccessIterator last)
 
829
 
                less<typename iterator_traits<RandomAccessIterator>::value_type> c;
 
830
 
                sort(first, last, c );
 
833
 
        template<class RandomAccessIterator, class Compare> _UCXXEXPORT
 
834
 
                void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp)
 
836
 
                stable_sort(first, last, comp);
 
839
 
        template<class RandomAccessIterator> _UCXXEXPORT
 
840
 
                void stable_sort(RandomAccessIterator first, RandomAccessIterator last)
 
842
 
                less<typename iterator_traits<RandomAccessIterator>::value_type> c;
 
843
 
                stable_sort(first, last, c);
 
846
 
        template<class RandomAccessIterator, class Compare> _UCXXEXPORT
 
847
 
                void stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp)
 
849
 
                //FIXME - bubble sort
 
850
 
                RandomAccessIterator temp;
 
852
 
                while(last - first > 0){
 
854
 
                        while(temp != first){
 
855
 
                                if( comp( *temp, *(temp-1) ) ){
 
856
 
                                        iter_swap( temp-1, temp);
 
864
 
        template<class RandomAccessIterator> _UCXXEXPORT
 
865
 
                void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last)
 
867
 
                less<typename iterator_traits<RandomAccessIterator>::value_type> c;
 
868
 
                partial_sort(first, middle, last, c);
 
870
 
        template<class RandomAccessIterator, class Compare> _UCXXEXPORT
 
871
 
                void partial_sort(RandomAccessIterator first, RandomAccessIterator middle,
 
872
 
                        RandomAccessIterator last, Compare comp)
 
874
 
                //Fixme - partial bubble sort
 
875
 
                RandomAccessIterator temp;
 
877
 
                while(first < middle){
 
879
 
                        while(temp != first){
 
880
 
                                if( comp(*temp, *(temp -1 ) ) ) {
 
881
 
                                        iter_swap( temp-1, temp);
 
888
 
        template<class InputIterator, class RandomAccessIterator> _UCXXEXPORT
 
890
 
                partial_sort_copy(InputIterator first, InputIterator last,
 
891
 
                        RandomAccessIterator result_first, RandomAccessIterator result_last)
 
893
 
                less<typename iterator_traits<RandomAccessIterator>::value_type> c;
 
894
 
                return partial_sort_copy(first, last, result_first, result_last, c);
 
896
 
        template<class InputIterator, class RandomAccessIterator, class Compare> _UCXXEXPORT
 
898
 
                partial_sort_copy(InputIterator first, InputIterator last,
 
899
 
                        RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp)
 
901
 
                size_t output_size = last-first;
 
902
 
                size_t temp_size = result_last - result_first;
 
903
 
                if(temp_size < output_size){
 
904
 
                        output_size = temp_size;
 
907
 
                RandomAccessIterator middle = result_first + output_size;
 
908
 
                RandomAccessIterator temp = result_first;
 
910
 
                while(temp != middle){
 
915
 
                sort(result_first, middle, comp);
 
917
 
                while( first != last){
 
918
 
                        if( comp( *first, *(middle-1) ) ){
 
919
 
                                *(middle-1) = *first;
 
920
 
                                sort(result_first, middle, comp);
 
927
 
        template<class RandomAccessIterator> _UCXXEXPORT
 
928
 
                void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last)
 
930
 
                less<typename iterator_traits<RandomAccessIterator>::value_type> c;
 
931
 
                nth_element(first, nth, last, c);
 
933
 
        template<class RandomAccessIterator, class Compare> _UCXXEXPORT
 
934
 
                void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
 
935
 
                        RandomAccessIterator last, Compare comp)
 
937
 
                partial_sort(first, nth, last, comp);
 
940
 
        template<class ForwardIterator, class T> _UCXXEXPORT
 
941
 
                ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
 
944
 
                less<typename iterator_traits<ForwardIterator>::value_type> c;
 
945
 
                return lower_bound(first, last, value, c);
 
948
 
        template<class ForwardIterator, class T, class Compare> _UCXXEXPORT
 
949
 
                ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
 
950
 
                        const T& value, Compare comp)
 
955
 
                //If below or equal to the first element
 
956
 
                if( comp(*first, value) == false){
 
959
 
                ForwardIterator middle;
 
961
 
                //If greater than the top element
 
963
 
                advance(middle, distance(first, last) - 1);
 
964
 
                if( comp(*middle, value) ){
 
968
 
                //Now begin the actual search for the begining
 
969
 
                while( distance(first, last) > 1 ){
 
972
 
                        advance(middle, (distance(first, last)/2) );
 
973
 
                        if( !comp(*middle, value) ){
 
980
 
                if( !comp(*first, value) ){
 
986
 
        template<class ForwardIterator, class T> _UCXXEXPORT
 
987
 
                ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
 
990
 
                less<typename iterator_traits<ForwardIterator>::value_type> c;
 
991
 
                return upper_bound(first, last, value, c);
 
995
 
        template<class ForwardIterator, class T, class Compare> _UCXXEXPORT
 
996
 
                ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
 
997
 
                        const T& value, Compare comp)
 
1002
 
                //If below the first element
 
1003
 
                if( comp(value, *first) == true){
 
1007
 
                ForwardIterator middle;
 
1009
 
                //If greater than the top element
 
1011
 
                advance(middle, distance(first, last) - 1);
 
1012
 
                if( comp(*middle, value) ){
 
1016
 
                //Now begin the actual search for the end
 
1017
 
                while( distance(first, last) > 1 ){
 
1020
 
                        advance(middle, (distance(first, last)/2) );
 
1021
 
                        if( comp(value, *middle) ){
 
1028
 
                if( comp(value, *first) ){
 
1035
 
        template<class ForwardIterator, class T> _UCXXEXPORT
 
1036
 
                pair<ForwardIterator, ForwardIterator>
 
1037
 
                equal_range(ForwardIterator first, ForwardIterator last, const T& value)
 
1039
 
                less<typename iterator_traits<ForwardIterator>::value_type> c;
 
1040
 
                return equal_range(first, last, value, c);
 
1043
 
        template<class ForwardIterator, class T, class Compare> _UCXXEXPORT
 
1044
 
                pair<ForwardIterator, ForwardIterator>
 
1045
 
                equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp)
 
1047
 
                pair<ForwardIterator, ForwardIterator> retval;
 
1048
 
                retval.first = lower_bound(first, last, value, comp);
 
1049
 
                //Reuse retval.first in order to (possibly) save a few comparisons
 
1050
 
                retval.second = upper_bound(retval.first, last, value, comp);
 
1055
 
        template<class ForwardIterator, class T> _UCXXEXPORT
 
1056
 
                bool binary_search(ForwardIterator first, ForwardIterator last,
 
1059
 
                less<typename iterator_traits<ForwardIterator>::value_type> c;
 
1060
 
                return binary_search(first, last, value, c);
 
1063
 
        template<class ForwardIterator, class T, class Compare> _UCXXEXPORT
 
1064
 
                bool binary_search(ForwardIterator first, ForwardIterator last,
 
1065
 
                        const T& value, Compare comp)
 
1067
 
                if( distance(first, last) == 0){
 
1071
 
                ForwardIterator middle;
 
1073
 
                while( distance(first, last) > 1 ){
 
1074
 
                        //Set middle between first and last
 
1076
 
                        advance(middle, distance(first, last)/2 );
 
1078
 
                        if( comp(*middle, value ) == true){
 
1085
 
                if( !comp(*first, value) && !comp(value, *first) ){
 
1088
 
                if( !comp(*last, value) && !comp(value, *last) ){
 
1095
 
        // _lib.alg.merge_, merge:
 
1096
 
        template<class InputIterator1, class InputIterator2, class OutputIterator> _UCXXEXPORT
 
1098
 
                merge(InputIterator1 first1, InputIterator1 last1,
 
1099
 
                        InputIterator2 first2, InputIterator2 last2, OutputIterator result)
 
1101
 
                less<typename iterator_traits<InputIterator1>::value_type> c;
 
1102
 
                return merge(first1, last1, first2, last2, result, c);
 
1104
 
        template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare> _UCXXEXPORT
 
1106
 
                merge(InputIterator1 first1, InputIterator1 last1,
 
1107
 
                        InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
 
1109
 
                while( first1 != last1 && first2 != last2){
 
1110
 
                        //If in this order so first1 elements which are equal come first
 
1111
 
                        if( comp(*first2, *first1) ){
 
1120
 
                //Clean up remaining elements
 
1121
 
                while(first1 != last1){
 
1126
 
                while(first2 != last2){
 
1133
 
        template<class BidirectionalIterator> _UCXXEXPORT
 
1134
 
                void inplace_merge(BidirectionalIterator first,
 
1135
 
                        BidirectionalIterator middle, BidirectionalIterator last)
 
1137
 
                less<typename iterator_traits<BidirectionalIterator>::value_type> c;
 
1138
 
                inplace_merge(first, middle, last, c);
 
1140
 
        template<class BidirectionalIterator, class Compare> _UCXXEXPORT
 
1141
 
                void inplace_merge(BidirectionalIterator first,
 
1142
 
                        BidirectionalIterator middle, BidirectionalIterator last, Compare comp)
 
1144
 
                //FIXME - using a bubble exchange method
 
1145
 
                while(first != middle && middle !=last){
 
1146
 
                        if( comp(*middle, *first) ){
 
1147
 
                                BidirectionalIterator temp(middle);
 
1148
 
                                while( temp != first){
 
1149
 
                                        iter_swap(temp, temp-1);
 
1158
 
        // _lib.alg.set.operations_, set operations:
 
1159
 
        template<class InputIterator1, class InputIterator2> _UCXXEXPORT
 
1160
 
                bool includes(InputIterator1 first1, InputIterator1 last1,
 
1161
 
                        InputIterator2 first2, InputIterator2 last2)
 
1163
 
                less<typename iterator_traits<InputIterator1>::value_type> c;
 
1164
 
                return includes(first1, last1, first2, last2, c );
 
1167
 
        template<class InputIterator1, class InputIterator2, class Compare> _UCXXEXPORT
 
1168
 
                bool includes(InputIterator1 first1, InputIterator1 last1,
 
1169
 
                        InputIterator2 first2, InputIterator2 last2, Compare comp)
 
1171
 
                while(first2 != last2){
 
1172
 
                        //Advance the large set until no longer smaller than the element we are looking for
 
1173
 
                        while( comp(*first1, *first2) ){
 
1175
 
                                //If we are at the end of the list, we don't have the desired element
 
1176
 
                                if(first1 == last1){
 
1180
 
                        //If we are past the element we want, it isn't here
 
1181
 
                        if( comp(*first2, *first1) ){
 
1184
 
                        ++first2;       //Move to next element
 
1189
 
        template<class InputIterator1, class InputIterator2, class OutputIterator> _UCXXEXPORT
 
1190
 
                OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
 
1191
 
                        InputIterator2 first2, InputIterator2 last2, OutputIterator result)
 
1193
 
                less<typename iterator_traits<InputIterator1>::value_type> c;
 
1194
 
                return set_union(first1, last1, first2, last2, result, c);
 
1197
 
        template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare> _UCXXEXPORT
 
1198
 
                OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
 
1199
 
                        InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
 
1201
 
                while( first1 != last1 && first2 != last2){
 
1202
 
                        if( comp(*first2, *first1) ){
 
1205
 
                                //Elliminate duplicates
 
1206
 
                                InputIterator2 temp = first2;
 
1207
 
                                while( first1 != last1 && !comp( *temp, *first1) ){
 
1210
 
                                while( first2 != last2 && !comp( *temp, *first2) ){
 
1215
 
                                        //Elliminate duplicates
 
1216
 
                                InputIterator1 temp = first1;
 
1217
 
                                while( first1 != last1 && !comp( *temp, *first1) ){
 
1220
 
                                while( first2 != last2 && !comp( *temp, *first2) ){
 
1227
 
                //Clean up remaining elements
 
1228
 
                while(first1 != last1){
 
1231
 
                        InputIterator1 temp = first1;
 
1232
 
                        while( first1 != last1 && !comp( *temp, *first1) ){
 
1237
 
                while(first2 != last2){
 
1240
 
                        InputIterator2 temp = first2;
 
1241
 
                        while( first2 != last2 && !comp( *temp, *first2) ){
 
1248
 
        template<class InputIterator1, class InputIterator2, class OutputIterator> _UCXXEXPORT
 
1249
 
                OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
 
1250
 
                        InputIterator2 first2, InputIterator2 last2, OutputIterator result)
 
1252
 
                less<typename iterator_traits<InputIterator1>::value_type> c;
 
1253
 
                return set_intersection(first1, last1, first2, last2, result, c);
 
1255
 
        template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare> _UCXXEXPORT
 
1256
 
                OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
 
1257
 
                        InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
 
1259
 
                while( first1 != last1 && first2 != last2){
 
1260
 
                        if( comp(*first2, *first1) ){
 
1262
 
                        }else if( comp(*first1, *first2) ) {
 
1267
 
                                InputIterator1 temp = first1;
 
1268
 
                                while( first1 != last1 && !comp( *temp, *first1) ){
 
1276
 
        template<class InputIterator1, class InputIterator2, class OutputIterator> _UCXXEXPORT
 
1277
 
                OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
 
1278
 
                        InputIterator2 first2, InputIterator2 last2, OutputIterator result)
 
1280
 
                less<typename iterator_traits<InputIterator1>::value_type> c;
 
1281
 
                return set_difference(first1, last1, first2, last2, result, c);
 
1283
 
        template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare> _UCXXEXPORT
 
1284
 
                OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
 
1285
 
                        InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
 
1287
 
                while( first1 != last1 && first2 != last2){
 
1288
 
                        if( comp(*first1, *first2) ){
 
1292
 
                                //Elliminate duplicates
 
1293
 
                                InputIterator1 temp = first1;
 
1294
 
                                while( first1 != last1 && !comp( *temp, *first1) ){
 
1297
 
                        }else if( comp(*first2, *first1) ){
 
1299
 
                                //Elliminate duplicates
 
1300
 
                                InputIterator2 temp = first2;
 
1301
 
                                while( first2 != last2 && !comp( *temp, *first2) ){
 
1305
 
                        }else{  //They are identical - skip
 
1306
 
                                //Elliminate duplicates
 
1307
 
                                InputIterator1 temp = first1;
 
1308
 
                                while( first1 != last1 && !comp( *temp, *first1) ){
 
1311
 
                                while( first2 != last2 && !comp( *temp, *first2) ){
 
1317
 
                //Clean up remaining elements
 
1318
 
                while(first1 != last1){
 
1321
 
                        InputIterator1 temp = first1;
 
1322
 
                        while( first1 != last1 && !comp( *temp, *first1) ){
 
1329
 
        template<class InputIterator1, class InputIterator2, class OutputIterator> _UCXXEXPORT
 
1330
 
                OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
 
1331
 
                        InputIterator2 first2, InputIterator2 last2, OutputIterator result)
 
1333
 
                less<typename iterator_traits<InputIterator1>::value_type> c;
 
1334
 
                return set_symmetric_difference(first1, last1, first2, last2, result, c);
 
1336
 
        template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare> _UCXXEXPORT
 
1337
 
                OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
 
1338
 
                        InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
 
1340
 
                while( first1 != last1 && first2 != last2){
 
1341
 
                        if( comp(*first1, *first2) ){
 
1345
 
                                //Elliminate duplicates
 
1346
 
                                InputIterator1 temp = first1;
 
1347
 
                                while( first1 != last1 && !comp( *temp, *first1) ){
 
1350
 
                        }else if( comp(*first2, *first1) ){
 
1354
 
                                //Elliminate duplicates
 
1355
 
                                InputIterator2 temp = first2;
 
1356
 
                                while( first2 != last2 && !comp( *temp, *first2) ){
 
1360
 
                        }else{  //They are identical - skip
 
1361
 
                                //Elliminate duplicates
 
1362
 
                                InputIterator1 temp = first1;
 
1363
 
                                while( first1 != last1 && !comp( *temp, *first1) ){
 
1366
 
                                while( first2 != last2 && !comp( *temp, *first2) ){
 
1372
 
                //Clean up remaining elements
 
1373
 
                while(first1 != last1){
 
1376
 
                        InputIterator1 temp = first1;
 
1377
 
                        while( first1 != last1 && !comp( *temp, *first1) ){
 
1382
 
                while(first2 != last2){
 
1385
 
                        InputIterator2 temp = first2;
 
1386
 
                        while( first2 != last2 && !comp( *temp, *first2) ){
 
1394
 
        // _lib.alg.heap.operations_, heap operations:
 
1396
 
        template<class RandomAccessIterator> _UCXXEXPORT
 
1397
 
                void push_heap(RandomAccessIterator first, RandomAccessIterator last)
 
1399
 
                less<typename iterator_traits<RandomAccessIterator>::value_type> c;
 
1400
 
                push_heap(first, last, c);
 
1403
 
        template<class RandomAccessIterator, class Compare> _UCXXEXPORT
 
1404
 
                void push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp)
 
1406
 
                // *(last - 1) is the last element
 
1407
 
                RandomAccessIterator begin, middle, end;
 
1410
 
                if(last - first < 2){           //Empty heap
 
1413
 
                if ( comp(*(last-1), *end) ){   //Belongs past the end - already in place
 
1416
 
                while(end - begin > 1){
 
1417
 
                        middle = begin + ((end - begin)/2);
 
1418
 
                        if( comp(*middle, *(last-1) ) ){
 
1425
 
                if( comp(*begin, *(last-1)) ){
 
1431
 
                //Now all we do is swap the elements up to the begining
 
1434
 
                while(last > middle){
 
1435
 
                        iter_swap(last, last-1);
 
1440
 
        template<class RandomAccessIterator> _UCXXEXPORT
 
1441
 
                void pop_heap(RandomAccessIterator first, RandomAccessIterator last)
 
1443
 
                less<typename iterator_traits<RandomAccessIterator>::value_type> c;
 
1444
 
                pop_heap(first, last, c);
 
1446
 
        template<class RandomAccessIterator, class Compare> _UCXXEXPORT
 
1447
 
                void pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare)
 
1450
 
                while(first < last){
 
1451
 
                        iter_swap( first, first+1);
 
1456
 
        template<class RandomAccessIterator> _UCXXEXPORT
 
1457
 
                void make_heap(RandomAccessIterator first, RandomAccessIterator last)
 
1459
 
                less<typename iterator_traits<RandomAccessIterator>::value_type> c;
 
1460
 
                make_heap(first, last, c);
 
1462
 
        template<class RandomAccessIterator, class Compare> _UCXXEXPORT
 
1463
 
                void make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp)
 
1465
 
                sort( reverse_iterator<RandomAccessIterator>(last), reverse_iterator<RandomAccessIterator>(first), comp);
 
1467
 
        template<class RandomAccessIterator> _UCXXEXPORT
 
1468
 
                void sort_heap(RandomAccessIterator first, RandomAccessIterator last)
 
1470
 
                less<typename iterator_traits<RandomAccessIterator>::value_type> c;
 
1471
 
                sort_heap(first, last, c);
 
1473
 
        template<class RandomAccessIterator, class Compare> _UCXXEXPORT
 
1474
 
                void sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp)
 
1476
 
                sort( first, last, comp);
 
1480
 
        // _lib.alg.min.max_, minimum and maximum:
 
1481
 
        template<class T> _UCXXEXPORT
 
1482
 
                const T& min(const T& a, const T& b)
 
1490
 
        template<class T, class Compare> _UCXXEXPORT
 
1491
 
                const T& min(const T& a, const T& b, Compare comp)
 
1493
 
                if( comp(b, a) == true){
 
1499
 
        template<class T> _UCXXEXPORT
 
1500
 
                const T& max(const T& a, const T& b)
 
1508
 
        template<class T, class Compare> _UCXXEXPORT
 
1509
 
                const T& max(const T& a, const T& b, Compare comp)
 
1517
 
        template<class ForwardIterator> _UCXXEXPORT
 
1518
 
                ForwardIterator min_element(ForwardIterator first, ForwardIterator last)
 
1520
 
                less<typename iterator_traits<ForwardIterator>::value_type> c;
 
1521
 
                return min_element(first, last, c);
 
1524
 
        template<class ForwardIterator, class Compare> _UCXXEXPORT
 
1525
 
                ForwardIterator min_element(ForwardIterator first, ForwardIterator last, Compare comp)
 
1527
 
                ForwardIterator retval = first;
 
1529
 
                while(first != last){
 
1530
 
                        if( comp( *first, *retval) ){
 
1538
 
        template<class ForwardIterator> _UCXXEXPORT
 
1539
 
                ForwardIterator max_element(ForwardIterator first, ForwardIterator last)
 
1541
 
                less<typename iterator_traits<ForwardIterator>::value_type> c;
 
1542
 
                return max_element(first, last, c);
 
1545
 
        template<class ForwardIterator, class Compare> _UCXXEXPORT
 
1546
 
                ForwardIterator max_element(ForwardIterator first, ForwardIterator last, Compare comp)
 
1548
 
                ForwardIterator retval = first;
 
1550
 
                while(first != last){
 
1551
 
                        if( comp( *retval, *first ) ){
 
1559
 
        template<class InputIterator1, class InputIterator2> _UCXXEXPORT
 
1560
 
                bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
 
1561
 
                        InputIterator2 first2, InputIterator2 last2)
 
1563
 
                less<typename iterator_traits<InputIterator1>::value_type> c;
 
1564
 
                return lexicographical_compare(first1, last1, first2, last2, c);
 
1567
 
        template<class InputIterator1, class InputIterator2, class Compare> _UCXXEXPORT
 
1568
 
                bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
 
1569
 
                        InputIterator2 first2, InputIterator2 last2, Compare comp)
 
1571
 
                while(first1 != last1 && first2 != last2){
 
1572
 
                        if( comp(*first1, *first2) ){
 
1575
 
                        if( comp(*first2, *first1) ){
 
1581
 
                return first1==last1 && first2 != last2;
 
1584
 
        // _lib.alg.permutation.generators_, permutations
 
1585
 
        template<class BidirectionalIterator> _UCXXEXPORT
 
1586
 
                bool next_permutation(BidirectionalIterator first, BidirectionalIterator last)
 
1588
 
                less<typename iterator_traits<BidirectionalIterator>::value_type> c;
 
1589
 
                return next_permutation(first, last, c);
 
1592
 
        template<class BidirectionalIterator, class Compare> _UCXXEXPORT
 
1593
 
                bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp)
 
1596
 
                        return false;   // No data
 
1598
 
                BidirectionalIterator i = last;
 
1601
 
                        return false;   //Only one element
 
1603
 
                BidirectionalIterator ii = i;
 
1605
 
                //If the last two items are in order, swap them and call it done
 
1606
 
                if( comp(*ii, *i) ){
 
1612
 
                //This part of the algorithm copied from G++ header files ver. 3.4.2
 
1618
 
                        if ( comp(*i, *ii) ){
 
1619
 
                                BidirectionalIterator j = last;
 
1621
 
                                while ( !comp(*i, *j)){
 
1629
 
                                reverse(first, last);
 
1637
 
        template<class BidirectionalIterator> _UCXXEXPORT
 
1638
 
                bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last)
 
1640
 
                less<typename iterator_traits<BidirectionalIterator>::value_type> c;
 
1641
 
                return prev_permutation(first, last, c);
 
1644
 
        template<class BidirectionalIterator, class Compare> _UCXXEXPORT
 
1645
 
                bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp)
 
1648
 
                        return false;   // No data
 
1650
 
                BidirectionalIterator i = last;
 
1653
 
                        return false;   //Only one element
 
1655
 
                BidirectionalIterator ii = i;
 
1657
 
                //If the last two items are in reverse order, swap them and call it done
 
1658
 
                if( comp(*i, *ii) ){
 
1663
 
                //Copied from GNU GCC header files version 3.4.2
 
1670
 
                        if ( comp(*ii, *i)){
 
1671
 
                                BidirectionalIterator j = last;
 
1673
 
                                while ( !comp(*j, *i)){
 
1681
 
                                reverse(first, last);
 
1690
 
#pragma GCC visibility pop