Page 3 of 4 FirstFirst 1234 LastLast
Results 51 to 75 of 99
  1. #51
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    /*
    * Copyright (c) 1997
    * Silicon Graphics Computer Systems, Inc.
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. Silicon Graphics makes no
    * representations about the suitability of this software for any
    * purpose. It is provided "as is" without express or implied warranty.
    */

    /* NOTE: This is an internal header file, included by other STL headers.
    * You should not attempt to use it directly.
    */

    # include <stdio.h>

    #ifdef __STL_USE_NEW_IOSTREAMS
    # include <iostream>
    #else /* __STL_USE_NEW_IOSTREAMS */
    # include <iostream.h>
    #endif /* __STL_USE_NEW_IOSTREAMS */

    #ifdef __STL_USE_EXCEPTIONS
    # include <stdexcept>
    #endif

    __STL_BEGIN_NAMESPACE

    #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
    #pragma set woff 1174
    #endif

    // Set buf_start, buf_end, and buf_ptr appropriately, filling tmp_buf
    // if necessary. Assumes _M_path_end[leaf_index] and leaf_pos are correct.
    // Results in a valid buf_ptr if the iterator can be legitimately
    // dereferenced.
    template <class _CharT, class _Alloc>
    void _Rope_iterator_base<_CharT,_Alloc>::_S_setbuf(
    _Rope_iterator_base<_CharT,_Alloc>& __x)
    {
    const _RopeRep* __leaf = __x._M_path_end[__x._M_leaf_index];
    size_t __leaf_pos = __x._M_leaf_pos;
    size_t __pos = __x._M_current_pos;

    switch(__leaf->_M_tag) {
    case _RopeRep::_S_leaf:
    __x._M_buf_start =
    ((_Rope_RopeLeaf<_CharT,_Alloc>*)__leaf)->_M_data;
    __x._M_buf_ptr = __x._M_buf_start + (__pos - __leaf_pos);
    __x._M_buf_end = __x._M_buf_start + __leaf->_M_size;
    break;
    case _RopeRep::_S_function:
    case _RopeRep::_S_substringfn:
    {
    size_t __len = _S_iterator_buf_len;
    size_t __buf_start_pos = __leaf_pos;
    size_t __leaf_end = __leaf_pos + __leaf->_M_size;
    char_producer<_CharT>* __fn =
    ((_Rope_RopeFunction<_CharT,_Alloc>*)__leaf)->_M_fn;

    if (__buf_start_pos + __len <= __pos) {
    __buf_start_pos = __pos - __len/4;
    if (__buf_start_pos + __len > __leaf_end) {
    __buf_start_pos = __leaf_end - __len;
    }
    }
    if (__buf_start_pos + __len > __leaf_end) {
    __len = __leaf_end - __buf_start_pos;
    }
    (*__fn)(__buf_start_pos - __leaf_pos, __len, __x._M_tmp_buf);
    __x._M_buf_ptr = __x._M_tmp_buf + (__pos - __buf_start_pos);
    __x._M_buf_start = __x._M_tmp_buf;
    __x._M_buf_end = __x._M_tmp_buf + __len;
    }
    break;
    default:
    __stl_assert(0);
    }
    }

    // Set path and buffer inside a rope iterator. We assume that
    // pos and root are already set.
    template <class _CharT, class _Alloc>
    void _Rope_iterator_base<_CharT,_Alloc>::_S_setcache
    (_Rope_iterator_base<_CharT,_Alloc>& __x)
    {
    const _RopeRep* __path[_RopeRep::_S_max_rope_depth+1];
    const _RopeRep* __curr_rope;
    int __curr_depth = -1; /* index into path */
    size_t __curr_start_pos = 0;
    size_t __pos = __x._M_current_pos;
    unsigned char __dirns = 0; // Bit vector marking right turns in the path

    __stl_assert(__pos <= __x._M_root->_M_size);
    if (__pos >= __x._M_root->_M_size) {
    __x._M_buf_ptr = 0;
    return;
    }
    __curr_rope = __x._M_root;
    if (0 != __curr_rope->_M_c_string) {
    /* Treat the root as a leaf. */
    __x._M_buf_start = __curr_rope->_M_c_string;
    __x._M_buf_end = __curr_rope->_M_c_string + __curr_rope->_M_size;
    __x._M_buf_ptr = __curr_rope->_M_c_string + __pos;
    __x._M_path_end[0] = __curr_rope;
    __x._M_leaf_index = 0;
    __x._M_leaf_pos = 0;
    return;
    }
    for(; {
    ++__curr_depth;
    __stl_assert(__curr_depth <= _RopeRep::_S_max_rope_depth);
    __path[__curr_depth] = __curr_rope;
    switch(__curr_rope->_M_tag) {
    case _RopeRep::_S_leaf:
    case _RopeRep::_S_function:
    case _RopeRep::_S_substringfn:
    __x._M_leaf_pos = __curr_start_pos;
    goto done;
    case _RopeRep::_S_concat:
    {
    _Rope_RopeConcatenation<_CharT,_Alloc>* __c =
    (_Rope_RopeConcatenation<_CharT,_Alloc>*)__curr_ro pe;
    _RopeRep* __left = __c->_M_left;
    size_t __left_len = __left->_M_size;

    __dirns <<= 1;
    if (__pos >= __curr_start_pos + __left_len) {
    __dirns |= 1;
    __curr_rope = __c->_M_right;
    __curr_start_pos += __left_len;
    } else {
    __curr_rope = __left;
    }
    }
    break;
    }
    }
    done:
    // Copy last section of path into _M_path_end.
    {
    int __i = -1;
    int __j = __curr_depth + 1 - _S_path_cache_len;

    if (__j < 0) __j = 0;
    while (__j <= __curr_depth) {
    __x._M_path_end[++__i] = __path[__j++];
    }
    __x._M_leaf_index = __i;
    }
    __x._M_path_directions = __dirns;
    _S_setbuf(__x);
    }

    // Specialized version of the above. Assumes that
    // the path cache is valid for the previous position.
    template <class _CharT, class _Alloc>
    void _Rope_iterator_base<_CharT,_Alloc>::_S_setcache_fo r_incr
    (_Rope_iterator_base<_CharT,_Alloc>& __x)
    {
    int __current_index = __x._M_leaf_index;
    const _RopeRep* __current_node = __x._M_path_end[__current_index];
    size_t __len = __current_node->_M_size;
    size_t __node_start_pos = __x._M_leaf_pos;
    unsigned char __dirns = __x._M_path_directions;
    _Rope_RopeConcatenation<_CharT,_Alloc>* __c;

    __stl_assert(__x._M_current_pos <= __x._M_root->_M_size);
    if (__x._M_current_pos - __node_start_pos < __len) {
    /* More stuff in this leaf, we just didn't cache it. */
    _S_setbuf(__x);
    return;
    }
    __stl_assert(__node_start_pos + __len == __x._M_current_pos);
    // node_start_pos is starting position of last_node.
    while (--__current_index >= 0) {
    if (!(__dirns & 1) /* Path turned left */)
    break;
    __current_node = __x._M_path_end[__current_index];
    __c = (_Rope_RopeConcatenation<_CharT,_Alloc>*)__current _node;
    // Otherwise we were in the right child. Thus we should pop
    // the concatenation node.
    __node_start_pos -= __c->_M_left->_M_size;
    __dirns >>= 1;
    }
    if (__current_index < 0) {
    // We underflowed the cache. Punt.
    _S_setcache(__x);
    return;
    }
    __current_node = __x._M_path_end[__current_index];
    __c = (_Rope_RopeConcatenation<_CharT,_Alloc>*)__current _node;
    // current_node is a concatenation node. We are positioned on the first
    // character in its right child.
    // node_start_pos is starting position of current_node.
    __node_start_pos += __c->_M_left->_M_size;
    __current_node = __c->_M_right;
    __x._M_path_end[++__current_index] = __current_node;
    __dirns |= 1;
    while (_RopeRep::_S_concat == __current_node->_M_tag) {
    ++__current_index;
    if (_S_path_cache_len == __current_index) {
    int __i;
    for (__i = 0; __i < _S_path_cache_len-1; __i++) {
    __x._M_path_end[__i] = __x._M_path_end[__i+1];
    }
    --__current_index;
    }
    __current_node =
    ((_Rope_RopeConcatenation<_CharT,_Alloc>*)__curren t_node)->_M_left;
    __x._M_path_end[__current_index] = __current_node;
    __dirns <<= 1;
    // node_start_pos is unchanged.
    }
    __x._M_leaf_index = __current_index;
    __x._M_leaf_pos = __node_start_pos;
    __x._M_path_directions = __dirns;
    _S_setbuf(__x);
    }

    template <class _CharT, class _Alloc>
    void _Rope_iterator_base<_CharT,_Alloc>::_M_incr(size_t __n) {
    _M_current_pos += __n;
    if (0 != _M_buf_ptr) {
    size_t __chars_left = _M_buf_end - _M_buf_ptr;
    if (__chars_left > __n) {
    _M_buf_ptr += __n;
    } else if (__chars_left == __n) {
    _M_buf_ptr += __n;
    _S_setcache_for_incr(*this);
    } else {
    _M_buf_ptr = 0;
    }
    }
    }

    template <class _CharT, class _Alloc>
    void _Rope_iterator_base<_CharT,_Alloc>::_M_decr(size_t __n) {
    if (0 != _M_buf_ptr) {
    size_t __chars_left = _M_buf_ptr - _M_buf_start;
    if (__chars_left >= __n) {
    _M_buf_ptr -= __n;
    } else {
    _M_buf_ptr = 0;
    }
    }
    _M_current_pos -= __n;
    }

    template <class _CharT, class _Alloc>
    void _Rope_iterator<_CharT,_Alloc>::_M_check() {
    if (_M_root_rope->_M_tree_ptr != _M_root) {
    // _Rope was modified. Get things fixed up.
    _RopeRep::_S_unref(_M_root);
    _M_root = _M_root_rope->_M_tree_ptr;
    _RopeRep::_S_ref(_M_root);
    _M_buf_ptr = 0;
    }
    }

    template <class _CharT, class _Alloc>
    inline
    _Rope_const_iterator<_CharT, _Alloc>::_Rope_const_iterator(
    const _Rope_iterator<_CharT,_Alloc>& __x)
    : _Rope_iterator_base<_CharT,_Alloc>(__x)
    { }

    template <class _CharT, class _Alloc>
    inline _Rope_iterator<_CharT,_Alloc>::_Rope_iterator(
    rope<_CharT,_Alloc>& __r, size_t __pos)
    : _Rope_iterator_base<_CharT,_Alloc>(__r._M_tree_ptr , __pos),
    _M_root_rope(&__r)
    {
    _RopeRep::_S_ref(_M_root);
    }

    template <class _CharT, class _Alloc>
    inline size_t
    rope<_CharT,_Alloc>::_S_char_ptr_len(const _CharT* __s)
    {
    const _CharT* __p = __s;

    while (!_S_is0(*__p)) { ++__p; }
    return (__p - __s);
    }


    #ifndef __GC

    template <class _CharT, class _Alloc>
    inline void _Rope_RopeRep<_CharT,_Alloc>::_M_free_c_string()
    {
    _CharT* __cstr = _M_c_string;
    if (0 != __cstr) {
    size_t __size = _M_size + 1;
    destroy(__cstr, __cstr + __size);
    _Data_deallocate(__cstr, __size);
    }
    }


    template <class _CharT, class _Alloc>
    #ifdef __STL_USE_STD_ALLOCATORS
    inline void _Rope_RopeRep<_CharT,_Alloc>::_S_free_string(_Char T* __s,
    size_t __n,
    allocator_type __a)
    #else
    inline void _Rope_RopeRep<_CharT,_Alloc>::_S_free_string(_Char T* __s,
    size_t __n)
    #endif
    {
    if (!_S_is_basic_char_type((_CharT*)0)) {
    destroy(__s, __s + __n);
    }
    // This has to be a static member, so this gets a bit messy
    # ifdef __STL_USE_STD_ALLOCATORS
    __a.deallocate(
    __s, _Rope_RopeLeaf<_CharT,_Alloc>::_S_rounded_up_size( __n));
    # else
    _Data_deallocate(
    __s, _Rope_RopeLeaf<_CharT,_Alloc>::_S_rounded_up_size( __n));
    # endif
    }

  2. #52
    Veteran
    My Team
    Houston Rockets
    Post Count
    1,981
    I'm gonna know how to program a computer by the end of this thread.

  3. #53
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    // There are several reasons for not doing this with virtual destructors
    // and a class specific delete operator:
    // - A class specific delete operator can't easily get access to
    // allocator instances if we need them.
    // - Any virtual function would need a 4 or byte vtable pointer;
    // this only requires a one byte tag per object.
    template <class _CharT, class _Alloc>
    void _Rope_RopeRep<_CharT,_Alloc>::_M_free_tree()
    {
    switch(_M_tag) {
    case _S_leaf:
    {
    _Rope_RopeLeaf<_CharT,_Alloc>* __l
    = (_Rope_RopeLeaf<_CharT,_Alloc>*)this;
    __l->_Rope_RopeLeaf<_CharT,_Alloc>::~_Rope_RopeLeaf( );
    _L_deallocate(__l, 1);
    break;
    }
    case _S_concat:
    {
    _Rope_RopeConcatenation<_CharT,_Alloc>* __c
    = (_Rope_RopeConcatenation<_CharT,_Alloc>*)this;
    __c->_Rope_RopeConcatenation<_CharT,_Alloc>::
    ~_Rope_RopeConcatenation();
    _C_deallocate(__c, 1);
    break;
    }
    case _S_function:
    {
    _Rope_RopeFunction<_CharT,_Alloc>* __f
    = (_Rope_RopeFunction<_CharT,_Alloc>*)this;
    __f->_Rope_RopeFunction<_CharT,_Alloc>::~_Rope_RopeFun ction();
    _F_deallocate(__f, 1);
    break;
    }
    case _S_substringfn:
    {
    _Rope_RopeSubstring<_CharT,_Alloc>* __ss =
    (_Rope_RopeSubstring<_CharT,_Alloc>*)this;
    __ss->_Rope_RopeSubstring<_CharT,_Alloc>::
    ~_Rope_RopeSubstring();
    _S_deallocate(__ss, 1);
    break;
    }
    }
    }
    #else

    template <class _CharT, class _Alloc>
    #ifdef __STL_USE_STD_ALLOCATORS
    inline void _Rope_RopeRep<_CharT,_Alloc>::_S_free_string
    (const _CharT*, size_t, allocator_type)
    #else
    inline void _Rope_RopeRep<_CharT,_Alloc>::_S_free_string
    (const _CharT*, size_t)
    #endif
    {}

    #endif


    // Concatenate a C string onto a leaf rope by copying the rope data.
    // Used for short ropes.
    template <class _CharT, class _Alloc>
    rope<_CharT,_Alloc>::_RopeLeaf*
    rope<_CharT,_Alloc>::_S_leaf_concat_char_iter
    (_RopeLeaf* __r, const _CharT* __iter, size_t __len)
    {
    size_t __old_len = __r->_M_size;
    _CharT* __new_data = (_CharT*)
    _Data_allocate(_S_rounded_up_size(__old_len + __len));
    _RopeLeaf* __result;

    uninitialized_copy_n(__r->_M_data, __old_len, __new_data);
    uninitialized_copy_n(__iter, __len, __new_data + __old_len);
    _S_cond_store_eos(__new_data[__old_len + __len]);
    __STL_TRY {
    __result = _S_new_RopeLeaf(__new_data, __old_len + __len,
    __r->get_allocator());
    }
    __STL_UNWIND(_RopeRep::__STL_FREE_STRING(__new_dat a, __old_len + __len,
    __r->get_allocator()));
    return __result;
    }

    #ifndef __GC
    // As above, but it's OK to clobber original if refcount is 1
    template <class _CharT, class _Alloc>
    rope<_CharT,_Alloc>::_RopeLeaf*
    rope<_CharT,_Alloc>::_S_destr_leaf_concat_char_ite r
    (_RopeLeaf* __r, const _CharT* __iter, size_t __len)
    {
    __stl_assert(__r->_M_ref_count >= 1);
    if (__r->_M_ref_count > 1)
    return _S_leaf_concat_char_iter(__r, __iter, __len);
    size_t __old_len = __r->_M_size;
    if (_S_allocated_capacity(__old_len) >= __old_len + __len) {
    // The space has been partially initialized for the standard
    // character types. But that doesn't matter for those types.
    uninitialized_copy_n(__iter, __len, __r->_M_data + __old_len);
    if (_S_is_basic_char_type((_CharT*)0)) {
    _S_cond_store_eos(__r->_M_data[__old_len + __len]);
    __stl_assert(__r->_M_c_string == __r->_M_data);
    } else if (__r->_M_c_string != __r->_M_data && 0 != __r->_M_c_string) {
    __r->_M_free_c_string();
    __r->_M_c_string = 0;
    }
    __r->_M_size = __old_len + __len;
    __stl_assert(__r->_M_ref_count == 1);
    __r->_M_ref_count = 2;
    return __r;
    } else {
    _RopeLeaf* __result = _S_leaf_concat_char_iter(__r, __iter, __len);
    __stl_assert(__result->_M_ref_count == 1);
    return __result;
    }
    }
    #endif

    // Assumes left and right are not 0.
    // Does not increment (nor decrement on exception) child reference counts.
    // Result has ref count 1.
    template <class _CharT, class _Alloc>
    rope<_CharT,_Alloc>::_RopeRep*
    rope<_CharT,_Alloc>::_S_tree_concat (_RopeRep* __left, _RopeRep* __right)
    {
    _RopeConcatenation* __result =
    _S_new_RopeConcatenation(__left, __right, __left->get_allocator());
    size_t __depth = __result->_M_depth;

    # ifdef __STL_USE_STD_ALLOCATORS
    __stl_assert(__left->get_allocator() == __right->get_allocator());
    # endif
    if (__depth > 20 && (__result->_M_size < 1000 ||
    __depth > _RopeRep::_S_max_rope_depth)) {
    _RopeRep* __balanced;

    __STL_TRY {
    __balanced = _S_balance(__result);
    # ifndef __GC
    if (__result != __balanced) {
    __stl_assert(1 == __result->_M_ref_count
    && 1 == __balanced->_M_ref_count);
    }
    # endif
    __result->_M_unref_nonnil();
    }
    __STL_UNWIND((_C_deallocate(__result,1)));
    // In case of exception, we need to deallocate
    // otherwise dangling result node. But caller
    // still owns its children. Thus unref is
    // inappropriate.
    return __balanced;
    } else {
    return __result;
    }
    }

    template <class _CharT, class _Alloc>
    rope<_CharT,_Alloc>::_RopeRep* rope<_CharT,_Alloc>::_S_concat_char_iter
    (_RopeRep* __r, const _CharT*__s, size_t __slen)
    {
    _RopeRep* __result;
    if (0 == __slen) {
    _S_ref(__r);
    return __r;
    }
    if (0 == __r)
    return __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen,
    __r->get_allocator());
    if (_RopeRep::_S_leaf == __r->_M_tag &&
    __r->_M_size + __slen <= _S_copy_max) {
    __result = _S_leaf_concat_char_iter((_RopeLeaf*)__r, __s, __slen);
    # ifndef __GC
    __stl_assert(1 == __result->_M_ref_count);
    # endif
    return __result;
    }
    if (_RopeRep::_S_concat == __r->_M_tag
    && _RopeRep::_S_leaf == ((_RopeConcatenation*)__r)->_M_right->_M_tag) {
    _RopeLeaf* __right =
    (_RopeLeaf* )(((_RopeConcatenation* )__r)->_M_right);
    if (__right->_M_size + __slen <= _S_copy_max) {
    _RopeRep* __left = ((_RopeConcatenation*)__r)->_M_left;
    _RopeRep* __nright =
    _S_leaf_concat_char_iter((_RopeLeaf*)__right, __s, __slen);
    __left->_M_ref_nonnil();
    __STL_TRY {
    __result = _S_tree_concat(__left, __nright);
    }
    __STL_UNWIND(_S_unref(__left); _S_unref(__nright));
    # ifndef __GC
    __stl_assert(1 == __result->_M_ref_count);
    # endif
    return __result;
    }
    }
    _RopeRep* __nright =
    __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __r->get_allocator());
    __STL_TRY {
    __r->_M_ref_nonnil();
    __result = _S_tree_concat(__r, __nright);
    }
    __STL_UNWIND(_S_unref(__r); _S_unref(__nright));
    # ifndef __GC
    __stl_assert(1 == __result->_M_ref_count);
    # endif
    return __result;
    }

    #ifndef __GC
    template <class _CharT, class _Alloc>
    rope<_CharT,_Alloc>::_RopeRep*
    rope<_CharT,_Alloc>::_S_destr_concat_char_iter(
    _RopeRep* __r, const _CharT* __s, size_t __slen)
    {
    _RopeRep* __result;
    if (0 == __r)
    return __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen,
    __r->get_allocator());
    size_t __count = __r->_M_ref_count;
    size_t __orig_size = __r->_M_size;
    __stl_assert(__count >= 1);
    if (__count > 1) return _S_concat_char_iter(__r, __s, __slen);
    if (0 == __slen) {
    __r->_M_ref_count = 2; // One more than before
    return __r;
    }
    if (__orig_size + __slen <= _S_copy_max &&
    _RopeRep::_S_leaf == __r->_M_tag) {
    __result = _S_destr_leaf_concat_char_iter((_RopeLeaf*)__r, __s, __slen);
    return __result;
    }
    if (_RopeRep::_S_concat == __r->_M_tag) {
    _RopeLeaf* __right = (_RopeLeaf*)(((_RopeConcatenation*)__r)->_M_right);
    if (_RopeRep::_S_leaf == __right->_M_tag
    && __right->_M_size + __slen <= _S_copy_max) {
    _RopeRep* __new_right =
    _S_destr_leaf_concat_char_iter(__right, __s, __slen);
    if (__right == __new_right) {
    __stl_assert(__new_right->_M_ref_count == 2);
    __new_right->_M_ref_count = 1;
    } else {
    __stl_assert(__new_right->_M_ref_count >= 1);
    __right->_M_unref_nonnil();
    }
    __stl_assert(__r->_M_ref_count == 1);
    __r->_M_ref_count = 2; // One more than before.
    ((_RopeConcatenation*)__r)->_M_right = __new_right;
    __r->_M_size = __orig_size + __slen;
    if (0 != __r->_M_c_string) {
    __r->_M_free_c_string();
    __r->_M_c_string = 0;
    }
    return __r;
    }
    }
    _RopeRep* __right =
    __STL_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __r->get_allocator());
    __r->_M_ref_nonnil();
    __STL_TRY {
    __result = _S_tree_concat(__r, __right);
    }
    __STL_UNWIND(_S_unref(__r); _S_unref(__right))
    __stl_assert(1 == __result->_M_ref_count);
    return __result;
    }
    #endif /* !__GC */

    template <class _CharT, class _Alloc>
    rope<_CharT,_Alloc>::_RopeRep*
    rope<_CharT,_Alloc>::_S_concat(_RopeRep* __left, _RopeRep* __right)
    {
    if (0 == __left) {
    _S_ref(__right);
    return __right;
    }
    if (0 == __right) {
    __left->_M_ref_nonnil();
    return __left;
    }
    if (_RopeRep::_S_leaf == __right->_M_tag) {
    if (_RopeRep::_S_leaf == __left->_M_tag) {
    if (__right->_M_size + __left->_M_size <= _S_copy_max) {
    return _S_leaf_concat_char_iter((_RopeLeaf*)__left,
    ((_RopeLeaf*)__right)->_M_data,
    __right->_M_size);
    }
    } else if (_RopeRep::_S_concat == __left->_M_tag
    && _RopeRep::_S_leaf ==
    ((_RopeConcatenation*)__left)->_M_right->_M_tag) {
    _RopeLeaf* __leftright =
    (_RopeLeaf*)(((_RopeConcatenation*)__left)->_M_right);
    if (__leftright->_M_size + __right->_M_size <= _S_copy_max) {
    _RopeRep* __leftleft = ((_RopeConcatenation*)__left)->_M_left;
    _RopeRep* __rest = _S_leaf_concat_char_iter(__leftright,
    ((_RopeLeaf*)__right)->_M_data,
    __right->_M_size);
    __leftleft->_M_ref_nonnil();
    __STL_TRY {
    return(_S_tree_concat(__leftleft, __rest));
    }
    __STL_UNWIND(_S_unref(__leftleft); _S_unref(__rest))
    }
    }
    }
    __left->_M_ref_nonnil();
    __right->_M_ref_nonnil();
    __STL_TRY {
    return(_S_tree_concat(__left, __right));
    }
    __STL_UNWIND(_S_unref(__left); _S_unref(__right));
    }

    template <class _CharT, class _Alloc>
    rope<_CharT,_Alloc>::_RopeRep*
    rope<_CharT,_Alloc>::_S_substring(_RopeRep* __base,
    size_t __start, size_t __endp1)
    {
    if (0 == __base) return 0;
    size_t __len = __base->_M_size;
    size_t __adj_endp1;
    const size_t __lazy_threshold = 128;

    if (__endp1 >= __len) {
    if (0 == __start) {
    __base->_M_ref_nonnil();
    return __base;
    } else {
    __adj_endp1 = __len;
    }
    } else {
    __adj_endp1 = __endp1;
    }
    switch(__base->_M_tag) {
    case _RopeRep::_S_concat:
    {
    _RopeConcatenation* __c = (_RopeConcatenation*)__base;
    _RopeRep* __left = __c->_M_left;
    _RopeRep* __right = __c->_M_right;
    size_t __left_len = __left->_M_size;
    _RopeRep* __result;

    if (__adj_endp1 <= __left_len) {
    return _S_substring(__left, __start, __endp1);
    } else if (__start >= __left_len) {
    return _S_substring(__right, __start - __left_len,
    __adj_endp1 - __left_len);
    }
    _Self_destruct_ptr __left_result(
    _S_substring(__left, __start, __left_len));
    _Self_destruct_ptr __right_result(
    _S_substring(__right, 0, __endp1 - __left_len));
    __result = _S_concat(__left_result, __right_result);
    # ifndef __GC
    __stl_assert(1 == __result->_M_ref_count);
    # endif
    return __result;
    }
    case _RopeRep::_S_leaf:
    {
    _RopeLeaf* __l = (_RopeLeaf*)__base;
    _RopeLeaf* __result;
    size_t __result_len;
    if (__start >= __adj_endp1) return 0;
    __result_len = __adj_endp1 - __start;
    if (__result_len > __lazy_threshold) goto lazy;
    # ifdef __GC
    const _CharT* __section = __l->_M_data + __start;
    __result = _S_new_RopeLeaf(__section, __result_len,
    __base->get_allocator());
    __result->_M_c_string = 0; // Not eos terminated.
    # else
    // We should sometimes create substring node instead.
    __result = __STL_ROPE_FROM_UNOWNED_CHAR_PTR(
    __l->_M_data + __start, __result_len,
    __base->get_allocator());
    # endif
    return __result;
    }
    case _RopeRep::_S_substringfn:
    // Avoid introducing multiple layers of substring nodes.
    {
    _RopeSubstring* __old = (_RopeSubstring*)__base;
    size_t __result_len;
    if (__start >= __adj_endp1) return 0;
    __result_len = __adj_endp1 - __start;
    if (__result_len > __lazy_threshold) {
    _RopeSubstring* __result =
    _S_new_RopeSubstring(__old->_M_base,
    __start + __old->_M_start,
    __adj_endp1 - __start,
    __base->get_allocator());
    return __result;

    } // *** else fall through: ***
    }
    case _RopeRep::_S_function:
    {
    _RopeFunction* __f = (_RopeFunction*)__base;
    _CharT* __section;
    size_t __result_len;
    if (__start >= __adj_endp1) return 0;
    __result_len = __adj_endp1 - __start;

    if (__result_len > __lazy_threshold) goto lazy;
    __section = (_CharT*)
    _Data_allocate(_S_rounded_up_size(__result_len));
    __STL_TRY {
    (*(__f->_M_fn))(__start, __result_len, __section);
    }
    __STL_UNWIND(_RopeRep::__STL_FREE_STRING(
    __section, __result_len, __base->get_allocator()));
    _S_cond_store_eos(__section[__result_len]);
    return _S_new_RopeLeaf(__section, __result_len,
    __base->get_allocator());
    }
    }
    /*NOTREACHED*/
    __stl_assert(false);
    lazy:
    {
    // Create substring node.
    return _S_new_RopeSubstring(__base, __start, __adj_endp1 - __start,
    __base->get_allocator());
    }
    }

    template<class _CharT>
    class _Rope_flatten_char_consumer : public _Rope_char_consumer<_CharT> {
    private:
    _CharT* _M_buf_ptr;
    public:

    _Rope_flatten_char_consumer(_CharT* __buffer) {
    _M_buf_ptr = __buffer;
    };
    ~_Rope_flatten_char_consumer() {}
    bool operator() (const _CharT* __leaf, size_t __n) {
    uninitialized_copy_n(__leaf, __n, _M_buf_ptr);
    _M_buf_ptr += __n;
    return true;
    }
    };

    template<class _CharT>
    class _Rope_find_char_char_consumer : public _Rope_char_consumer<_CharT> {
    private:
    _CharT _M_pattern;
    public:
    size_t _M_count; // Number of nonmatching characters
    _Rope_find_char_char_consumer(_CharT __p)
    : _M_pattern(__p), _M_count(0) {}
    ~_Rope_find_char_char_consumer() {}
    bool operator() (const _CharT* __leaf, size_t __n) {
    size_t __i;
    for (__i = 0; __i < __n; __i++) {
    if (__leaf[__i] == _M_pattern) {
    _M_count += __i; return false;
    }
    }
    _M_count += __n; return true;
    }
    };

    #ifdef __STL_USE_NEW_IOSTREAMS
    template<class _CharT, class _Traits>
    // Here _CharT is both the stream and rope character type.
    #else
    template<class _CharT>
    // Here _CharT is the rope character type. Unlike in the
    // above case, we somewhat handle the case in which it doesn't
    // match the stream character type, i.e. char.
    #endif
    class _Rope_insert_char_consumer : public _Rope_char_consumer<_CharT> {
    private:
    # ifdef __STL_USE_NEW_IOSTREAMS
    typedef basic_ostream<_CharT,_Traits> _Insert_ostream;
    # else
    typedef ostream _Insert_ostream;
    # endif
    _Insert_ostream& _M_o;
    public:
    _Rope_insert_char_consumer(_Insert_ostream& __writer)
    : _M_o(__writer) {};
    ~_Rope_insert_char_consumer() { };
    // Caller is presumed to own the ostream
    bool operator() (const _CharT* __leaf, size_t __n);
    // Returns true to continue traversal.
    };

  4. #54
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    #ifdef __STL_USE_NEW_IOSTREAMS
    template<class _CharT, class _Traits>
    bool _Rope_insert_char_consumer<_CharT, _Traits>::operator()
    (const _CharT* __leaf, size_t __n)
    {
    size_t __i;
    // We assume that formatting is set up correctly for each element.
    for (__i = 0; __i < __n; __i++) _M_o.put(__leaf[__i]);
    return true;
    }

    #else
    template<class _CharT>
    bool _Rope_insert_char_consumer<_CharT>::operator()
    (const _CharT* __leaf, size_t __n)
    {
    size_t __i;
    // We assume that formatting is set up correctly for each element.
    for (__i = 0; __i < __n; __i++) _M_o << __leaf[__i];
    return true;
    }


    __STL_TEMPLATE_NULL
    inline bool _Rope_insert_char_consumer<char>::operator()
    (const char* __leaf, size_t __n)
    {
    size_t __i;
    for (__i = 0; __i < __n; __i++) _M_o.put(__leaf[__i]);
    return true;
    }
    #endif

    template <class _CharT, class _Alloc>
    bool rope<_CharT, _Alloc>::_S_apply_to_pieces(
    _Rope_char_consumer<_CharT>& __c,
    const _RopeRep* __r,
    size_t __begin, size_t __end)
    {
    if (0 == __r) return true;
    switch(__r->_M_tag) {
    case _RopeRep::_S_concat:
    {
    _RopeConcatenation* __conc = (_RopeConcatenation*)__r;
    _RopeRep* __left = __conc->_M_left;
    size_t __left_len = __left->_M_size;
    if (__begin < __left_len) {
    size_t __left_end = min(__left_len, __end);
    if (!_S_apply_to_pieces(__c, __left, __begin, __left_end))
    return false;
    }
    if (__end > __left_len) {
    _RopeRep* __right = __conc->_M_right;
    size_t __right_start = max(__left_len, __begin);
    if (!_S_apply_to_pieces(__c, __right,
    __right_start - __left_len,
    __end - __left_len)) {
    return false;
    }
    }
    }
    return true;
    case _RopeRep::_S_leaf:
    {
    _RopeLeaf* __l = (_RopeLeaf*)__r;
    return __c(__l->_M_data + __begin, __end - __begin);
    }
    case _RopeRep::_S_function:
    case _RopeRep::_S_substringfn:
    {
    _RopeFunction* __f = (_RopeFunction*)__r;
    size_t __len = __end - __begin;
    bool __result;
    _CharT* __buffer =
    (_CharT*)alloc::allocate(__len * sizeof(_CharT));
    __STL_TRY {
    (*(__f->_M_fn))(__begin, __len, __buffer);
    __result = __c(__buffer, __len);
    alloc::deallocate(__buffer, __len * sizeof(_CharT));
    }
    __STL_UNWIND((alloc::deallocate(__buffer,
    __len * sizeof(_CharT))))
    return __result;
    }
    default:
    __stl_assert(false);
    /*NOTREACHED*/
    return false;
    }
    }

    #ifdef __STL_USE_NEW_IOSTREAMS
    template<class _CharT, class _Traits>
    inline void _Rope_fill(basic_ostream<_CharT, _Traits>& __o, size_t __n)
    #else
    inline void _Rope_fill(ostream& __o, size_t __n)
    #endif
    {
    char __f = __o.fill();
    size_t __i;

    for (__i = 0; __i < __n; __i++) __o.put(__f);
    }


    template <class _CharT> inline bool _Rope_is_simple(_CharT*) { return false; }
    inline bool _Rope_is_simple(char*) { return true; }
    inline bool _Rope_is_simple(wchar_t*) { return true; }

    #ifdef __STL_USE_NEW_IOSTREAMS
    template<class _CharT, class _Traits, class _Alloc>
    basic_ostream<_CharT, _Traits>& operator<<
    (basic_ostream<_CharT, _Traits>& __o,
    const rope<_CharT, _Alloc>& __r)
    #else
    template<class _CharT, class _Alloc>
    ostream& operator<< (ostream& __o, const rope<_CharT, _Alloc>& __r)
    #endif
    {
    size_t __w = __o.width();
    bool __left = bool(__o.flags() & ios::left);
    size_t __pad_len;
    size_t __rope_len = __r.size();
    # ifdef __STL_USE_NEW_IOSTREAMS
    _Rope_insert_char_consumer<_CharT, _Traits> __c(__o);
    # else
    _Rope_insert_char_consumer<_CharT> __c(__o);
    # endif
    bool __is_simple = _Rope_is_simple((_CharT*)0);

    if (__rope_len < __w) {
    __pad_len = __w - __rope_len;
    } else {
    __pad_len = 0;
    }
    if (!__is_simple) __o.width(__w/__rope_len);
    __STL_TRY {
    if (__is_simple && !__left && __pad_len > 0) {
    _Rope_fill(__o, __pad_len);
    }
    __r.apply_to_pieces(0, __r.size(), __c);
    if (__is_simple && __left && __pad_len > 0) {
    _Rope_fill(__o, __pad_len);
    }
    if (!__is_simple)
    __o.width(__w);
    }
    __STL_UNWIND(if (!__is_simple) __o.width(__w))
    return __o;
    }

    template <class _CharT, class _Alloc>
    _CharT*
    rope<_CharT,_Alloc>::_S_flatten(_RopeRep* __r,
    size_t __start, size_t __len,
    _CharT* __buffer)
    {
    _Rope_flatten_char_consumer<_CharT> __c(__buffer);
    _S_apply_to_pieces(__c, __r, __start, __start + __len);
    return(__buffer + __len);
    }

    template <class _CharT, class _Alloc>
    size_t
    rope<_CharT,_Alloc>::find(_CharT __pattern, size_t __start) const
    {
    _Rope_find_char_char_consumer<_CharT> __c(__pattern);
    _S_apply_to_pieces(__c, _M_tree_ptr, __start, size());
    size_type __result_pos = __start + __c._M_count;
    # ifndef __STL_OLD_ROPE_SEMANTICS
    if (__result_pos == size()) __result_pos = npos;
    # endif
    return __result_pos;
    }

    template <class _CharT, class _Alloc>
    _CharT*
    rope<_CharT,_Alloc>::_S_flatten(_RopeRep* __r, _CharT* __buffer)
    {
    if (0 == __r) return __buffer;
    switch(__r->_M_tag) {
    case _RopeRep::_S_concat:
    {
    _RopeConcatenation* __c = (_RopeConcatenation*)__r;
    _RopeRep* __left = __c->_M_left;
    _RopeRep* __right = __c->_M_right;
    _CharT* __rest = _S_flatten(__left, __buffer);
    return _S_flatten(__right, __rest);
    }
    case _RopeRep::_S_leaf:
    {
    _RopeLeaf* __l = (_RopeLeaf*)__r;
    return copy_n(__l->_M_data, __l->_M_size, __buffer).second;
    }
    case _RopeRep::_S_function:
    case _RopeRep::_S_substringfn:
    // We dont yet do anything with substring nodes.
    // This needs to be fixed before ropefiles will work well.
    {
    _RopeFunction* __f = (_RopeFunction*)__r;
    (*(__f->_M_fn))(0, __f->_M_size, __buffer);
    return __buffer + __f->_M_size;
    }
    default:
    __stl_assert(false);
    /*NOTREACHED*/
    return 0;
    }
    }


    // This needs work for _CharT != char
    template <class _CharT, class _Alloc>
    void
    rope<_CharT,_Alloc>::_S_dump(_RopeRep* __r, int __indent)
    {
    for (int __i = 0; __i < __indent; __i++) putchar(' ');
    if (0 == __r) {
    printf("NULL\n"); return;
    }
    if (_RopeRep::_S_concat == __r->_M_tag) {
    _RopeConcatenation* __c = (_RopeConcatenation*)__r;
    _RopeRep* __left = __c->_M_left;
    _RopeRep* __right = __c->_M_right;

    # ifdef __GC
    printf("Concatenation %p (depth = %d, len = %ld, %s balanced)\n",
    __r, __r->_M_depth, __r->_M_size, __r->_M_is_balanced? "" : "not");
    # else
    printf("Concatenation %p (rc = %ld, depth = %d, "
    "len = %ld, %s balanced)\n",
    __r, __r->_M_ref_count, __r->_M_depth, __r->_M_size,
    __r->_M_is_balanced? "" : "not");
    # endif
    _S_dump(__left, __indent + 2);
    _S_dump(__right, __indent + 2);
    return;
    } else {
    char* __kind;

    switch (__r->_M_tag) {
    case _RopeRep::_S_leaf:
    __kind = "Leaf";
    break;
    case _RopeRep::_S_function:
    __kind = "Function";
    break;
    case _RopeRep::_S_substringfn:
    __kind = "Function representing substring";
    break;
    default:
    __kind = "(corrupted kind field!)";
    }
    # ifdef __GC
    printf("%s %p (depth = %d, len = %ld) ",
    __kind, __r, __r->_M_depth, __r->_M_size);
    # else
    printf("%s %p (rc = %ld, depth = %d, len = %ld) ",
    __kind, __r, __r->_M_ref_count, __r->_M_depth, __r->_M_size);
    # endif
    if (_S_is_one_byte_char_type((_CharT*)0)) {
    const int __max_len = 40;
    _Self_destruct_ptr __prefix(_S_substring(__r, 0, __max_len));
    _CharT __buffer[__max_len + 1];
    bool __too_big = __r->_M_size > __prefix->_M_size;

    _S_flatten(__prefix, __buffer);
    __buffer[__prefix->_M_size] = _S_eos((_CharT*)0);
    printf("%s%s\n",
    (char*)__buffer, __too_big? "...\n" : "\n");
    } else {
    printf("\n");
    }
    }
    }

    template <class _CharT, class _Alloc>
    const unsigned long
    rope<_CharT,_Alloc>::_S_min_len[
    _Rope_RopeRep<_CharT,_Alloc>::_S_max_rope_depth + 1] = {
    /* 0 */1, /* 1 */2, /* 2 */3, /* 3 */5, /* 4 */8, /* 5 */13, /* 6 */21,
    /* 7 */34, /* 8 */55, /* 9 */89, /* 10 */144, /* 11 */233, /* 12 */377,
    /* 13 */610, /* 14 */987, /* 15 */1597, /* 16 */2584, /* 17 */4181,
    /* 18 */6765, /* 19 */10946, /* 20 */17711, /* 21 */28657, /* 22 */46368,
    /* 23 */75025, /* 24 */121393, /* 25 */196418, /* 26 */317811,
    /* 27 */514229, /* 28 */832040, /* 29 */1346269, /* 30 */2178309,
    /* 31 */3524578, /* 32 */5702887, /* 33 */9227465, /* 34 */14930352,
    /* 35 */24157817, /* 36 */39088169, /* 37 */63245986, /* 38 */102334155,
    /* 39 */165580141, /* 40 */267914296, /* 41 */433494437,
    /* 42 */701408733, /* 43 */1134903170, /* 44 */1836311903,
    /* 45 */2971215073u };
    // These are Fibonacci numbers < 2**32.

    template <class _CharT, class _Alloc>
    rope<_CharT,_Alloc>::_RopeRep*
    rope<_CharT,_Alloc>::_S_balance(_RopeRep* __r)
    {
    _RopeRep* __forest[_RopeRep::_S_max_rope_depth + 1];
    _RopeRep* __result = 0;
    int __i;
    // Invariant:
    // The concatenation of forest in descending order is equal to __r.
    // __forest[__i]._M_size >= _S_min_len[__i]
    // __forest[__i]._M_depth = __i
    // References from forest are included in refcount.

    for (__i = 0; __i <= _RopeRep::_S_max_rope_depth; ++__i)
    __forest[__i] = 0;
    __STL_TRY {
    _S_add_to_forest(__r, __forest);
    for (__i = 0; __i <= _RopeRep::_S_max_rope_depth; ++__i)
    if (0 != __forest[__i]) {
    # ifndef __GC
    _Self_destruct_ptr __old(__result);
    # endif
    __result = _S_concat(__forest[__i], __result);
    __forest[__i]->_M_unref_nonnil();
    # if !defined(__GC) && defined(__STL_USE_EXCEPTIONS)
    __forest[__i] = 0;
    # endif
    }
    }
    __STL_UNWIND(for(__i = 0; __i <= _RopeRep::_S_max_rope_depth; __i++)
    _S_unref(__forest[__i]))
    if (__result->_M_depth > _RopeRep::_S_max_rope_depth) {
    # ifdef __STL_USE_EXCEPTIONS
    __STL_THROW(length_error("rope too long"));
    # else
    abort();
    # endif
    }
    return(__result);
    }


    template <class _CharT, class _Alloc>
    void
    rope<_CharT,_Alloc>::_S_add_to_forest(_RopeRep* __r, _RopeRep** __forest)
    {
    if (__r->_M_is_balanced) {
    _S_add_leaf_to_forest(__r, __forest);
    return;
    }
    __stl_assert(__r->_M_tag == _RopeRep::_S_concat);
    {
    _RopeConcatenation* __c = (_RopeConcatenation*)__r;

    _S_add_to_forest(__c->_M_left, __forest);
    _S_add_to_forest(__c->_M_right, __forest);
    }
    }


    template <class _CharT, class _Alloc>
    void
    rope<_CharT,_Alloc>::_S_add_leaf_to_forest(_RopeRe p* __r, _RopeRep** __forest)
    {
    _RopeRep* __insertee; // included in refcount
    _RopeRep* __too_tiny = 0; // included in refcount
    int __i; // forest[0..__i-1] is empty
    size_t __s = __r->_M_size;

    for (__i = 0; __s >= _S_min_len[__i+1]/* not this bucket */; ++__i) {
    if (0 != __forest[__i]) {
    # ifndef __GC
    _Self_destruct_ptr __old(__too_tiny);
    # endif
    __too_tiny = _S_concat_and_set_balanced(__forest[__i], __too_tiny);
    __forest[__i]->_M_unref_nonnil();
    __forest[__i] = 0;
    }
    }
    {
    # ifndef __GC
    _Self_destruct_ptr __old(__too_tiny);
    # endif
    __insertee = _S_concat_and_set_balanced(__too_tiny, __r);
    }
    // Too_tiny dead, and no longer included in refcount.
    // Insertee is live and included.
    __stl_assert(_S_is_almost_balanced(__insertee));
    __stl_assert(__insertee->_M_depth <= __r->_M_depth + 1);
    for (;; ++__i) {
    if (0 != __forest[__i]) {
    # ifndef __GC
    _Self_destruct_ptr __old(__insertee);
    # endif
    __insertee = _S_concat_and_set_balanced(__forest[__i], __insertee);
    __forest[__i]->_M_unref_nonnil();
    __forest[__i] = 0;
    __stl_assert(_S_is_almost_balanced(__insertee));
    }
    __stl_assert(_S_min_len[__i] <= __insertee->_M_size);
    __stl_assert(__forest[__i] == 0);
    if (__i == _RopeRep::_S_max_rope_depth ||
    __insertee->_M_size < _S_min_len[__i+1]) {
    __forest[__i] = __insertee;
    // refcount is OK since __insertee is now dead.
    return;
    }
    }
    }

    template <class _CharT, class _Alloc>
    _CharT
    rope<_CharT,_Alloc>::_S_fetch(_RopeRep* __r, size_type __i)
    {
    __GC_CONST _CharT* __cstr = __r->_M_c_string;

    __stl_assert(__i < __r->_M_size);
    if (0 != __cstr) return __cstr[__i];
    for(; {
    switch(__r->_M_tag) {
    case _RopeRep::_S_concat:
    {
    _RopeConcatenation* __c = (_RopeConcatenation*)__r;
    _RopeRep* __left = __c->_M_left;
    size_t __left_len = __left->_M_size;

    if (__i >= __left_len) {
    __i -= __left_len;
    __r = __c->_M_right;
    } else {
    __r = __left;
    }
    }
    break;
    case _RopeRep::_S_leaf:
    {
    _RopeLeaf* __l = (_RopeLeaf*)__r;
    return __l->_M_data[__i];
    }
    case _RopeRep::_S_function:
    case _RopeRep::_S_substringfn:
    {
    _RopeFunction* __f = (_RopeFunction*)__r;
    _CharT __result;

    (*(__f->_M_fn))(__i, 1, &__result);
    return __result;
    }
    }
    }
    }

    # ifndef __GC
    // Return a uniquely referenced character slot for the given
    // position, or 0 if that's not possible.
    template <class _CharT, class _Alloc>
    _CharT*
    rope<_CharT,_Alloc>::_S_fetch_ptr(_RopeRep* __r, size_type __i)
    {
    _RopeRep* __clrstack[_RopeRep::_S_max_rope_depth];
    size_t __csptr = 0;

    for(; {
    if (__r->_M_ref_count > 1) return 0;
    switch(__r->_M_tag) {
    case _RopeRep::_S_concat:
    {
    _RopeConcatenation* __c = (_RopeConcatenation*)__r;
    _RopeRep* __left = __c->_M_left;
    size_t __left_len = __left->_M_size;

    if (__c->_M_c_string != 0) __clrstack[__csptr++] = __c;
    if (__i >= __left_len) {
    __i -= __left_len;
    __r = __c->_M_right;
    } else {
    __r = __left;
    }
    }
    break;
    case _RopeRep::_S_leaf:
    {
    _RopeLeaf* __l = (_RopeLeaf*)__r;
    if (__l->_M_c_string != __l->_M_data && __l->_M_c_string != 0)
    __clrstack[__csptr++] = __l;
    while (__csptr > 0) {
    -- __csptr;
    _RopeRep* __d = __clrstack[__csptr];
    __d->_M_free_c_string();
    __d->_M_c_string = 0;
    }
    return __l->_M_data + __i;
    }
    case _RopeRep::_S_function:
    case _RopeRep::_S_substringfn:
    return 0;
    }
    }
    }
    # endif /* __GC */

    // The following could be implemented trivially using
    // lexicographical_compare_3way.
    // We do a little more work to avoid dealing with rope iterators for
    // flat strings.
    template <class _CharT, class _Alloc>
    int
    rope<_CharT,_Alloc>::_S_compare (const _RopeRep* __left,
    const _RopeRep* __right)
    {
    size_t __left_len;
    size_t __right_len;

    if (0 == __right) return 0 != __left;
    if (0 == __left) return -1;
    __left_len = __left->_M_size;
    __right_len = __right->_M_size;
    if (_RopeRep::_S_leaf == __left->_M_tag) {
    _RopeLeaf* __l = (_RopeLeaf*) __left;
    if (_RopeRep::_S_leaf == __right->_M_tag) {
    _RopeLeaf* __r = (_RopeLeaf*) __right;
    return lexicographical_compare_3way(
    __l->_M_data, __l->_M_data + __left_len,
    __r->_M_data, __r->_M_data + __right_len);
    } else {
    const_iterator __rstart(__right, 0);
    const_iterator __rend(__right, __right_len);
    return lexicographical_compare_3way(
    __l->_M_data, __l->_M_data + __left_len,
    __rstart, __rend);
    }
    } else {
    const_iterator __lstart(__left, 0);
    const_iterator __lend(__left, __left_len);
    if (_RopeRep::_S_leaf == __right->_M_tag) {
    _RopeLeaf* __r = (_RopeLeaf*) __right;
    return lexicographical_compare_3way(
    __lstart, __lend,
    __r->_M_data, __r->_M_data + __right_len);
    } else {
    const_iterator __rstart(__right, 0);
    const_iterator __rend(__right, __right_len);
    return lexicographical_compare_3way(
    __lstart, __lend,
    __rstart, __rend);
    }
    }
    }

    // Assignment to reference proxies.
    template <class _CharT, class _Alloc>
    _Rope_char_ref_proxy<_CharT, _Alloc>&
    _Rope_char_ref_proxy<_CharT, _Alloc>::operator= (_CharT __c) {
    _RopeRep* __old = _M_root->_M_tree_ptr;
    # ifndef __GC
    // First check for the case in which everything is uniquely
    // referenced. In that case we can do this destructively.
    _CharT* __ptr = _My_rope::_S_fetch_ptr(__old, _M_pos);
    if (0 != __ptr) {
    *__ptr = __c;
    return *this;
    }
    # endif
    _Self_destruct_ptr __left(
    _My_rope::_S_substring(__old, 0, _M_pos));
    _Self_destruct_ptr __right(
    _My_rope::_S_substring(__old, _M_pos+1, __old->_M_size));
    _Self_destruct_ptr __result_left(
    _My_rope::_S_destr_concat_char_iter(__left, &__c, 1));

    # ifndef __GC
    __stl_assert(__left == __result_left || 1 == __result_left->_M_ref_count);
    # endif
    _RopeRep* __result =
    _My_rope::_S_concat(__result_left, __right);
    # ifndef __GC
    __stl_assert(1 <= __result->_M_ref_count);
    _RopeRep::_S_unref(__old);
    # endif
    _M_root->_M_tree_ptr = __result;
    return *this;
    }

    template <class _CharT, class _Alloc>
    inline _Rope_char_ref_proxy<_CharT, _Alloc>::operator _CharT () const
    {
    if (_M_current_valid) {
    return _M_current;
    } else {
    return _My_rope::_S_fetch(_M_root->_M_tree_ptr, _M_pos);
    }
    }
    template <class _CharT, class _Alloc>
    _Rope_char_ptr_proxy<_CharT, _Alloc>
    _Rope_char_ref_proxy<_CharT, _Alloc>::operator& () const {
    return _Rope_char_ptr_proxy<_CharT, _Alloc>(*this);
    }

    template <class _CharT, class _Alloc>
    rope<_CharT, _Alloc>::rope(size_t __n, _CharT __c,
    const allocator_type& __a)
    : _Base(__a)
    {
    rope<_CharT,_Alloc> __result;
    const size_t __exponentiate_threshold = 32;
    size_t __exponent;
    size_t __rest;
    _CharT* __rest_buffer;
    _RopeRep* __remainder;
    rope<_CharT,_Alloc> __remainder_rope;

    if (0 == __n)
    return;

    __exponent = __n / __exponentiate_threshold;
    __rest = __n % __exponentiate_threshold;
    if (0 == __rest) {
    __remainder = 0;
    } else {
    __rest_buffer = _Data_allocate(_S_rounded_up_size(__rest));
    uninitialized_fill_n(__rest_buffer, __rest, __c);
    _S_cond_store_eos(__rest_buffer[__rest]);
    __STL_TRY {
    __remainder = _S_new_RopeLeaf(__rest_buffer, __rest, __a);
    }
    __STL_UNWIND(_RopeRep::__STL_FREE_STRING(__rest_bu ffer, __rest, __a))
    }
    __remainder_rope._M_tree_ptr = __remainder;
    if (__exponent != 0) {
    _CharT* __base_buffer =
    _Data_allocate(_S_rounded_up_size(__exponentiate_t hreshold));
    _RopeLeaf* __base_leaf;
    rope __base_rope;
    uninitialized_fill_n(__base_buffer, __exponentiate_threshold, __c);
    _S_cond_store_eos(__base_buffer[__exponentiate_threshold]);
    __STL_TRY {
    __base_leaf = _S_new_RopeLeaf(__base_buffer,
    __exponentiate_threshold, __a);
    }
    __STL_UNWIND(_RopeRep::__STL_FREE_STRING(__base_bu ffer,
    __exponentiate_threshold, __a))
    __base_rope._M_tree_ptr = __base_leaf;
    if (1 == __exponent) {
    __result = __base_rope;
    # ifndef __GC
    __stl_assert(2 == __result._M_tree_ptr->_M_ref_count);
    // One each for base_rope and __result
    # endif
    } else {
    __result = power(__base_rope, __exponent,
    _Rope_Concat_fn<_CharT,_Alloc>());
    }
    if (0 != __remainder) {
    __result += __remainder_rope;
    }
    } else {
    __result = __remainder_rope;
    }
    _M_tree_ptr = __result._M_tree_ptr;
    _M_tree_ptr->_M_ref_nonnil();
    }

  5. #55
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    template<class _CharT, class _Alloc>
    _CharT rope<_CharT,_Alloc>::_S_empty_c_str[1];

    template<class _CharT, class _Alloc>
    const _CharT* rope<_CharT,_Alloc>::c_str() const {
    if (0 == _M_tree_ptr) {
    _S_empty_c_str[0] = _S_eos((_CharT*)0); // Possibly redundant,
    // but probably fast.
    return _S_empty_c_str;
    }
    __GC_CONST _CharT* __old_c_string = _M_tree_ptr->_M_c_string;
    if (0 != __old_c_string) return(__old_c_string);
    size_t __s = size();
    _CharT* __result = _Data_allocate(__s + 1);
    _S_flatten(_M_tree_ptr, __result);
    __result[__s] = _S_eos((_CharT*)0);
    # ifdef __GC
    _M_tree_ptr->_M_c_string = __result;
    # else
    if ((__old_c_string = (__GC_CONST _CharT*)
    _Atomic_swap((unsigned long *)(&(_M_tree_ptr->_M_c_string)),
    (unsigned long)__result)) != 0) {
    // It must have been added in the interim. Hence it had to have been
    // separately allocated. Deallocate the old copy, since we just
    // replaced it.
    destroy(__old_c_string, __old_c_string + __s + 1);
    _Data_deallocate(__old_c_string, __s + 1);
    }
    # endif
    return(__result);
    }

    template<class _CharT, class _Alloc>
    const _CharT* rope<_CharT,_Alloc>::replace_with_c_str() {
    if (0 == _M_tree_ptr) {
    _S_empty_c_str[0] = _S_eos((_CharT*)0);
    return _S_empty_c_str;
    }
    __GC_CONST _CharT* __old_c_string = _M_tree_ptr->_M_c_string;
    if (_RopeRep::_S_leaf == _M_tree_ptr->_M_tag && 0 != __old_c_string) {
    return(__old_c_string);
    }
    size_t __s = size();
    _CharT* __result = _Data_allocate(_S_rounded_up_size(__s));
    _S_flatten(_M_tree_ptr, __result);
    __result[__s] = _S_eos((_CharT*)0);
    _M_tree_ptr->_M_unref_nonnil();
    _M_tree_ptr = _S_new_RopeLeaf(__result, __s, get_allocator());
    return(__result);
    }

    // Algorithm specializations. More should be added.

    template<class _Rope_iterator> // was templated on CharT and Alloc
    void // VC++ workaround
    _Rope_rotate(_Rope_iterator __first,
    _Rope_iterator __middle,
    _Rope_iterator __last)
    {
    typedef typename _Rope_iterator::value_type _CharT;
    typedef typename _Rope_iterator::_allocator_type _Alloc;

    __stl_assert(__first.container() == __middle.container()
    && __middle.container() == __last.container());
    rope<_CharT,_Alloc>& __r(__first.container());
    rope<_CharT,_Alloc> __prefix = __r.substr(0, __first.index());
    rope<_CharT,_Alloc> __suffix =
    __r.substr(__last.index(), __r.size() - __last.index());
    rope<_CharT,_Alloc> __part1 =
    __r.substr(__middle.index(), __last.index() - __middle.index());
    rope<_CharT,_Alloc> __part2 =
    __r.substr(__first.index(), __middle.index() - __first.index());
    __r = __prefix;
    __r += __part1;
    __r += __part2;
    __r += __suffix;
    }

    #if !defined(__GNUC__)
    // Appears to confuse g++
    inline void rotate(_Rope_iterator<char,__STL_DEFAULT_ALLOCATOR (char)> __first,
    _Rope_iterator<char,__STL_DEFAULT_ALLOCATOR(char)> __middle,
    _Rope_iterator<char,__STL_DEFAULT_ALLOCATOR(char)> __last) {
    _Rope_rotate(__first, __middle, __last);
    }
    #endif

    # if 0
    // Probably not useful for several reasons:
    // - for SGIs 7.1 compiler and probably some others,
    // this forces lots of rope<wchar_t, ...> instantiations, creating a
    // code bloat and compile time problem. (Fixed in 7.2.)
    // - wchar_t is 4 bytes wide on most UNIX platforms, making it unattractive
    // for unicode strings. Unsigned short may be a better character
    // type.
    inline void rotate(
    _Rope_iterator<wchar_t,__STL_DEFAULT_ALLOCATOR(cha r)> __first,
    _Rope_iterator<wchar_t,__STL_DEFAULT_ALLOCATOR(cha r)> __middle,
    _Rope_iterator<wchar_t,__STL_DEFAULT_ALLOCATOR(cha r)> __last) {
    _Rope_rotate(__first, __middle, __last);
    }
    # endif


    #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
    #pragma reset woff 1174
    #endif

    __STL_END_NAMESPACE

    // Local Variables:
    // mode:C++
    // End:

  6. #56
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    /*
    * Copyright (c) 1999
    * Silicon Graphics Computer Systems, Inc.
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. Silicon Graphics makes no
    * representations about the suitability of this software for any
    * purpose. It is provided "as is" without express or implied warranty.
    */

    #ifndef STL_SEQUENCE_CONCEPTS_H
    #define STL_SEQUENCE_CONCEPTS_H

    #include <container_concepts.h>

    #ifdef __STL_USE_CONCEPT_CHECKS

    // This file covers the following concepts:
    // _Sequence
    // _FrontInsertionSequence
    // _BackInsertionSequence

    struct _ERROR_IN_STL_SEQ {

    template <class _XX>
    static void
    __fill_constructor_requirement_violation(_XX& __s) {
    typename _XX::value_type __t = typename _XX::value_type();
    typename _XX::difference_type __n = typename _XX::difference_type();
    _XX __x(__n, __t);
    __sink_unused_warning(__x);
    }
    template <class _XX>
    static void
    __fill_default_constructor_requirement_violation(_ XX& __s) {
    _STL_ERROR::__default_constructor_requirement_viol ation(*__s.begin());
    typename _XX::difference_type __n = typename _XX::difference_type();
    _XX __x(__n);
    __sink_unused_warning(__x);
    }
    template <class _XX>
    static void
    __range_constructor_requirement_violation(_XX& __s) {
    _XX __x(__s.begin(), __s.end());
    __sink_unused_warning(__x);
    }
    template <class _XX>
    static void
    __insert_function_requirement_violation(_XX& __s) {
    typename _XX::value_type __t = typename _XX::value_type();
    typename _XX::iterator __p = typename _XX::iterator();
    __p = __s.insert(__p, __t);
    }
    template <class _XX>
    static void
    __fill_insert_function_requirement_violation(_XX& __s) {
    typename _XX::value_type __t = typename _XX::value_type();
    typename _XX::iterator __p = typename _XX::iterator();
    typename _XX::difference_type __n = typename _XX::difference_type();
    __s.insert(__p, __n, __t);
    }
    template <class _XX>
    static void
    __range_insert_function_requirement_violation(_XX& __s) {
    typename _XX::iterator __p = typename _XX::iterator();
    typename _XX::iterator __i = typename _XX::iterator();
    typename _XX::iterator __j = typename _XX::iterator();
    __s.insert(__p, __i, __j);
    }
    template <class _XX>
    static void
    __insert_element_function_requirement_violation(_X X& __s) {
    typename _XX::value_type __t = typename _XX::value_type();
    std::pair<typename _XX::iterator, bool> __r;
    __r = __s.insert(__t);
    __sink_unused_warning(__r);
    }
    template <class _XX>
    static void
    __unconditional_insert_element_function_requiremen t_violation(_XX& __s) {
    typename _XX::value_type __t = typename _XX::value_type();
    typename _XX::iterator __p;
    __p = __s.insert(__t);
    __sink_unused_warning(__p);
    }
    template <class _XX>
    static void
    __erase_function_requirement_violation(_XX& __s) {
    typename _XX::iterator __p = typename _XX::iterator();
    __p = __s.erase(__p);
    }
    template <class _XX>
    static void
    __range_erase_function_requirement_violation(_XX& __s) {
    typename _XX::iterator __p = typename _XX::iterator();
    typename _XX::iterator __q = typename _XX::iterator();
    __p = __s.erase(__p, __q);
    }
    template <class _XX>
    static void
    __const_front_function_requirement_violation(const _XX& __s) {
    typename _XX::const_reference __t = __s.front();
    __sink_unused_warning(__t);
    }
    template <class _XX>
    static void
    __front_function_requirement_violation(_XX& __s) {
    typename _XX::reference __t = __s.front();
    __const_front_function_requirement_violation(__s);
    __sink_unused_warning(__t);
    }
    template <class _XX>
    static void
    __const_back_function_requirement_violation(const _XX& __s) {
    typename _XX::const_reference __t = __s.back();
    __sink_unused_warning(__t);
    }
    template <class _XX>
    static void
    __back_function_requirement_violation(_XX& __s) {
    typename _XX::reference __t = __s.back();
    __const_back_function_requirement_violation(__s);
    __sink_unused_warning(__t);
    }
    template <class _XX>
    static void
    __push_front_function_requirement_violation(_XX& __s) {
    typename _XX::value_type __t = typename _XX::value_type();
    __s.push_front(__t);
    }
    template <class _XX>
    static void
    __pop_front_function_requirement_violation(_XX& __s) {
    __s.pop_front();
    }
    template <class _XX>
    static void
    __push_back_function_requirement_violation(_XX& __s) {
    typename _XX::value_type __t = typename _XX::value_type();
    __s.push_back(__t);
    }
    template <class _XX>
    static void
    __pop_back_function_requirement_violation(_XX& __s) {
    __s.pop_back();
    }

    };

    /* Sequence Containers */

    template <class _Sequence>
    struct _Sequence_concept_specification {
    static void
    _Sequence_requirement_violation(_Sequence __s) {
    // Refinement of ForwardContainer
    _ForwardContainer_concept_specification<_Sequence> ::_ForwardContainer_requirement_violation(__s);
    // Refinement of DefaultConstructible
    _DefaultConstructible_concept_specification<_Seque nce>::_DefaultConstructible_requirement_violation( __s);
    // Valid Expressions
    _ERROR_IN_STL_SEQ::__fill_constructor_requirement_ violation(__s);
    _ERROR_IN_STL_SEQ::__fill_default_constructor_requ irement_violation(__s);
    _ERROR_IN_STL_SEQ::__range_constructor_requirement _violation(__s);
    _ERROR_IN_STL_SEQ::__insert_function_requirement_v iolation(__s);
    _ERROR_IN_STL_SEQ::__fill_insert_function_requirem ent_violation(__s);
    _ERROR_IN_STL_SEQ::__range_insert_function_require ment_violation(__s);
    _ERROR_IN_STL_SEQ::__erase_function_requirement_vi olation(__s);
    _ERROR_IN_STL_SEQ::__range_erase_function_requirem ent_violation(__s);
    _ERROR_IN_STL_SEQ::__front_function_requirement_vi olation(__s);
    }
    };

    template <class _FrontInsertionSequence>
    struct _FrontInsertionSequence_concept_specification {
    static void
    _FrontInsertionSequence_requirement_violation(_Fro ntInsertionSequence __s) {
    // Refinement of Sequence
    _Sequence_concept_specification<_FrontInsertionSeq uence>::_Sequence_requirement_violation(__s);
    // Valid Expressions
    _ERROR_IN_STL_SEQ::__push_front_function_requireme nt_violation(__s);
    _ERROR_IN_STL_SEQ::__pop_front_function_requiremen t_violation(__s);
    }
    };

    template <class _BackInsertionSequence>
    struct _BackInsertionSequence_concept_specification {
    static void
    _BackInsertionSequence_requirement_violation(_Back InsertionSequence __s) {
    // Refinement of Sequence
    _Sequence_concept_specification<_BackInsertionSequ ence>::_Sequence_requirement_violation(__s);
    // Valid Expressions
    _ERROR_IN_STL_SEQ::__back_function_requirement_vio lation(__s);
    _ERROR_IN_STL_SEQ::__push_back_function_requiremen t_violation(__s);
    _ERROR_IN_STL_SEQ::__pop_back_function_requirement _violation(__s);
    }
    };

    #endif /* if __STL_USE_CONCEPT_CHECKS */


    #endif /* STL_SEQUENCE_CONCEPTS_H */

  7. #57
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    /*
    *
    * Copyright (c) 1994
    * Hewlett-Packard Company
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. 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.
    *
    *
    * Copyright (c) 1996,1997
    * Silicon Graphics Computer Systems, Inc.
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. Silicon Graphics makes no
    * representations about the suitability of this software for any
    * purpose. It is provided "as is" without express or implied warranty.
    */

    #ifndef __SGI_STL_SET
    #define __SGI_STL_SET

    #ifndef __SGI_STL_INTERNAL_TREE_H
    #include <stl_tree.h>
    #endif
    #include <stl_set.h>
    #include <stl_multiset.h>

    #endif /* __SGI_STL_SET */

    // Local Variables:
    // mode:C++
    // End:

  8. #58
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    /*
    *
    * Copyright (c) 1994
    * Hewlett-Packard Company
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. 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.
    *
    *
    * Copyright (c) 1996,1997
    * Silicon Graphics Computer Systems, Inc.
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. Silicon Graphics makes no
    * representations about the suitability of this software for any
    * purpose. It is provided "as is" without express or implied warranty.
    */

    #ifndef __SGI_STL_SET_H
    #define __SGI_STL_SET_H

    #ifndef __SGI_STL_INTERNAL_TREE_H
    #include <stl_tree.h>
    #endif
    #include <algobase.h>
    #include <alloc.h>
    #include <stl_set.h>

    #ifdef __STL_USE_NAMESPACES
    using __STD::rb_tree;
    using __STD::set;
    #endif /* __STL_USE_NAMESPACES */

    #endif /* __SGI_STL_SET_H */

    // Local Variables:
    // mode:C++
    // End:

  9. #59
    Board Man Comes Home Clipper Nation's Avatar
    My Team
    Los Angeles Clippers
    Post Count
    54,257
    Kobe Bryant has reportedly appeared in a gay sex tape, though the flimsy rumor from a gossip website has sparked anger among some Los Angeles Lakers fans.

    The report alleges that the NBA All-Star appears in an explicit video with a man who plays basketball for Cal State Bernadino. There is also a video that reportedly shows the tryst, though details are far from specific.

    The Kobe Bryant gay sex tape report originated from MediaTakeOut.com a gossip site that reported “your fav player on the Los Angeles Lakers gets caught up in gay sex scandal… they got him on tape!”


  10. #60
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    /*
    * Copyright (c) 1997
    * Silicon Graphics Computer Systems, Inc.
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. Silicon Graphics makes no
    * representations about the suitability of this software for any
    * purpose. It is provided "as is" without express or implied warranty.
    *
    */

    #ifndef __SGI_STL_SLIST
    #define __SGI_STL_SLIST

    #include <stl_algobase.h>
    #include <stl_alloc.h>
    #include <stl_construct.h>
    #include <stl_uninitialized.h>
    #include <stl_slist.h>

    #endif /* __SGI_STL_SLIST */

    // Local Variables:
    // mode:C++
    // End:

  11. #61
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    /*
    * Copyright (c) 1997
    * Silicon Graphics Computer Systems, Inc.
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. Silicon Graphics makes no
    * representations about the suitability of this software for any
    * purpose. It is provided "as is" without express or implied warranty.
    *
    */

    #ifndef __SGI_STL_SLIST_H
    #define __SGI_STL_SLIST_H

    #include <algobase.h>
    #include <alloc.h>
    #include <stl_slist.h>

    #ifdef __STL_USE_NAMESPACES
    using __STD::slist;
    #endif /* __STL_USE_NAMESPACES */

    #endif /* __SGI_STL_SLIST_H */

    // Local Variables:
    // mode:C++
    // End:

  12. #62
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    /*
    *
    * Copyright (c) 1994
    * Hewlett-Packard Company
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. 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.
    *
    *
    * Copyright (c) 1996,1997
    * Silicon Graphics Computer Systems, Inc.
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. Silicon Graphics makes no
    * representations about the suitability of this software for any
    * purpose. It is provided "as is" without express or implied warranty.
    */

    #ifndef __SGI_STL_STACK
    #define __SGI_STL_STACK

    #include <stl_algobase.h>
    #include <stl_alloc.h>
    #include <stl_construct.h>
    #include <stl_uninitialized.h>
    #include <stl_deque.h>
    #include <stl_stack.h>

    #endif /* __SGI_STL_STACK */

    // Local Variables:
    // mode:C++
    // End:

  13. #63
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    /*
    *
    * Copyright (c) 1994
    * Hewlett-Packard Company
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. 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.
    *
    *
    * Copyright (c) 1996,1997
    * Silicon Graphics Computer Systems, Inc.
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. Silicon Graphics makes no
    * representations about the suitability of this software for any
    * purpose. It is provided "as is" without express or implied warranty.
    */

    #ifndef __SGI_STL_STACK_H
    #define __SGI_STL_STACK_H

    #include <vector.h>
    #include <deque.h>
    #include <heap.h>
    #include <stl_stack.h>
    #include <stl_queue.h>

    #ifdef __STL_USE_NAMESPACES
    using __STD::stack;
    using __STD::queue;
    using __STD::priority_queue;
    #endif /* __STL_USE_NAMESPACES */

    #endif /* __SGI_STL_STACK_H */

    // Local Variables:
    // mode:C++
    // End:

  14. #64
    Board Man Comes Home Clipper Nation's Avatar
    My Team
    Los Angeles Clippers
    Post Count
    54,257
    Kobe Bryant has reportedly appeared in a gay sex tape, though the flimsy rumor from a gossip website has sparked anger among some Los Angeles Lakers fans.

    The report alleges that the NBA All-Star appears in an explicit video with a man who plays basketball for Cal State Bernadino. There is also a video that reportedly shows the tryst, though details are far from specific.

    The Kobe Bryant gay sex tape report originated from MediaTakeOut.com a gossip site that reported “your fav player on the Los Angeles Lakers gets caught up in gay sex scandal… they got him on tape!”


  15. #65
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    /*
    * Copyright (c) 1997
    * Silicon Graphics Computer Systems, Inc.
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. Silicon Graphics makes no
    * representations about the suitability of this software for any
    * purpose. It is provided "as is" without express or implied warranty.
    */

    #ifndef __SGI_STDEXCEPT
    #define __SGI_STDEXCEPT

    #include <stl_exception.h>

    #if defined(__STL_USE_EXCEPTIONS) || \
    !(defined(_MIPS_SIM) && defined(_ABIO32) && _MIPS_SIM == _ABIO32)

    #include <stl_string_fwd.h>

    __STL_BEGIN_NAMESPACE

    class __Named_exception : public __STL_EXCEPTION_BASE {
    public:
    __Named_exception(const string& __str) {
    strncpy(_M_name, __get_c_string(__str), _S_bufsize);
    _M_name[_S_bufsize - 1] = '\0';
    }
    virtual const char* what() const __STL_NOTHROW { return _M_name; }

    private:
    enum { _S_bufsize = 256 };
    char _M_name[_S_bufsize];
    };

    class logic_error : public __Named_exception {
    public:
    logic_error(const string& __s) : __Named_exception(__s) {}
    };

    class runtime_error : public __Named_exception {
    public:
    runtime_error(const string& __s) : __Named_exception(__s) {}
    };

    class domain_error : public logic_error {
    public:
    domain_error(const string& __arg) : logic_error(__arg) {}
    };

    class invalid_argument : public logic_error {
    public:
    invalid_argument(const string& __arg) : logic_error(__arg) {}
    };

    class length_error : public logic_error {
    public:
    length_error(const string& __arg) : logic_error(__arg) {}
    };

    class out_of_range : public logic_error {
    public:
    out_of_range(const string& __arg) : logic_error(__arg) {}
    };

    class range_error : public runtime_error {
    public:
    range_error(const string& __arg) : runtime_error(__arg) {}
    };

    class overflow_error : public runtime_error {
    public:
    overflow_error(const string& __arg) : runtime_error(__arg) {}
    };

    class underflow_error : public runtime_error {
    public:
    underflow_error(const string& __arg) : runtime_error(__arg) {}
    };

    __STL_END_NAMESPACE

    #ifndef __SGI_STL_STRING
    #include <string>
    #endif

    #endif /* Not o32, and no exceptions */

    #endif /* __SGI_STDEXCEPT */

    // Local Variables:
    // mode:C++
    // End:

  16. #66
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    /*
    *
    * Copyright (c) 1994
    * Hewlett-Packard Company
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. 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.
    *
    *
    * Copyright (c) 1996
    * Silicon Graphics Computer Systems, Inc.
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. Silicon Graphics makes no
    * representations about the suitability of this software for any
    * purpose. It is provided "as is" without express or implied warranty.
    */

    /* NOTE: This is an internal header file, included by other STL headers.
    * You should not attempt to use it directly.
    */

    #ifndef __SGI_STL_INTERNAL_ALGO_H
    #define __SGI_STL_INTERNAL_ALGO_H

    #include <stl_heap.h>

    // See concept_checks.h for the concept-checking macros
    // __STL_REQUIRES, __STL_CONVERTIBLE, etc.


    __STL_BEGIN_NAMESPACE

    #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
    #pragma set woff 1209
    #endif

    // __median (an extension, not present in the C++ standard).

    template <class _Tp>
    inline const _Tp& __median(const _Tp& __a, const _Tp& __b, const _Tp& __c) {
    __STL_REQUIRES(_Tp, _LessThanComparable);
    if (__a < __b)
    if (__b < __c)
    return __b;
    else if (__a < __c)
    return __c;
    else
    return __a;
    else if (__a < __c)
    return __a;
    else if (__b < __c)
    return __c;
    else
    return __b;
    }

    template <class _Tp, class _Compare>
    inline const _Tp&
    __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp) {
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
    if (__comp(__a, __b))
    if (__comp(__b, __c))
    return __b;
    else if (__comp(__a, __c))
    return __c;
    else
    return __a;
    else if (__comp(__a, __c))
    return __a;
    else if (__comp(__b, __c))
    return __c;
    else
    return __b;
    }

    // for_each. Apply a function to every element of a range.
    template <class _Inpu er, class _Function>
    _Function for_each(_Inpu er __first, _Inpu er __last, _Function __f) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    for ( ; __first != __last; ++__first)
    __f(*__first);
    return __f;
    }

    // find and find_if.

    template <class _Inpu er, class _Tp>
    inline _Inpu er find(_Inpu er __first, _Inpu er __last,
    const _Tp& __val,
    input_iterator_tag)
    {
    while (__first != __last && !(*__first == __val))
    ++__first;
    return __first;
    }

    template <class _Inpu er, class _Predicate>
    inline _Inpu er find_if(_Inpu er __first, _Inpu er __last,
    _Predicate __pred,
    input_iterator_tag)
    {
    while (__first != __last && !__pred(*__first))
    ++__first;
    return __first;
    }

    #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION

    template <class _RandomAccessIter, class _Tp>
    _RandomAccessIter find(_RandomAccessIter __first, _RandomAccessIter __last,
    const _Tp& __val,
    random_access_iterator_tag)
    {
    typename iterator_traits<_RandomAccessIter>::difference_typ e __trip_count
    = (__last - __first) >> 2;

    for ( ; __trip_count > 0 ; --__trip_count) {
    if (*__first == __val) return __first;
    ++__first;

    if (*__first == __val) return __first;
    ++__first;

    if (*__first == __val) return __first;
    ++__first;

    if (*__first == __val) return __first;
    ++__first;
    }

    switch(__last - __first) {
    case 3:
    if (*__first == __val) return __first;
    ++__first;
    case 2:
    if (*__first == __val) return __first;
    ++__first;
    case 1:
    if (*__first == __val) return __first;
    ++__first;
    case 0:
    default:
    return __last;
    }
    }

    template <class _RandomAccessIter, class _Predicate>
    _RandomAccessIter find_if(_RandomAccessIter __first, _RandomAccessIter __last,
    _Predicate __pred,
    random_access_iterator_tag)
    {
    typename iterator_traits<_RandomAccessIter>::difference_typ e __trip_count
    = (__last - __first) >> 2;

    for ( ; __trip_count > 0 ; --__trip_count) {
    if (__pred(*__first)) return __first;
    ++__first;

    if (__pred(*__first)) return __first;
    ++__first;

    if (__pred(*__first)) return __first;
    ++__first;

    if (__pred(*__first)) return __first;
    ++__first;
    }

    switch(__last - __first) {
    case 3:
    if (__pred(*__first)) return __first;
    ++__first;
    case 2:
    if (__pred(*__first)) return __first;
    ++__first;
    case 1:
    if (__pred(*__first)) return __first;
    ++__first;
    case 0:
    default:
    return __last;
    }
    }

    #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */

    template <class _Inpu er, class _Tp>
    inline _Inpu er find(_Inpu er __first, _Inpu er __last,
    const _Tp& __val)
    {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
    typename iterator_traits<_Inpu er>::value_type, _Tp);
    return find(__first, __last, __val, __ITERATOR_CATEGORY(__first));
    }

    template <class _Inpu er, class _Predicate>
    inline _Inpu er find_if(_Inpu er __first, _Inpu er __last,
    _Predicate __pred) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
    typename iterator_traits<_Inpu er>::value_type);
    return find_if(__first, __last, __pred, __ITERATOR_CATEGORY(__first));
    }

    // adjacent_find.

    template <class _ForwardIter>
    _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
    _EqualityComparable);
    if (__first == __last)
    return __last;
    _ForwardIter __next = __first;
    while(++__next != __last) {
    if (*__first == *__next)
    return __first;
    __first = __next;
    }
    return __last;
    }

    template <class _ForwardIter, class _BinaryPredicate>
    _ForwardIter adjacent_find(_ForwardIter __first, _ForwardIter __last,
    _BinaryPredicate __binary_pred) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
    typename iterator_traits<_ForwardIter>::value_type,
    typename iterator_traits<_ForwardIter>::value_type);
    if (__first == __last)
    return __last;
    _ForwardIter __next = __first;
    while(++__next != __last) {
    if (__binary_pred(*__first, *__next))
    return __first;
    __first = __next;
    }
    return __last;
    }

    // count and count_if. There are two version of each, one whose return type
    // type is void and one (present only if we have partial specialization)
    // whose return type is iterator_traits<_Inpu er>::difference_type. The
    // C++ standard only has the latter version, but the former, which was present
    // in the HP STL, is retained for backward compatibility.

    template <class _Inpu er, class _Tp, class _Size>
    void count(_Inpu er __first, _Inpu er __last, const _Tp& __value,
    _Size& __n) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(typename iterator_traits<_Inpu er>::value_type,
    _EqualityComparable);
    __STL_REQUIRES(_Tp, _EqualityComparable);
    for ( ; __first != __last; ++__first)
    if (*__first == __value)
    ++__n;
    }

    template <class _Inpu er, class _Predicate, class _Size>
    void count_if(_Inpu er __first, _Inpu er __last, _Predicate __pred,
    _Size& __n) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
    typename iterator_traits<_Inpu er>::value_type);
    for ( ; __first != __last; ++__first)
    if (__pred(*__first))
    ++__n;
    }

    #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION

    template <class _Inpu er, class _Tp>
    typename iterator_traits<_Inpu er>::difference_type
    count(_Inpu er __first, _Inpu er __last, const _Tp& __value) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(typename iterator_traits<_Inpu er>::value_type,
    _EqualityComparable);
    __STL_REQUIRES(_Tp, _EqualityComparable);
    typename iterator_traits<_Inpu er>::difference_type __n = 0;
    for ( ; __first != __last; ++__first)
    if (*__first == __value)
    ++__n;
    return __n;
    }

    template <class _Inpu er, class _Predicate>
    typename iterator_traits<_Inpu er>::difference_type
    count_if(_Inpu er __first, _Inpu er __last, _Predicate __pred) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
    typename iterator_traits<_Inpu er>::value_type);
    typename iterator_traits<_Inpu er>::difference_type __n = 0;
    for ( ; __first != __last; ++__first)
    if (__pred(*__first))
    ++__n;
    return __n;
    }


    #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */

    // search.

    template <class _ForwardIter1, class _ForwardIter2>
    _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
    _ForwardIter2 __first2, _ForwardIter2 __last2)
    {
    __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
    __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
    __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
    typename iterator_traits<_ForwardIter1>::value_type,
    typename iterator_traits<_ForwardIter2>::value_type);

    // Test for empty ranges
    if (__first1 == __last1 || __first2 == __last2)
    return __first1;

    // Test for a pattern of length 1.
    _ForwardIter2 __tmp(__first2);
    ++__tmp;
    if (__tmp == __last2)
    return find(__first1, __last1, *__first2);

    // General case.

    _ForwardIter2 __p1, __p;

    __p1 = __first2; ++__p1;

    _ForwardIter1 __current = __first1;

    while (__first1 != __last1) {
    __first1 = find(__first1, __last1, *__first2);
    if (__first1 == __last1)
    return __last1;

    __p = __p1;
    __current = __first1;
    if (++__current == __last1)
    return __last1;

    while (*__current == *__p) {
    if (++__p == __last2)
    return __first1;
    if (++__current == __last1)
    return __last1;
    }

    ++__first1;
    }
    return __first1;
    }

    template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
    _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
    _ForwardIter2 __first2, _ForwardIter2 __last2,
    _BinaryPred __predicate)
    {
    __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
    __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
    __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool,
    typename iterator_traits<_ForwardIter1>::value_type,
    typename iterator_traits<_ForwardIter2>::value_type);

    // Test for empty ranges
    if (__first1 == __last1 || __first2 == __last2)
    return __first1;

    // Test for a pattern of length 1.
    _ForwardIter2 __tmp(__first2);
    ++__tmp;
    if (__tmp == __last2) {
    while (__first1 != __last1 && !__predicate(*__first1, *__first2))
    ++__first1;
    return __first1;
    }

    // General case.

    _ForwardIter2 __p1, __p;

    __p1 = __first2; ++__p1;

    _ForwardIter1 __current = __first1;

    while (__first1 != __last1) {
    while (__first1 != __last1) {
    if (__predicate(*__first1, *__first2))
    break;
    ++__first1;
    }
    while (__first1 != __last1 && !__predicate(*__first1, *__first2))
    ++__first1;
    if (__first1 == __last1)
    return __last1;

    __p = __p1;
    __current = __first1;
    if (++__current == __last1) return __last1;

    while (__predicate(*__current, *__p)) {
    if (++__p == __last2)
    return __first1;
    if (++__current == __last1)
    return __last1;
    }

    ++__first1;
    }
    return __first1;
    }

    // search_n. Search for __count consecutive copies of __val.

    template <class _ForwardIter, class _Integer, class _Tp>
    _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
    _Integer __count, const _Tp& __val) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
    _EqualityComparable);
    __STL_REQUIRES(_Tp, _EqualityComparable);

    if (__count <= 0)
    return __first;
    else {
    __first = find(__first, __last, __val);
    while (__first != __last) {
    _Integer __n = __count - 1;
    _ForwardIter __i = __first;
    ++__i;
    while (__i != __last && __n != 0 && *__i == __val) {
    ++__i;
    --__n;
    }
    if (__n == 0)
    return __first;
    else
    __first = find(__i, __last, __val);
    }
    return __last;
    }
    }

    template <class _ForwardIter, class _Integer, class _Tp, class _BinaryPred>
    _ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
    _Integer __count, const _Tp& __val,
    _BinaryPred __binary_pred) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_BINARY_FUNCTION_CHECK(_BinaryPred, bool,
    typename iterator_traits<_ForwardIter>::value_type, _Tp);
    if (__count <= 0)
    return __first;
    else {
    while (__first != __last) {
    if (__binary_pred(*__first, __val))
    break;
    ++__first;
    }
    while (__first != __last) {
    _Integer __n = __count - 1;
    _ForwardIter __i = __first;
    ++__i;
    while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) {
    ++__i;
    --__n;
    }
    if (__n == 0)
    return __first;
    else {
    while (__i != __last) {
    if (__binary_pred(*__i, __val))
    break;
    ++__i;
    }
    __first = __i;
    }
    }
    return __last;
    }
    }

    // swap_ranges

    template <class _ForwardIter1, class _ForwardIter2>
    _ForwardIter2 swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1,
    _ForwardIter2 __first2) {
    __STL_REQUIRES(_ForwardIter1, _Mutable_ForwardIterator);
    __STL_REQUIRES(_ForwardIter2, _Mutable_ForwardIterator);
    __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter1>::value_type,
    typename iterator_traits<_ForwardIter2>::value_type);
    __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter2>::value_type,
    typename iterator_traits<_ForwardIter1>::value_type);
    for ( ; __first1 != __last1; ++__first1, ++__first2)
    iter_swap(__first1, __first2);
    return __first2;
    }

    // transform

    template <class _Inpu er, class _Outpu er, class _UnaryOperation>
    _Outpu er transform(_Inpu er __first, _Inpu er __last,
    _Outpu er __result, _UnaryOperation __opr) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);

    for ( ; __first != __last; ++__first, ++__result)
    *__result = __opr(*__first);
    return __result;
    }

    template <class _Inpu er1, class _Inpu er2, class _Outpu er,
    class _BinaryOperation>
    _Outpu er transform(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Outpu er __result,
    _BinaryOperation __binary_op) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
    *__result = __binary_op(*__first1, *__first2);
    return __result;
    }

    // replace, replace_if, replace_copy, replace_copy_if

    template <class _ForwardIter, class _Tp>
    void replace(_ForwardIter __first, _ForwardIter __last,
    const _Tp& __old_value, const _Tp& __new_value) {
    __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
    __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
    typename iterator_traits<_ForwardIter>::value_type, _Tp);
    __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
    for ( ; __first != __last; ++__first)
    if (*__first == __old_value)
    *__first = __new_value;
    }

    template <class _ForwardIter, class _Predicate, class _Tp>
    void replace_if(_ForwardIter __first, _ForwardIter __last,
    _Predicate __pred, const _Tp& __new_value) {
    __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
    __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
    __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
    typename iterator_traits<_ForwardIter>::value_type);
    for ( ; __first != __last; ++__first)
    if (__pred(*__first))
    *__first = __new_value;
    }

    template <class _Inpu er, class _Outpu er, class _Tp>
    _Outpu er replace_copy(_Inpu er __first, _Inpu er __last,
    _Outpu er __result,
    const _Tp& __old_value, const _Tp& __new_value) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
    typename iterator_traits<_Inpu er>::value_type, _Tp);
    for ( ; __first != __last; ++__first, ++__result)
    *__result = *__first == __old_value ? __new_value : *__first;
    return __result;
    }

  17. #67
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    template <class _Inpu er, class _Outpu er, class _Predicate, class _Tp>
    _Outpu er replace_copy_if(_Inpu er __first, _Inpu er __last,
    _Outpu er __result,
    _Predicate __pred, const _Tp& __new_value) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
    typename iterator_traits<_Inpu er>::value_type);
    for ( ; __first != __last; ++__first, ++__result)
    *__result = __pred(*__first) ? __new_value : *__first;
    return __result;
    }

    // generate and generate_n

    template <class _ForwardIter, class _Generator>
    void generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_GENERATOR_CHECK(_Generator,
    typename iterator_traits<_ForwardIter>::value_type);
    for ( ; __first != __last; ++__first)
    *__first = __gen();
    }

    template <class _Outpu er, class _Size, class _Generator>
    _Outpu er generate_n(_Outpu er __first, _Size __n, _Generator __gen) {
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    for ( ; __n > 0; --__n, ++__first)
    *__first = __gen();
    return __first;
    }

    // remove, remove_if, remove_copy, remove_copy_if

    template <class _Inpu er, class _Outpu er, class _Tp>
    _Outpu er remove_copy(_Inpu er __first, _Inpu er __last,
    _Outpu er __result, const _Tp& __value) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
    typename iterator_traits<_Inpu er>::value_type, _Tp);
    for ( ; __first != __last; ++__first)
    if (!(*__first == __value)) {
    *__result = *__first;
    ++__result;
    }
    return __result;
    }

    template <class _Inpu er, class _Outpu er, class _Predicate>
    _Outpu er remove_copy_if(_Inpu er __first, _Inpu er __last,
    _Outpu er __result, _Predicate __pred) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
    typename iterator_traits<_Inpu er>::value_type);
    for ( ; __first != __last; ++__first)
    if (!__pred(*__first)) {
    *__result = *__first;
    ++__result;
    }
    return __result;
    }

    template <class _ForwardIter, class _Tp>
    _ForwardIter remove(_ForwardIter __first, _ForwardIter __last,
    const _Tp& __value) {
    __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
    __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
    typename iterator_traits<_ForwardIter>::value_type, _Tp);
    __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type);
    __first = find(__first, __last, __value);
    _ForwardIter __i = __first;
    return __first == __last ? __first
    : remove_copy(++__i, __last, __first, __value);
    }

    template <class _ForwardIter, class _Predicate>
    _ForwardIter remove_if(_ForwardIter __first, _ForwardIter __last,
    _Predicate __pred) {
    __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
    __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
    typename iterator_traits<_ForwardIter>::value_type);
    __first = find_if(__first, __last, __pred);
    _ForwardIter __i = __first;
    return __first == __last ? __first
    : remove_copy_if(++__i, __last, __first, __pred);
    }

    // unique and unique_copy

    template <class _Inpu er, class _Outpu er, class _Tp>
    _Outpu er __unique_copy(_Inpu er __first, _Inpu er __last,
    _Outpu er __result, _Tp*) {
    _Tp __value = *__first;
    *__result = __value;
    while (++__first != __last)
    if (!(__value == *__first)) {
    __value = *__first;
    *++__result = __value;
    }
    return ++__result;
    }

    template <class _Inpu er, class _Outpu er>
    inline _Outpu er __unique_copy(_Inpu er __first, _Inpu er __last,
    _Outpu er __result,
    output_iterator_tag) {
    return __unique_copy(__first, __last, __result, __VALUE_TYPE(__first));
    }

    template <class _Inpu er, class _ForwardIter>
    _ForwardIter __unique_copy(_Inpu er __first, _Inpu er __last,
    _ForwardIter __result, forward_iterator_tag) {
    *__result = *__first;
    while (++__first != __last)
    if (!(*__result == *__first))
    *++__result = *__first;
    return ++__result;
    }

    template <class _Inpu er, class _Outpu er>
    inline _Outpu er unique_copy(_Inpu er __first, _Inpu er __last,
    _Outpu er __result) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_REQUIRES(typename iterator_traits<_Inpu er>::value_type,
    _EqualityComparable);
    if (__first == __last) return __result;
    return __unique_copy(__first, __last, __result,
    __ITERATOR_CATEGORY(__result));
    }

    template <class _Inpu er, class _Outpu er, class _BinaryPredicate,
    class _Tp>
    _Outpu er __unique_copy(_Inpu er __first, _Inpu er __last,
    _Outpu er __result,
    _BinaryPredicate __binary_pred, _Tp*) {
    __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool, _Tp, _Tp);
    _Tp __value = *__first;
    *__result = __value;
    while (++__first != __last)
    if (!__binary_pred(__value, *__first)) {
    __value = *__first;
    *++__result = __value;
    }
    return ++__result;
    }

    template <class _Inpu er, class _Outpu er, class _BinaryPredicate>
    inline _Outpu er __unique_copy(_Inpu er __first, _Inpu er __last,
    _Outpu er __result,
    _BinaryPredicate __binary_pred,
    output_iterator_tag) {
    return __unique_copy(__first, __last, __result, __binary_pred,
    __VALUE_TYPE(__first));
    }

    template <class _Inpu er, class _ForwardIter, class _BinaryPredicate>
    _ForwardIter __unique_copy(_Inpu er __first, _Inpu er __last,
    _ForwardIter __result,
    _BinaryPredicate __binary_pred,
    forward_iterator_tag) {
    __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
    typename iterator_traits<_ForwardIter>::value_type,
    typename iterator_traits<_Inpu er>::value_type);
    *__result = *__first;
    while (++__first != __last)
    if (!__binary_pred(*__result, *__first)) *++__result = *__first;
    return ++__result;
    }

    template <class _Inpu er, class _Outpu er, class _BinaryPredicate>
    inline _Outpu er unique_copy(_Inpu er __first, _Inpu er __last,
    _Outpu er __result,
    _BinaryPredicate __binary_pred) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    if (__first == __last) return __result;
    return __unique_copy(__first, __last, __result, __binary_pred,
    __ITERATOR_CATEGORY(__result));
    }

    template <class _ForwardIter>
    _ForwardIter unique(_ForwardIter __first, _ForwardIter __last) {
    __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
    __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
    _EqualityComparable);
    __first = adjacent_find(__first, __last);
    return unique_copy(__first, __last, __first);
    }

    template <class _ForwardIter, class _BinaryPredicate>
    _ForwardIter unique(_ForwardIter __first, _ForwardIter __last,
    _BinaryPredicate __binary_pred) {
    __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
    __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
    typename iterator_traits<_ForwardIter>::value_type,
    typename iterator_traits<_ForwardIter>::value_type);
    __first = adjacent_find(__first, __last, __binary_pred);
    return unique_copy(__first, __last, __first, __binary_pred);
    }

    // reverse and reverse_copy, and their auxiliary functions

    template <class _BidirectionalIter>
    void __reverse(_BidirectionalIter __first, _BidirectionalIter __last,
    bidirectional_iterator_tag) {
    while (true)
    if (__first == __last || __first == --__last)
    return;
    else
    iter_swap(__first++, __last);
    }

    template <class _RandomAccessIter>
    void __reverse(_RandomAccessIter __first, _RandomAccessIter __last,
    random_access_iterator_tag) {
    while (__first < __last)
    iter_swap(__first++, --__last);
    }

    template <class _BidirectionalIter>
    inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last) {
    __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
    __reverse(__first, __last, __ITERATOR_CATEGORY(__first));
    }

    template <class _BidirectionalIter, class _Outpu er>
    _Outpu er reverse_copy(_BidirectionalIter __first,
    _BidirectionalIter __last,
    _Outpu er __result) {
    __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    while (__first != __last) {
    --__last;
    *__result = *__last;
    ++__result;
    }
    return __result;
    }

    // rotate and rotate_copy, and their auxiliary functions

    template <class _EuclideanRingElement>
    _EuclideanRingElement __gcd(_EuclideanRingElement __m,
    _EuclideanRingElement __n)
    {
    while (__n != 0) {
    _EuclideanRingElement __t = __m % __n;
    __m = __n;
    __n = __t;
    }
    return __m;
    }

    template <class _ForwardIter, class _Distance>
    _ForwardIter __rotate(_ForwardIter __first,
    _ForwardIter __middle,
    _ForwardIter __last,
    _Distance*,
    forward_iterator_tag) {
    if (__first == __middle)
    return __last;
    if (__last == __middle)
    return __first;

    _ForwardIter __first2 = __middle;
    do {
    swap(*__first++, *__first2++);
    if (__first == __middle)
    __middle = __first2;
    } while (__first2 != __last);

    _ForwardIter __new_middle = __first;

    __first2 = __middle;

    while (__first2 != __last) {
    swap (*__first++, *__first2++);
    if (__first == __middle)
    __middle = __first2;
    else if (__first2 == __last)
    __first2 = __middle;
    }

    return __new_middle;
    }


    template <class _BidirectionalIter, class _Distance>
    _BidirectionalIter __rotate(_BidirectionalIter __first,
    _BidirectionalIter __middle,
    _BidirectionalIter __last,
    _Distance*,
    bidirectional_iterator_tag) {
    __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
    if (__first == __middle)
    return __last;
    if (__last == __middle)
    return __first;

    __reverse(__first, __middle, bidirectional_iterator_tag());
    __reverse(__middle, __last, bidirectional_iterator_tag());

    while (__first != __middle && __middle != __last)
    swap (*__first++, *--__last);

    if (__first == __middle) {
    __reverse(__middle, __last, bidirectional_iterator_tag());
    return __last;
    }
    else {
    __reverse(__first, __middle, bidirectional_iterator_tag());
    return __first;
    }
    }

    template <class _RandomAccessIter, class _Distance, class _Tp>
    _RandomAccessIter __rotate(_RandomAccessIter __first,
    _RandomAccessIter __middle,
    _RandomAccessIter __last,
    _Distance *, _Tp *) {
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    _Distance __n = __last - __first;
    _Distance __k = __middle - __first;
    _Distance __l = __n - __k;
    _RandomAccessIter __result = __first + (__last - __middle);

    if (__k == 0)
    return __last;

    else if (__k == __l) {
    swap_ranges(__first, __middle, __middle);
    return __result;
    }

    _Distance __d = __gcd(__n, __k);

    for (_Distance __i = 0; __i < __d; __i++) {
    _Tp __tmp = *__first;
    _RandomAccessIter __p = __first;

    if (__k < __l) {
    for (_Distance __j = 0; __j < __l/__d; __j++) {
    if (__p > __first + __l) {
    *__p = *(__p - __l);
    __p -= __l;
    }

    *__p = *(__p + __k);
    __p += __k;
    }
    }

    else {
    for (_Distance __j = 0; __j < __k/__d - 1; __j ++) {
    if (__p < __last - __k) {
    *__p = *(__p + __k);
    __p += __k;
    }

    *__p = * (__p - __l);
    __p -= __l;
    }
    }

    *__p = __tmp;
    ++__first;
    }

    return __result;
    }

    template <class _ForwardIter>
    inline _ForwardIter rotate(_ForwardIter __first, _ForwardIter __middle,
    _ForwardIter __last) {
    __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
    return __rotate(__first, __middle, __last,
    __DISTANCE_TYPE(__first),
    __ITERATOR_CATEGORY(__first));
    }

    template <class _ForwardIter, class _Outpu er>
    _Outpu er rotate_copy(_ForwardIter __first, _ForwardIter __middle,
    _ForwardIter __last, _Outpu er __result) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    return copy(__first, __middle, copy(__middle, __last, __result));
    }

    // Return a random number in the range [0, __n). This function encapsulates
    // whether we're using rand (part of the standard C library) or lrand48
    // (not standard, but a much better choice whenever it's available).

    template <class _Distance>
    inline _Distance __random_number(_Distance __n) {
    #ifdef __STL_NO_DRAND48
    return rand() % __n;
    #else
    return lrand48() % __n;
    #endif
    }

    // random_shuffle

    template <class _RandomAccessIter>
    inline void random_shuffle(_RandomAccessIter __first,
    _RandomAccessIter __last) {
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    if (__first == __last) return;
    for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
    iter_swap(__i, __first + __random_number((__i - __first) + 1));
    }

    template <class _RandomAccessIter, class _RandomNumberGenerator>
    void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
    _RandomNumberGenerator& __rand) {
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    if (__first == __last) return;
    for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
    iter_swap(__i, __first + __rand((__i - __first) + 1));
    }

    // random_sample and random_sample_n (extensions, not part of the standard).

    template <class _ForwardIter, class _Outpu er, class _Distance>
    _Outpu er random_sample_n(_ForwardIter __first, _ForwardIter __last,
    _Outpu er __out, const _Distance __n)
    {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    _Distance __remaining = 0;
    distance(__first, __last, __remaining);
    _Distance __m = min(__n, __remaining);

    while (__m > 0) {
    if (__random_number(__remaining) < __m) {
    *__out = *__first;
    ++__out;
    --__m;
    }

    --__remaining;
    ++__first;
    }
    return __out;
    }

    template <class _ForwardIter, class _Outpu er, class _Distance,
    class _RandomNumberGenerator>
    _Outpu er random_sample_n(_ForwardIter __first, _ForwardIter __last,
    _Outpu er __out, const _Distance __n,
    _RandomNumberGenerator& __rand)
    {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_UNARY_FUNCTION_CHECK(_RandomNumberGenerator, _Distance, _Distance);
    _Distance __remaining = 0;
    distance(__first, __last, __remaining);
    _Distance __m = min(__n, __remaining);

    while (__m > 0) {
    if (__rand(__remaining) < __m) {
    *__out = *__first;
    ++__out;
    --__m;
    }

    --__remaining;
    ++__first;
    }
    return __out;
    }

    template <class _Inpu er, class _RandomAccessIter, class _Distance>
    _RandomAccessIter __random_sample(_Inpu er __first, _Inpu er __last,
    _RandomAccessIter __out,
    const _Distance __n)
    {
    _Distance __m = 0;
    _Distance __t = __n;
    for ( ; __first != __last && __m < __n; ++__m, ++__first)
    __out[__m] = *__first;

    while (__first != __last) {
    ++__t;
    _Distance __M = __random_number(__t);
    if (__M < __n)
    __out[__M] = *__first;
    ++__first;
    }

    return __out + __m;
    }

    template <class _Inpu er, class _RandomAccessIter,
    class _RandomNumberGenerator, class _Distance>
    _RandomAccessIter __random_sample(_Inpu er __first, _Inpu er __last,
    _RandomAccessIter __out,
    _RandomNumberGenerator& __rand,
    const _Distance __n)
    {
    __STL_UNARY_FUNCTION_CHECK(_RandomNumberGenerator, _Distance, _Distance);
    _Distance __m = 0;
    _Distance __t = __n;
    for ( ; __first != __last && __m < __n; ++__m, ++__first)
    __out[__m] = *__first;

    while (__first != __last) {
    ++__t;
    _Distance __M = __rand(__t);
    if (__M < __n)
    __out[__M] = *__first;
    ++__first;
    }

    return __out + __m;
    }

    template <class _Inpu er, class _RandomAccessIter>
    inline _RandomAccessIter
    random_sample(_Inpu er __first, _Inpu er __last,
    _RandomAccessIter __out_first, _RandomAccessIter __out_last)
    {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    return __random_sample(__first, __last,
    __out_first, __out_last - __out_first);
    }

  18. #68
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    template <class _Inpu er, class _RandomAccessIter,
    class _RandomNumberGenerator>
    inline _RandomAccessIter
    random_sample(_Inpu er __first, _Inpu er __last,
    _RandomAccessIter __out_first, _RandomAccessIter __out_last,
    _RandomNumberGenerator& __rand)
    {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    return __random_sample(__first, __last,
    __out_first, __rand,
    __out_last - __out_first);
    }

    // par ion, stable_par ion, and their auxiliary functions

    template <class _ForwardIter, class _Predicate>
    _ForwardIter __par ion(_ForwardIter __first,
    _ForwardIter __last,
    _Predicate __pred,
    forward_iterator_tag) {
    if (__first == __last) return __first;

    while (__pred(*__first))
    if (++__first == __last) return __first;

    _ForwardIter __next = __first;

    while (++__next != __last)
    if (__pred(*__next)) {
    swap(*__first, *__next);
    ++__first;
    }

    return __first;
    }

    template <class _BidirectionalIter, class _Predicate>
    _BidirectionalIter __par ion(_BidirectionalIter __first,
    _BidirectionalIter __last,
    _Predicate __pred,
    bidirectional_iterator_tag) {
    while (true) {
    while (true)
    if (__first == __last)
    return __first;
    else if (__pred(*__first))
    ++__first;
    else
    break;
    --__last;
    while (true)
    if (__first == __last)
    return __first;
    else if (!__pred(*__last))
    --__last;
    else
    break;
    iter_swap(__first, __last);
    ++__first;
    }
    }

    template <class _ForwardIter, class _Predicate>
    inline _ForwardIter par ion(_ForwardIter __first,
    _ForwardIter __last,
    _Predicate __pred) {
    __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
    __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
    typename iterator_traits<_ForwardIter>::value_type);
    return __par ion(__first, __last, __pred, __ITERATOR_CATEGORY(__first));
    }


    template <class _ForwardIter, class _Predicate, class _Distance>
    _ForwardIter __inplace_stable_par ion(_ForwardIter __first,
    _ForwardIter __last,
    _Predicate __pred, _Distance __len) {
    if (__len == 1)
    return __pred(*__first) ? __last : __first;
    _ForwardIter __middle = __first;
    advance(__middle, __len / 2);
    return rotate(__inplace_stable_par ion(__first, __middle, __pred,
    __len / 2),
    __middle,
    __inplace_stable_par ion(__middle, __last, __pred,
    __len - __len / 2));
    }

    template <class _ForwardIter, class _Pointer, class _Predicate,
    class _Distance>
    _ForwardIter __stable_par ion_adaptive(_ForwardIter __first,
    _ForwardIter __last,
    _Predicate __pred, _Distance __len,
    _Pointer __buffer,
    _Distance __buffer_size)
    {
    if (__len <= __buffer_size) {
    _ForwardIter __result1 = __first;
    _Pointer __result2 = __buffer;
    for ( ; __first != __last ; ++__first)
    if (__pred(*__first)) {
    *__result1 = *__first;
    ++__result1;
    }
    else {
    *__result2 = *__first;
    ++__result2;
    }
    copy(__buffer, __result2, __result1);
    return __result1;
    }
    else {
    _ForwardIter __middle = __first;
    advance(__middle, __len / 2);
    return rotate(__stable_par ion_adaptive(
    __first, __middle, __pred,
    __len / 2, __buffer, __buffer_size),
    __middle,
    __stable_par ion_adaptive(
    __middle, __last, __pred,
    __len - __len / 2, __buffer, __buffer_size));
    }
    }

    template <class _ForwardIter, class _Predicate, class _Tp, class _Distance>
    inline _ForwardIter
    __stable_par ion_aux(_ForwardIter __first, _ForwardIter __last,
    _Predicate __pred, _Tp*, _Distance*)
    {
    _Temporary_buffer<_ForwardIter, _Tp> __buf(__first, __last);
    if (__buf.size() > 0)
    return __stable_par ion_adaptive(__first, __last, __pred,
    _Distance(__buf.requested_size()),
    __buf.begin(), __buf.size());
    else
    return __inplace_stable_par ion(__first, __last, __pred,
    _Distance(__buf.requested_size()));
    }

    template <class _ForwardIter, class _Predicate>
    inline _ForwardIter stable_par ion(_ForwardIter __first,
    _ForwardIter __last,
    _Predicate __pred) {
    __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
    __STL_UNARY_FUNCTION_CHECK(_Predicate, bool,
    typename iterator_traits<_ForwardIter>::value_type);
    if (__first == __last)
    return __first;
    else
    return __stable_par ion_aux(__first, __last, __pred,
    __VALUE_TYPE(__first),
    __DISTANCE_TYPE(__first));
    }

    template <class _RandomAccessIter, class _Tp>
    _RandomAccessIter __unguarded_par ion(_RandomAccessIter __first,
    _RandomAccessIter __last,
    _Tp __pivot)
    {
    while (true) {
    while (*__first < __pivot)
    ++__first;
    --__last;
    while (__pivot < *__last)
    --__last;
    if (!(__first < __last))
    return __first;
    iter_swap(__first, __last);
    ++__first;
    }
    }

    template <class _RandomAccessIter, class _Tp, class _Compare>
    _RandomAccessIter __unguarded_par ion(_RandomAccessIter __first,
    _RandomAccessIter __last,
    _Tp __pivot, _Compare __comp)
    {
    while (true) {
    while (__comp(*__first, __pivot))
    ++__first;
    --__last;
    while (__comp(__pivot, *__last))
    --__last;
    if (!(__first < __last))
    return __first;
    iter_swap(__first, __last);
    ++__first;
    }
    }

    const int __stl_threshold = 16;

    // sort() and its auxiliary functions.

    template <class _RandomAccessIter, class _Tp>
    void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val) {
    _RandomAccessIter __next = __last;
    --__next;
    while (__val < *__next) {
    *__last = *__next;
    __last = __next;
    --__next;
    }
    *__last = __val;
    }

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

    template <class _RandomAccessIter, class _Tp>
    inline void __linear_insert(_RandomAccessIter __first,
    _RandomAccessIter __last, _Tp*) {
    _Tp __val = *__last;
    if (__val < *__first) {
    copy_backward(__first, __last, __last + 1);
    *__first = __val;
    }
    else
    __unguarded_linear_insert(__last, __val);
    }

    template <class _RandomAccessIter, class _Tp, class _Compare>
    inline void __linear_insert(_RandomAccessIter __first,
    _RandomAccessIter __last, _Tp*, _Compare __comp) {
    _Tp __val = *__last;
    if (__comp(__val, *__first)) {
    copy_backward(__first, __last, __last + 1);
    *__first = __val;
    }
    else
    __unguarded_linear_insert(__last, __val, __comp);
    }

    template <class _RandomAccessIter>
    void __insertion_sort(_RandomAccessIter __first, _RandomAccessIter __last) {
    if (__first == __last) return;
    for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
    __linear_insert(__first, __i, __VALUE_TYPE(__first));
    }

    template <class _RandomAccessIter, class _Compare>
    void __insertion_sort(_RandomAccessIter __first,
    _RandomAccessIter __last, _Compare __comp) {
    if (__first == __last) return;
    for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
    __linear_insert(__first, __i, __VALUE_TYPE(__first), __comp);
    }

    template <class _RandomAccessIter, class _Tp>
    void __unguarded_insertion_sort_aux(_RandomAccessIter __first,
    _RandomAccessIter __last, _Tp*) {
    for (_RandomAccessIter __i = __first; __i != __last; ++__i)
    __unguarded_linear_insert(__i, _Tp(*__i));
    }

    template <class _RandomAccessIter>
    inline void __unguarded_insertion_sort(_RandomAccessIter __first,
    _RandomAccessIter __last) {
    __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first));
    }

    template <class _RandomAccessIter, class _Tp, class _Compare>
    void __unguarded_insertion_sort_aux(_RandomAccessIter __first,
    _RandomAccessIter __last,
    _Tp*, _Compare __comp) {
    for (_RandomAccessIter __i = __first; __i != __last; ++__i)
    __unguarded_linear_insert(__i, _Tp(*__i), __comp);
    }

    template <class _RandomAccessIter, class _Compare>
    inline void __unguarded_insertion_sort(_RandomAccessIter __first,
    _RandomAccessIter __last,
    _Compare __comp) {
    __unguarded_insertion_sort_aux(__first, __last, __VALUE_TYPE(__first),
    __comp);
    }

    template <class _RandomAccessIter>
    void __final_insertion_sort(_RandomAccessIter __first,
    _RandomAccessIter __last) {
    if (__last - __first > __stl_threshold) {
    __insertion_sort(__first, __first + __stl_threshold);
    __unguarded_insertion_sort(__first + __stl_threshold, __last);
    }
    else
    __insertion_sort(__first, __last);
    }

    template <class _RandomAccessIter, class _Compare>
    void __final_insertion_sort(_RandomAccessIter __first,
    _RandomAccessIter __last, _Compare __comp) {
    if (__last - __first > __stl_threshold) {
    __insertion_sort(__first, __first + __stl_threshold, __comp);
    __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);
    }
    else
    __insertion_sort(__first, __last, __comp);
    }

    template <class _Size>
    inline _Size __lg(_Size __n) {
    _Size __k;
    for (__k = 0; __n != 1; __n >>= 1) ++__k;
    return __k;
    }

    template <class _RandomAccessIter, class _Tp, class _Size>
    void __introsort_loop(_RandomAccessIter __first,
    _RandomAccessIter __last, _Tp*,
    _Size __depth_limit)
    {
    while (__last - __first > __stl_threshold) {
    if (__depth_limit == 0) {
    partial_sort(__first, __last, __last);
    return;
    }
    --__depth_limit;
    _RandomAccessIter __cut =
    __unguarded_par ion(__first, __last,
    _Tp(__median(*__first,
    *(__first + (__last - __first)/2),
    *(__last - 1))));
    __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit);
    __last = __cut;
    }
    }

    template <class _RandomAccessIter, class _Tp, class _Size, class _Compare>
    void __introsort_loop(_RandomAccessIter __first,
    _RandomAccessIter __last, _Tp*,
    _Size __depth_limit, _Compare __comp)
    {
    while (__last - __first > __stl_threshold) {
    if (__depth_limit == 0) {
    partial_sort(__first, __last, __last, __comp);
    return;
    }
    --__depth_limit;
    _RandomAccessIter __cut =
    __unguarded_par ion(__first, __last,
    _Tp(__median(*__first,
    *(__first + (__last - __first)/2),
    *(__last - 1), __comp)),
    __comp);
    __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit, __comp);
    __last = __cut;
    }
    }

    template <class _RandomAccessIter>
    inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) {
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
    _LessThanComparable);
    if (__first != __last) {
    __introsort_loop(__first, __last,
    __VALUE_TYPE(__first),
    __lg(__last - __first) * 2);
    __final_insertion_sort(__first, __last);
    }
    }

    template <class _RandomAccessIter, class _Compare>
    inline void sort(_RandomAccessIter __first, _RandomAccessIter __last,
    _Compare __comp) {
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_RandomAccessIter>::value_type,
    typename iterator_traits<_RandomAccessIter>::value_type);
    if (__first != __last) {
    __introsort_loop(__first, __last,
    __VALUE_TYPE(__first),
    __lg(__last - __first) * 2,
    __comp);
    __final_insertion_sort(__first, __last, __comp);
    }
    }

    // stable_sort() and its auxiliary functions.

    template <class _RandomAccessIter>
    void __inplace_stable_sort(_RandomAccessIter __first,
    _RandomAccessIter __last) {
    if (__last - __first < 15) {
    __insertion_sort(__first, __last);
    return;
    }
    _RandomAccessIter __middle = __first + (__last - __first) / 2;
    __inplace_stable_sort(__first, __middle);
    __inplace_stable_sort(__middle, __last);
    __merge_without_buffer(__first, __middle, __last,
    __middle - __first,
    __last - __middle);
    }

    template <class _RandomAccessIter, class _Compare>
    void __inplace_stable_sort(_RandomAccessIter __first,
    _RandomAccessIter __last, _Compare __comp) {
    if (__last - __first < 15) {
    __insertion_sort(__first, __last, __comp);
    return;
    }
    _RandomAccessIter __middle = __first + (__last - __first) / 2;
    __inplace_stable_sort(__first, __middle, __comp);
    __inplace_stable_sort(__middle, __last, __comp);
    __merge_without_buffer(__first, __middle, __last,
    __middle - __first,
    __last - __middle,
    __comp);
    }

    template <class _RandomAccessIter1, class _RandomAccessIter2,
    class _Distance>
    void __merge_sort_loop(_RandomAccessIter1 __first,
    _RandomAccessIter1 __last,
    _RandomAccessIter2 __result, _Distance __step_size) {
    _Distance __two_step = 2 * __step_size;

    while (__last - __first >= __two_step) {
    __result = merge(__first, __first + __step_size,
    __first + __step_size, __first + __two_step,
    __result);
    __first += __two_step;
    }

    __step_size = min(_Distance(__last - __first), __step_size);
    merge(__first, __first + __step_size, __first + __step_size, __last,
    __result);
    }

  19. #69
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    template <class _RandomAccessIter1, class _RandomAccessIter2,
    class _Distance, class _Compare>
    void __merge_sort_loop(_RandomAccessIter1 __first,
    _RandomAccessIter1 __last,
    _RandomAccessIter2 __result, _Distance __step_size,
    _Compare __comp) {
    _Distance __two_step = 2 * __step_size;

    while (__last - __first >= __two_step) {
    __result = merge(__first, __first + __step_size,
    __first + __step_size, __first + __two_step,
    __result,
    __comp);
    __first += __two_step;
    }
    __step_size = min(_Distance(__last - __first), __step_size);

    merge(__first, __first + __step_size,
    __first + __step_size, __last,
    __result,
    __comp);
    }

    const int __stl_chunk_size = 7;

    template <class _RandomAccessIter, class _Distance>
    void __chunk_insertion_sort(_RandomAccessIter __first,
    _RandomAccessIter __last, _Distance __chunk_size)
    {
    while (__last - __first >= __chunk_size) {
    __insertion_sort(__first, __first + __chunk_size);
    __first += __chunk_size;
    }
    __insertion_sort(__first, __last);
    }

    template <class _RandomAccessIter, class _Distance, class _Compare>
    void __chunk_insertion_sort(_RandomAccessIter __first,
    _RandomAccessIter __last,
    _Distance __chunk_size, _Compare __comp)
    {
    while (__last - __first >= __chunk_size) {
    __insertion_sort(__first, __first + __chunk_size, __comp);
    __first += __chunk_size;
    }
    __insertion_sort(__first, __last, __comp);
    }

    template <class _RandomAccessIter, class _Pointer, class _Distance>
    void __merge_sort_with_buffer(_RandomAccessIter __first,
    _RandomAccessIter __last,
    _Pointer __buffer, _Distance*) {
    _Distance __len = __last - __first;
    _Pointer __buffer_last = __buffer + __len;

    _Distance __step_size = __stl_chunk_size;
    __chunk_insertion_sort(__first, __last, __step_size);

    while (__step_size < __len) {
    __merge_sort_loop(__first, __last, __buffer, __step_size);
    __step_size *= 2;
    __merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
    __step_size *= 2;
    }
    }

    template <class _RandomAccessIter, class _Pointer, class _Distance,
    class _Compare>
    void __merge_sort_with_buffer(_RandomAccessIter __first,
    _RandomAccessIter __last, _Pointer __buffer,
    _Distance*, _Compare __comp) {
    _Distance __len = __last - __first;
    _Pointer __buffer_last = __buffer + __len;

    _Distance __step_size = __stl_chunk_size;
    __chunk_insertion_sort(__first, __last, __step_size, __comp);

    while (__step_size < __len) {
    __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);
    __step_size *= 2;
    __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);
    __step_size *= 2;
    }
    }

    template <class _RandomAccessIter, class _Pointer, class _Distance>
    void __stable_sort_adaptive(_RandomAccessIter __first,
    _RandomAccessIter __last, _Pointer __buffer,
    _Distance __buffer_size) {
    _Distance __len = (__last - __first + 1) / 2;
    _RandomAccessIter __middle = __first + __len;
    if (__len > __buffer_size) {
    __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size);
    __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size);
    }
    else {
    __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0);
    __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0);
    }
    __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
    _Distance(__last - __middle), __buffer, __buffer_size);
    }

    template <class _RandomAccessIter, class _Pointer, class _Distance,
    class _Compare>
    void __stable_sort_adaptive(_RandomAccessIter __first,
    _RandomAccessIter __last, _Pointer __buffer,
    _Distance __buffer_size, _Compare __comp) {
    _Distance __len = (__last - __first + 1) / 2;
    _RandomAccessIter __middle = __first + __len;
    if (__len > __buffer_size) {
    __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size,
    __comp);
    __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size,
    __comp);
    }
    else {
    __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0,
    __comp);
    __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0,
    __comp);
    }
    __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first),
    _Distance(__last - __middle), __buffer, __buffer_size,
    __comp);
    }

    template <class _RandomAccessIter, class _Tp, class _Distance>
    inline void __stable_sort_aux(_RandomAccessIter __first,
    _RandomAccessIter __last, _Tp*, _Distance*) {
    _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
    if (buf.begin() == 0)
    __inplace_stable_sort(__first, __last);
    else
    __stable_sort_adaptive(__first, __last, buf.begin(),
    _Distance(buf.size()));
    }

    template <class _RandomAccessIter, class _Tp, class _Distance, class _Compare>
    inline void __stable_sort_aux(_RandomAccessIter __first,
    _RandomAccessIter __last, _Tp*, _Distance*,
    _Compare __comp) {
    _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
    if (buf.begin() == 0)
    __inplace_stable_sort(__first, __last, __comp);
    else
    __stable_sort_adaptive(__first, __last, buf.begin(),
    _Distance(buf.size()),
    __comp);
    }

    template <class _RandomAccessIter>
    inline void stable_sort(_RandomAccessIter __first,
    _RandomAccessIter __last) {
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
    _LessThanComparable);
    __stable_sort_aux(__first, __last,
    __VALUE_TYPE(__first),
    __DISTANCE_TYPE(__first));
    }

    template <class _RandomAccessIter, class _Compare>
    inline void stable_sort(_RandomAccessIter __first,
    _RandomAccessIter __last, _Compare __comp) {
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_RandomAccessIter>::value_type,
    typename iterator_traits<_RandomAccessIter>::value_type);
    __stable_sort_aux(__first, __last,
    __VALUE_TYPE(__first),
    __DISTANCE_TYPE(__first),
    __comp);
    }

    // partial_sort, partial_sort_copy, and auxiliary functions.

    template <class _RandomAccessIter, class _Tp>
    void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
    _RandomAccessIter __last, _Tp*) {
    make_heap(__first, __middle);
    for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
    if (*__i < *__first)
    __pop_heap(__first, __middle, __i, _Tp(*__i),
    __DISTANCE_TYPE(__first));
    sort_heap(__first, __middle);
    }

    template <class _RandomAccessIter>
    inline void partial_sort(_RandomAccessIter __first,
    _RandomAccessIter __middle,
    _RandomAccessIter __last) {
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
    _LessThanComparable);
    __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first));
    }

    template <class _RandomAccessIter, class _Tp, class _Compare>
    void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
    _RandomAccessIter __last, _Tp*, _Compare __comp) {
    make_heap(__first, __middle, __comp);
    for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
    if (__comp(*__i, *__first))
    __pop_heap(__first, __middle, __i, _Tp(*__i), __comp,
    __DISTANCE_TYPE(__first));
    sort_heap(__first, __middle, __comp);
    }

    template <class _RandomAccessIter, class _Compare>
    inline void partial_sort(_RandomAccessIter __first,
    _RandomAccessIter __middle,
    _RandomAccessIter __last, _Compare __comp) {
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_RandomAccessIter>::value_type,
    typename iterator_traits<_RandomAccessIter>::value_type);
    __partial_sort(__first, __middle, __last, __VALUE_TYPE(__first), __comp);
    }

    template <class _Inpu er, class _RandomAccessIter, class _Distance,
    class _Tp>
    _RandomAccessIter __partial_sort_copy(_Inpu er __first,
    _Inpu er __last,
    _RandomAccessIter __result_first,
    _RandomAccessIter __result_last,
    _Distance*, _Tp*) {
    if (__result_first == __result_last) return __result_last;
    _RandomAccessIter __result_real_last = __result_first;
    while(__first != __last && __result_real_last != __result_last) {
    *__result_real_last = *__first;
    ++__result_real_last;
    ++__first;
    }
    make_heap(__result_first, __result_real_last);
    while (__first != __last) {
    if (*__first < *__result_first)
    __adjust_heap(__result_first, _Distance(0),
    _Distance(__result_real_last - __result_first),
    _Tp(*__first));
    ++__first;
    }
    sort_heap(__result_first, __result_real_last);
    return __result_real_last;
    }

    template <class _Inpu er, class _RandomAccessIter>
    inline _RandomAccessIter
    partial_sort_copy(_Inpu er __first, _Inpu er __last,
    _RandomAccessIter __result_first,
    _RandomAccessIter __result_last) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    __STL_CONVERTIBLE(typename iterator_traits<_Inpu er>::value_type,
    typename iterator_traits<_RandomAccessIter>::value_type);
    __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
    _LessThanComparable);
    __STL_REQUIRES(typename iterator_traits<_Inpu er>::value_type,
    _LessThanComparable);
    return __partial_sort_copy(__first, __last, __result_first, __result_last,
    __DISTANCE_TYPE(__result_first),
    __VALUE_TYPE(__first));
    }

    template <class _Inpu er, class _RandomAccessIter, class _Compare,
    class _Distance, class _Tp>
    _RandomAccessIter __partial_sort_copy(_Inpu er __first,
    _Inpu er __last,
    _RandomAccessIter __result_first,
    _RandomAccessIter __result_last,
    _Compare __comp, _Distance*, _Tp*) {
    if (__result_first == __result_last) return __result_last;
    _RandomAccessIter __result_real_last = __result_first;
    while(__first != __last && __result_real_last != __result_last) {
    *__result_real_last = *__first;
    ++__result_real_last;
    ++__first;
    }
    make_heap(__result_first, __result_real_last, __comp);
    while (__first != __last) {
    if (__comp(*__first, *__result_first))
    __adjust_heap(__result_first, _Distance(0),
    _Distance(__result_real_last - __result_first),
    _Tp(*__first),
    __comp);
    ++__first;
    }
    sort_heap(__result_first, __result_real_last, __comp);
    return __result_real_last;
    }

    template <class _Inpu er, class _RandomAccessIter, class _Compare>
    inline _RandomAccessIter
    partial_sort_copy(_Inpu er __first, _Inpu er __last,
    _RandomAccessIter __result_first,
    _RandomAccessIter __result_last, _Compare __comp) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    __STL_CONVERTIBLE(typename iterator_traits<_Inpu er>::value_type,
    typename iterator_traits<_RandomAccessIter>::value_type);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_RandomAccessIter>::value_type,
    typename iterator_traits<_RandomAccessIter>::value_type);
    return __partial_sort_copy(__first, __last, __result_first, __result_last,
    __comp,
    __DISTANCE_TYPE(__result_first),
    __VALUE_TYPE(__first));
    }

    // nth_element() and its auxiliary functions.

    template <class _RandomAccessIter, class _Tp>
    void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
    _RandomAccessIter __last, _Tp*) {
    while (__last - __first > 3) {
    _RandomAccessIter __cut =
    __unguarded_par ion(__first, __last,
    _Tp(__median(*__first,
    *(__first + (__last - __first)/2),
    *(__last - 1))));
    if (__cut <= __nth)
    __first = __cut;
    else
    __last = __cut;
    }
    __insertion_sort(__first, __last);
    }

  20. #70
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    template <class _RandomAccessIter>
    inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
    _RandomAccessIter __last) {
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
    _LessThanComparable);
    __nth_element(__first, __nth, __last, __VALUE_TYPE(__first));
    }

    template <class _RandomAccessIter, class _Tp, class _Compare>
    void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
    _RandomAccessIter __last, _Tp*, _Compare __comp) {
    while (__last - __first > 3) {
    _RandomAccessIter __cut =
    __unguarded_par ion(__first, __last,
    _Tp(__median(*__first,
    *(__first + (__last - __first)/2),
    *(__last - 1),
    __comp)),
    __comp);
    if (__cut <= __nth)
    __first = __cut;
    else
    __last = __cut;
    }
    __insertion_sort(__first, __last, __comp);
    }

    template <class _RandomAccessIter, class _Compare>
    inline void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
    _RandomAccessIter __last, _Compare __comp) {
    __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_RandomAccessIter>::value_type,
    typename iterator_traits<_RandomAccessIter>::value_type);
    __nth_element(__first, __nth, __last, __VALUE_TYPE(__first), __comp);
    }


    // Binary search (lower_bound, upper_bound, equal_range, binary_search).

    template <class _ForwardIter, class _Tp, class _Distance>
    _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
    const _Tp& __val, _Distance*)
    {
    _Distance __len = 0;
    distance(__first, __last, __len);
    _Distance __half;
    _ForwardIter __middle;

    while (__len > 0) {
    __half = __len >> 1;
    __middle = __first;
    advance(__middle, __half);
    if (*__middle < __val) {
    __first = __middle;
    ++__first;
    __len = __len - __half - 1;
    }
    else
    __len = __half;
    }
    return __first;
    }

    template <class _ForwardIter, class _Tp>
    inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
    const _Tp& __val) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES_SAME_TYPE(_Tp,
    typename iterator_traits<_ForwardIter>::value_type);
    __STL_REQUIRES(_Tp, _LessThanComparable);
    return __lower_bound(__first, __last, __val,
    __DISTANCE_TYPE(__first));
    }

    template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
    _ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
    const _Tp& __val, _Compare __comp, _Distance*)
    {
    _Distance __len = 0;
    distance(__first, __last, __len);
    _Distance __half;
    _ForwardIter __middle;

    while (__len > 0) {
    __half = __len >> 1;
    __middle = __first;
    advance(__middle, __half);
    if (__comp(*__middle, __val)) {
    __first = __middle;
    ++__first;
    __len = __len - __half - 1;
    }
    else
    __len = __half;
    }
    return __first;
    }

    template <class _ForwardIter, class _Tp, class _Compare>
    inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
    const _Tp& __val, _Compare __comp) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES_SAME_TYPE(_Tp,
    typename iterator_traits<_ForwardIter>::value_type);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
    return __lower_bound(__first, __last, __val, __comp,
    __DISTANCE_TYPE(__first));
    }

    template <class _ForwardIter, class _Tp, class _Distance>
    _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
    const _Tp& __val, _Distance*)
    {
    _Distance __len = 0;
    distance(__first, __last, __len);
    _Distance __half;
    _ForwardIter __middle;

    while (__len > 0) {
    __half = __len >> 1;
    __middle = __first;
    advance(__middle, __half);
    if (__val < *__middle)
    __len = __half;
    else {
    __first = __middle;
    ++__first;
    __len = __len - __half - 1;
    }
    }
    return __first;
    }

    template <class _ForwardIter, class _Tp>
    inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
    const _Tp& __val) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES_SAME_TYPE(_Tp,
    typename iterator_traits<_ForwardIter>::value_type);
    __STL_REQUIRES(_Tp, _LessThanComparable);
    return __upper_bound(__first, __last, __val,
    __DISTANCE_TYPE(__first));
    }

    template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
    _ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
    const _Tp& __val, _Compare __comp, _Distance*)
    {
    _Distance __len = 0;
    distance(__first, __last, __len);
    _Distance __half;
    _ForwardIter __middle;

    while (__len > 0) {
    __half = __len >> 1;
    __middle = __first;
    advance(__middle, __half);
    if (__comp(__val, *__middle))
    __len = __half;
    else {
    __first = __middle;
    ++__first;
    __len = __len - __half - 1;
    }
    }
    return __first;
    }

    template <class _ForwardIter, class _Tp, class _Compare>
    inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
    const _Tp& __val, _Compare __comp) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES_SAME_TYPE(_Tp,
    typename iterator_traits<_ForwardIter>::value_type);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
    return __upper_bound(__first, __last, __val, __comp,
    __DISTANCE_TYPE(__first));
    }

    template <class _ForwardIter, class _Tp, class _Distance>
    pair<_ForwardIter, _ForwardIter>
    __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
    _Distance*)
    {
    _Distance __len = 0;
    distance(__first, __last, __len);
    _Distance __half;
    _ForwardIter __middle, __left, __right;

    while (__len > 0) {
    __half = __len >> 1;
    __middle = __first;
    advance(__middle, __half);
    if (*__middle < __val) {
    __first = __middle;
    ++__first;
    __len = __len - __half - 1;
    }
    else if (__val < *__middle)
    __len = __half;
    else {
    __left = lower_bound(__first, __middle, __val);
    advance(__first, __len);
    __right = upper_bound(++__middle, __first, __val);
    return pair<_ForwardIter, _ForwardIter>(__left, __right);
    }
    }
    return pair<_ForwardIter, _ForwardIter>(__first, __first);
    }

    template <class _ForwardIter, class _Tp>
    inline pair<_ForwardIter, _ForwardIter>
    equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES_SAME_TYPE(_Tp,
    typename iterator_traits<_ForwardIter>::value_type);
    __STL_REQUIRES(_Tp, _LessThanComparable);
    return __equal_range(__first, __last, __val,
    __DISTANCE_TYPE(__first));
    }

    template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
    pair<_ForwardIter, _ForwardIter>
    __equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
    _Compare __comp, _Distance*)
    {
    _Distance __len = 0;
    distance(__first, __last, __len);
    _Distance __half;
    _ForwardIter __middle, __left, __right;

    while (__len > 0) {
    __half = __len >> 1;
    __middle = __first;
    advance(__middle, __half);
    if (__comp(*__middle, __val)) {
    __first = __middle;
    ++__first;
    __len = __len - __half - 1;
    }
    else if (__comp(__val, *__middle))
    __len = __half;
    else {
    __left = lower_bound(__first, __middle, __val, __comp);
    advance(__first, __len);
    __right = upper_bound(++__middle, __first, __val, __comp);
    return pair<_ForwardIter, _ForwardIter>(__left, __right);
    }
    }
    return pair<_ForwardIter, _ForwardIter>(__first, __first);
    }

    template <class _ForwardIter, class _Tp, class _Compare>
    inline pair<_ForwardIter, _ForwardIter>
    equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
    _Compare __comp) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES_SAME_TYPE(_Tp,
    typename iterator_traits<_ForwardIter>::value_type);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
    return __equal_range(__first, __last, __val, __comp,
    __DISTANCE_TYPE(__first));
    }

    template <class _ForwardIter, class _Tp>
    bool binary_search(_ForwardIter __first, _ForwardIter __last,
    const _Tp& __val) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES_SAME_TYPE(_Tp,
    typename iterator_traits<_ForwardIter>::value_type);
    __STL_REQUIRES(_Tp, _LessThanComparable);
    _ForwardIter __i = lower_bound(__first, __last, __val);
    return __i != __last && !(__val < *__i);
    }

    template <class _ForwardIter, class _Tp, class _Compare>
    bool binary_search(_ForwardIter __first, _ForwardIter __last,
    const _Tp& __val,
    _Compare __comp) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES_SAME_TYPE(_Tp,
    typename iterator_traits<_ForwardIter>::value_type);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool, _Tp, _Tp);
    _ForwardIter __i = lower_bound(__first, __last, __val, __comp);
    return __i != __last && !__comp(__val, *__i);
    }

    // merge, with and without an explicitly supplied comparison function.

    template <class _Inpu er1, class _Inpu er2, class _Outpu er>
    _Outpu er merge(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2,
    _Outpu er __result) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_REQUIRES_SAME_TYPE(
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    __STL_REQUIRES(typename iterator_traits<_Inpu er1>::value_type,
    _LessThanComparable);
    while (__first1 != __last1 && __first2 != __last2) {
    if (*__first2 < *__first1) {
    *__result = *__first2;
    ++__first2;
    }
    else {
    *__result = *__first1;
    ++__first1;
    }
    ++__result;
    }
    return copy(__first2, __last2, copy(__first1, __last1, __result));
    }

    template <class _Inpu er1, class _Inpu er2, class _Outpu er,
    class _Compare>
    _Outpu er merge(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2,
    _Outpu er __result, _Compare __comp) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES_SAME_TYPE(
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er1>::value_type);
    while (__first1 != __last1 && __first2 != __last2) {
    if (__comp(*__first2, *__first1)) {
    *__result = *__first2;
    ++__first2;
    }
    else {
    *__result = *__first1;
    ++__first1;
    }
    ++__result;
    }
    return copy(__first2, __last2, copy(__first1, __last1, __result));
    }

    // inplace_merge and its auxiliary functions.

    template <class _BidirectionalIter, class _Distance>
    void __merge_without_buffer(_BidirectionalIter __first,
    _BidirectionalIter __middle,
    _BidirectionalIter __last,
    _Distance __len1, _Distance __len2) {
    if (__len1 == 0 || __len2 == 0)
    return;
    if (__len1 + __len2 == 2) {
    if (*__middle < *__first)
    iter_swap(__first, __middle);
    return;
    }
    _BidirectionalIter __first_cut = __first;
    _BidirectionalIter __second_cut = __middle;
    _Distance __len11 = 0;
    _Distance __len22 = 0;
    if (__len1 > __len2) {
    __len11 = __len1 / 2;
    advance(__first_cut, __len11);
    __second_cut = lower_bound(__middle, __last, *__first_cut);
    distance(__middle, __second_cut, __len22);
    }
    else {
    __len22 = __len2 / 2;
    advance(__second_cut, __len22);
    __first_cut = upper_bound(__first, __middle, *__second_cut);
    distance(__first, __first_cut, __len11);
    }
    _BidirectionalIter __new_middle
    = rotate(__first_cut, __middle, __second_cut);
    __merge_without_buffer(__first, __first_cut, __new_middle,
    __len11, __len22);
    __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
    __len2 - __len22);
    }

  21. #71
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    template <class _BidirectionalIter, class _Distance, class _Compare>
    void __merge_without_buffer(_BidirectionalIter __first,
    _BidirectionalIter __middle,
    _BidirectionalIter __last,
    _Distance __len1, _Distance __len2,
    _Compare __comp) {
    if (__len1 == 0 || __len2 == 0)
    return;
    if (__len1 + __len2 == 2) {
    if (__comp(*__middle, *__first))
    iter_swap(__first, __middle);
    return;
    }
    _BidirectionalIter __first_cut = __first;
    _BidirectionalIter __second_cut = __middle;
    _Distance __len11 = 0;
    _Distance __len22 = 0;
    if (__len1 > __len2) {
    __len11 = __len1 / 2;
    advance(__first_cut, __len11);
    __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
    distance(__middle, __second_cut, __len22);
    }
    else {
    __len22 = __len2 / 2;
    advance(__second_cut, __len22);
    __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
    distance(__first, __first_cut, __len11);
    }
    _BidirectionalIter __new_middle
    = rotate(__first_cut, __middle, __second_cut);
    __merge_without_buffer(__first, __first_cut, __new_middle, __len11, __len22,
    __comp);
    __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
    __len2 - __len22, __comp);
    }

    template <class _BidirectionalIter1, class _BidirectionalIter2,
    class _Distance>
    _BidirectionalIter1 __rotate_adaptive(_BidirectionalIter1 __first,
    _BidirectionalIter1 __middle,
    _BidirectionalIter1 __last,
    _Distance __len1, _Distance __len2,
    _BidirectionalIter2 __buffer,
    _Distance __buffer_size) {
    _BidirectionalIter2 __buffer_end;
    if (__len1 > __len2 && __len2 <= __buffer_size) {
    __buffer_end = copy(__middle, __last, __buffer);
    copy_backward(__first, __middle, __last);
    return copy(__buffer, __buffer_end, __first);
    }
    else if (__len1 <= __buffer_size) {
    __buffer_end = copy(__first, __middle, __buffer);
    copy(__middle, __last, __first);
    return copy_backward(__buffer, __buffer_end, __last);
    }
    else
    return rotate(__first, __middle, __last);
    }

    template <class _BidirectionalIter1, class _BidirectionalIter2,
    class _BidirectionalIter3>
    _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
    _BidirectionalIter1 __last1,
    _BidirectionalIter2 __first2,
    _BidirectionalIter2 __last2,
    _BidirectionalIter3 __result) {
    if (__first1 == __last1)
    return copy_backward(__first2, __last2, __result);
    if (__first2 == __last2)
    return copy_backward(__first1, __last1, __result);
    --__last1;
    --__last2;
    while (true) {
    if (*__last2 < *__last1) {
    *--__result = *__last1;
    if (__first1 == __last1)
    return copy_backward(__first2, ++__last2, __result);
    --__last1;
    }
    else {
    *--__result = *__last2;
    if (__first2 == __last2)
    return copy_backward(__first1, ++__last1, __result);
    --__last2;
    }
    }
    }

    template <class _BidirectionalIter1, class _BidirectionalIter2,
    class _BidirectionalIter3, class _Compare>
    _BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
    _BidirectionalIter1 __last1,
    _BidirectionalIter2 __first2,
    _BidirectionalIter2 __last2,
    _BidirectionalIter3 __result,
    _Compare __comp) {
    if (__first1 == __last1)
    return copy_backward(__first2, __last2, __result);
    if (__first2 == __last2)
    return copy_backward(__first1, __last1, __result);
    --__last1;
    --__last2;
    while (true) {
    if (__comp(*__last2, *__last1)) {
    *--__result = *__last1;
    if (__first1 == __last1)
    return copy_backward(__first2, ++__last2, __result);
    --__last1;
    }
    else {
    *--__result = *__last2;
    if (__first2 == __last2)
    return copy_backward(__first1, ++__last1, __result);
    --__last2;
    }
    }
    }

    template <class _BidirectionalIter, class _Distance, class _Pointer>
    void __merge_adaptive(_BidirectionalIter __first,
    _BidirectionalIter __middle,
    _BidirectionalIter __last,
    _Distance __len1, _Distance __len2,
    _Pointer __buffer, _Distance __buffer_size) {
    if (__len1 <= __len2 && __len1 <= __buffer_size) {
    _Pointer __buffer_end = copy(__first, __middle, __buffer);
    merge(__buffer, __buffer_end, __middle, __last, __first);
    }
    else if (__len2 <= __buffer_size) {
    _Pointer __buffer_end = copy(__middle, __last, __buffer);
    __merge_backward(__first, __middle, __buffer, __buffer_end, __last);
    }
    else {
    _BidirectionalIter __first_cut = __first;
    _BidirectionalIter __second_cut = __middle;
    _Distance __len11 = 0;
    _Distance __len22 = 0;
    if (__len1 > __len2) {
    __len11 = __len1 / 2;
    advance(__first_cut, __len11);
    __second_cut = lower_bound(__middle, __last, *__first_cut);
    distance(__middle, __second_cut, __len22);
    }
    else {
    __len22 = __len2 / 2;
    advance(__second_cut, __len22);
    __first_cut = upper_bound(__first, __middle, *__second_cut);
    distance(__first, __first_cut, __len11);
    }
    _BidirectionalIter __new_middle =
    __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
    __len22, __buffer, __buffer_size);
    __merge_adaptive(__first, __first_cut, __new_middle, __len11,
    __len22, __buffer, __buffer_size);
    __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
    __len2 - __len22, __buffer, __buffer_size);
    }
    }

    template <class _BidirectionalIter, class _Distance, class _Pointer,
    class _Compare>
    void __merge_adaptive(_BidirectionalIter __first,
    _BidirectionalIter __middle,
    _BidirectionalIter __last,
    _Distance __len1, _Distance __len2,
    _Pointer __buffer, _Distance __buffer_size,
    _Compare __comp) {
    if (__len1 <= __len2 && __len1 <= __buffer_size) {
    _Pointer __buffer_end = copy(__first, __middle, __buffer);
    merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
    }
    else if (__len2 <= __buffer_size) {
    _Pointer __buffer_end = copy(__middle, __last, __buffer);
    __merge_backward(__first, __middle, __buffer, __buffer_end, __last,
    __comp);
    }
    else {
    _BidirectionalIter __first_cut = __first;
    _BidirectionalIter __second_cut = __middle;
    _Distance __len11 = 0;
    _Distance __len22 = 0;
    if (__len1 > __len2) {
    __len11 = __len1 / 2;
    advance(__first_cut, __len11);
    __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
    distance(__middle, __second_cut, __len22);
    }
    else {
    __len22 = __len2 / 2;
    advance(__second_cut, __len22);
    __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
    distance(__first, __first_cut, __len11);
    }
    _BidirectionalIter __new_middle =
    __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
    __len22, __buffer, __buffer_size);
    __merge_adaptive(__first, __first_cut, __new_middle, __len11,
    __len22, __buffer, __buffer_size, __comp);
    __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
    __len2 - __len22, __buffer, __buffer_size, __comp);
    }
    }

    template <class _BidirectionalIter, class _Tp, class _Distance>
    inline void __inplace_merge_aux(_BidirectionalIter __first,
    _BidirectionalIter __middle,
    _BidirectionalIter __last, _Tp*, _Distance*) {
    _Distance __len1 = 0;
    distance(__first, __middle, __len1);
    _Distance __len2 = 0;
    distance(__middle, __last, __len2);

    _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last);
    if (__buf.begin() == 0)
    __merge_without_buffer(__first, __middle, __last, __len1, __len2);
    else
    __merge_adaptive(__first, __middle, __last, __len1, __len2,
    __buf.begin(), _Distance(__buf.size()));
    }

    template <class _BidirectionalIter, class _Tp,
    class _Distance, class _Compare>
    inline void __inplace_merge_aux(_BidirectionalIter __first,
    _BidirectionalIter __middle,
    _BidirectionalIter __last, _Tp*, _Distance*,
    _Compare __comp) {
    _Distance __len1 = 0;
    distance(__first, __middle, __len1);
    _Distance __len2 = 0;
    distance(__middle, __last, __len2);

    _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last);
    if (__buf.begin() == 0)
    __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp);
    else
    __merge_adaptive(__first, __middle, __last, __len1, __len2,
    __buf.begin(), _Distance(__buf.size()),
    __comp);
    }

    template <class _BidirectionalIter>
    inline void inplace_merge(_BidirectionalIter __first,
    _BidirectionalIter __middle,
    _BidirectionalIter __last) {
    __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
    __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
    _LessThanComparable);
    if (__first == __middle || __middle == __last)
    return;
    __inplace_merge_aux(__first, __middle, __last,
    __VALUE_TYPE(__first), __DISTANCE_TYPE(__first));
    }

    template <class _BidirectionalIter, class _Compare>
    inline void inplace_merge(_BidirectionalIter __first,
    _BidirectionalIter __middle,
    _BidirectionalIter __last, _Compare __comp) {
    __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_BidirectionalIter>::value_type,
    typename iterator_traits<_BidirectionalIter>::value_type);
    if (__first == __middle || __middle == __last)
    return;
    __inplace_merge_aux(__first, __middle, __last,
    __VALUE_TYPE(__first), __DISTANCE_TYPE(__first),
    __comp);
    }

    // Set algorithms: includes, set_union, set_intersection, set_difference,
    // set_symmetric_difference. All of these algorithms have the precondition
    // that their input ranges are sorted and the postcondition that their output
    // ranges are sorted.

    template <class _Inpu er1, class _Inpu er2>
    bool includes(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES_SAME_TYPE(
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    __STL_REQUIRES(typename iterator_traits<_Inpu er1>::value_type,
    _LessThanComparable);
    while (__first1 != __last1 && __first2 != __last2)
    if (*__first2 < *__first1)
    return false;
    else if(*__first1 < *__first2)
    ++__first1;
    else
    ++__first1, ++__first2;

    return __first2 == __last2;
    }

    template <class _Inpu er1, class _Inpu er2, class _Compare>
    bool includes(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2, _Compare __comp) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES_SAME_TYPE(
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    while (__first1 != __last1 && __first2 != __last2)
    if (__comp(*__first2, *__first1))
    return false;
    else if(__comp(*__first1, *__first2))
    ++__first1;
    else
    ++__first1, ++__first2;

    return __first2 == __last2;
    }

    template <class _Inpu er1, class _Inpu er2, class _Outpu er>
    _Outpu er set_union(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2,
    _Outpu er __result) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_REQUIRES_SAME_TYPE(
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    __STL_REQUIRES(typename iterator_traits<_Inpu er1>::value_type,
    _LessThanComparable);
    while (__first1 != __last1 && __first2 != __last2) {
    if (*__first1 < *__first2) {
    *__result = *__first1;
    ++__first1;
    }
    else if (*__first2 < *__first1) {
    *__result = *__first2;
    ++__first2;
    }
    else {
    *__result = *__first1;
    ++__first1;
    ++__first2;
    }
    ++__result;
    }
    return copy(__first2, __last2, copy(__first1, __last1, __result));
    }

    template <class _Inpu er1, class _Inpu er2, class _Outpu er,
    class _Compare>
    _Outpu er set_union(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2,
    _Outpu er __result, _Compare __comp) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_REQUIRES_SAME_TYPE(
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    while (__first1 != __last1 && __first2 != __last2) {
    if (__comp(*__first1, *__first2)) {
    *__result = *__first1;
    ++__first1;
    }
    else if (__comp(*__first2, *__first1)) {
    *__result = *__first2;
    ++__first2;
    }
    else {
    *__result = *__first1;
    ++__first1;
    ++__first2;
    }
    ++__result;
    }
    return copy(__first2, __last2, copy(__first1, __last1, __result));
    }

    template <class _Inpu er1, class _Inpu er2, class _Outpu er>
    _Outpu er set_intersection(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2,
    _Outpu er __result) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_REQUIRES_SAME_TYPE(
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    __STL_REQUIRES(typename iterator_traits<_Inpu er1>::value_type,
    _LessThanComparable);
    while (__first1 != __last1 && __first2 != __last2)
    if (*__first1 < *__first2)
    ++__first1;
    else if (*__first2 < *__first1)
    ++__first2;
    else {
    *__result = *__first1;
    ++__first1;
    ++__first2;
    ++__result;
    }
    return __result;
    }

    template <class _Inpu er1, class _Inpu er2, class _Outpu er,
    class _Compare>
    _Outpu er set_intersection(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2,
    _Outpu er __result, _Compare __comp) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_REQUIRES_SAME_TYPE(
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);

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

    template <class _Inpu er1, class _Inpu er2, class _Outpu er>
    _Outpu er set_difference(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2,
    _Outpu er __result) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_REQUIRES_SAME_TYPE(
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    __STL_REQUIRES(typename iterator_traits<_Inpu er1>::value_type,
    _LessThanComparable);
    while (__first1 != __last1 && __first2 != __last2)
    if (*__first1 < *__first2) {
    *__result = *__first1;
    ++__first1;
    ++__result;
    }
    else if (*__first2 < *__first1)
    ++__first2;
    else {
    ++__first1;
    ++__first2;
    }
    return copy(__first1, __last1, __result);
    }

    template <class _Inpu er1, class _Inpu er2, class _Outpu er,
    class _Compare>
    _Outpu er set_difference(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2,
    _Outpu er __result, _Compare __comp) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_REQUIRES_SAME_TYPE(
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);

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

  22. #72
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    template <class _Inpu er1, class _Inpu er2, class _Outpu er>
    _Outpu er
    set_symmetric_difference(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2,
    _Outpu er __result) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_REQUIRES_SAME_TYPE(
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    __STL_REQUIRES(typename iterator_traits<_Inpu er1>::value_type,
    _LessThanComparable);
    while (__first1 != __last1 && __first2 != __last2)
    if (*__first1 < *__first2) {
    *__result = *__first1;
    ++__first1;
    ++__result;
    }
    else if (*__first2 < *__first1) {
    *__result = *__first2;
    ++__first2;
    ++__result;
    }
    else {
    ++__first1;
    ++__first2;
    }
    return copy(__first2, __last2, copy(__first1, __last1, __result));
    }

    template <class _Inpu er1, class _Inpu er2, class _Outpu er,
    class _Compare>
    _Outpu er
    set_symmetric_difference(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2,
    _Outpu er __result,
    _Compare __comp) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    __STL_REQUIRES_SAME_TYPE(
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_Inpu er1>::value_type,
    typename iterator_traits<_Inpu er2>::value_type);
    while (__first1 != __last1 && __first2 != __last2)
    if (__comp(*__first1, *__first2)) {
    *__result = *__first1;
    ++__first1;
    ++__result;
    }
    else if (__comp(*__first2, *__first1)) {
    *__result = *__first2;
    ++__first2;
    ++__result;
    }
    else {
    ++__first1;
    ++__first2;
    }
    return copy(__first2, __last2, copy(__first1, __last1, __result));
    }

    // min_element and max_element, with and without an explicitly supplied
    // comparison function.

    template <class _ForwardIter>
    _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
    _LessThanComparable);
    if (__first == __last) return __first;
    _ForwardIter __result = __first;
    while (++__first != __last)
    if (*__result < *__first)
    __result = __first;
    return __result;
    }

    template <class _ForwardIter, class _Compare>
    _ForwardIter max_element(_ForwardIter __first, _ForwardIter __last,
    _Compare __comp) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_ForwardIter>::value_type,
    typename iterator_traits<_ForwardIter>::value_type);
    if (__first == __last) return __first;
    _ForwardIter __result = __first;
    while (++__first != __last)
    if (__comp(*__result, *__first)) __result = __first;
    return __result;
    }

    template <class _ForwardIter>
    _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
    _LessThanComparable);
    if (__first == __last) return __first;
    _ForwardIter __result = __first;
    while (++__first != __last)
    if (*__first < *__result)
    __result = __first;
    return __result;
    }

    template <class _ForwardIter, class _Compare>
    _ForwardIter min_element(_ForwardIter __first, _ForwardIter __last,
    _Compare __comp) {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_ForwardIter>::value_type,
    typename iterator_traits<_ForwardIter>::value_type);
    if (__first == __last) return __first;
    _ForwardIter __result = __first;
    while (++__first != __last)
    if (__comp(*__first, *__result))
    __result = __first;
    return __result;
    }

    // next_permutation and prev_permutation, with and without an explicitly
    // supplied comparison function.

    template <class _BidirectionalIter>
    bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
    __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
    __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
    _LessThanComparable);
    if (__first == __last)
    return false;
    _BidirectionalIter __i = __first;
    ++__i;
    if (__i == __last)
    return false;
    __i = __last;
    --__i;

    for(; {
    _BidirectionalIter __ii = __i;
    --__i;
    if (*__i < *__ii) {
    _BidirectionalIter __j = __last;
    while (!(*__i < *--__j))
    {}
    iter_swap(__i, __j);
    reverse(__ii, __last);
    return true;
    }
    if (__i == __first) {
    reverse(__first, __last);
    return false;
    }
    }
    }

    template <class _BidirectionalIter, class _Compare>
    bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
    _Compare __comp) {
    __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_BidirectionalIter>::value_type,
    typename iterator_traits<_BidirectionalIter>::value_type);
    if (__first == __last)
    return false;
    _BidirectionalIter __i = __first;
    ++__i;
    if (__i == __last)
    return false;
    __i = __last;
    --__i;

    for(; {
    _BidirectionalIter __ii = __i;
    --__i;
    if (__comp(*__i, *__ii)) {
    _BidirectionalIter __j = __last;
    while (!__comp(*__i, *--__j))
    {}
    iter_swap(__i, __j);
    reverse(__ii, __last);
    return true;
    }
    if (__i == __first) {
    reverse(__first, __last);
    return false;
    }
    }
    }

    template <class _BidirectionalIter>
    bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
    __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
    __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
    _LessThanComparable);
    if (__first == __last)
    return false;
    _BidirectionalIter __i = __first;
    ++__i;
    if (__i == __last)
    return false;
    __i = __last;
    --__i;

    for(; {
    _BidirectionalIter __ii = __i;
    --__i;
    if (*__ii < *__i) {
    _BidirectionalIter __j = __last;
    while (!(*--__j < *__i))
    {}
    iter_swap(__i, __j);
    reverse(__ii, __last);
    return true;
    }
    if (__i == __first) {
    reverse(__first, __last);
    return false;
    }
    }
    }

    template <class _BidirectionalIter, class _Compare>
    bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
    _Compare __comp) {
    __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
    __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
    typename iterator_traits<_BidirectionalIter>::value_type,
    typename iterator_traits<_BidirectionalIter>::value_type);
    if (__first == __last)
    return false;
    _BidirectionalIter __i = __first;
    ++__i;
    if (__i == __last)
    return false;
    __i = __last;
    --__i;

    for(; {
    _BidirectionalIter __ii = __i;
    --__i;
    if (__comp(*__ii, *__i)) {
    _BidirectionalIter __j = __last;
    while (!__comp(*--__j, *__i))
    {}
    iter_swap(__i, __j);
    reverse(__ii, __last);
    return true;
    }
    if (__i == __first) {
    reverse(__first, __last);
    return false;
    }
    }
    }

    // find_first_of, with and without an explicitly supplied comparison function.

    template <class _Inpu er, class _ForwardIter>
    _Inpu er find_first_of(_Inpu er __first1, _Inpu er __last1,
    _ForwardIter __first2, _ForwardIter __last2)
    {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
    typename iterator_traits<_Inpu er>::value_type,
    typename iterator_traits<_ForwardIter>::value_type);

    for ( ; __first1 != __last1; ++__first1)
    for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
    if (*__first1 == *__iter)
    return __first1;
    return __last1;
    }

    template <class _Inpu er, class _ForwardIter, class _BinaryPredicate>
    _Inpu er find_first_of(_Inpu er __first1, _Inpu er __last1,
    _ForwardIter __first2, _ForwardIter __last2,
    _BinaryPredicate __comp)
    {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
    typename iterator_traits<_Inpu er>::value_type,
    typename iterator_traits<_ForwardIter>::value_type);

    for ( ; __first1 != __last1; ++__first1)
    for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
    if (__comp(*__first1, *__iter))
    return __first1;
    return __last1;
    }


    // find_end, with and without an explicitly supplied comparison function.
    // Search [first2, last2) as a subsequence in [first1, last1), and return
    // the *last* possible match. Note that find_end for bidirectional iterators
    // is much faster than for forward iterators.

    // find_end for forward iterators.
    template <class _ForwardIter1, class _ForwardIter2>
    _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
    _ForwardIter2 __first2, _ForwardIter2 __last2,
    forward_iterator_tag, forward_iterator_tag)
    {
    if (__first2 == __last2)
    return __last1;
    else {
    _ForwardIter1 __result = __last1;
    while (1) {
    _ForwardIter1 __new_result
    = search(__first1, __last1, __first2, __last2);
    if (__new_result == __last1)
    return __result;
    else {
    __result = __new_result;
    __first1 = __new_result;
    ++__first1;
    }
    }
    }
    }

    template <class _ForwardIter1, class _ForwardIter2,
    class _BinaryPredicate>
    _ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
    _ForwardIter2 __first2, _ForwardIter2 __last2,
    forward_iterator_tag, forward_iterator_tag,
    _BinaryPredicate __comp)
    {
    if (__first2 == __last2)
    return __last1;
    else {
    _ForwardIter1 __result = __last1;
    while (1) {
    _ForwardIter1 __new_result
    = search(__first1, __last1, __first2, __last2, __comp);
    if (__new_result == __last1)
    return __result;
    else {
    __result = __new_result;
    __first1 = __new_result;
    ++__first1;
    }
    }
    }
    }

    // find_end for bidirectional iterators. Requires partial specialization.
    #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION

    template <class _BidirectionalIter1, class _BidirectionalIter2>
    _BidirectionalIter1
    __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
    _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
    bidirectional_iterator_tag, bidirectional_iterator_tag)
    {
    __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator);
    __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator);
    typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
    typedef reverse_iterator<_BidirectionalIter2> _RevIter2;

    _RevIter1 __rlast1(__first1);
    _RevIter2 __rlast2(__first2);
    _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
    _RevIter2(__last2), __rlast2);

    if (__rresult == __rlast1)
    return __last1;
    else {
    _BidirectionalIter1 __result = __rresult.base();
    advance(__result, -distance(__first2, __last2));
    return __result;
    }
    }

    template <class _BidirectionalIter1, class _BidirectionalIter2,
    class _BinaryPredicate>
    _BidirectionalIter1
    __find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
    _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
    bidirectional_iterator_tag, bidirectional_iterator_tag,
    _BinaryPredicate __comp)
    {
    __STL_REQUIRES(_BidirectionalIter1, _BidirectionalIterator);
    __STL_REQUIRES(_BidirectionalIter2, _BidirectionalIterator);
    typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
    typedef reverse_iterator<_BidirectionalIter2> _RevIter2;

    _RevIter1 __rlast1(__first1);
    _RevIter2 __rlast2(__first2);
    _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
    _RevIter2(__last2), __rlast2,
    __comp);

    if (__rresult == __rlast1)
    return __last1;
    else {
    _BidirectionalIter1 __result = __rresult.base();
    advance(__result, -distance(__first2, __last2));
    return __result;
    }
    }
    #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */

    // Dispatching functions for find_end.

    template <class _ForwardIter1, class _ForwardIter2>
    inline _ForwardIter1
    find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
    _ForwardIter2 __first2, _ForwardIter2 __last2)
    {
    __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
    __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
    __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool,
    typename iterator_traits<_ForwardIter1>::value_type,
    typename iterator_traits<_ForwardIter2>::value_type);
    return __find_end(__first1, __last1, __first2, __last2,
    __ITERATOR_CATEGORY(__first1),
    __ITERATOR_CATEGORY(__first2));
    }

    template <class _ForwardIter1, class _ForwardIter2,
    class _BinaryPredicate>
    inline _ForwardIter1
    find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
    _ForwardIter2 __first2, _ForwardIter2 __last2,
    _BinaryPredicate __comp)
    {
    __STL_REQUIRES(_ForwardIter1, _ForwardIterator);
    __STL_REQUIRES(_ForwardIter2, _ForwardIterator);
    __STL_BINARY_FUNCTION_CHECK(_BinaryPredicate, bool,
    typename iterator_traits<_ForwardIter1>::value_type,
    typename iterator_traits<_ForwardIter2>::value_type);

    return __find_end(__first1, __last1, __first2, __last2,
    __ITERATOR_CATEGORY(__first1),
    __ITERATOR_CATEGORY(__first2),
    __comp);
    }

    // is_heap, a predicate testing whether or not a range is
    // a heap. This function is an extension, not part of the C++
    // standard.

    template <class _RandomAccessIter, class _Distance>
    bool __is_heap(_RandomAccessIter __first, _Distance __n)
    {
    _Distance __parent = 0;
    for (_Distance __child = 1; __child < __n; ++__child) {
    if (__first[__parent] < __first[__child])
    return false;
    if ((__child & 1) == 0)
    ++__parent;
    }
    return true;
    }

    template <class _RandomAccessIter, class _Distance, class _StrictWeakOrdering>
    bool __is_heap(_RandomAccessIter __first, _StrictWeakOrdering __comp,
    _Distance __n)
    {
    _Distance __parent = 0;
    for (_Distance __child = 1; __child < __n; ++__child) {
    if (__comp(__first[__parent], __first[__child]))
    return false;
    if ((__child & 1) == 0)
    ++__parent;
    }
    return true;
    }

    template <class _RandomAccessIter>
    inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last)
    {
    __STL_REQUIRES(_RandomAccessIter, _RandomAccessIterator);
    __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type,
    _LessThanComparable);
    return __is_heap(__first, __last - __first);
    }


    template <class _RandomAccessIter, class _StrictWeakOrdering>
    inline bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
    _StrictWeakOrdering __comp)
    {
    __STL_REQUIRES(_RandomAccessIter, _RandomAccessIterator);
    __STL_BINARY_FUNCTION_CHECK(_StrictWeakOrdering, bool,
    typename iterator_traits<_RandomAccessIter>::value_type,
    typename iterator_traits<_RandomAccessIter>::value_type);
    return __is_heap(__first, __comp, __last - __first);
    }

    // is_sorted, a predicated testing whether a range is sorted in
    // nondescending order. This is an extension, not part of the C++
    // standard.

    template <class _ForwardIter>
    bool is_sorted(_ForwardIter __first, _ForwardIter __last)
    {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
    _LessThanComparable);
    if (__first == __last)
    return true;

    _ForwardIter __next = __first;
    for (++__next; __next != __last; __first = __next, ++__next) {
    if (*__next < *__first)
    return false;
    }

    return true;
    }

    template <class _ForwardIter, class _StrictWeakOrdering>
    bool is_sorted(_ForwardIter __first, _ForwardIter __last,
    _StrictWeakOrdering __comp)
    {
    __STL_REQUIRES(_ForwardIter, _ForwardIterator);
    __STL_BINARY_FUNCTION_CHECK(_StrictWeakOrdering, bool,
    typename iterator_traits<_ForwardIter>::value_type,
    typename iterator_traits<_ForwardIter>::value_type);
    if (__first == __last)
    return true;

    _ForwardIter __next = __first;
    for (++__next; __next != __last; __first = __next, ++__next) {
    if (__comp(*__next, *__first))
    return false;
    }

    return true;
    }

    #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
    #pragma reset woff 1209
    #endif

    __STL_END_NAMESPACE

    #endif /* __SGI_STL_INTERNAL_ALGO_H */

    // Local Variables:
    // mode:C++
    // End:

  23. #73
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    /*
    *
    * Copyright (c) 1994
    * Hewlett-Packard Company
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. 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.
    *
    *
    * Copyright (c) 1996-1998
    * Silicon Graphics Computer Systems, Inc.
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. Silicon Graphics makes no
    * representations about the suitability of this software for any
    * purpose. It is provided "as is" without express or implied warranty.
    */

    /* NOTE: This is an internal header file, included by other STL headers.
    * You should not attempt to use it directly.
    */


    #ifndef __SGI_STL_INTERNAL_ALGOBASE_H
    #define __SGI_STL_INTERNAL_ALGOBASE_H

    #ifndef __STL_CONFIG_H
    #include <stl_config.h>
    #endif
    #ifndef __SGI_STL_INTERNAL_RELOPS
    #include <stl_relops.h>
    #endif
    #ifndef __SGI_STL_INTERNAL_PAIR_H
    #include <stl_pair.h>
    #endif
    #ifndef __TYPE_TRAITS_H
    #include <type_traits.h>
    #endif

    #include <string.h>
    #include <limits.h>
    #include <stdlib.h>
    #include <stddef.h>
    #include <new.h>

    #ifdef __STL_USE_NEW_IOSTREAMS
    #include <iosfwd>
    #else /* __STL_USE_NEW_IOSTREAMS */
    #include <iostream.h>
    #endif /* __STL_USE_NEW_IOSTREAMS */

    #ifndef __SGI_STL_INTERNAL_ITERATOR_H
    #include <stl_iterator_base.h>
    #include <stl_iterator.h>
    #endif

    // We pick up concept_checks.h from stl_iterator_base.h.

    __STL_BEGIN_NAMESPACE

    // swap and iter_swap

    template <class _ForwardIter1, class _ForwardIter2, class _Tp>
    inline void __iter_swap(_ForwardIter1 __a, _ForwardIter2 __b, _Tp*) {
    _Tp __tmp = *__a;
    *__a = *__b;
    *__b = __tmp;
    }

    template <class _ForwardIter1, class _ForwardIter2>
    inline void iter_swap(_ForwardIter1 __a, _ForwardIter2 __b) {
    __STL_REQUIRES(_ForwardIter1, _Mutable_ForwardIterator);
    __STL_REQUIRES(_ForwardIter2, _Mutable_ForwardIterator);
    __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter1>::value_type,
    typename iterator_traits<_ForwardIter2>::value_type);
    __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter2>::value_type,
    typename iterator_traits<_ForwardIter1>::value_type);
    __iter_swap(__a, __b, __VALUE_TYPE(__a));
    }

    template <class _Tp>
    inline void swap(_Tp& __a, _Tp& __b) {
    __STL_REQUIRES(_Tp, _Assignable);
    _Tp __tmp = __a;
    __a = __b;
    __b = __tmp;
    }

    //--------------------------------------------------
    // min and max

    #if !defined(__BORLANDC__) || __BORLANDC__ >= 0x540 /* C++ Builder 4.0 */

    #undef min
    #undef max

    template <class _Tp>
    inline const _Tp& min(const _Tp& __a, const _Tp& __b) {
    __STL_REQUIRES(_Tp, _LessThanComparable);
    return __b < __a ? __b : __a;
    }

    template <class _Tp>
    inline const _Tp& max(const _Tp& __a, const _Tp& __b) {
    __STL_REQUIRES(_Tp, _LessThanComparable);
    return __a < __b ? __b : __a;
    }

    #endif /* __BORLANDC__ */

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

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

    //--------------------------------------------------
    // copy

    // All of these auxiliary functions serve two purposes. (1) Replace
    // calls to copy with memmove whenever possible. (Memmove, not memcpy,
    // because the input and output ranges are permitted to overlap.)
    // (2) If we're using random access iterators, then write the loop as
    // a for loop with an explicit count.

    template <class _Inpu er, class _Outpu er, class _Distance>
    inline _Outpu er __copy(_Inpu er __first, _Inpu er __last,
    _Outpu er __result,
    input_iterator_tag, _Distance*)
    {
    for ( ; __first != __last; ++__result, ++__first)
    *__result = *__first;
    return __result;
    }

    template <class _RandomAccessIter, class _Outpu er, class _Distance>
    inline _Outpu er
    __copy(_RandomAccessIter __first, _RandomAccessIter __last,
    _Outpu er __result, random_access_iterator_tag, _Distance*)
    {
    for (_Distance __n = __last - __first; __n > 0; --__n) {
    *__result = *__first;
    ++__first;
    ++__result;
    }
    return __result;
    }

    template <class _Tp>
    inline _Tp*
    __copy_trivial(const _Tp* __first, const _Tp* __last, _Tp* __result) {
    memmove(__result, __first, sizeof(_Tp) * (__last - __first));
    return __result + (__last - __first);
    }

    #if defined(__STL_FUNCTION_TMPL_PARTIAL_ORDER)

    template <class _Inpu er, class _Outpu er>
    inline _Outpu er __copy_aux2(_Inpu er __first, _Inpu er __last,
    _Outpu er __result, __false_type) {
    return __copy(__first, __last, __result,
    __ITERATOR_CATEGORY(__first),
    __DISTANCE_TYPE(__first));
    }

    template <class _Inpu er, class _Outpu er>
    inline _Outpu er __copy_aux2(_Inpu er __first, _Inpu er __last,
    _Outpu er __result, __true_type) {
    return __copy(__first, __last, __result,
    __ITERATOR_CATEGORY(__first),
    __DISTANCE_TYPE(__first));
    }

    #ifndef __USLC__

    template <class _Tp>
    inline _Tp* __copy_aux2(_Tp* __first, _Tp* __last, _Tp* __result,
    __true_type) {
    return __copy_trivial(__first, __last, __result);
    }

    #endif /* __USLC__ */

    template <class _Tp>
    inline _Tp* __copy_aux2(const _Tp* __first, const _Tp* __last, _Tp* __result,
    __true_type) {
    return __copy_trivial(__first, __last, __result);
    }


    template <class _Inpu er, class _Outpu er, class _Tp>
    inline _Outpu er __copy_aux(_Inpu er __first, _Inpu er __last,
    _Outpu er __result, _Tp*) {
    typedef typename __type_traits<_Tp>::has_trivial_assignment_operato r
    _Trivial;
    return __copy_aux2(__first, __last, __result, _Trivial());
    }

    template <class _Inpu er, class _Outpu er>
    inline _Outpu er copy(_Inpu er __first, _Inpu er __last,
    _Outpu er __result) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    return __copy_aux(__first, __last, __result, __VALUE_TYPE(__first));
    }

    // Hack for compilers that don't have partial ordering of function templates
    // but do have partial specialization of class templates.
    #elif defined(__STL_CLASS_PARTIAL_SPECIALIZATION)

    template <class _Inpu er, class _Outpu er, class _BoolType>
    struct __copy_dispatch {
    static _Outpu er copy(_Inpu er __first, _Inpu er __last,
    _Outpu er __result) {
    typedef typename iterator_traits<_Inpu er>::iterator_category _Category;
    typedef typename iterator_traits<_Inpu er>::difference_type _Distance;
    return __copy(__first, __last, __result, _Category(), (_Distance*) 0);
    }
    };

    template <class _Tp>
    struct __copy_dispatch<_Tp*, _Tp*, __true_type>
    {
    static _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result) {
    return __copy_trivial(__first, __last, __result);
    }
    };

    template <class _Tp>
    struct __copy_dispatch<const _Tp*, _Tp*, __true_type>
    {
    static _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result) {
    return __copy_trivial(__first, __last, __result);
    }
    };

    template <class _Inpu er, class _Outpu er>
    inline _Outpu er copy(_Inpu er __first, _Inpu er __last,
    _Outpu er __result) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    typedef typename iterator_traits<_Inpu er>::value_type _Tp;
    typedef typename __type_traits<_Tp>::has_trivial_assignment_operato r
    _Trivial;
    return __copy_dispatch<_Inpu er, _Outpu er, _Trivial>
    :y(__first, __last, __result);
    }

    // Fallback for compilers with neither partial ordering nor partial
    // specialization. Define the faster version for the basic builtin
    // types.
    #else /* __STL_CLASS_PARTIAL_SPECIALIZATION */

    template <class _Inpu er, class _Outpu er>
    inline _Outpu er copy(_Inpu er __first, _Inpu er __last,
    _Outpu er __result)
    {
    return __copy(__first, __last, __result,
    __ITERATOR_CATEGORY(__first),
    __DISTANCE_TYPE(__first));
    }

    #define __SGI_STL_DECLARE_COPY_TRIVIAL(_Tp) \
    inline _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result) { \
    memmove(__result, __first, sizeof(_Tp) * (__last - __first)); \
    return __result + (__last - __first); \
    }

    __SGI_STL_DECLARE_COPY_TRIVIAL(char)
    __SGI_STL_DECLARE_COPY_TRIVIAL(signed char)
    __SGI_STL_DECLARE_COPY_TRIVIAL(unsigned char)
    __SGI_STL_DECLARE_COPY_TRIVIAL(short)
    __SGI_STL_DECLARE_COPY_TRIVIAL(unsigned short)
    __SGI_STL_DECLARE_COPY_TRIVIAL(int)
    __SGI_STL_DECLARE_COPY_TRIVIAL(unsigned int)
    __SGI_STL_DECLARE_COPY_TRIVIAL(long)
    __SGI_STL_DECLARE_COPY_TRIVIAL(unsigned long)
    #ifdef __STL_HAS_WCHAR_T
    __SGI_STL_DECLARE_COPY_TRIVIAL(wchar_t)
    #endif
    #ifdef _STL_LONG_LONG
    __SGI_STL_DECLARE_COPY_TRIVIAL(long long)
    __SGI_STL_DECLARE_COPY_TRIVIAL(unsigned long long)
    #endif
    __SGI_STL_DECLARE_COPY_TRIVIAL(float)
    __SGI_STL_DECLARE_COPY_TRIVIAL(double)
    __SGI_STL_DECLARE_COPY_TRIVIAL(long double)

    #undef __SGI_STL_DECLARE_COPY_TRIVIAL
    #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */

    //--------------------------------------------------
    // copy_backward

    template <class _BidirectionalIter1, class _BidirectionalIter2,
    class _Distance>
    inline _BidirectionalIter2 __copy_backward(_BidirectionalIter1 __first,
    _BidirectionalIter1 __last,
    _BidirectionalIter2 __result,
    bidirectional_iterator_tag,
    _Distance*)
    {
    while (__first != __last)
    *--__result = *--__last;
    return __result;
    }

    template <class _RandomAccessIter, class _BidirectionalIter, class _Distance>
    inline _BidirectionalIter __copy_backward(_RandomAccessIter __first,
    _RandomAccessIter __last,
    _BidirectionalIter __result,
    random_access_iterator_tag,
    _Distance*)
    {
    for (_Distance __n = __last - __first; __n > 0; --__n)
    *--__result = *--__last;
    return __result;
    }

    #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION

    // This dispatch class is a workaround for compilers that do not
    // have partial ordering of function templates. All we're doing is
    // creating a specialization so that we can turn a call to copy_backward
    // into a memmove whenever possible.

    template <class _BidirectionalIter1, class _BidirectionalIter2,
    class _BoolType>
    struct __copy_backward_dispatch
    {
    typedef typename iterator_traits<_BidirectionalIter1>::iterator_cat egory
    _Cat;
    typedef typename iterator_traits<_BidirectionalIter1>::difference_t ype
    _Distance;

    static _BidirectionalIter2 copy(_BidirectionalIter1 __first,
    _BidirectionalIter1 __last,
    _BidirectionalIter2 __result) {
    return __copy_backward(__first, __last, __result, _Cat(), (_Distance*) 0);
    }
    };

    template <class _Tp>
    struct __copy_backward_dispatch<_Tp*, _Tp*, __true_type>
    {
    static _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result) {
    const ptrdiff_t _Num = __last - __first;
    memmove(__result - _Num, __first, sizeof(_Tp) * _Num);
    return __result - _Num;
    }
    };

    template <class _Tp>
    struct __copy_backward_dispatch<const _Tp*, _Tp*, __true_type>
    {
    static _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result) {
    return __copy_backward_dispatch<_Tp*, _Tp*, __true_type>
    :y(__first, __last, __result);
    }
    };

    template <class _BI1, class _BI2>
    inline _BI2 copy_backward(_BI1 __first, _BI1 __last, _BI2 __result) {
    __STL_REQUIRES(_BI1, _BidirectionalIterator);
    __STL_REQUIRES(_BI2, _Mutable_BidirectionalIterator);
    __STL_CONVERTIBLE(typename iterator_traits<_BI1>::value_type,
    typename iterator_traits<_BI2>::value_type);
    typedef typename __type_traits<typename iterator_traits<_BI2>::value_type>
    ::has_trivial_assignment_operator
    _Trivial;
    return __copy_backward_dispatch<_BI1, _BI2, _Trivial>
    :y(__first, __last, __result);
    }

    #else /* __STL_CLASS_PARTIAL_SPECIALIZATION */

    template <class _BI1, class _BI2>
    inline _BI2 copy_backward(_BI1 __first, _BI1 __last, _BI2 __result) {
    return __copy_backward(__first, __last, __result,
    __ITERATOR_CATEGORY(__first),
    __DISTANCE_TYPE(__first));
    }

    #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */

    //--------------------------------------------------
    // copy_n (not part of the C++ standard)

    template <class _Inpu er, class _Size, class _Outpu er>
    pair<_Inpu er, _Outpu er> __copy_n(_Inpu er __first, _Size __count,
    _Outpu er __result,
    input_iterator_tag) {
    for ( ; __count > 0; --__count) {
    *__result = *__first;
    ++__first;
    ++__result;
    }
    return pair<_Inpu er, _Outpu er>(__first, __result);
    }

    template <class _RAIter, class _Size, class _Outpu er>
    inline pair<_RAIter, _Outpu er>
    __copy_n(_RAIter __first, _Size __count,
    _Outpu er __result,
    random_access_iterator_tag) {
    _RAIter __last = __first + __count;
    return pair<_RAIter, _Outpu er>(__last, copy(__first, __last, __result));
    }

    template <class _Inpu er, class _Size, class _Outpu er>
    inline pair<_Inpu er, _Outpu er>
    __copy_n(_Inpu er __first, _Size __count, _Outpu er __result) {
    return __copy_n(__first, __count, __result,
    __ITERATOR_CATEGORY(__first));
    }

    template <class _Inpu er, class _Size, class _Outpu er>
    inline pair<_Inpu er, _Outpu er>
    copy_n(_Inpu er __first, _Size __count, _Outpu er __result) {
    __STL_REQUIRES(_Inpu er, _Inpu erator);
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    return __copy_n(__first, __count, __result);
    }

    //--------------------------------------------------
    // fill and fill_n


    template <class _ForwardIter, class _Tp>
    void fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __value) {
    __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator);
    for ( ; __first != __last; ++__first)
    *__first = __value;
    }

    template <class _Outpu er, class _Size, class _Tp>
    _Outpu er fill_n(_Outpu er __first, _Size __n, const _Tp& __value) {
    __STL_REQUIRES(_Outpu er, _Outpu erator);
    for ( ; __n > 0; --__n, ++__first)
    *__first = __value;
    return __first;
    }

    // Specialization: for one-byte types we can use memset.

    inline void fill(unsigned char* __first, unsigned char* __last,
    const unsigned char& __c) {
    unsigned char __tmp = __c;
    memset(__first, __tmp, __last - __first);
    }

    inline void fill(signed char* __first, signed char* __last,
    const signed char& __c) {
    signed char __tmp = __c;
    memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
    }

    inline void fill(char* __first, char* __last, const char& __c) {
    char __tmp = __c;
    memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
    }

    #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER

    template <class _Size>
    inline unsigned char* fill_n(unsigned char* __first, _Size __n,
    const unsigned char& __c) {
    fill(__first, __first + __n, __c);
    return __first + __n;
    }

    template <class _Size>
    inline signed char* fill_n(char* __first, _Size __n,
    const signed char& __c) {
    fill(__first, __first + __n, __c);
    return __first + __n;
    }

    template <class _Size>
    inline char* fill_n(char* __first, _Size __n, const char& __c) {
    fill(__first, __first + __n, __c);
    return __first + __n;
    }

    #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */

    //--------------------------------------------------
    // equal and mismatch

    template <class _Inpu er1, class _Inpu er2>
    pair<_Inpu er1, _Inpu er2> mismatch(_Inpu er1 __first1,
    _Inpu er1 __last1,
    _Inpu er2 __first2) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(typename iterator_traits<_Inpu er1>::value_type,
    _EqualityComparable);
    __STL_REQUIRES(typename iterator_traits<_Inpu er2>::value_type,
    _EqualityComparable);
    while (__first1 != __last1 && *__first1 == *__first2) {
    ++__first1;
    ++__first2;
    }
    return pair<_Inpu er1, _Inpu er2>(__first1, __first2);
    }

    template <class _Inpu er1, class _Inpu er2, class _BinaryPredicate>
    pair<_Inpu er1, _Inpu er2> mismatch(_Inpu er1 __first1,
    _Inpu er1 __last1,
    _Inpu er2 __first2,
    _BinaryPredicate __binary_pred) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    while (__first1 != __last1 && __binary_pred(*__first1, *__first2)) {
    ++__first1;
    ++__first2;
    }
    return pair<_Inpu er1, _Inpu er2>(__first1, __first2);
    }

    template <class _Inpu er1, class _Inpu er2>
    inline bool equal(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(typename iterator_traits<_Inpu er1>::value_type,
    _EqualityComparable);
    __STL_REQUIRES(typename iterator_traits<_Inpu er2>::value_type,
    _EqualityComparable);
    for ( ; __first1 != __last1; ++__first1, ++__first2)
    if (*__first1 != *__first2)
    return false;
    return true;
    }

    template <class _Inpu er1, class _Inpu er2, class _BinaryPredicate>
    inline bool equal(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _BinaryPredicate __binary_pred) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    for ( ; __first1 != __last1; ++__first1, ++__first2)
    if (!__binary_pred(*__first1, *__first2))
    return false;
    return true;
    }

    //--------------------------------------------------
    // lexicographical_compare and lexicographical_compare_3way.
    // (the latter is not part of the C++ standard.)

    template <class _Inpu er1, class _Inpu er2>
    bool lexicographical_compare(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(typename iterator_traits<_Inpu er1>::value_type,
    _LessThanComparable);
    __STL_REQUIRES(typename iterator_traits<_Inpu er2>::value_type,
    _LessThanComparable);
    for ( ; __first1 != __last1 && __first2 != __last2
    ; ++__first1, ++__first2) {
    if (*__first1 < *__first2)
    return true;
    if (*__first2 < *__first1)
    return false;
    }
    return __first1 == __last1 && __first2 != __last2;
    }

    template <class _Inpu er1, class _Inpu er2, class _Compare>
    bool lexicographical_compare(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2,
    _Compare __comp) {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    for ( ; __first1 != __last1 && __first2 != __last2
    ; ++__first1, ++__first2) {
    if (__comp(*__first1, *__first2))
    return true;
    if (__comp(*__first2, *__first1))
    return false;
    }
    return __first1 == __last1 && __first2 != __last2;
    }

    inline bool
    lexicographical_compare(const unsigned char* __first1,
    const unsigned char* __last1,
    const unsigned char* __first2,
    const unsigned char* __last2)
    {
    const size_t __len1 = __last1 - __first1;
    const size_t __len2 = __last2 - __first2;
    const int __result = memcmp(__first1, __first2, min(__len1, __len2));
    return __result != 0 ? __result < 0 : __len1 < __len2;
    }

    inline bool lexicographical_compare(const char* __first1, const char* __last1,
    const char* __first2, const char* __last2)
    {
    #if CHAR_MAX == SCHAR_MAX
    return lexicographical_compare((const signed char*) __first1,
    (const signed char*) __last1,
    (const signed char*) __first2,
    (const signed char*) __last2);
    #else /* CHAR_MAX == SCHAR_MAX */
    return lexicographical_compare((const unsigned char*) __first1,
    (const unsigned char*) __last1,
    (const unsigned char*) __first2,
    (const unsigned char*) __last2);
    #endif /* CHAR_MAX == SCHAR_MAX */
    }

  24. #74
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    template <class _Inpu er1, class _Inpu er2>
    int __lexicographical_compare_3way(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2)
    {
    while (__first1 != __last1 && __first2 != __last2) {
    if (*__first1 < *__first2)
    return -1;
    if (*__first2 < *__first1)
    return 1;
    ++__first1;
    ++__first2;
    }
    if (__first2 == __last2) {
    return !(__first1 == __last1);
    }
    else {
    return -1;
    }
    }

    inline int
    __lexicographical_compare_3way(const unsigned char* __first1,
    const unsigned char* __last1,
    const unsigned char* __first2,
    const unsigned char* __last2)
    {
    const ptrdiff_t __len1 = __last1 - __first1;
    const ptrdiff_t __len2 = __last2 - __first2;
    const int __result = memcmp(__first1, __first2, min(__len1, __len2));
    return __result != 0 ? __result
    : (__len1 == __len2 ? 0 : (__len1 < __len2 ? -1 : 1));
    }

    inline int
    __lexicographical_compare_3way(const char* __first1, const char* __last1,
    const char* __first2, const char* __last2)
    {
    #if CHAR_MAX == SCHAR_MAX
    return __lexicographical_compare_3way(
    (const signed char*) __first1,
    (const signed char*) __last1,
    (const signed char*) __first2,
    (const signed char*) __last2);
    #else
    return __lexicographical_compare_3way((const unsigned char*) __first1,
    (const unsigned char*) __last1,
    (const unsigned char*) __first2,
    (const unsigned char*) __last2);
    #endif
    }

    template <class _Inpu er1, class _Inpu er2>
    int lexicographical_compare_3way(_Inpu er1 __first1, _Inpu er1 __last1,
    _Inpu er2 __first2, _Inpu er2 __last2)
    {
    __STL_REQUIRES(_Inpu er1, _Inpu erator);
    __STL_REQUIRES(_Inpu er2, _Inpu erator);
    __STL_REQUIRES(typename iterator_traits<_Inpu er1>::value_type,
    _LessThanComparable);
    __STL_REQUIRES(typename iterator_traits<_Inpu er2>::value_type,
    _LessThanComparable);
    return __lexicographical_compare_3way(__first1, __last1, __first2, __last2);
    }

    __STL_END_NAMESPACE

    #endif /* __SGI_STL_INTERNAL_ALGOBASE_H */

    // Local Variables:
    // mode:C++
    // End:

  25. #75
    俺はまんこが大好きなんだよ baseline bum's Avatar
    My Team
    San Antonio Spurs
    Post Count
    97,883
    /*
    * Copyright (c) 1996-1997
    * Silicon Graphics Computer Systems, Inc.
    *
    * Permission to use, copy, modify, distribute and sell this software
    * and its do entation 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 do entation. Silicon Graphics makes no
    * representations about the suitability of this software for any
    * purpose. It is provided "as is" without express or implied warranty.
    */

    /* NOTE: This is an internal header file, included by other STL headers.
    * You should not attempt to use it directly.
    */

    #ifndef __SGI_STL_INTERNAL_ALLOC_H
    #define __SGI_STL_INTERNAL_ALLOC_H

    #ifdef __SUNPRO_CC
    # define __PRIVATE public
    // Extra access restrictions prevent us from really making some things
    // private.
    #else
    # define __PRIVATE private
    #endif

    #ifdef __STL_STATIC_TEMPLATE_MEMBER_BUG
    # define __USE_MALLOC
    #endif


    // This implements some standard node allocators. These are
    // NOT the same as the allocators in the C++ draft standard or in
    // in the original STL. They do not encapsulate different pointer
    // types; indeed we assume that there is only one pointer type.
    // The allocation primitives are intended to allocate individual objects,
    // not larger arenas as with the original STL allocators.

    #ifndef __THROW_BAD_ALLOC
    # if defined(__STL_NO_BAD_ALLOC) || !defined(__STL_USE_EXCEPTIONS)
    # include <stdio.h>
    # include <stdlib.h>
    # define __THROW_BAD_ALLOC fprintf(stderr, "out of memory\n"); exit(1)
    # else /* Standard conforming out-of-memory handling */
    # include <new>
    # define __THROW_BAD_ALLOC throw std::bad_alloc()
    # endif
    #endif

    #include <stddef.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #ifndef __RESTRICT
    # define __RESTRICT
    #endif

    #ifdef __STL_THREADS
    # include <stl_threads.h>
    # define __NODE_ALLOCATOR_THREADS true
    # ifdef __STL_SGI_THREADS
    // We test whether threads are in use before locking.
    // Perhaps this should be moved into stl_threads.h, but that
    // probably makes it harder to avoid the procedure call when
    // it isn't needed.
    extern "C" {
    extern int __us_rsthread_malloc;
    }
    // The above is copied from malloc.h. Including <malloc.h>
    // would be cleaner but fails with certain levels of standard
    // conformance.
    # define __NODE_ALLOCATOR_LOCK if (threads && __us_rsthread_malloc) \
    { _S_node_allocator_lock._M_acquire_lock(); }
    # define __NODE_ALLOCATOR_UNLOCK if (threads && __us_rsthread_malloc) \
    { _S_node_allocator_lock._M_release_lock(); }
    # else /* !__STL_SGI_THREADS */
    # define __NODE_ALLOCATOR_LOCK \
    { if (threads) _S_node_allocator_lock._M_acquire_lock(); }
    # define __NODE_ALLOCATOR_UNLOCK \
    { if (threads) _S_node_allocator_lock._M_release_lock(); }
    # endif
    #else
    // Thread-unsafe
    # define __NODE_ALLOCATOR_LOCK
    # define __NODE_ALLOCATOR_UNLOCK
    # define __NODE_ALLOCATOR_THREADS false
    #endif

    __STL_BEGIN_NAMESPACE

    #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
    #pragma set woff 1174
    #endif

    // Malloc-based allocator. Typically slower than default alloc below.
    // Typically thread-safe and more storage efficient.
    #ifdef __STL_STATIC_TEMPLATE_MEMBER_BUG
    # ifdef __DECLARE_GLOBALS_HERE
    void (* __malloc_alloc_oom_handler)() = 0;
    // g++ 2.7.2 does not handle static template data members.
    # else
    extern void (* __malloc_alloc_oom_handler)();
    # endif
    #endif

    template <int __inst>
    class __malloc_alloc_template {

    private:

    static void* _S_oom_malloc(size_t);
    static void* _S_oom_realloc(void*, size_t);

    #ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG
    static void (* __malloc_alloc_oom_handler)();
    #endif

    public:

    static void* allocate(size_t __n)
    {
    void* __result = malloc(__n);
    if (0 == __result) __result = _S_oom_malloc(__n);
    return __result;
    }

    static void deallocate(void* __p, size_t /* __n */)
    {
    free(__p);
    }

    static void* reallocate(void* __p, size_t /* old_sz */, size_t __new_sz)
    {
    void* __result = realloc(__p, __new_sz);
    if (0 == __result) __result = _S_oom_realloc(__p, __new_sz);
    return __result;
    }

    static void (* __set_malloc_handler(void (*__f)()))()
    {
    void (* __old)() = __malloc_alloc_oom_handler;
    __malloc_alloc_oom_handler = __f;
    return(__old);
    }

    };

    // malloc_alloc out-of-memory handling

    #ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG
    template <int __inst>
    void (* __malloc_alloc_template<__inst>::__malloc_alloc_oo m_handler)() = 0;
    #endif

    template <int __inst>
    void*
    __malloc_alloc_template<__inst>::_S_oom_malloc(siz e_t __n)
    {
    void (* __my_malloc_handler)();
    void* __result;

    for (; {
    __my_malloc_handler = __malloc_alloc_oom_handler;
    if (0 == __my_malloc_handler) { __THROW_BAD_ALLOC; }
    (*__my_malloc_handler)();
    __result = malloc(__n);
    if (__result) return(__result);
    }
    }

    template <int __inst>
    void* __malloc_alloc_template<__inst>::_S_oom_realloc(vo id* __p, size_t __n)
    {
    void (* __my_malloc_handler)();
    void* __result;

    for (; {
    __my_malloc_handler = __malloc_alloc_oom_handler;
    if (0 == __my_malloc_handler) { __THROW_BAD_ALLOC; }
    (*__my_malloc_handler)();
    __result = realloc(__p, __n);
    if (__result) return(__result);
    }
    }

    typedef __malloc_alloc_template<0> malloc_alloc;

    template<class _Tp, class _Alloc>
    class simple_alloc {

    public:
    static _Tp* allocate(size_t __n)
    { return 0 == __n ? 0 : (_Tp*) _Alloc::allocate(__n * sizeof (_Tp)); }
    static _Tp* allocate(void)
    { return (_Tp*) _Alloc::allocate(sizeof (_Tp)); }
    static void deallocate(_Tp* __p, size_t __n)
    { if (0 != __n) _Alloc::deallocate(__p, __n * sizeof (_Tp)); }
    static void deallocate(_Tp* __p)
    { _Alloc::deallocate(__p, sizeof (_Tp)); }
    };

    // Allocator adaptor to check size arguments for debugging.
    // Reports errors using assert. Checking can be disabled with
    // NDEBUG, but it's far better to just use the underlying allocator
    // instead when no checking is desired.
    // There is some evidence that this can confuse Purify.
    template <class _Alloc>
    class debug_alloc {

    private:

    enum {_S_extra = 8}; // Size of space used to store size. Note
    // that this must be large enough to preserve
    // alignment.

    public:

    static void* allocate(size_t __n)
    {
    char* __result = (char*)_Alloc::allocate(__n + (int) _S_extra);
    *(size_t*)__result = __n;
    return __result + (int) _S_extra;
    }

    static void deallocate(void* __p, size_t __n)
    {
    char* __real_p = (char*)__p - (int) _S_extra;
    assert(*(size_t*)__real_p == __n);
    _Alloc::deallocate(__real_p, __n + (int) _S_extra);
    }

    static void* reallocate(void* __p, size_t __old_sz, size_t __new_sz)
    {
    char* __real_p = (char*)__p - (int) _S_extra;
    assert(*(size_t*)__real_p == __old_sz);
    char* __result = (char*)
    _Alloc::reallocate(__real_p, __old_sz + (int) _S_extra,
    __new_sz + (int) _S_extra);
    *(size_t*)__result = __new_sz;
    return __result + (int) _S_extra;
    }

    };


    # ifdef __USE_MALLOC

    typedef malloc_alloc alloc;
    typedef malloc_alloc single_client_alloc;

    # else


    // Default node allocator.
    // With a reasonable compiler, this should be roughly as fast as the
    // original STL class-specific allocators, but with less fragmentation.
    // Default_alloc_template parameters are experimental and MAY
    // DISAPPEAR in the future. Clients should just use alloc for now.
    //
    // Important implementation properties:
    // 1. If the client request an object of size > _MAX_BYTES, the resulting
    // object will be obtained directly from malloc.
    // 2. In all other cases, we allocate an object of size exactly
    // _S_round_up(requested_size). Thus the client has enough size
    // information that we can return the object to the proper free list
    // without permanently losing part of the object.
    //

    // The first template parameter specifies whether more than one thread
    // may use this allocator. It is safe to allocate an object from
    // one instance of a default_alloc and deallocate it with another
    // one. This effectively transfers its ownership to the second one.
    // This may have undesirable effects on reference locality.
    // The second parameter is unreferenced and serves only to allow the
    // creation of multiple default_alloc instances.
    // Node that containers built on different allocator instances have
    // different types, limiting the utility of this approach.

    #if defined(__SUNPRO_CC) || defined(__GNUC__)
    // breaks if we make these template class members:
    enum {_ALIGN = 8};
    enum {_MAX_BYTES = 128};
    enum {_NFREELISTS = 16}; // _MAX_BYTES/_ALIGN
    #endif

    template <bool threads, int inst>
    class __default_alloc_template {

    private:
    // Really we should use static const int x = N
    // instead of enum { x = N }, but few compilers accept the former.
    #if ! (defined(__SUNPRO_CC) || defined(__GNUC__))
    enum {_ALIGN = 8};
    enum {_MAX_BYTES = 128};
    enum {_NFREELISTS = 16}; // _MAX_BYTES/_ALIGN
    # endif
    static size_t
    _S_round_up(size_t __bytes)
    { return (((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN - 1)); }

    __PRIVATE:
    union _Obj {
    union _Obj* _M_free_list_link;
    char _M_client_data[1]; /* The client sees this. */
    };
    private:
    # if defined(__SUNPRO_CC) || defined(__GNUC__) || defined(__HP_aCC)
    static _Obj* __STL_VOLATILE _S_free_list[];
    // Specifying a size results in duplicate def for 4.1
    # else
    static _Obj* __STL_VOLATILE _S_free_list[_NFREELISTS];
    # endif
    static size_t _S_freelist_index(size_t __bytes) {
    return (((__bytes) + (size_t)_ALIGN-1)/(size_t)_ALIGN - 1);
    }

    // Returns an object of size __n, and optionally adds to size __n free list.
    static void* _S_refill(size_t __n);
    // Allocates a chunk for nobjs of size size. nobjs may be reduced
    // if it is inconvenient to allocate the requested number.
    static char* _S_chunk_alloc(size_t __size, int& __nobjs);

    // Chunk allocation state.
    static char* _S_start_free;
    static char* _S_end_free;
    static size_t _S_heap_size;

    # ifdef __STL_THREADS
    static _STL_mutex_lock _S_node_allocator_lock;
    # endif

    // It would be nice to use _STL_auto_lock here. But we
    // don't need the NULL check. And we do need a test whether
    // threads have actually been started.
    class _Lock;
    friend class _Lock;
    class _Lock {
    public:
    _Lock() { __NODE_ALLOCATOR_LOCK; }
    ~_Lock() { __NODE_ALLOCATOR_UNLOCK; }
    };

    public:

    /* __n must be > 0 */
    static void* allocate(size_t __n)
    {
    void* __ret = 0;

    if (__n > (size_t) _MAX_BYTES) {
    __ret = malloc_alloc::allocate(__n);
    }
    else {
    _Obj* __STL_VOLATILE* __my_free_list
    = _S_free_list + _S_freelist_index(__n);
    // Acquire the lock here with a constructor call.
    // This ensures that it is released in exit or during stack
    // unwinding.
    # ifndef _NOTHREADS
    /*REFERENCED*/
    _Lock __lock_instance;
    # endif
    _Obj* __RESTRICT __result = *__my_free_list;
    if (__result == 0)
    __ret = _S_refill(_S_round_up(__n));
    else {
    *__my_free_list = __result -> _M_free_list_link;
    __ret = __result;
    }
    }

    return __ret;
    };

    /* __p may not be 0 */
    static void deallocate(void* __p, size_t __n)
    {
    if (__n > (size_t) _MAX_BYTES)
    malloc_alloc::deallocate(__p, __n);
    else {
    _Obj* __STL_VOLATILE* __my_free_list
    = _S_free_list + _S_freelist_index(__n);
    _Obj* __q = (_Obj*)__p;

    // acquire lock
    # ifndef _NOTHREADS
    /*REFERENCED*/
    _Lock __lock_instance;
    # endif /* _NOTHREADS */
    __q -> _M_free_list_link = *__my_free_list;
    *__my_free_list = __q;
    // lock is released here
    }
    }

    static void* reallocate(void* __p, size_t __old_sz, size_t __new_sz);

    } ;

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •