/***************************************************************************
 *
 * algorithm.cc - Non-inline definitions for the Standard Library algorithms
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Copyright (c) 1994
 * Hewlett-Packard Company
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  Hewlett-Packard Company makes no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied warranty.
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 1994-2006 Rogue Wave Software.
 * 
 **************************************************************************/


_RWSTD_NAMESPACE (std) { 


_EXPORT
template <class _FwdIter1, class _FwdIter2, class _Dist>
_FwdIter1 __find_end (_FwdIter1 __first1, _FwdIter1 __last1,
                      _FwdIter2 __first2, _FwdIter2 __last2,
                      _Dist*)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    const _Dist __dist1 = _DISTANCE (__first2, __last2, _Dist);

    if (!__dist1)
        return __last1;

    _Dist __dist2 = _DISTANCE (__first1, __last1, _Dist);

    _FwdIter1 __res = __last1;

    while (__dist2 >= __dist1) {
        if (equal (__first2, __last2, __first1))
            __res  = __first1;

        __dist2 = _DISTANCE (++__first1, __last1, _Dist);
    }
    return __res;
}



_EXPORT
template <class _FwdIter1, class _FwdIter2,
          class _BinaryPredicate, class _Dist>
_FwdIter1 __find_end (_FwdIter1 __first1, _FwdIter1 __last1,
                      _FwdIter2 __first2, _FwdIter2 __last2,
                      _BinaryPredicate __pred, _Dist*)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    const _Dist __dist1 = _DISTANCE (__first2, __last2, _Dist);

    if (!__dist1)
        return __last1;

    _Dist __dist2 = _DISTANCE (__first1, __last1, _Dist);

    _FwdIter1 __res = __last1;

    while (__dist2 >= __dist1) {
        if (_STD::equal (__first2, __last2, __first1, __pred))
            __res = __first1;

        __dist2 = _DISTANCE (++__first1, __last1, _Dist);
    }
    return __res;
}


_EXPORT
template <class _FwdIter1, class _FwdIter2>
_FwdIter1 find_first_of (_FwdIter1 __first1, _FwdIter1 __last1,
                         _FwdIter2 __first2, _FwdIter2 __last2)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    if (__first2 == __last2)
        return __last1;

    for (_FwdIter1 __next = __first1; !(__next == __last1); ++__next)
        if (!(_STD::find (__first2, __last2, *__next) == __last2))
            return __next;

    return __last1;
}


_EXPORT
template <class _FwdIter1, class _FwdIter2,
          class _BinaryPredicate>
_FwdIter1 find_first_of (_FwdIter1 __first1, _FwdIter1 __last1,
                         _FwdIter2 __first2, _FwdIter2 __last2,
                         _BinaryPredicate __pred)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    if (__first2 == __last2)
        return __last1;

    for (_FwdIter1 __next = __first1; !(__next == __last1); ++__next)
        for (_FwdIter2 __iter = __first2; !(__iter == __last2); ++__iter)
            if (!(__pred (*__next, *__iter) == false))
                return __next;

    return __last1;
}


_EXPORT
template <class _FwdIter>
_FwdIter adjacent_find (_FwdIter __first, _FwdIter __last)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (__first == __last)
        return __last;

    for (_FwdIter __next = __first; !(++__next == __last); __first = __next)
        if (*__first == *__next)
            return __first;

    return __last;
}


_EXPORT
template <class _FwdIter, class _BinaryPredicate>
_FwdIter adjacent_find (_FwdIter __first, _FwdIter __last,
                        _BinaryPredicate __pred)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (__first == __last)
        return __last;

    for (_FwdIter __next = __first; !(++__next == __last); __first = __next)
        if (!(__pred (*__first, *__next) == false))
            return __first;

    return __last;
}


_EXPORT
template <class _FwdIter1, class _FwdIter2, class _Dist1, class _Dist2>
_FwdIter1 __search (_FwdIter1 __first1, _FwdIter1 __last1,
                    _FwdIter2 __first2, _FwdIter2 __last2,
                    _Dist1*, _Dist2*)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    _Dist1 __dist1 = _DISTANCE (__first1, __last1, _Dist1);
    _Dist2 __dist2 = _DISTANCE (__first2, __last2, _Dist2);

    if (__dist1 < __dist2)
        return __last1;

    _FwdIter1 __cur1 = __first1;
    _FwdIter2 __cur2 = __first2;

    while (!(__cur2 == __last2)) {
        if (!(*__cur1 == *__cur2)) {
            ++__cur1;
            ++__cur2;
            if (__dist1-- == __dist2)
                return __last1;

            __cur1 = ++__first1;
            __cur2 = __first2;
        }
        else {
            ++__cur1;
            ++__cur2;
        }
    }

    return (__cur2 == __last2) ? __first1 : __last1;
}


_EXPORT
template <class _FwdIter1, class _FwdIter2,
          class _BinaryPredicate, class _Dist1, class _Dist2>
_FwdIter1 __search (_FwdIter1 __first1, _FwdIter1 __last1,
                    _FwdIter2 __first2, _FwdIter2 __last2,
                    _BinaryPredicate __pred, _Dist1*, _Dist2*)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    _Dist1 __dist1 = _DISTANCE (__first1, __last1, _Dist1);
    _Dist2 __dist2 = _DISTANCE (__first2, __last2, _Dist2);

    if (__dist1 < __dist2) return __last1;

    _FwdIter1 __cur1 = __first1;
    _FwdIter2 __cur2 = __first2;

    while (!(__cur2 == __last2)) {
        if (__pred (*__cur1, *__cur2) == false) {
            ++__cur1;
            ++__cur2;
            if (__dist1-- == __dist2)
                return __last1;

            __cur1 = ++__first1;
            __cur2 = __first2;
        }
        else {
            ++__cur1;
            ++__cur2;
        }
    }

    return (__cur2 == __last2) ? __first1 : __last1;
}


_EXPORT
template <class _FwdIter, class _Dist, class _Size, class _TypeT>
_FwdIter __search_n (_FwdIter __first, _FwdIter __last,
                     _Dist*, _Size __count, const _TypeT& __val)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (__count <= 0)
        return __last;

    const _Dist __dist = _DISTANCE (__first, __last, _Dist);

    if (__dist < _Dist (__count))
        return __last;

    _Dist __span    = __dist - _Dist (__count);
    _Dist __matches = 0;

    _FwdIter __current = __first;

    while (!(__current == __last)) {
        if (!(*__current == __val)) {
            if (__span < __matches + 1)
                return __last;
            __span   -= __matches + 1;
            __matches = 0;
            __first   = ++__current;
        }
        else {
            if (++__matches == _Dist (__count))
                return __first;
            ++__current;
        }
    }

    return __last;
}


