deque.tcc

来自「symbian上STL模板库的实现」· TCC 代码 · 共 719 行 · 第 1/2 页

TCC
719
字号
    // Called only if _M_impl._M_finish._M_cur == _M_impl._M_finish._M_first.    template <typename _Tp, typename _Alloc>        void deque<_Tp,_Alloc>::        _M_pop_back_aux()        {            _M_deallocate_node(this->_M_impl._M_finish._M_first);            this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node - 1);            this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_last - 1;            std::_Destroy(this->_M_impl._M_finish._M_cur);        }    // Called only if _M_impl._M_start._M_cur == _M_impl._M_start._M_last - 1.  Note that    // if the deque has at least one element (a precondition for this member    // function), and if _M_impl._M_start._M_cur == _M_impl._M_start._M_last, then the deque    // must have at least two nodes.    template <typename _Tp, typename _Alloc>        void deque<_Tp,_Alloc>::        _M_pop_front_aux()        {            std::_Destroy(this->_M_impl._M_start._M_cur);            _M_deallocate_node(this->_M_impl._M_start._M_first);            this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node + 1);            this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_first;        }    template <typename _Tp, typename _Alloc>        template <typename _InputIterator>        void        deque<_Tp,_Alloc>::        _M_range_insert_aux(iterator __pos,                _InputIterator __first, _InputIterator __last,                input_iterator_tag)        { std::copy(__first, __last, std::inserter(*this, __pos)); }    template <typename _Tp, typename _Alloc>        template <typename _ForwardIterator>        void        deque<_Tp,_Alloc>::        _M_range_insert_aux(iterator __pos,                _ForwardIterator __first, _ForwardIterator __last,                forward_iterator_tag)        {            size_type __n = std::distance(__first, __last);            if (__pos._M_cur == this->_M_impl._M_start._M_cur)            {                iterator __new_start = _M_reserve_elements_at_front(__n);                try                {                    std::uninitialized_copy(__first, __last, __new_start);                    this->_M_impl._M_start = __new_start;                }                catch(...)                {                    _M_destroy_nodes(__new_start._M_node, this->_M_impl._M_start._M_node);                    __throw_exception_again;                }            }            else if (__pos._M_cur == this->_M_impl._M_finish._M_cur)            {                iterator __new_finish = _M_reserve_elements_at_back(__n);                try                {                    std::uninitialized_copy(__first, __last, this->_M_impl._M_finish);                    this->_M_impl._M_finish = __new_finish;                }                catch(...)                {                    _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,                            __new_finish._M_node + 1);                    __throw_exception_again;                }            }            else                _M_insert_aux(__pos, __first, __last, __n);        }    template <typename _Tp, typename _Alloc>        typename deque<_Tp, _Alloc>::iterator        deque<_Tp,_Alloc>::        _M_insert_aux(iterator __pos, const value_type& __x)        {            difference_type __index = __pos - this->_M_impl._M_start;            value_type __x_copy = __x; // XXX copy            if (static_cast<size_type>(__index) < size() / 2)            {                push_front(front());                iterator __front1 = this->_M_impl._M_start;                ++__front1;                iterator __front2 = __front1;                ++__front2;                __pos = this->_M_impl._M_start + __index;                iterator __pos1 = __pos;                ++__pos1;                std::copy(__front2, __pos1, __front1);            }            else            {                push_back(back());                iterator __back1 = this->_M_impl._M_finish;                --__back1;                iterator __back2 = __back1;                --__back2;                __pos = this->_M_impl._M_start + __index;                std::copy_backward(__pos, __back2, __back1);            }            *__pos = __x_copy;            return __pos;        }    template <typename _Tp, typename _Alloc>        void        deque<_Tp,_Alloc>::        _M_insert_aux(iterator __pos, size_type __n, const value_type& __x)        {            const difference_type __elems_before = __pos - this->_M_impl._M_start;            size_type __length = this->size();            value_type __x_copy = __x;            if (__elems_before < difference_type(__length / 2))            {                iterator __new_start = _M_reserve_elements_at_front(__n);                iterator __old_start = this->_M_impl._M_start;                __pos = this->_M_impl._M_start + __elems_before;                try                {                    if (__elems_before >= difference_type(__n))                    {                        iterator __start_n = this->_M_impl._M_start + difference_type(__n);                        std::uninitialized_copy(this->_M_impl._M_start, __start_n,                                __new_start);                        this->_M_impl._M_start = __new_start;                        std::copy(__start_n, __pos, __old_start);                        fill(__pos - difference_type(__n), __pos, __x_copy);                    }                    else                    {                        std::__uninitialized_copy_fill(this->_M_impl._M_start, __pos,                                __new_start,                                this->_M_impl._M_start, __x_copy);                        this->_M_impl._M_start = __new_start;                        std::fill(__old_start, __pos, __x_copy);                    }                }                catch(...)                {                    _M_destroy_nodes(__new_start._M_node, this->_M_impl._M_start._M_node);                    __throw_exception_again;                }            }            else            {                iterator __new_finish = _M_reserve_elements_at_back(__n);                iterator __old_finish = this->_M_impl._M_finish;                const difference_type __elems_after =                    difference_type(__length) - __elems_before;                __pos = this->_M_impl._M_finish - __elems_after;                try                {                    if (__elems_after > difference_type(__n))                    {                        iterator __finish_n = this->_M_impl._M_finish - difference_type(__n);                        std::uninitialized_copy(__finish_n, this->_M_impl._M_finish,                                this->_M_impl._M_finish);                        this->_M_impl._M_finish = __new_finish;                        std::copy_backward(__pos, __finish_n, __old_finish);                        std::fill(__pos, __pos + difference_type(__n), __x_copy);                    }                    else                    {                        std::__uninitialized_fill_copy(this->_M_impl._M_finish,                                __pos + difference_type(__n),                                __x_copy, __pos,                                this->_M_impl._M_finish);                        this->_M_impl._M_finish = __new_finish;                        std::fill(__pos, __old_finish, __x_copy);                    }                }                catch(...)                {                    _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,                            __new_finish._M_node + 1);                    __throw_exception_again;                }            }        }    template <typename _Tp, typename _Alloc>        template <typename _ForwardIterator>        void        deque<_Tp,_Alloc>::        _M_insert_aux(iterator __pos,                _ForwardIterator __first, _ForwardIterator __last,                size_type __n)        {            const difference_type __elemsbefore = __pos - this->_M_impl._M_start;            size_type __length = size();            if (static_cast<size_type>(__elemsbefore) < __length / 2)            {                iterator __new_start = _M_reserve_elements_at_front(__n);                iterator __old_start = this->_M_impl._M_start;                __pos = this->_M_impl._M_start + __elemsbefore;                try                {                    if (__elemsbefore >= difference_type(__n))                    {                        iterator __start_n = this->_M_impl._M_start + difference_type(__n);                        std::uninitialized_copy(this->_M_impl._M_start, __start_n,                                __new_start);                        this->_M_impl._M_start = __new_start;                        std::copy(__start_n, __pos, __old_start);                        std::copy(__first, __last, __pos - difference_type(__n));                    }                    else                    {                        _ForwardIterator __mid = __first;                        std::advance(__mid, difference_type(__n) - __elemsbefore);                        std::__uninitialized_copy_copy(this->_M_impl._M_start, __pos,                                __first, __mid, __new_start);                        this->_M_impl._M_start = __new_start;                        std::copy(__mid, __last, __old_start);                    }                }                catch(...)                {                    _M_destroy_nodes(__new_start._M_node, this->_M_impl._M_start._M_node);                    __throw_exception_again;                }            }            else            {                iterator __new_finish = _M_reserve_elements_at_back(__n);                iterator __old_finish = this->_M_impl._M_finish;                const difference_type __elemsafter =                    difference_type(__length) - __elemsbefore;                __pos = this->_M_impl._M_finish - __elemsafter;                try                {                    if (__elemsafter > difference_type(__n))                    {                        iterator __finish_n = this->_M_impl._M_finish - difference_type(__n);                        std::uninitialized_copy(__finish_n,                                this->_M_impl._M_finish,                                this->_M_impl._M_finish);                        this->_M_impl._M_finish = __new_finish;                        std::copy_backward(__pos, __finish_n, __old_finish);                        std::copy(__first, __last, __pos);                    }                    else                    {                        _ForwardIterator __mid = __first;                        std::advance(__mid, __elemsafter);                        std::__uninitialized_copy_copy(__mid, __last, __pos,                                this->_M_impl._M_finish,                                this->_M_impl._M_finish);                        this->_M_impl._M_finish = __new_finish;                        std::copy(__first, __mid, __pos);                    }                }                catch(...)                {                    _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,                            __new_finish._M_node + 1);                    __throw_exception_again;                }            }        }    template <typename _Tp, typename _Alloc>        void        deque<_Tp,_Alloc>::        _M_new_elements_at_front(size_type __new_elems)        {            size_type __new_nodes                = (__new_elems + _S_buffer_size() - 1) / _S_buffer_size();            _M_reserve_map_at_front(__new_nodes);            size_type __i;            try            {                for (__i = 1; __i <= __new_nodes; ++__i)                    *(this->_M_impl._M_start._M_node - __i) = this->_M_allocate_node();            }            catch(...)            {                for (size_type __j = 1; __j < __i; ++__j)                    _M_deallocate_node(*(this->_M_impl._M_start._M_node - __j));                __throw_exception_again;            }        }    template <typename _Tp, typename _Alloc>        void        deque<_Tp,_Alloc>::        _M_new_elements_at_back(size_type __new_elems)        {            size_type __new_nodes                = (__new_elems + _S_buffer_size() - 1) / _S_buffer_size();            _M_reserve_map_at_back(__new_nodes);            size_type __i;            try            {                for (__i = 1; __i <= __new_nodes; ++__i)                    *(this->_M_impl._M_finish._M_node + __i) = this->_M_allocate_node();            }            catch(...)            {                for (size_type __j = 1; __j < __i; ++__j)                    _M_deallocate_node(*(this->_M_impl._M_finish._M_node + __j));                __throw_exception_again;            }        }    template <typename _Tp, typename _Alloc>        void        deque<_Tp,_Alloc>::        _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front)        {            size_type __old_num_nodes                = this->_M_impl._M_finish._M_node - this->_M_impl._M_start._M_node + 1;            size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;            _Map_pointer __new_nstart;            if (this->_M_impl._M_map_size > 2 * __new_num_nodes)            {                __new_nstart = this->_M_impl._M_map + (this->_M_impl._M_map_size                        - __new_num_nodes) / 2                    + (__add_at_front ? __nodes_to_add : 0);                if (__new_nstart < this->_M_impl._M_start._M_node)                    std::copy(this->_M_impl._M_start._M_node,                            this->_M_impl._M_finish._M_node + 1,                            __new_nstart);                else                    std::copy_backward(this->_M_impl._M_start._M_node,                            this->_M_impl._M_finish._M_node + 1,                            __new_nstart + __old_num_nodes);            }            else            {                size_type __new_map_size = this->_M_impl._M_map_size                    + std::max(this->_M_impl._M_map_size,                            __nodes_to_add) + 2;                _Map_pointer __new_map = this->_M_allocate_map(__new_map_size);                __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2                    + (__add_at_front ? __nodes_to_add : 0);                std::copy(this->_M_impl._M_start._M_node,                        this->_M_impl._M_finish._M_node + 1,                        __new_nstart);                _M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size);                this->_M_impl._M_map = __new_map;                this->_M_impl._M_map_size = __new_map_size;            }            this->_M_impl._M_start._M_set_node(__new_nstart);            this->_M_impl._M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);        }} // namespace std#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?