11b86b14eSAlexander Kabaev // Deque implementation (out of line) -*- C++ -*-
21b86b14eSAlexander Kabaev
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
4*f8a1b7d9SAlexander Kabaev // Free Software Foundation, Inc.
51b86b14eSAlexander Kabaev //
61b86b14eSAlexander Kabaev // This file is part of the GNU ISO C++ Library. This library is free
71b86b14eSAlexander Kabaev // software; you can redistribute it and/or modify it under the
81b86b14eSAlexander Kabaev // terms of the GNU General Public License as published by the
91b86b14eSAlexander Kabaev // Free Software Foundation; either version 2, or (at your option)
101b86b14eSAlexander Kabaev // any later version.
111b86b14eSAlexander Kabaev
121b86b14eSAlexander Kabaev // This library is distributed in the hope that it will be useful,
131b86b14eSAlexander Kabaev // but WITHOUT ANY WARRANTY; without even the implied warranty of
141b86b14eSAlexander Kabaev // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
151b86b14eSAlexander Kabaev // GNU General Public License for more details.
161b86b14eSAlexander Kabaev
171b86b14eSAlexander Kabaev // You should have received a copy of the GNU General Public License along
181b86b14eSAlexander Kabaev // with this library; see the file COPYING. If not, write to the Free
19*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
201b86b14eSAlexander Kabaev // USA.
211b86b14eSAlexander Kabaev
221b86b14eSAlexander Kabaev // As a special exception, you may use this file as part of a free software
231b86b14eSAlexander Kabaev // library without restriction. Specifically, if other files instantiate
241b86b14eSAlexander Kabaev // templates or use macros or inline functions from this file, or you compile
251b86b14eSAlexander Kabaev // this file and link it with other files to produce an executable, this
261b86b14eSAlexander Kabaev // file does not by itself cause the resulting executable to be covered by
271b86b14eSAlexander Kabaev // the GNU General Public License. This exception does not however
281b86b14eSAlexander Kabaev // invalidate any other reasons why the executable file might be covered by
291b86b14eSAlexander Kabaev // the GNU General Public License.
301b86b14eSAlexander Kabaev
311b86b14eSAlexander Kabaev /*
321b86b14eSAlexander Kabaev *
331b86b14eSAlexander Kabaev * Copyright (c) 1994
341b86b14eSAlexander Kabaev * Hewlett-Packard Company
351b86b14eSAlexander Kabaev *
361b86b14eSAlexander Kabaev * Permission to use, copy, modify, distribute and sell this software
371b86b14eSAlexander Kabaev * and its documentation for any purpose is hereby granted without fee,
381b86b14eSAlexander Kabaev * provided that the above copyright notice appear in all copies and
391b86b14eSAlexander Kabaev * that both that copyright notice and this permission notice appear
401b86b14eSAlexander Kabaev * in supporting documentation. Hewlett-Packard Company makes no
411b86b14eSAlexander Kabaev * representations about the suitability of this software for any
421b86b14eSAlexander Kabaev * purpose. It is provided "as is" without express or implied warranty.
431b86b14eSAlexander Kabaev *
441b86b14eSAlexander Kabaev *
451b86b14eSAlexander Kabaev * Copyright (c) 1997
461b86b14eSAlexander Kabaev * Silicon Graphics Computer Systems, Inc.
471b86b14eSAlexander Kabaev *
481b86b14eSAlexander Kabaev * Permission to use, copy, modify, distribute and sell this software
491b86b14eSAlexander Kabaev * and its documentation for any purpose is hereby granted without fee,
501b86b14eSAlexander Kabaev * provided that the above copyright notice appear in all copies and
511b86b14eSAlexander Kabaev * that both that copyright notice and this permission notice appear
521b86b14eSAlexander Kabaev * in supporting documentation. Silicon Graphics makes no
531b86b14eSAlexander Kabaev * representations about the suitability of this software for any
541b86b14eSAlexander Kabaev * purpose. It is provided "as is" without express or implied warranty.
551b86b14eSAlexander Kabaev */
561b86b14eSAlexander Kabaev
571b86b14eSAlexander Kabaev /** @file deque.tcc
581b86b14eSAlexander Kabaev * This is an internal header file, included by other library headers.
591b86b14eSAlexander Kabaev * You should not attempt to use it directly.
601b86b14eSAlexander Kabaev */
611b86b14eSAlexander Kabaev
62ffeaf689SAlexander Kabaev #ifndef _DEQUE_TCC
63ffeaf689SAlexander Kabaev #define _DEQUE_TCC 1
641b86b14eSAlexander Kabaev
_GLIBCXX_BEGIN_NESTED_NAMESPACE(std,_GLIBCXX_STD)65*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD)
66*f8a1b7d9SAlexander Kabaev
671b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
681b86b14eSAlexander Kabaev deque<_Tp, _Alloc>&
691b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
701b86b14eSAlexander Kabaev operator=(const deque& __x)
711b86b14eSAlexander Kabaev {
721b86b14eSAlexander Kabaev const size_type __len = size();
731b86b14eSAlexander Kabaev if (&__x != this)
741b86b14eSAlexander Kabaev {
751b86b14eSAlexander Kabaev if (__len >= __x.size())
76*f8a1b7d9SAlexander Kabaev _M_erase_at_end(std::copy(__x.begin(), __x.end(),
77*f8a1b7d9SAlexander Kabaev this->_M_impl._M_start));
781b86b14eSAlexander Kabaev else
791b86b14eSAlexander Kabaev {
801b86b14eSAlexander Kabaev const_iterator __mid = __x.begin() + difference_type(__len);
81ffeaf689SAlexander Kabaev std::copy(__x.begin(), __mid, this->_M_impl._M_start);
82ffeaf689SAlexander Kabaev insert(this->_M_impl._M_finish, __mid, __x.end());
831b86b14eSAlexander Kabaev }
841b86b14eSAlexander Kabaev }
851b86b14eSAlexander Kabaev return *this;
861b86b14eSAlexander Kabaev }
871b86b14eSAlexander Kabaev
881b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
891b86b14eSAlexander Kabaev typename deque<_Tp, _Alloc>::iterator
901b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
insert(iterator __position,const value_type & __x)91*f8a1b7d9SAlexander Kabaev insert(iterator __position, const value_type& __x)
921b86b14eSAlexander Kabaev {
93*f8a1b7d9SAlexander Kabaev if (__position._M_cur == this->_M_impl._M_start._M_cur)
941b86b14eSAlexander Kabaev {
951b86b14eSAlexander Kabaev push_front(__x);
96ffeaf689SAlexander Kabaev return this->_M_impl._M_start;
971b86b14eSAlexander Kabaev }
98*f8a1b7d9SAlexander Kabaev else if (__position._M_cur == this->_M_impl._M_finish._M_cur)
991b86b14eSAlexander Kabaev {
1001b86b14eSAlexander Kabaev push_back(__x);
101ffeaf689SAlexander Kabaev iterator __tmp = this->_M_impl._M_finish;
1021b86b14eSAlexander Kabaev --__tmp;
1031b86b14eSAlexander Kabaev return __tmp;
1041b86b14eSAlexander Kabaev }
1051b86b14eSAlexander Kabaev else
106*f8a1b7d9SAlexander Kabaev return _M_insert_aux(__position, __x);
1071b86b14eSAlexander Kabaev }
1081b86b14eSAlexander Kabaev
1091b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
1101b86b14eSAlexander Kabaev typename deque<_Tp, _Alloc>::iterator
1111b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
erase(iterator __position)1121b86b14eSAlexander Kabaev erase(iterator __position)
1131b86b14eSAlexander Kabaev {
1141b86b14eSAlexander Kabaev iterator __next = __position;
1151b86b14eSAlexander Kabaev ++__next;
116*f8a1b7d9SAlexander Kabaev const difference_type __index = __position - begin();
117*f8a1b7d9SAlexander Kabaev if (static_cast<size_type>(__index) < (size() >> 1))
1181b86b14eSAlexander Kabaev {
119*f8a1b7d9SAlexander Kabaev if (__position != begin())
120*f8a1b7d9SAlexander Kabaev std::copy_backward(begin(), __position, __next);
1211b86b14eSAlexander Kabaev pop_front();
1221b86b14eSAlexander Kabaev }
1231b86b14eSAlexander Kabaev else
1241b86b14eSAlexander Kabaev {
125*f8a1b7d9SAlexander Kabaev if (__next != end())
126*f8a1b7d9SAlexander Kabaev std::copy(__next, end(), __position);
1271b86b14eSAlexander Kabaev pop_back();
1281b86b14eSAlexander Kabaev }
129*f8a1b7d9SAlexander Kabaev return begin() + __index;
1301b86b14eSAlexander Kabaev }
1311b86b14eSAlexander Kabaev
1321b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
1331b86b14eSAlexander Kabaev typename deque<_Tp, _Alloc>::iterator
1341b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
erase(iterator __first,iterator __last)1351b86b14eSAlexander Kabaev erase(iterator __first, iterator __last)
1361b86b14eSAlexander Kabaev {
137*f8a1b7d9SAlexander Kabaev if (__first == begin() && __last == end())
1381b86b14eSAlexander Kabaev {
1391b86b14eSAlexander Kabaev clear();
140*f8a1b7d9SAlexander Kabaev return end();
1411b86b14eSAlexander Kabaev }
1421b86b14eSAlexander Kabaev else
1431b86b14eSAlexander Kabaev {
144ffeaf689SAlexander Kabaev const difference_type __n = __last - __first;
145*f8a1b7d9SAlexander Kabaev const difference_type __elems_before = __first - begin();
146*f8a1b7d9SAlexander Kabaev if (static_cast<size_type>(__elems_before) <= (size() - __n) / 2)
1471b86b14eSAlexander Kabaev {
148*f8a1b7d9SAlexander Kabaev if (__first != begin())
149*f8a1b7d9SAlexander Kabaev std::copy_backward(begin(), __first, __last);
150*f8a1b7d9SAlexander Kabaev _M_erase_at_begin(begin() + __n);
1511b86b14eSAlexander Kabaev }
1521b86b14eSAlexander Kabaev else
1531b86b14eSAlexander Kabaev {
154*f8a1b7d9SAlexander Kabaev if (__last != end())
155*f8a1b7d9SAlexander Kabaev std::copy(__last, end(), __first);
156*f8a1b7d9SAlexander Kabaev _M_erase_at_end(end() - __n);
1571b86b14eSAlexander Kabaev }
158*f8a1b7d9SAlexander Kabaev return begin() + __elems_before;
1591b86b14eSAlexander Kabaev }
1601b86b14eSAlexander Kabaev }
1611b86b14eSAlexander Kabaev
1621b86b14eSAlexander Kabaev template <typename _Tp, class _Alloc>
163ffeaf689SAlexander Kabaev template <typename _InputIterator>
1641b86b14eSAlexander Kabaev void
165*f8a1b7d9SAlexander Kabaev deque<_Tp, _Alloc>::
_M_assign_aux(_InputIterator __first,_InputIterator __last,std::input_iterator_tag)166*f8a1b7d9SAlexander Kabaev _M_assign_aux(_InputIterator __first, _InputIterator __last,
167*f8a1b7d9SAlexander Kabaev std::input_iterator_tag)
1681b86b14eSAlexander Kabaev {
1691b86b14eSAlexander Kabaev iterator __cur = begin();
1701b86b14eSAlexander Kabaev for (; __first != __last && __cur != end(); ++__cur, ++__first)
1711b86b14eSAlexander Kabaev *__cur = *__first;
1721b86b14eSAlexander Kabaev if (__first == __last)
173*f8a1b7d9SAlexander Kabaev _M_erase_at_end(__cur);
1741b86b14eSAlexander Kabaev else
1751b86b14eSAlexander Kabaev insert(end(), __first, __last);
1761b86b14eSAlexander Kabaev }
1771b86b14eSAlexander Kabaev
1781b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
1791b86b14eSAlexander Kabaev void
1801b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_fill_insert(iterator __pos,size_type __n,const value_type & __x)1811b86b14eSAlexander Kabaev _M_fill_insert(iterator __pos, size_type __n, const value_type& __x)
1821b86b14eSAlexander Kabaev {
183ffeaf689SAlexander Kabaev if (__pos._M_cur == this->_M_impl._M_start._M_cur)
1841b86b14eSAlexander Kabaev {
1851b86b14eSAlexander Kabaev iterator __new_start = _M_reserve_elements_at_front(__n);
1861b86b14eSAlexander Kabaev try
1871b86b14eSAlexander Kabaev {
188*f8a1b7d9SAlexander Kabaev std::__uninitialized_fill_a(__new_start, this->_M_impl._M_start,
189*f8a1b7d9SAlexander Kabaev __x, _M_get_Tp_allocator());
190ffeaf689SAlexander Kabaev this->_M_impl._M_start = __new_start;
1911b86b14eSAlexander Kabaev }
1921b86b14eSAlexander Kabaev catch(...)
1931b86b14eSAlexander Kabaev {
194*f8a1b7d9SAlexander Kabaev _M_destroy_nodes(__new_start._M_node,
195*f8a1b7d9SAlexander Kabaev this->_M_impl._M_start._M_node);
1961b86b14eSAlexander Kabaev __throw_exception_again;
1971b86b14eSAlexander Kabaev }
1981b86b14eSAlexander Kabaev }
199ffeaf689SAlexander Kabaev else if (__pos._M_cur == this->_M_impl._M_finish._M_cur)
2001b86b14eSAlexander Kabaev {
2011b86b14eSAlexander Kabaev iterator __new_finish = _M_reserve_elements_at_back(__n);
2021b86b14eSAlexander Kabaev try
2031b86b14eSAlexander Kabaev {
204*f8a1b7d9SAlexander Kabaev std::__uninitialized_fill_a(this->_M_impl._M_finish,
205*f8a1b7d9SAlexander Kabaev __new_finish, __x,
206*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
207ffeaf689SAlexander Kabaev this->_M_impl._M_finish = __new_finish;
2081b86b14eSAlexander Kabaev }
2091b86b14eSAlexander Kabaev catch(...)
2101b86b14eSAlexander Kabaev {
211ffeaf689SAlexander Kabaev _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
212ffeaf689SAlexander Kabaev __new_finish._M_node + 1);
2131b86b14eSAlexander Kabaev __throw_exception_again;
2141b86b14eSAlexander Kabaev }
2151b86b14eSAlexander Kabaev }
2161b86b14eSAlexander Kabaev else
2171b86b14eSAlexander Kabaev _M_insert_aux(__pos, __n, __x);
2181b86b14eSAlexander Kabaev }
2191b86b14eSAlexander Kabaev
2201b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
2211b86b14eSAlexander Kabaev void
2221b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_fill_initialize(const value_type & __value)2231b86b14eSAlexander Kabaev _M_fill_initialize(const value_type& __value)
2241b86b14eSAlexander Kabaev {
2251b86b14eSAlexander Kabaev _Map_pointer __cur;
2261b86b14eSAlexander Kabaev try
2271b86b14eSAlexander Kabaev {
228ffeaf689SAlexander Kabaev for (__cur = this->_M_impl._M_start._M_node;
229ffeaf689SAlexander Kabaev __cur < this->_M_impl._M_finish._M_node;
230ffeaf689SAlexander Kabaev ++__cur)
231*f8a1b7d9SAlexander Kabaev std::__uninitialized_fill_a(*__cur, *__cur + _S_buffer_size(),
232*f8a1b7d9SAlexander Kabaev __value, _M_get_Tp_allocator());
233*f8a1b7d9SAlexander Kabaev std::__uninitialized_fill_a(this->_M_impl._M_finish._M_first,
234ffeaf689SAlexander Kabaev this->_M_impl._M_finish._M_cur,
235*f8a1b7d9SAlexander Kabaev __value, _M_get_Tp_allocator());
2361b86b14eSAlexander Kabaev }
2371b86b14eSAlexander Kabaev catch(...)
2381b86b14eSAlexander Kabaev {
239*f8a1b7d9SAlexander Kabaev std::_Destroy(this->_M_impl._M_start, iterator(*__cur, __cur),
240*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
2411b86b14eSAlexander Kabaev __throw_exception_again;
2421b86b14eSAlexander Kabaev }
2431b86b14eSAlexander Kabaev }
2441b86b14eSAlexander Kabaev
2451b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
2461b86b14eSAlexander Kabaev template <typename _InputIterator>
2471b86b14eSAlexander Kabaev void
2481b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_range_initialize(_InputIterator __first,_InputIterator __last,std::input_iterator_tag)2491b86b14eSAlexander Kabaev _M_range_initialize(_InputIterator __first, _InputIterator __last,
250*f8a1b7d9SAlexander Kabaev std::input_iterator_tag)
2511b86b14eSAlexander Kabaev {
252ffeaf689SAlexander Kabaev this->_M_initialize_map(0);
2531b86b14eSAlexander Kabaev try
2541b86b14eSAlexander Kabaev {
2551b86b14eSAlexander Kabaev for (; __first != __last; ++__first)
2561b86b14eSAlexander Kabaev push_back(*__first);
2571b86b14eSAlexander Kabaev }
2581b86b14eSAlexander Kabaev catch(...)
2591b86b14eSAlexander Kabaev {
2601b86b14eSAlexander Kabaev clear();
2611b86b14eSAlexander Kabaev __throw_exception_again;
2621b86b14eSAlexander Kabaev }
2631b86b14eSAlexander Kabaev }
2641b86b14eSAlexander Kabaev
2651b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
2661b86b14eSAlexander Kabaev template <typename _ForwardIterator>
2671b86b14eSAlexander Kabaev void
2681b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_range_initialize(_ForwardIterator __first,_ForwardIterator __last,std::forward_iterator_tag)2691b86b14eSAlexander Kabaev _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
270*f8a1b7d9SAlexander Kabaev std::forward_iterator_tag)
2711b86b14eSAlexander Kabaev {
272ffeaf689SAlexander Kabaev const size_type __n = std::distance(__first, __last);
273ffeaf689SAlexander Kabaev this->_M_initialize_map(__n);
2741b86b14eSAlexander Kabaev
2751b86b14eSAlexander Kabaev _Map_pointer __cur_node;
2761b86b14eSAlexander Kabaev try
2771b86b14eSAlexander Kabaev {
278ffeaf689SAlexander Kabaev for (__cur_node = this->_M_impl._M_start._M_node;
279ffeaf689SAlexander Kabaev __cur_node < this->_M_impl._M_finish._M_node;
2801b86b14eSAlexander Kabaev ++__cur_node)
2811b86b14eSAlexander Kabaev {
2821b86b14eSAlexander Kabaev _ForwardIterator __mid = __first;
283ffeaf689SAlexander Kabaev std::advance(__mid, _S_buffer_size());
284*f8a1b7d9SAlexander Kabaev std::__uninitialized_copy_a(__first, __mid, *__cur_node,
285*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
2861b86b14eSAlexander Kabaev __first = __mid;
2871b86b14eSAlexander Kabaev }
288*f8a1b7d9SAlexander Kabaev std::__uninitialized_copy_a(__first, __last,
289*f8a1b7d9SAlexander Kabaev this->_M_impl._M_finish._M_first,
290*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
2911b86b14eSAlexander Kabaev }
2921b86b14eSAlexander Kabaev catch(...)
2931b86b14eSAlexander Kabaev {
294*f8a1b7d9SAlexander Kabaev std::_Destroy(this->_M_impl._M_start,
295*f8a1b7d9SAlexander Kabaev iterator(*__cur_node, __cur_node),
296*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
2971b86b14eSAlexander Kabaev __throw_exception_again;
2981b86b14eSAlexander Kabaev }
2991b86b14eSAlexander Kabaev }
3001b86b14eSAlexander Kabaev
301ffeaf689SAlexander Kabaev // Called only if _M_impl._M_finish._M_cur == _M_impl._M_finish._M_last - 1.
3021b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
3031b86b14eSAlexander Kabaev void
3041b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_push_back_aux(const value_type & __t)3051b86b14eSAlexander Kabaev _M_push_back_aux(const value_type& __t)
3061b86b14eSAlexander Kabaev {
3071b86b14eSAlexander Kabaev value_type __t_copy = __t;
3081b86b14eSAlexander Kabaev _M_reserve_map_at_back();
309ffeaf689SAlexander Kabaev *(this->_M_impl._M_finish._M_node + 1) = this->_M_allocate_node();
3101b86b14eSAlexander Kabaev try
3111b86b14eSAlexander Kabaev {
312*f8a1b7d9SAlexander Kabaev this->_M_impl.construct(this->_M_impl._M_finish._M_cur, __t_copy);
313*f8a1b7d9SAlexander Kabaev this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node
314*f8a1b7d9SAlexander Kabaev + 1);
315ffeaf689SAlexander Kabaev this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_first;
3161b86b14eSAlexander Kabaev }
3171b86b14eSAlexander Kabaev catch(...)
3181b86b14eSAlexander Kabaev {
319ffeaf689SAlexander Kabaev _M_deallocate_node(*(this->_M_impl._M_finish._M_node + 1));
3201b86b14eSAlexander Kabaev __throw_exception_again;
3211b86b14eSAlexander Kabaev }
3221b86b14eSAlexander Kabaev }
3231b86b14eSAlexander Kabaev
324ffeaf689SAlexander Kabaev // Called only if _M_impl._M_start._M_cur == _M_impl._M_start._M_first.
3251b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
3261b86b14eSAlexander Kabaev void
3271b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_push_front_aux(const value_type & __t)3281b86b14eSAlexander Kabaev _M_push_front_aux(const value_type& __t)
3291b86b14eSAlexander Kabaev {
3301b86b14eSAlexander Kabaev value_type __t_copy = __t;
3311b86b14eSAlexander Kabaev _M_reserve_map_at_front();
332ffeaf689SAlexander Kabaev *(this->_M_impl._M_start._M_node - 1) = this->_M_allocate_node();
3331b86b14eSAlexander Kabaev try
3341b86b14eSAlexander Kabaev {
335*f8a1b7d9SAlexander Kabaev this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node
336*f8a1b7d9SAlexander Kabaev - 1);
337ffeaf689SAlexander Kabaev this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_last - 1;
338*f8a1b7d9SAlexander Kabaev this->_M_impl.construct(this->_M_impl._M_start._M_cur, __t_copy);
3391b86b14eSAlexander Kabaev }
3401b86b14eSAlexander Kabaev catch(...)
3411b86b14eSAlexander Kabaev {
342ffeaf689SAlexander Kabaev ++this->_M_impl._M_start;
343ffeaf689SAlexander Kabaev _M_deallocate_node(*(this->_M_impl._M_start._M_node - 1));
3441b86b14eSAlexander Kabaev __throw_exception_again;
3451b86b14eSAlexander Kabaev }
3461b86b14eSAlexander Kabaev }
3471b86b14eSAlexander Kabaev
348ffeaf689SAlexander Kabaev // Called only if _M_impl._M_finish._M_cur == _M_impl._M_finish._M_first.
3491b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
3501b86b14eSAlexander Kabaev void deque<_Tp, _Alloc>::
_M_pop_back_aux()3511b86b14eSAlexander Kabaev _M_pop_back_aux()
3521b86b14eSAlexander Kabaev {
353ffeaf689SAlexander Kabaev _M_deallocate_node(this->_M_impl._M_finish._M_first);
354ffeaf689SAlexander Kabaev this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node - 1);
355ffeaf689SAlexander Kabaev this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_last - 1;
356*f8a1b7d9SAlexander Kabaev this->_M_impl.destroy(this->_M_impl._M_finish._M_cur);
3571b86b14eSAlexander Kabaev }
3581b86b14eSAlexander Kabaev
359*f8a1b7d9SAlexander Kabaev // Called only if _M_impl._M_start._M_cur == _M_impl._M_start._M_last - 1.
360*f8a1b7d9SAlexander Kabaev // Note that if the deque has at least one element (a precondition for this
361*f8a1b7d9SAlexander Kabaev // member function), and if
362*f8a1b7d9SAlexander Kabaev // _M_impl._M_start._M_cur == _M_impl._M_start._M_last,
363*f8a1b7d9SAlexander Kabaev // then the deque must have at least two nodes.
3641b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
3651b86b14eSAlexander Kabaev void deque<_Tp, _Alloc>::
_M_pop_front_aux()3661b86b14eSAlexander Kabaev _M_pop_front_aux()
3671b86b14eSAlexander Kabaev {
368*f8a1b7d9SAlexander Kabaev this->_M_impl.destroy(this->_M_impl._M_start._M_cur);
369ffeaf689SAlexander Kabaev _M_deallocate_node(this->_M_impl._M_start._M_first);
370ffeaf689SAlexander Kabaev this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node + 1);
371ffeaf689SAlexander Kabaev this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_first;
3721b86b14eSAlexander Kabaev }
3731b86b14eSAlexander Kabaev
3741b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
3751b86b14eSAlexander Kabaev template <typename _InputIterator>
3761b86b14eSAlexander Kabaev void
3771b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_range_insert_aux(iterator __pos,_InputIterator __first,_InputIterator __last,std::input_iterator_tag)3781b86b14eSAlexander Kabaev _M_range_insert_aux(iterator __pos,
3791b86b14eSAlexander Kabaev _InputIterator __first, _InputIterator __last,
380*f8a1b7d9SAlexander Kabaev std::input_iterator_tag)
381ffeaf689SAlexander Kabaev { std::copy(__first, __last, std::inserter(*this, __pos)); }
3821b86b14eSAlexander Kabaev
3831b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
3841b86b14eSAlexander Kabaev template <typename _ForwardIterator>
3851b86b14eSAlexander Kabaev void
3861b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_range_insert_aux(iterator __pos,_ForwardIterator __first,_ForwardIterator __last,std::forward_iterator_tag)3871b86b14eSAlexander Kabaev _M_range_insert_aux(iterator __pos,
3881b86b14eSAlexander Kabaev _ForwardIterator __first, _ForwardIterator __last,
389*f8a1b7d9SAlexander Kabaev std::forward_iterator_tag)
3901b86b14eSAlexander Kabaev {
391*f8a1b7d9SAlexander Kabaev const size_type __n = std::distance(__first, __last);
392ffeaf689SAlexander Kabaev if (__pos._M_cur == this->_M_impl._M_start._M_cur)
3931b86b14eSAlexander Kabaev {
3941b86b14eSAlexander Kabaev iterator __new_start = _M_reserve_elements_at_front(__n);
3951b86b14eSAlexander Kabaev try
3961b86b14eSAlexander Kabaev {
397*f8a1b7d9SAlexander Kabaev std::__uninitialized_copy_a(__first, __last, __new_start,
398*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
399ffeaf689SAlexander Kabaev this->_M_impl._M_start = __new_start;
4001b86b14eSAlexander Kabaev }
4011b86b14eSAlexander Kabaev catch(...)
4021b86b14eSAlexander Kabaev {
403*f8a1b7d9SAlexander Kabaev _M_destroy_nodes(__new_start._M_node,
404*f8a1b7d9SAlexander Kabaev this->_M_impl._M_start._M_node);
4051b86b14eSAlexander Kabaev __throw_exception_again;
4061b86b14eSAlexander Kabaev }
4071b86b14eSAlexander Kabaev }
408ffeaf689SAlexander Kabaev else if (__pos._M_cur == this->_M_impl._M_finish._M_cur)
4091b86b14eSAlexander Kabaev {
4101b86b14eSAlexander Kabaev iterator __new_finish = _M_reserve_elements_at_back(__n);
4111b86b14eSAlexander Kabaev try
4121b86b14eSAlexander Kabaev {
413*f8a1b7d9SAlexander Kabaev std::__uninitialized_copy_a(__first, __last,
414*f8a1b7d9SAlexander Kabaev this->_M_impl._M_finish,
415*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
416ffeaf689SAlexander Kabaev this->_M_impl._M_finish = __new_finish;
4171b86b14eSAlexander Kabaev }
4181b86b14eSAlexander Kabaev catch(...)
4191b86b14eSAlexander Kabaev {
420ffeaf689SAlexander Kabaev _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
421ffeaf689SAlexander Kabaev __new_finish._M_node + 1);
4221b86b14eSAlexander Kabaev __throw_exception_again;
4231b86b14eSAlexander Kabaev }
4241b86b14eSAlexander Kabaev }
4251b86b14eSAlexander Kabaev else
4261b86b14eSAlexander Kabaev _M_insert_aux(__pos, __first, __last, __n);
4271b86b14eSAlexander Kabaev }
4281b86b14eSAlexander Kabaev
4291b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
4301b86b14eSAlexander Kabaev typename deque<_Tp, _Alloc>::iterator
4311b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_insert_aux(iterator __pos,const value_type & __x)4321b86b14eSAlexander Kabaev _M_insert_aux(iterator __pos, const value_type& __x)
4331b86b14eSAlexander Kabaev {
434ffeaf689SAlexander Kabaev difference_type __index = __pos - this->_M_impl._M_start;
4351b86b14eSAlexander Kabaev value_type __x_copy = __x; // XXX copy
4361b86b14eSAlexander Kabaev if (static_cast<size_type>(__index) < size() / 2)
4371b86b14eSAlexander Kabaev {
4381b86b14eSAlexander Kabaev push_front(front());
439ffeaf689SAlexander Kabaev iterator __front1 = this->_M_impl._M_start;
4401b86b14eSAlexander Kabaev ++__front1;
4411b86b14eSAlexander Kabaev iterator __front2 = __front1;
4421b86b14eSAlexander Kabaev ++__front2;
443ffeaf689SAlexander Kabaev __pos = this->_M_impl._M_start + __index;
4441b86b14eSAlexander Kabaev iterator __pos1 = __pos;
4451b86b14eSAlexander Kabaev ++__pos1;
446ffeaf689SAlexander Kabaev std::copy(__front2, __pos1, __front1);
4471b86b14eSAlexander Kabaev }
4481b86b14eSAlexander Kabaev else
4491b86b14eSAlexander Kabaev {
4501b86b14eSAlexander Kabaev push_back(back());
451ffeaf689SAlexander Kabaev iterator __back1 = this->_M_impl._M_finish;
4521b86b14eSAlexander Kabaev --__back1;
4531b86b14eSAlexander Kabaev iterator __back2 = __back1;
4541b86b14eSAlexander Kabaev --__back2;
455ffeaf689SAlexander Kabaev __pos = this->_M_impl._M_start + __index;
456ffeaf689SAlexander Kabaev std::copy_backward(__pos, __back2, __back1);
4571b86b14eSAlexander Kabaev }
4581b86b14eSAlexander Kabaev *__pos = __x_copy;
4591b86b14eSAlexander Kabaev return __pos;
4601b86b14eSAlexander Kabaev }
4611b86b14eSAlexander Kabaev
4621b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
4631b86b14eSAlexander Kabaev void
4641b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_insert_aux(iterator __pos,size_type __n,const value_type & __x)4651b86b14eSAlexander Kabaev _M_insert_aux(iterator __pos, size_type __n, const value_type& __x)
4661b86b14eSAlexander Kabaev {
467ffeaf689SAlexander Kabaev const difference_type __elems_before = __pos - this->_M_impl._M_start;
468*f8a1b7d9SAlexander Kabaev const size_type __length = this->size();
4691b86b14eSAlexander Kabaev value_type __x_copy = __x;
4701b86b14eSAlexander Kabaev if (__elems_before < difference_type(__length / 2))
4711b86b14eSAlexander Kabaev {
4721b86b14eSAlexander Kabaev iterator __new_start = _M_reserve_elements_at_front(__n);
473ffeaf689SAlexander Kabaev iterator __old_start = this->_M_impl._M_start;
474ffeaf689SAlexander Kabaev __pos = this->_M_impl._M_start + __elems_before;
4751b86b14eSAlexander Kabaev try
4761b86b14eSAlexander Kabaev {
4771b86b14eSAlexander Kabaev if (__elems_before >= difference_type(__n))
4781b86b14eSAlexander Kabaev {
479*f8a1b7d9SAlexander Kabaev iterator __start_n = (this->_M_impl._M_start
480*f8a1b7d9SAlexander Kabaev + difference_type(__n));
481*f8a1b7d9SAlexander Kabaev std::__uninitialized_copy_a(this->_M_impl._M_start,
482*f8a1b7d9SAlexander Kabaev __start_n, __new_start,
483*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
484ffeaf689SAlexander Kabaev this->_M_impl._M_start = __new_start;
485ffeaf689SAlexander Kabaev std::copy(__start_n, __pos, __old_start);
486*f8a1b7d9SAlexander Kabaev std::fill(__pos - difference_type(__n), __pos, __x_copy);
4871b86b14eSAlexander Kabaev }
4881b86b14eSAlexander Kabaev else
4891b86b14eSAlexander Kabaev {
490*f8a1b7d9SAlexander Kabaev std::__uninitialized_copy_fill(this->_M_impl._M_start,
491*f8a1b7d9SAlexander Kabaev __pos, __new_start,
492*f8a1b7d9SAlexander Kabaev this->_M_impl._M_start,
493*f8a1b7d9SAlexander Kabaev __x_copy,
494*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
495ffeaf689SAlexander Kabaev this->_M_impl._M_start = __new_start;
496ffeaf689SAlexander Kabaev std::fill(__old_start, __pos, __x_copy);
4971b86b14eSAlexander Kabaev }
4981b86b14eSAlexander Kabaev }
4991b86b14eSAlexander Kabaev catch(...)
5001b86b14eSAlexander Kabaev {
501*f8a1b7d9SAlexander Kabaev _M_destroy_nodes(__new_start._M_node,
502*f8a1b7d9SAlexander Kabaev this->_M_impl._M_start._M_node);
5031b86b14eSAlexander Kabaev __throw_exception_again;
5041b86b14eSAlexander Kabaev }
5051b86b14eSAlexander Kabaev }
5061b86b14eSAlexander Kabaev else
5071b86b14eSAlexander Kabaev {
5081b86b14eSAlexander Kabaev iterator __new_finish = _M_reserve_elements_at_back(__n);
509ffeaf689SAlexander Kabaev iterator __old_finish = this->_M_impl._M_finish;
5101b86b14eSAlexander Kabaev const difference_type __elems_after =
5111b86b14eSAlexander Kabaev difference_type(__length) - __elems_before;
512ffeaf689SAlexander Kabaev __pos = this->_M_impl._M_finish - __elems_after;
5131b86b14eSAlexander Kabaev try
5141b86b14eSAlexander Kabaev {
5151b86b14eSAlexander Kabaev if (__elems_after > difference_type(__n))
5161b86b14eSAlexander Kabaev {
517*f8a1b7d9SAlexander Kabaev iterator __finish_n = (this->_M_impl._M_finish
518*f8a1b7d9SAlexander Kabaev - difference_type(__n));
519*f8a1b7d9SAlexander Kabaev std::__uninitialized_copy_a(__finish_n,
520*f8a1b7d9SAlexander Kabaev this->_M_impl._M_finish,
521*f8a1b7d9SAlexander Kabaev this->_M_impl._M_finish,
522*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
523ffeaf689SAlexander Kabaev this->_M_impl._M_finish = __new_finish;
524ffeaf689SAlexander Kabaev std::copy_backward(__pos, __finish_n, __old_finish);
525ffeaf689SAlexander Kabaev std::fill(__pos, __pos + difference_type(__n), __x_copy);
5261b86b14eSAlexander Kabaev }
5271b86b14eSAlexander Kabaev else
5281b86b14eSAlexander Kabaev {
529ffeaf689SAlexander Kabaev std::__uninitialized_fill_copy(this->_M_impl._M_finish,
530ffeaf689SAlexander Kabaev __pos + difference_type(__n),
531ffeaf689SAlexander Kabaev __x_copy, __pos,
532*f8a1b7d9SAlexander Kabaev this->_M_impl._M_finish,
533*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
534ffeaf689SAlexander Kabaev this->_M_impl._M_finish = __new_finish;
535ffeaf689SAlexander Kabaev std::fill(__pos, __old_finish, __x_copy);
5361b86b14eSAlexander Kabaev }
5371b86b14eSAlexander Kabaev }
5381b86b14eSAlexander Kabaev catch(...)
5391b86b14eSAlexander Kabaev {
540ffeaf689SAlexander Kabaev _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
541ffeaf689SAlexander Kabaev __new_finish._M_node + 1);
5421b86b14eSAlexander Kabaev __throw_exception_again;
5431b86b14eSAlexander Kabaev }
5441b86b14eSAlexander Kabaev }
5451b86b14eSAlexander Kabaev }
5461b86b14eSAlexander Kabaev
5471b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
5481b86b14eSAlexander Kabaev template <typename _ForwardIterator>
5491b86b14eSAlexander Kabaev void
5501b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_insert_aux(iterator __pos,_ForwardIterator __first,_ForwardIterator __last,size_type __n)5511b86b14eSAlexander Kabaev _M_insert_aux(iterator __pos,
5521b86b14eSAlexander Kabaev _ForwardIterator __first, _ForwardIterator __last,
5531b86b14eSAlexander Kabaev size_type __n)
5541b86b14eSAlexander Kabaev {
555ffeaf689SAlexander Kabaev const difference_type __elemsbefore = __pos - this->_M_impl._M_start;
556*f8a1b7d9SAlexander Kabaev const size_type __length = size();
5571b86b14eSAlexander Kabaev if (static_cast<size_type>(__elemsbefore) < __length / 2)
5581b86b14eSAlexander Kabaev {
5591b86b14eSAlexander Kabaev iterator __new_start = _M_reserve_elements_at_front(__n);
560ffeaf689SAlexander Kabaev iterator __old_start = this->_M_impl._M_start;
561ffeaf689SAlexander Kabaev __pos = this->_M_impl._M_start + __elemsbefore;
5621b86b14eSAlexander Kabaev try
5631b86b14eSAlexander Kabaev {
5641b86b14eSAlexander Kabaev if (__elemsbefore >= difference_type(__n))
5651b86b14eSAlexander Kabaev {
566*f8a1b7d9SAlexander Kabaev iterator __start_n = (this->_M_impl._M_start
567*f8a1b7d9SAlexander Kabaev + difference_type(__n));
568*f8a1b7d9SAlexander Kabaev std::__uninitialized_copy_a(this->_M_impl._M_start,
569*f8a1b7d9SAlexander Kabaev __start_n, __new_start,
570*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
571ffeaf689SAlexander Kabaev this->_M_impl._M_start = __new_start;
572ffeaf689SAlexander Kabaev std::copy(__start_n, __pos, __old_start);
573ffeaf689SAlexander Kabaev std::copy(__first, __last, __pos - difference_type(__n));
5741b86b14eSAlexander Kabaev }
5751b86b14eSAlexander Kabaev else
5761b86b14eSAlexander Kabaev {
5771b86b14eSAlexander Kabaev _ForwardIterator __mid = __first;
578ffeaf689SAlexander Kabaev std::advance(__mid, difference_type(__n) - __elemsbefore);
579*f8a1b7d9SAlexander Kabaev std::__uninitialized_copy_copy(this->_M_impl._M_start,
580*f8a1b7d9SAlexander Kabaev __pos, __first, __mid,
581*f8a1b7d9SAlexander Kabaev __new_start,
582*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
583ffeaf689SAlexander Kabaev this->_M_impl._M_start = __new_start;
584ffeaf689SAlexander Kabaev std::copy(__mid, __last, __old_start);
5851b86b14eSAlexander Kabaev }
5861b86b14eSAlexander Kabaev }
5871b86b14eSAlexander Kabaev catch(...)
5881b86b14eSAlexander Kabaev {
589*f8a1b7d9SAlexander Kabaev _M_destroy_nodes(__new_start._M_node,
590*f8a1b7d9SAlexander Kabaev this->_M_impl._M_start._M_node);
5911b86b14eSAlexander Kabaev __throw_exception_again;
5921b86b14eSAlexander Kabaev }
5931b86b14eSAlexander Kabaev }
5941b86b14eSAlexander Kabaev else
5951b86b14eSAlexander Kabaev {
5961b86b14eSAlexander Kabaev iterator __new_finish = _M_reserve_elements_at_back(__n);
597ffeaf689SAlexander Kabaev iterator __old_finish = this->_M_impl._M_finish;
5981b86b14eSAlexander Kabaev const difference_type __elemsafter =
5991b86b14eSAlexander Kabaev difference_type(__length) - __elemsbefore;
600ffeaf689SAlexander Kabaev __pos = this->_M_impl._M_finish - __elemsafter;
6011b86b14eSAlexander Kabaev try
6021b86b14eSAlexander Kabaev {
6031b86b14eSAlexander Kabaev if (__elemsafter > difference_type(__n))
6041b86b14eSAlexander Kabaev {
605*f8a1b7d9SAlexander Kabaev iterator __finish_n = (this->_M_impl._M_finish
606*f8a1b7d9SAlexander Kabaev - difference_type(__n));
607*f8a1b7d9SAlexander Kabaev std::__uninitialized_copy_a(__finish_n,
608ffeaf689SAlexander Kabaev this->_M_impl._M_finish,
609*f8a1b7d9SAlexander Kabaev this->_M_impl._M_finish,
610*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
611ffeaf689SAlexander Kabaev this->_M_impl._M_finish = __new_finish;
612ffeaf689SAlexander Kabaev std::copy_backward(__pos, __finish_n, __old_finish);
613ffeaf689SAlexander Kabaev std::copy(__first, __last, __pos);
6141b86b14eSAlexander Kabaev }
6151b86b14eSAlexander Kabaev else
6161b86b14eSAlexander Kabaev {
6171b86b14eSAlexander Kabaev _ForwardIterator __mid = __first;
618ffeaf689SAlexander Kabaev std::advance(__mid, __elemsafter);
619ffeaf689SAlexander Kabaev std::__uninitialized_copy_copy(__mid, __last, __pos,
620ffeaf689SAlexander Kabaev this->_M_impl._M_finish,
621*f8a1b7d9SAlexander Kabaev this->_M_impl._M_finish,
622*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
623ffeaf689SAlexander Kabaev this->_M_impl._M_finish = __new_finish;
624ffeaf689SAlexander Kabaev std::copy(__first, __mid, __pos);
6251b86b14eSAlexander Kabaev }
6261b86b14eSAlexander Kabaev }
6271b86b14eSAlexander Kabaev catch(...)
6281b86b14eSAlexander Kabaev {
629ffeaf689SAlexander Kabaev _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
630ffeaf689SAlexander Kabaev __new_finish._M_node + 1);
6311b86b14eSAlexander Kabaev __throw_exception_again;
6321b86b14eSAlexander Kabaev }
6331b86b14eSAlexander Kabaev }
6341b86b14eSAlexander Kabaev }
6351b86b14eSAlexander Kabaev
6361b86b14eSAlexander Kabaev template<typename _Tp, typename _Alloc>
6371b86b14eSAlexander Kabaev void
6381b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_destroy_data_aux(iterator __first,iterator __last)639*f8a1b7d9SAlexander Kabaev _M_destroy_data_aux(iterator __first, iterator __last)
640*f8a1b7d9SAlexander Kabaev {
641*f8a1b7d9SAlexander Kabaev for (_Map_pointer __node = __first._M_node + 1;
642*f8a1b7d9SAlexander Kabaev __node < __last._M_node; ++__node)
643*f8a1b7d9SAlexander Kabaev std::_Destroy(*__node, *__node + _S_buffer_size(),
644*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
645*f8a1b7d9SAlexander Kabaev
646*f8a1b7d9SAlexander Kabaev if (__first._M_node != __last._M_node)
647*f8a1b7d9SAlexander Kabaev {
648*f8a1b7d9SAlexander Kabaev std::_Destroy(__first._M_cur, __first._M_last,
649*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
650*f8a1b7d9SAlexander Kabaev std::_Destroy(__last._M_first, __last._M_cur,
651*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
652*f8a1b7d9SAlexander Kabaev }
653*f8a1b7d9SAlexander Kabaev else
654*f8a1b7d9SAlexander Kabaev std::_Destroy(__first._M_cur, __last._M_cur,
655*f8a1b7d9SAlexander Kabaev _M_get_Tp_allocator());
656*f8a1b7d9SAlexander Kabaev }
657*f8a1b7d9SAlexander Kabaev
658*f8a1b7d9SAlexander Kabaev template <typename _Tp, typename _Alloc>
659*f8a1b7d9SAlexander Kabaev void
660*f8a1b7d9SAlexander Kabaev deque<_Tp, _Alloc>::
_M_new_elements_at_front(size_type __new_elems)6611b86b14eSAlexander Kabaev _M_new_elements_at_front(size_type __new_elems)
6621b86b14eSAlexander Kabaev {
663*f8a1b7d9SAlexander Kabaev if (this->max_size() - this->size() < __new_elems)
664*f8a1b7d9SAlexander Kabaev __throw_length_error(__N("deque::_M_new_elements_at_front"));
665*f8a1b7d9SAlexander Kabaev
666*f8a1b7d9SAlexander Kabaev const size_type __new_nodes = ((__new_elems + _S_buffer_size() - 1)
667*f8a1b7d9SAlexander Kabaev / _S_buffer_size());
6681b86b14eSAlexander Kabaev _M_reserve_map_at_front(__new_nodes);
6691b86b14eSAlexander Kabaev size_type __i;
6701b86b14eSAlexander Kabaev try
6711b86b14eSAlexander Kabaev {
6721b86b14eSAlexander Kabaev for (__i = 1; __i <= __new_nodes; ++__i)
673ffeaf689SAlexander Kabaev *(this->_M_impl._M_start._M_node - __i) = this->_M_allocate_node();
6741b86b14eSAlexander Kabaev }
6751b86b14eSAlexander Kabaev catch(...)
6761b86b14eSAlexander Kabaev {
6771b86b14eSAlexander Kabaev for (size_type __j = 1; __j < __i; ++__j)
678ffeaf689SAlexander Kabaev _M_deallocate_node(*(this->_M_impl._M_start._M_node - __j));
6791b86b14eSAlexander Kabaev __throw_exception_again;
6801b86b14eSAlexander Kabaev }
6811b86b14eSAlexander Kabaev }
6821b86b14eSAlexander Kabaev
6831b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
6841b86b14eSAlexander Kabaev void
6851b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_new_elements_at_back(size_type __new_elems)6861b86b14eSAlexander Kabaev _M_new_elements_at_back(size_type __new_elems)
6871b86b14eSAlexander Kabaev {
688*f8a1b7d9SAlexander Kabaev if (this->max_size() - this->size() < __new_elems)
689*f8a1b7d9SAlexander Kabaev __throw_length_error(__N("deque::_M_new_elements_at_back"));
690*f8a1b7d9SAlexander Kabaev
691*f8a1b7d9SAlexander Kabaev const size_type __new_nodes = ((__new_elems + _S_buffer_size() - 1)
692*f8a1b7d9SAlexander Kabaev / _S_buffer_size());
6931b86b14eSAlexander Kabaev _M_reserve_map_at_back(__new_nodes);
6941b86b14eSAlexander Kabaev size_type __i;
6951b86b14eSAlexander Kabaev try
6961b86b14eSAlexander Kabaev {
6971b86b14eSAlexander Kabaev for (__i = 1; __i <= __new_nodes; ++__i)
698ffeaf689SAlexander Kabaev *(this->_M_impl._M_finish._M_node + __i) = this->_M_allocate_node();
6991b86b14eSAlexander Kabaev }
7001b86b14eSAlexander Kabaev catch(...)
7011b86b14eSAlexander Kabaev {
7021b86b14eSAlexander Kabaev for (size_type __j = 1; __j < __i; ++__j)
703ffeaf689SAlexander Kabaev _M_deallocate_node(*(this->_M_impl._M_finish._M_node + __j));
7041b86b14eSAlexander Kabaev __throw_exception_again;
7051b86b14eSAlexander Kabaev }
7061b86b14eSAlexander Kabaev }
7071b86b14eSAlexander Kabaev
7081b86b14eSAlexander Kabaev template <typename _Tp, typename _Alloc>
7091b86b14eSAlexander Kabaev void
7101b86b14eSAlexander Kabaev deque<_Tp, _Alloc>::
_M_reallocate_map(size_type __nodes_to_add,bool __add_at_front)7111b86b14eSAlexander Kabaev _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front)
7121b86b14eSAlexander Kabaev {
713*f8a1b7d9SAlexander Kabaev const size_type __old_num_nodes
714ffeaf689SAlexander Kabaev = this->_M_impl._M_finish._M_node - this->_M_impl._M_start._M_node + 1;
715*f8a1b7d9SAlexander Kabaev const size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;
7161b86b14eSAlexander Kabaev
7171b86b14eSAlexander Kabaev _Map_pointer __new_nstart;
718ffeaf689SAlexander Kabaev if (this->_M_impl._M_map_size > 2 * __new_num_nodes)
7191b86b14eSAlexander Kabaev {
720ffeaf689SAlexander Kabaev __new_nstart = this->_M_impl._M_map + (this->_M_impl._M_map_size
721ffeaf689SAlexander Kabaev - __new_num_nodes) / 2
7221b86b14eSAlexander Kabaev + (__add_at_front ? __nodes_to_add : 0);
723ffeaf689SAlexander Kabaev if (__new_nstart < this->_M_impl._M_start._M_node)
724ffeaf689SAlexander Kabaev std::copy(this->_M_impl._M_start._M_node,
725ffeaf689SAlexander Kabaev this->_M_impl._M_finish._M_node + 1,
726ffeaf689SAlexander Kabaev __new_nstart);
7271b86b14eSAlexander Kabaev else
728ffeaf689SAlexander Kabaev std::copy_backward(this->_M_impl._M_start._M_node,
729ffeaf689SAlexander Kabaev this->_M_impl._M_finish._M_node + 1,
7301b86b14eSAlexander Kabaev __new_nstart + __old_num_nodes);
7311b86b14eSAlexander Kabaev }
7321b86b14eSAlexander Kabaev else
7331b86b14eSAlexander Kabaev {
734ffeaf689SAlexander Kabaev size_type __new_map_size = this->_M_impl._M_map_size
735ffeaf689SAlexander Kabaev + std::max(this->_M_impl._M_map_size,
736ffeaf689SAlexander Kabaev __nodes_to_add) + 2;
7371b86b14eSAlexander Kabaev
738ffeaf689SAlexander Kabaev _Map_pointer __new_map = this->_M_allocate_map(__new_map_size);
7391b86b14eSAlexander Kabaev __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2
7401b86b14eSAlexander Kabaev + (__add_at_front ? __nodes_to_add : 0);
741ffeaf689SAlexander Kabaev std::copy(this->_M_impl._M_start._M_node,
742ffeaf689SAlexander Kabaev this->_M_impl._M_finish._M_node + 1,
743ffeaf689SAlexander Kabaev __new_nstart);
744ffeaf689SAlexander Kabaev _M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size);
7451b86b14eSAlexander Kabaev
746ffeaf689SAlexander Kabaev this->_M_impl._M_map = __new_map;
747ffeaf689SAlexander Kabaev this->_M_impl._M_map_size = __new_map_size;
7481b86b14eSAlexander Kabaev }
7491b86b14eSAlexander Kabaev
750ffeaf689SAlexander Kabaev this->_M_impl._M_start._M_set_node(__new_nstart);
751ffeaf689SAlexander Kabaev this->_M_impl._M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);
7521b86b14eSAlexander Kabaev }
753*f8a1b7d9SAlexander Kabaev
754*f8a1b7d9SAlexander Kabaev // Overload for deque::iterators, exploiting the "segmented-iterator
755*f8a1b7d9SAlexander Kabaev // optimization". NB: leave const_iterators alone!
756*f8a1b7d9SAlexander Kabaev template<typename _Tp>
757*f8a1b7d9SAlexander Kabaev void
fill(const _Deque_iterator<_Tp,_Tp &,_Tp * > & __first,const _Deque_iterator<_Tp,_Tp &,_Tp * > & __last,const _Tp & __value)758*f8a1b7d9SAlexander Kabaev fill(const _Deque_iterator<_Tp, _Tp&, _Tp*>& __first,
759*f8a1b7d9SAlexander Kabaev const _Deque_iterator<_Tp, _Tp&, _Tp*>& __last, const _Tp& __value)
760*f8a1b7d9SAlexander Kabaev {
761*f8a1b7d9SAlexander Kabaev typedef typename _Deque_iterator<_Tp, _Tp&, _Tp*>::_Self _Self;
762*f8a1b7d9SAlexander Kabaev
763*f8a1b7d9SAlexander Kabaev for (typename _Self::_Map_pointer __node = __first._M_node + 1;
764*f8a1b7d9SAlexander Kabaev __node < __last._M_node; ++__node)
765*f8a1b7d9SAlexander Kabaev std::fill(*__node, *__node + _Self::_S_buffer_size(), __value);
766*f8a1b7d9SAlexander Kabaev
767*f8a1b7d9SAlexander Kabaev if (__first._M_node != __last._M_node)
768*f8a1b7d9SAlexander Kabaev {
769*f8a1b7d9SAlexander Kabaev std::fill(__first._M_cur, __first._M_last, __value);
770*f8a1b7d9SAlexander Kabaev std::fill(__last._M_first, __last._M_cur, __value);
771*f8a1b7d9SAlexander Kabaev }
772*f8a1b7d9SAlexander Kabaev else
773*f8a1b7d9SAlexander Kabaev std::fill(__first._M_cur, __last._M_cur, __value);
774*f8a1b7d9SAlexander Kabaev }
775*f8a1b7d9SAlexander Kabaev
776*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NESTED_NAMESPACE
7771b86b14eSAlexander Kabaev
778ffeaf689SAlexander Kabaev #endif
779