_EXPORT
template <class _FwdIter, class _Dist, class _Size, class _TypeT,
          class _BinaryPredicate>
_FwdIter __search_n (_FwdIter __first, _FwdIter __last,
                     _Dist*, _Size __count, const _TypeT& __val,
                     _BinaryPredicate __pred)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    const _Dist __dist = _DISTANCE (__first, __last, _Dist);

    const _RWSTD_PTRDIFF_T __int_count = __count;

    if (__dist < __int_count || __int_count <= 0)
        return __last;

    _Dist __span       = __dist - __int_count;
    _Dist __matches    = 0;
    _FwdIter __current = __first;

    while (!(__current == __last)) {
        if (__pred (*__current, __val) == false) {
            if (__span < __matches + 1)
                return __last;
            __span   -= __matches + 1;
            __matches = 0;
            __first   = ++__current;
        }
        else {
            if (++__matches == __count)
                return __first;
            ++__current;
        }
    }

    return __last;
}

//
// Modifying sequence operations.
//

_EXPORT
template <class _Iter, class _OutputIter, class _Predicate, class _TypeT>
_OutputIter replace_copy_if (_Iter __first, _Iter __last,
                             _OutputIter __res, _Predicate __pred,
                             const _TypeT& __new_value)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    for (; !(__first == __last); ++__res, ++__first)
        *__res = __pred (*__first) == false ? *__first : __new_value;

    return __res;
}


_EXPORT
template <class _InputIter, class _OutputIter, class _TypeT>
_OutputIter remove_copy (_InputIter __first, _InputIter __last,
                         _OutputIter __res, const _TypeT& __val)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    for (; !(__first == __last); ++__first)
        if (!(*__first == __val)) {
            *__res = *__first;
            ++__res;
        }
    return __res;
}


_EXPORT
template <class _InputIter, class _OutputIter, class _Predicate>
_OutputIter remove_copy_if (_InputIter __first, _InputIter __last,
                            _OutputIter __res, _Predicate __pred)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    for (; !(__first == __last); ++__first)
        if (__pred (*__first) == false) {
            *__res = *__first;
            ++__res;
        }
    return __res;
}


_EXPORT
template <class _FwdIter>
_FwdIter
unique (_FwdIter __first, _FwdIter __last)
{
    // find the first of two equal elements
    __first = _STD::adjacent_find (__first, __last);

    if (__first == __last)
        return __first;

    // advance `first' to point at the copy (may be overwritten later)
    _FwdIter __next = ++__first;

    // skip over all subsequent elements that are equal to the first
    while (!(++__next == __last))
        if (!(*__next == *__first))
            break;

    // invoke unique_copy to copy over the original sequence
    // starting at one past the first element
    return __unique_copy (__next, __last, __first,
                          _RWSTD_ITERATOR_CATEGORY (_FwdIter, __first));
}


_EXPORT
template <class _FwdIter, class _BinaryPredicate>
_FwdIter
unique (_FwdIter __first, _FwdIter __last, _BinaryPredicate __pred)
{
    __first = _STD::adjacent_find (__first, __last, __pred);

    if (__first == __last)
        return __first;

    _FwdIter __next = ++__first;

    while (!(++__next == __last))
        if (__pred (*__next, *__first) == false)
            break;

    return __unique_copy (__next, __last, __first, __pred,
                          _RWSTD_ITERATOR_CATEGORY (_FwdIter, __first));
}


_EXPORT
template <class _InputIter, class _FwdIter>
_FwdIter __unique_copy (_InputIter __first, _InputIter __last,
                        _FwdIter __res, forward_iterator_tag)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (__first == __last)
        return __res;

    *__res = *__first;
    while (!(++__first == __last))
        if (!(*__res == *__first))
            *++__res = *__first;
    return ++__res;
}


_EXPORT
template <class _InputIter, class _OutputIter, class _TypeT>
_OutputIter __unique_copy (_InputIter __first, _InputIter __last,
                           _OutputIter __res, _TypeT*)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (__first == __last)
        return __res;

    _TypeT __val = *__first;

    for (*__res = __val; !(++__first == __last); )
        if (!(__val == *__first)) {
            __val = *__first;
            *++__res = __val;
        }

    return ++__res;
}


_EXPORT
template <class _InputIter, class _FwdIter, class _BinaryPredicate>
_FwdIter __unique_copy (_InputIter __first, _InputIter __last,
                        _FwdIter __res,
                        _BinaryPredicate __pred,
                        forward_iterator_tag)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (__first == __last)
        return __res;

    for (*__res = *__first; !(++__first == __last); )
        if (__pred (*__res, *__first) == false)
            *++__res = *__first;

    return ++__res;
}


_EXPORT
template <class _InputIter, class _OutputIter, class _BinaryPredicate,
          class _TypeT>
_OutputIter __unique_copy (_InputIter __first, _InputIter __last,
                           _OutputIter __res,
                           _BinaryPredicate __pred, _TypeT*)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (__first == __last)
        return __res;

    _TypeT __val = *__first;

    for (*__res = __val; !(++__first == __last); )
        if (__pred (__val, *__first) == false) {
            __val = *__first;
            *++__res = __val;
        }

    return ++__res;
}


_EXPORT
template <class _FwdIter, class _Dist>
void __rotate (_FwdIter __first, _FwdIter __middle,
               _FwdIter __last, _Dist*, forward_iterator_tag)
{
    _RWSTD_ASSERT_IN_RANGE (__middle, __first, __last); 

    for (_FwdIter __i = __middle; ; ) {
        _STD::iter_swap (__first, __i);
        ++__i;
        if (++__first == __middle) {
            if (__i == __last)
                return;
            __middle = __i;
        }
        else if (__i == __last)
            __i = __middle;
    }
}


_EXPORT
template <class _EuclideanRingElement>
_EuclideanRingElement __gcd (_EuclideanRingElement __m,
                             _EuclideanRingElement __n)
{
    while (!(__n == _EuclideanRingElement ())) {
        const _EuclideanRingElement __r = __m % __n;
        __m = __n;
        __n = __r;
    }
    return __m;
}


_EXPORT
template <class _RandomAccessIter, class _Dist, class _TypeT>
void __rotate_cycle (_RandomAccessIter __first, _RandomAccessIter __last,
                     _RandomAccessIter __first2, _Dist __shift, _TypeT*)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    const _TypeT __val = *__first2;

    _RandomAccessIter __it1 = __first2;

    for (_RandomAccessIter __it2 = __it1 + __shift; !(__it2 == __first2); ) {
        *__it1 = *__it2;
        __it1  = __it2;

        if (__last - __it2 > __shift)
            __it2 += __shift;
        else
            __it2 = __first + (__shift - (__last - __it2));
    }

    *__it1 = __val;
}


_EXPORT
template <class _RandomAccessIter, class _Dist>
void __rotate (_RandomAccessIter __first, _RandomAccessIter __middle,
               _RandomAccessIter __last, _Dist*,
               random_access_iterator_tag)
{
    _RWSTD_ASSERT_IN_RANGE (__middle, __first, __last);
  
    for (_Dist __n = __gcd (__last - __first, __middle - __first); __n--; )
        __rotate_cycle (__first, __last, __first + __n, __middle - __first,
                       _RWSTD_VALUE_TYPE (_RandomAccessIter));
}


_EXPORT
template <class _RandomAccessIter, class _RandomNumberGenerator>
void random_shuffle (_RandomAccessIter __first, _RandomAccessIter __last,
                     _RandomNumberGenerator &__rand)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (!(__first == __last)) {

#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
        typedef _TYPENAME
            iterator_traits<_RandomAccessIter>::difference_type _DiffT;
#else   // if defined (_RWSTD_NO_CLASS_PARTIAL_SPEC)
        typedef _RWSTD_PTRDIFF_T _DiffT;
#endif   // _RWSTD_NO_CLASS_PARTIAL_SPEC

        _DiffT __limit = 2;

        for (_RandomAccessIter __i = __first; !(++__i == __last); ++__limit) {

            // the argument to and the return value of the random number
            // generator's operator() is required to be convertinble from
            // and to the iterator's difference_type but nothing else
            const _DiffT __rndoff (__rand (__limit));

            // returned value must be non-negative and less than the limit
            _RWSTD_ASSERT (0 <= __rndoff && __rndoff < __limit);

            _STD::iter_swap (__i, __first + __rndoff);
        }
    }
}


_EXPORT
template <class _BidirIter, class _Predicate>
_BidirIter partition (_BidirIter __first, _BidirIter __last, _Predicate __pred)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    for ( ; ; ++__first) {
        for ( ; ; ) {
            if (__first == __last)
                return __first;
            if (!(__pred (*__first) == false))
                ++__first;
            else
                break;
        }

        for (--__last; ; ) {
            if (__first == __last)
                return __first;
            if (__pred (*__last) == false)
                --__last;
            else
                break;
        }
        _STD::iter_swap (__first, __last);
    }
}


template <class _BidirIter, class _Predicate, class _Dist>
_BidirIter __inplace_stable_partition (_BidirIter __first, _BidirIter __last,
                                       _Predicate __pred, _Dist __dist)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (__dist == 1)
        return !(__pred (*__first) == false) ? __last : __first;

    _BidirIter __middle = __first;
    _STD::advance (__middle, __dist / 2);
    _BidirIter
        __first_cut = __inplace_stable_partition (__first, __middle, __pred,
                                                  __dist / 2);
    _BidirIter
        __second_cut = __inplace_stable_partition (__middle, __last, __pred,
                                                 __dist - __dist / 2);
    _STD::rotate (__first_cut, __middle, __second_cut);
    __dist = _DISTANCE (__middle, __second_cut, _Dist);
    _STD::advance (__first_cut, __dist);
    return __first_cut;
}


_EXPORT
template <class _BidirIter, class _Pointer, class _Predicate,
          class _Dist, class _TypeT>
_BidirIter __stable_partition_adaptive (_BidirIter __first, _BidirIter __last,
                                        _Predicate __pred, _Dist __dist,
                                        _Pointer __buf,
                                        _Dist __buf_size,
                                        _Dist& __fill_pointer, _TypeT*)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (__dist <= __buf_size)
    {
        __dist = 0;
        _BidirIter __res1 = __first;
        _Pointer __res2 = __buf;
        for (; !(__first == __last) && __dist < __fill_pointer; ++__first)
        {
            if (!(__pred (*__first) == false)) {
                *__res1 = *__first;
                ++__res1;
            }
            else {
                *__res2 = *__first;
                ++__res2;
                ++__dist;
            }
        }
        if (!(__first == __last))
        {
            raw_storage_iterator<_Pointer, _TypeT> __res3 (__res2);
            for (; !(__first == __last); ++__first)
            {
                if (!(__pred (*__first) == false)) {
                    *__res1 = *__first;
                    ++__res1;
                }
                else {
                    *__res3 = *__first;
                    ++__res3;
                    ++__dist;
                }
            }
            __fill_pointer = __dist;
        }
        _STD::copy (__buf, __buf + __dist, __res1);
        return __res1;
    }
    _BidirIter __middle = __first;
    _STD::advance (__middle, __dist / 2);

    // (__dist / 2)'s type may not be the same as that of __dist,
    // hence the seemingly redundant casts below
    _BidirIter __first_cut =
        __stable_partition_adaptive (__first, __middle, __pred,
                                     _Dist (__dist / 2),
                                     __buf, __buf_size,
                                     __fill_pointer, (_TypeT*)0);
    _BidirIter __second_cut =
        __stable_partition_adaptive (__middle, __last, __pred,
                                     _Dist (__dist - __dist / 2),
                                     __buf, __buf_size,
                                     __fill_pointer, (_TypeT*)0);

    _STD::rotate (__first_cut, __middle, __second_cut);
    __dist = _DISTANCE (__middle, __second_cut, _Dist);
    _STD::advance (__first_cut, __dist);
    return __first_cut;
}


_EXPORT
template <class _BidirIter, class _Predicate, class _TypeT, class _Dist>
_BidirIter __stable_partition (_BidirIter __first, _BidirIter __last,
                               _Predicate __pred, _TypeT*, _Dist*)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    const _Dist __dist = _DISTANCE (__first, __last, _Dist);

    if (!__dist)
        return __last;
    
    // call an extension of get_temporary_buffer<>() in case partial class
    // specialization (and iterator_traits<>) isn't supported by compiler
    pair<_TypeT*, _Dist> __pair =
        _STD::get_temporary_buffer (__dist, (_TypeT*)0);

    if (__pair.first == 0)
        return __inplace_stable_partition (__first, __last, __pred, __dist);

    _Dist __fill = 0;

    const _BidirIter __res =
        __stable_partition_adaptive (__first, __last, __pred, __dist,
                                     __pair.first, __pair.second,
                                     __fill, (_TypeT*)0);

    for (_TypeT *__ptr = __pair.first + __fill; !(__pair.first == __ptr--); )
        (*__ptr).~_TypeT ();

    _STD::return_temporary_buffer (__pair.first);

    return __res;
}

//
// Sorting and related operations.
//

template <class _RandomAccessIter, class _TypeT, class _Compare>
_RandomAccessIter __unguarded_partition (_RandomAccessIter __first,
                                         _RandomAccessIter __last,
                                         _TypeT __pivot, _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    for ( ; ; ++__first) {
        while (__comp (*__first, __pivot))
            ++__first;

        while (__comp (__pivot, *--__last)) { /* no-op */ }

        if (!(__first < __last))
            return __first;

        _STD::iter_swap (__first, __last);
    }
}


template <class _TypeT, class _Compare>
inline const _TypeT& __median (const _TypeT& __a, const _TypeT& __b,
                               const _TypeT& __c, _Compare __comp)
{
    return __comp (__a, __b)
        ? __comp (__b, __c) ? __b : __comp (__a, __c) ? __c : __a
        : __comp (__a, __c) ? __a : __comp (__b, __c) ? __c : __b;
}


enum { __rw_threshold = 16 };

template <class _RandomAccessIter, class _TypeT, class _Compare>
void __quick_sort_loop_aux (_RandomAccessIter __first,
                            _RandomAccessIter __last, _TypeT*,
                            _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    while (__last - __first > __rw_threshold) {
        _RandomAccessIter __cut =
            __unguarded_partition (__first, __last,
                                   _TypeT (__median (*__first,
                                                     * (__first +
                                                        (__last - __first)/2),
                                                     * (__last - 1),
                                                     __comp)),
             __comp);
        if (__cut - __first >= __last - __cut) {
            __quick_sort_loop_aux (__cut, __last,
                                   _RWSTD_VALUE_TYPE (_RandomAccessIter),
                                   __comp);
            __last = __cut;
        }
        else {
            __quick_sort_loop_aux (__first, __cut,
                                   _RWSTD_VALUE_TYPE (_RandomAccessIter),
                                   __comp);
            __first = __cut;
        }
    }
}


template <class _RandomAccessIter, class _TypeT>
inline void __linear_insert (_RandomAccessIter __first, 
                             _RandomAccessIter __last, _TypeT*)
{
    const _TypeT __val = *__last;

    if (__val < *__first) {
        _STD::copy_backward (__first, __last, __last + 1);
        *__first = __val;
    }
    else
        __unguarded_linear_insert (__last, __val);
}


template <class _RandomAccessIter, class _TypeT, class _Compare>
inline void
__linear_insert (_RandomAccessIter __first, _RandomAccessIter __last, _TypeT*,
                 _Compare __comp)
{
    const _TypeT __val = *__last;

    if (__comp (__val, *__first)) {
        _STD::copy_backward (__first, __last, __last + 1);
        *__first = __val;
    }
    else
        __unguarded_linear_insert (__last, __val, __comp);
}


_EXPORT
template <class _RandomAccessIter, class _Compare>
void __insertion_sort (_RandomAccessIter __first,
                       _RandomAccessIter __last, _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (! (__first == __last))
        for (_RandomAccessIter __i = __first + 1; !(__i == __last); ++__i)
            __linear_insert (__first, __i,
                             _RWSTD_VALUE_TYPE (_RandomAccessIter), __comp);
}

_EXPORT
template <class _RandomAccessIter, class _TypeT, class _Compare>
void __unguarded_linear_insert (_RandomAccessIter __last, _TypeT __val,
                                _Compare __comp)
{
    for (_RandomAccessIter __next = __last; __comp (__val, *--__next); ) {
        *__last = *__next;
        __last = __next;
    }
    *__last = __val;
}


_EXPORT
template <class _RandomAccessIter, class _Compare>
void __final_insertion_sort (_RandomAccessIter __first,
                             _RandomAccessIter __last, _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (__last - __first > __rw_threshold) {
        __insertion_sort (__first, __first + __rw_threshold, __comp);
        __unguarded_insertion_sort (__first + __rw_threshold, __last, __comp);
    }
    else
        __insertion_sort (__first, __last, __comp);
}


template <class _RandomAccessIter1, class _RandomAccessIter2,
          class _Dist, class _Compare>
void __merge_sort_loop (_RandomAccessIter1 __first,
                        _RandomAccessIter1 __last,
                        _RandomAccessIter2 __res, _Dist __step,
                        _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    const _Dist __two_step = 2 * __step;

    while (__last - __first >= __two_step) {
        __res = _STD::merge (__first, __first + __step,
                             __first + __step, __first + __two_step, __res,
                             __comp);
        __first += __two_step;
    }
    __step = (_STD::min)(_Dist (__last - __first), __step);

    _STD::merge (__first, __first + __step, __first + __step, __last,
                 __res, __comp);
}


template <class _RandomAccessIter, class _Dist, class _Compare>
void __chunk_insertion_sort (_RandomAccessIter __first,
                             _RandomAccessIter __last,
                             _Dist __chunk_size, _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    while (__last - __first >= __chunk_size)
    {
        __insertion_sort (__first, __first + __chunk_size, __comp);
        __first += __chunk_size;
    }
    __insertion_sort (__first, __last, __comp);
}


_EXPORT
template <class _RandomAccessIter, class _Pointer, class _Dist,
          class _Compare>
void __merge_sort_with_buffer (_RandomAccessIter __first,
                               _RandomAccessIter __last, _Pointer __buf,
                               _Dist*, _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    const _Dist __dist  = __last - __first;
    const _Pointer __bufend = __buf + __dist;

    _Dist __step = 7;   // STL chunk size

    __chunk_insertion_sort (__first, __last, __step, __comp);

    while (__step < __dist) {
        __merge_sort_loop (__first, __last, __buf, __step, __comp);
        __step *= 2;
        __merge_sort_loop (__buf, __bufend, __first, __step, __comp);
        __step *= 2;
    }
}


template <class _BidirIter, class _Dist, class _Pointer, class _Compare>
void __merge_adaptive (_BidirIter, _BidirIter, _BidirIter,
                       _Dist, _Dist, _Pointer, _Dist, _Compare);

_EXPORT
template <class _RandomAccessIter, class _Pointer, class _Dist,
          class _TypeT, class _Compare>
void __stable_sort_adaptive (_RandomAccessIter __first,
                             _RandomAccessIter __last, _Pointer __buf,
                             _Dist __buf_size, _TypeT*,
                             _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    const _Dist __dist = (__last - __first + 1) / 2;
    const _RandomAccessIter __middle = __first + __dist;

    if (__dist > __buf_size) {
        __stable_sort_adaptive (__first, __middle, __buf, __buf_size,
                                (_TypeT*)0, __comp);
        __stable_sort_adaptive (__middle, __last, __buf, __buf_size,
                                (_TypeT*)0, __comp);
    }
    else {
        __merge_sort_with_buffer (__first, __middle, __buf,
                                 (_Dist*)0, __comp);
        __merge_sort_with_buffer (__middle, __last, __buf,
                                 (_Dist*)0, __comp);
    }
    __merge_adaptive (__first, __middle, __last,
                      _Dist (__middle - __first),
                     _Dist (__last - __middle), __buf, __buf_size, __comp);
}


_EXPORT
template <class _RandomAccessIter, class _TypeT, class _Dist, class _Compare>
void
__stable_sort (_RandomAccessIter __first, _RandomAccessIter __last,
               _TypeT*, _Dist*, _Compare __comp)
{
    // call an extension of get_temporary_buffer<>() in case partial class
    // specialization (and iterator_traits<>) isn't supported by compiler
    pair<_TypeT*, _Dist> __p =
        _STD::get_temporary_buffer (_Dist (__last - __first), (_TypeT*)0);

    if (__p.first == 0)
        __inplace_stable_sort (__first, __last, __comp);
    else {
        _Dist __len = (_STD::min)(_Dist (__p.second),
                                      _Dist (__last - __first));
        _STD::copy (__first, __first + __len,
                    raw_storage_iterator<_TypeT*, _TypeT>(__p.first));

        __stable_sort_adaptive (__first, __last, __p.first, __p.second,
                                (_TypeT*)0, __comp);

        for (_TypeT *__ptr = __p.first + __len; !(__p.first == --__ptr); )
            (*__ptr).~_TypeT ();

        _STD::return_temporary_buffer (__p.first);
    }
}


_EXPORT
template <class _RandomAccessIter, class _TypeT, class _Compare>
void __partial_sort (_RandomAccessIter __first, _RandomAccessIter __middle,
                     _RandomAccessIter __last, _TypeT*, _Compare __comp)
{
    _RWSTD_ASSERT_IN_RANGE (__middle, __first, __last);

    _STD::make_heap (__first, __middle, __comp);

    for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
        if (__comp (*__i, *__first))
            __pop_heap (__first, __middle, __i, *__i, __comp,
                        _RWSTD_DIFFERENCE_TYPE (_RandomAccessIter));

    _STD::sort_heap (__first, __middle, __comp);
}


_EXPORT
template <class _InputIter, class _RandomAccessIter, class _Compare,
          class _Dist, class _TypeT>
_RandomAccessIter __partial_sort_copy (_InputIter __first,
                                       _InputIter __last,
                                       _RandomAccessIter __first2,
                                       _RandomAccessIter __last2,
                                       _Compare __comp,
                                       _Dist*, _TypeT*)
{
    _RWSTD_ASSERT_RANGE (__first, __last);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    if (__first2 == __last2)
        return __last2;

    _RandomAccessIter __res = __first2;

    for (; !(__first == __last) && !(__res == __last2); ++__first, ++__res)
        *__res = *__first;

    _STD::make_heap (__first2, __res, __comp);

    for (; !(__first == __last); ++__first) {
        if (__comp (*__first, *__first2))
            __adjust_heap (__first2, _Dist (), _Dist (__res - __first2),
                           *__first, __comp);
    }

    _STD::sort_heap (__first2, __res, __comp);

    return __res;
}


// David R. Musser's Introspective Sorting algorithm
// (see www.cs.rpi.edu/~musser/gp/introsort.ps)
// O(N * log (N)) worst case complexity
_EXPORT
template <class _RandomAccessIter, class _Dist, class _Compare>
void __introsort_loop (_RandomAccessIter __first, _RandomAccessIter __last,
                       _Dist __max_depth, _Compare __comp)
{
    for ( ; __rw_threshold < __last - __first; ) {
        if (0 == __max_depth) {
            __partial_sort (__first, __last, __last,
                            _RWSTD_VALUE_TYPE (_RandomAccessIter), __comp);
            break;
        }

        _RandomAccessIter __cut =
            __unguarded_partition (__first, __last,
                                   __median (*__first,
                                             *(__first + (__last - __first) /2),
                                             *(__last - 1), __comp), __comp);

        // limit the depth of the recursion tree to log2 (last - first)
        // where first and last are the initial values passed in from sort()
        __introsort_loop (__cut, __last, __max_depth /= 2, __comp);
        __last = __cut;
    }
}


_EXPORT
template <class _RandomAccessIter, class _TypeT, class _Compare>
void __nth_element (_RandomAccessIter __first, _RandomAccessIter __nth,
                    _RandomAccessIter __last, _TypeT*, _Compare __comp)
{
    _RWSTD_ASSERT_IN_RANGE (__nth, __first, __last);

    while (__last - __first > 3) {
        const _RandomAccessIter __cut =
            __unguarded_partition (__first, __last,
                                   _TypeT (__median (*__first,
                                                     * (__first +
                                                        (__last - __first)/2),
                                                     * (__last - 1),
                                                     __comp)),
             __comp);
        if (!(__nth < __cut))
            __first = __cut;
        else
            __last = __cut;
    }
    __insertion_sort (__first, __last, __comp);
}

//
// Binary search.
//

_EXPORT
template <class _FwdIter, class _TypeT, class _Compare, class _Dist>
_FwdIter __lower_bound (_FwdIter __first, _FwdIter __last,
                        const _TypeT& __val, _Compare __comp,
                        _Dist*, forward_iterator_tag)
{
    _RWSTD_ASSERT_RANGE (__first, __last);
    
    for (_Dist __dist = _DISTANCE (__first, __last, _Dist); __dist; ) {

        const _Dist __half = __dist / 2;
        _FwdIter __middle = __first;

        _STD::advance (__middle, __half);

        if (__comp (*__middle, __val)) {
            __first = __middle;
            ++__first;
            __dist = __dist - __half - 1;
        }
        else
            __dist = __half;
    }
    return __first;
}


_EXPORT
template <class _RandomAccessIter, class _TypeT, class _Compare,
          class _Dist>
_RandomAccessIter __lower_bound (_RandomAccessIter __first,
                                 _RandomAccessIter __last,
                                 const _TypeT& __val,
                                 _Compare __comp,
                                 _Dist*,
                                 random_access_iterator_tag)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    for (_Dist __dist = __last - __first; __dist > 0; ) {

        const _Dist __half = __dist / 2;
        const _RandomAccessIter __middle = __first + __half;

        if (__comp (*__middle, __val)) {
            __first = __middle + 1;
            __dist  = __dist - __half - 1;
        }
        else
            __dist = __half;
    }

    return __first;
}


_EXPORT
template <class _FwdIter, class _TypeT, class _Compare, class _Dist>
_FwdIter __upper_bound (_FwdIter __first, _FwdIter __last,
                        const _TypeT& __val, _Compare __comp,
                        _Dist*, forward_iterator_tag)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    for (_Dist __dist = _DISTANCE (__first, __last, _Dist); __dist; ) {

        const _Dist __half = __dist / 2;
        _FwdIter __middle = __first;

        _STD::advance (__middle, __half);

        if (__comp (__val, *__middle))
            __dist = __half;
        else {
            __first = __middle;
            ++__first;
            __dist = __dist - __half - 1;
        }
    }

    return __first;
}


_EXPORT
template <class _RandomAccessIter, class _TypeT, class _Compare, class _Dist>
_RandomAccessIter __upper_bound (_RandomAccessIter __first,
                                 _RandomAccessIter __last,
                                 const _TypeT& __val,
                                 _Compare __comp, _Dist*,
                                 random_access_iterator_tag)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    for (_Dist __dist = __last - __first; __dist; ) {

        const _Dist __half = __dist / 2;
        const _RandomAccessIter __middle = __first + __half;

        if (__comp (__val, *__middle))
            __dist = __half;
        else {
            __first = __middle + 1;
            __dist = __dist - __half - 1;
        }
    }

    return __first;
}


_EXPORT
template <class _FwdIter, class _TypeT, class _Compare, class _Dist>
pair<_FwdIter, _FwdIter>
__equal_range (_FwdIter __first, _FwdIter __last, const _TypeT& __val,
               _Compare __comp, _Dist*, forward_iterator_tag)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    for (_Dist __dist = _DISTANCE (__first, __last, _Dist); __dist; ) {

        const _Dist __half = __dist / 2;
        _FwdIter __middle = __first;

        _STD::advance (__middle, __half);

        if (__comp (*__middle, __val)) {
            __first = __middle;
            ++__first;
            __dist = __dist - __half - 1;
        }
        else if (__comp (__val, *__middle))
            __dist = __half;
        else {
            const _FwdIter __left =
                _STD::lower_bound (__first, __middle, __val, __comp);

            _STD::advance (__first, __dist);

            const _FwdIter __right =
                _STD::upper_bound (++__middle, __first, __val, __comp);

            return pair<_FwdIter, _FwdIter>(__left, __right);
        }
    }

    return pair<_FwdIter, _FwdIter>(__first, __first);
}


_EXPORT
template <class _RandomAccessIter, class _TypeT, class _Compare,
          class _Dist>
pair<_RandomAccessIter, _RandomAccessIter>
__equal_range (_RandomAccessIter __first, _RandomAccessIter __last,
               const _TypeT& __val, _Compare __comp, _Dist*,
               random_access_iterator_tag)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    for (_Dist __dist = __last - __first; __dist; ) {

        const _Dist __half = __dist / 2;
        const _RandomAccessIter __middle = __first + __half;

        if (__comp (*__middle, __val)) {
            __first = __middle + 1;
            __dist  = __dist - __half - 1;
        }
        else if (__comp (__val, *__middle))
            __dist = __half;
        else {
            const _RandomAccessIter __left =
                _STD::lower_bound (__first, __middle, __val, __comp);

            const _RandomAccessIter __right =
                _STD::upper_bound (__middle + 1, __first + __dist,
                                   __val, __comp);

            return pair<_RandomAccessIter, _RandomAccessIter>(__left, __right);
        }
    }

    return pair<_RandomAccessIter, _RandomAccessIter>(__first, __first);
}

//
// Merge
//

_EXPORT
template <class _InputIter1, class _InputIter2, class _OutputIter,
          class _Compare>
_OutputIter merge (_InputIter1 __first1, _InputIter1 __last1,
                   _InputIter2 __first2, _InputIter2 __last2,
                   _OutputIter __res, _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    for (; !(__first1 == __last1) && !(__first2 == __last2); ++__res) {
        if (__comp (*__first2, *__first1)) {
            *__res = *__first2;
            ++__first2;
        }
        else {
            *__res = *__first1;
            ++__first1;
        }
    }
    return _STD::copy (__first2, __last2, _STD::copy(__first1, __last1, __res));
}


_EXPORT
template <class _BidirIter, class _Dist, class _Compare>
void __merge_without_buffer (_BidirIter __first,
                             _BidirIter __middle,
                             _BidirIter __last,
                             _Dist __dist1, _Dist __dist2,
                             _Compare __comp)
{
    _RWSTD_ASSERT_IN_RANGE (__middle, __first, __last);

    if (__dist1 == 0 || __dist2 == 0)
        return;

    if (__dist1 + __dist2 == 2) {
        if (__comp (*__middle, *__first))
            _STD::iter_swap (__first, __middle);
        return;
    }

    _BidirIter __first_cut = __first;
    _BidirIter __second_cut = __middle;
    _Dist __dist11;
    _Dist __dist22;

    if (__dist1 > __dist2) {
        __dist11 = __dist1 / 2;
        _STD::advance (__first_cut, __dist11);
        __second_cut = _STD::lower_bound (__middle, __last,
                                          *__first_cut, __comp);
        __dist22 = _DISTANCE (__middle, __second_cut, _Dist);
    }
    else {
        __dist22 = __dist2 / 2;
        _STD::advance (__second_cut, __dist22);
        __first_cut = _STD::upper_bound (__first, __middle,
                                            *__second_cut, __comp);
        __dist11 = _DISTANCE (__first, __first_cut, _Dist);
    }
    _STD::rotate (__first_cut, __middle, __second_cut);

    _BidirIter __middle2 = __first_cut;

    _STD::advance (__middle2, __dist22);

    __merge_without_buffer (__first, __first_cut, __middle2,
                            __dist11, __dist22, __comp);
    __merge_without_buffer (__middle2, __second_cut, __last,
                            __dist1 - __dist11, __dist2 - __dist22, __comp);
}

_EXPORT
template <class _BidirIter1, class _BidirIter2, class _Dist>
_BidirIter1 __rotate_adaptive (_BidirIter1 __first,
                               _BidirIter1 __middle,
                               _BidirIter1 __last,
                               _Dist __dist1, _Dist __dist2,
                               _BidirIter2 __buf,
                               _Dist __buf_size)
{
    _RWSTD_ASSERT_IN_RANGE (__middle, __first, __last);

    if (__dist1 > __dist2 && __dist2 <= __buf_size) {
        _BidirIter2 __buf_end = _STD::copy (__middle, __last, __buf);
        _STD::copy_backward (__first, __middle, __last);
        return _STD::copy (__buf, __buf_end, __first);
    }

    if (__dist1 <= __buf_size) {
        _BidirIter2 __buf_end = _STD::copy (__first, __middle, __buf);
        _STD::copy (__middle, __last, __first);
        return _STD::copy_backward (__buf, __buf_end, __last);
    }

    _STD::rotate (__first, __middle, __last);
    _STD::advance (__first, __dist2);
    return __first;
}


template <class _BidirIter1, class _BidirIter2,
          class _BidirIter3>
_BidirIter3 __merge_backward (_BidirIter1 __first1,
                              _BidirIter1 __last1,
                              _BidirIter2 __first2,
                              _BidirIter2 __last2,
                              _BidirIter3 __res)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    if (__first1 == __last1)
        return _STD::copy_backward (__first2, __last2, __res);

    if (__first2 == __last2)
        return _STD::copy_backward (__first1, __last1, __res);

    for (--__last1, --__last2; ; ) {
        if (*__last2 < *__last1) {
            *--__res = *__last1;
            if (__first1 == __last1)
                return _STD::copy_backward (__first2, ++__last2, __res);
            --__last1;
        }
        else {
            *--__res = *__last2;
            if (__first2 == __last2)
                return _STD::copy_backward (__first1, ++__last1, __res);
            --__last2;
        }
    }
}


_EXPORT
template <class _BidirIter1, class _BidirIter2,
          class _BidirIter3, class _Compare>
_BidirIter3 __merge_backward (_BidirIter1 __first1,
                              _BidirIter1 __last1,
                              _BidirIter2 __first2,
                              _BidirIter2 __last2,
                              _BidirIter3 __res,
                              _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    if (__first1 == __last1)
        return _STD::copy_backward (__first2, __last2, __res);
    if (__first2 == __last2)
        return _STD::copy_backward (__first1, __last1, __res);

    for (--__last1, --__last2; ; ) {
        if (__comp (*__last2, *__last1)) {
            *--__res = *__last1;
            if (__first1 == __last1)
                return _STD::copy_backward (__first2, ++__last2, __res);
            --__last1;
        }
        else {
            *--__res = *__last2;
            if (__first2 == __last2)
                return _STD::copy_backward (__first1, ++__last1, __res);
            --__last2;
        }
    }
}


template <class _BidirIter, class _Dist, class _Pointer, class _Compare>
void __merge_adaptive (_BidirIter __first, _BidirIter __middle,
                       _BidirIter __last,
                       _Dist __dist1, _Dist __dist2,
                       _Pointer __buf, _Dist __buf_size,
                       _Compare __comp)
{
    _RWSTD_ASSERT_IN_RANGE (__middle, __first, __last);
    
    if (__dist1 <= __dist2 && __dist1 <= __buf_size)
    {
        _Pointer __buf_end = _STD::copy (__first, __middle, __buf);
        _STD::merge (__buf, __buf_end, __middle, __last, __first, __comp);
    }
    else if (__dist2 <= __buf_size)
    {
        _Pointer __buf_end = _STD::copy (__middle, __last, __buf);
        __merge_backward (__first, __middle, __buf, __buf_end, __last,
                          __comp);
    }
    else
    {
        _BidirIter __first_cut = __first;
        _BidirIter __second_cut = __middle;
        _Dist __dist11;
        _Dist __dist22;
        if (__dist1 > __dist2)
        {
            __dist11 = __dist1 / 2;
            _STD::advance (__first_cut, __dist11);
            __second_cut = _STD::lower_bound (__middle, __last, *__first_cut,
                                              __comp);
            __dist22 = _DISTANCE (__middle, __second_cut, _Dist);
        }
        else
        {
            __dist22 = __dist2 / 2;
            _STD::advance (__second_cut, __dist22);
            __first_cut = _STD::upper_bound (__first, __middle, *__second_cut,
                                                __comp);
            __dist11 = _DISTANCE (__first, __first_cut, _Dist);
        }
        _BidirIter __middle2 =
            __rotate_adaptive (__first_cut, __middle, __second_cut,
                               __dist1 - __dist11, __dist22,
                               __buf, __buf_size);
        __merge_adaptive (__first, __first_cut, __middle2,
                          __dist11, __dist22,
                          __buf, __buf_size, __comp);
        __merge_adaptive (__middle2, __second_cut, __last,
                          __dist1 - __dist11, __dist2 - __dist22,
                          __buf, __buf_size, __comp);
    }
}


_EXPORT
template <class _BidirIter, class _Dist, class _TypeT, class _Compare>
void __inplace_merge (_BidirIter __first, _BidirIter __middle,
                      _BidirIter __last, _Dist*, _TypeT*, _Compare __comp)
{
    _Dist __dist1 = _DISTANCE (__first, __middle, _Dist);
    _Dist __dist2 = _DISTANCE (__middle, __last, _Dist);
 
    // call an extension of get_temporary_buffer<>() in case partial class
    // specialization (and iterator_traits<>) isn't supported by compiler
    pair<_TypeT*, _Dist> __pair =
        _STD::get_temporary_buffer (__dist1 + __dist2, (_TypeT*)0);

    if (__pair.first == 0) {
        __merge_without_buffer (__first, __middle, __last, __dist1, __dist2,
                                __comp);
    }
    else {
        _Dist __dist = (_STD::min)(__pair.second, __dist1 + __dist2);
        
        _STD::fill_n (raw_storage_iterator<_TypeT*, _TypeT> (__pair.first),
                      __dist, *__first);
        __merge_adaptive (__first, __middle, __last, __dist1, __dist2,
                          __pair.first, __pair.second, __comp);

        for (_TypeT *__ptr = __pair.first + __dist;
             !(__pair.first == --__ptr); )
            (*__ptr).~_TypeT ();

        _STD::return_temporary_buffer (__pair.first);
    }
}

//
// Set operations. Assume sorted sequences.
//


// 25.3.5.1 - returns true iff every (not necessarily distinct) element
// in [first2, last2) occurs (at least as many times) in [first1, last1)
_EXPORT
template <class _InputIter1, class _InputIter2, class _Compare>
bool includes (_InputIter1 __first1, _InputIter1 __last1,
               _InputIter2 __first2, _InputIter2 __last2,
               _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    for (; !(__first1 == __last1) && !(__first2 == __last2); ++__first1) {
        if (__comp (*__first2, *__first1))
            return false;

        if (__comp (*__first1, *__first2) == false)
            ++__first2;
    }

    return __first2 == __last2;
}


_EXPORT
template <class _InputIter1, class _InputIter2, class _OutputIter,
          class _Compare>
_OutputIter set_union (_InputIter1 __first1, _InputIter1 __last1,
                       _InputIter2 __first2, _InputIter2 __last2,
                       _OutputIter __res, _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    for (; !(__first1 == __last1) && !(__first2 == __last2); ++__res) {
        if (__comp (*__first1, *__first2)) {
            *__res = *__first1;
            ++__first1;
        }
        else if (__comp (*__first2, *__first1)) {
            *__res = *__first2;
            ++__first2;
        }
        else {
            *__res = *__first1;
            ++__first1;
            ++__first2;
        }
    }
    return _STD::copy (__first2, __last2,
                       _STD::copy (__first1, __last1, __res));
}


_EXPORT
template <class _InputIter1, class _InputIter2, class _OutputIter,
          class _Compare>
_OutputIter set_intersection (_InputIter1 __first1, _InputIter1 __last1,
                              _InputIter2 __first2, _InputIter2 __last2,
                              _OutputIter __res, _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    while (!(__first1 == __last1) && !(__first2 == __last2)) {
        if (__comp (*__first1, *__first2))
            ++__first1;
        else if (__comp (*__first2, *__first1))
            ++__first2;
        else {
            *__res = *__first1;
            ++__res;
            ++__first1;
            ++__first2;
        }
    }

    return __res;
}


_EXPORT
template <class _InputIter1, class _InputIter2, class _OutputIter,
          class _Compare>
_OutputIter set_difference (_InputIter1 __first1, _InputIter1 __last1,
                            _InputIter2 __first2, _InputIter2 __last2,
                            _OutputIter __res, _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    while (!(__first1 == __last1) && !(__first2 == __last2)) {
        if (__comp (*__first1, *__first2)) {
            *__res = *__first1;
            ++__res;
            ++__first1;
        }
        else if (__comp (*__first2, *__first1))
            ++__first2;
        else {
            ++__first1;
            ++__first2;
        }
    }

    return _STD::copy (__first1, __last1, __res);
}


_EXPORT
template <class _InputIter1, class _InputIter2, class _OutputIter,
          class _Compare>
_OutputIter set_symmetric_difference (_InputIter1 __first1,
                                      _InputIter1 __last1,
                                      _InputIter2 __first2,
                                      _InputIter2 __last2,
                                      _OutputIter __res,
                                      _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first1, __last1);
    _RWSTD_ASSERT_RANGE (__first2, __last2);

    while (!(__first1 == __last1) && !(__first2 == __last2)) {
        if (__comp (*__first1, *__first2)) {
            *__res = *__first1;
            ++__res;
            ++__first1;
        }
        else if (__comp (*__first2, *__first1)) {
            *__res = *__first2;
            ++__res;
            ++__first2;
        }
        else {
            ++__first1;
            ++__first2;
        }
    }

    return _STD::copy (__first2, __last2, _STD::copy(__first1, __last1, __res));
}

//
// Minimum and maximum.
//


_EXPORT
template <class _FwdIter, class _Compare>
_FwdIter min_element (_FwdIter __first, _FwdIter __last, _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    _FwdIter __res = __first;

    if (!(__first == __last)) {
        while (!(++__first == __last)) {
            if (__comp (*__first, *__res))
                __res = __first;
        }
    }

    return __res;
}


_EXPORT
template <class _FwdIter, class _Compare>
_FwdIter max_element (_FwdIter __first, _FwdIter __last, _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    _FwdIter __res = __first;

    if (!(__first == __last)) {
        while (!(++__first == __last)) {
            if (__comp (*__res, *__first))
                __res = __first;
        }
    }

    return __res;
}

//
// Permutations.
//

_EXPORT
template <class _BidirIter, class _Compare>
bool next_permutation (_BidirIter __first, _BidirIter __last, _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (__first == __last)
        return false;

    _BidirIter __i = __first;

    if (++__i == __last)
        return false;

    bool __res;

    for (__i = __last, --__i; ; ) {
        const _BidirIter __ii = __i;

        if (__comp (*--__i, *__ii)) {

            _BidirIter __j = __last;

            while (__comp (*__i, *--__j) == false) { /* no-op */ }

            _STD::iter_swap (__i, __j);

            __first = __ii;
            __res   = true;
            break;
        }

        if (__i == __first) {
            __res = false;
            break;
        }
    }

    _STD::reverse (__first, __last);

    return __res;
}


_EXPORT
template <class _BidirIter, class _Compare>
bool prev_permutation (_BidirIter __first, _BidirIter __last, _Compare __comp)
{
    _RWSTD_ASSERT_RANGE (__first, __last);

    if (__first == __last)
        return false;

    _BidirIter __i = __first;

    if (++__i == __last)
        return false;

    bool __res;

    for (__i = __last, --__i; ; ) {
        const _BidirIter __ii = __i;

        if (__comp (*__ii, *--__i)) {

            _BidirIter __j = __last;

            while (__comp (*--__j, *__i) == false) { /* no-op */ }

            _STD::iter_swap (__i, __j);

            __first = __ii;
            __res   = true;
            break;
        }

        if (__i == __first) {
            __res = false;
            break;
        }
    }

    _STD::reverse (__first, __last);

    return __res;
}


}   // namespace std
