Home | History | Annotate | Line # | Download | only in bits
      1       1.1  mrg // Deque implementation (out of line) -*- C++ -*-
      2       1.1  mrg 
      3  1.1.1.13  mrg // Copyright (C) 2001-2024 Free Software Foundation, Inc.
      4       1.1  mrg //
      5       1.1  mrg // This file is part of the GNU ISO C++ Library.  This library is free
      6       1.1  mrg // software; you can redistribute it and/or modify it under the
      7       1.1  mrg // terms of the GNU General Public License as published by the
      8       1.1  mrg // Free Software Foundation; either version 3, or (at your option)
      9       1.1  mrg // any later version.
     10       1.1  mrg 
     11       1.1  mrg // This library is distributed in the hope that it will be useful,
     12       1.1  mrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13       1.1  mrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14       1.1  mrg // GNU General Public License for more details.
     15       1.1  mrg 
     16       1.1  mrg // Under Section 7 of GPL version 3, you are granted additional
     17       1.1  mrg // permissions described in the GCC Runtime Library Exception, version
     18       1.1  mrg // 3.1, as published by the Free Software Foundation.
     19       1.1  mrg 
     20       1.1  mrg // You should have received a copy of the GNU General Public License and
     21       1.1  mrg // a copy of the GCC Runtime Library Exception along with this program;
     22       1.1  mrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23       1.1  mrg // <http://www.gnu.org/licenses/>.
     24       1.1  mrg 
     25       1.1  mrg /*
     26       1.1  mrg  *
     27       1.1  mrg  * Copyright (c) 1994
     28       1.1  mrg  * Hewlett-Packard Company
     29       1.1  mrg  *
     30       1.1  mrg  * Permission to use, copy, modify, distribute and sell this software
     31       1.1  mrg  * and its documentation for any purpose is hereby granted without fee,
     32       1.1  mrg  * provided that the above copyright notice appear in all copies and
     33       1.1  mrg  * that both that copyright notice and this permission notice appear
     34       1.1  mrg  * in supporting documentation.  Hewlett-Packard Company makes no
     35       1.1  mrg  * representations about the suitability of this software for any
     36       1.1  mrg  * purpose.  It is provided "as is" without express or implied warranty.
     37       1.1  mrg  *
     38       1.1  mrg  *
     39       1.1  mrg  * Copyright (c) 1997
     40       1.1  mrg  * Silicon Graphics Computer Systems, Inc.
     41       1.1  mrg  *
     42       1.1  mrg  * Permission to use, copy, modify, distribute and sell this software
     43       1.1  mrg  * and its documentation for any purpose is hereby granted without fee,
     44       1.1  mrg  * provided that the above copyright notice appear in all copies and
     45       1.1  mrg  * that both that copyright notice and this permission notice appear
     46       1.1  mrg  * in supporting documentation.  Silicon Graphics makes no
     47       1.1  mrg  * representations about the suitability of this software for any
     48       1.1  mrg  * purpose.  It is provided "as is" without express or implied warranty.
     49       1.1  mrg  */
     50       1.1  mrg 
     51   1.1.1.2  mrg /** @file bits/deque.tcc
     52       1.1  mrg  *  This is an internal header file, included by other library headers.
     53   1.1.1.2  mrg  *  Do not attempt to use it directly. @headername{deque}
     54       1.1  mrg  */
     55       1.1  mrg 
     56       1.1  mrg #ifndef _DEQUE_TCC
     57       1.1  mrg #define _DEQUE_TCC 1
     58       1.1  mrg 
     59  1.1.1.10  mrg #include <bits/stl_algobase.h>
     60  1.1.1.10  mrg 
     61   1.1.1.2  mrg namespace std _GLIBCXX_VISIBILITY(default)
     62   1.1.1.2  mrg {
     63   1.1.1.8  mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
     64   1.1.1.2  mrg _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     65   1.1.1.2  mrg 
     66   1.1.1.2  mrg #if __cplusplus >= 201103L
     67   1.1.1.2  mrg   template <typename _Tp, typename _Alloc>
     68   1.1.1.2  mrg     void
     69   1.1.1.2  mrg     deque<_Tp, _Alloc>::
     70   1.1.1.2  mrg     _M_default_initialize()
     71   1.1.1.2  mrg     {
     72   1.1.1.2  mrg       _Map_pointer __cur;
     73   1.1.1.2  mrg       __try
     74  1.1.1.10  mrg 	{
     75  1.1.1.10  mrg 	  for (__cur = this->_M_impl._M_start._M_node;
     76   1.1.1.2  mrg 	       __cur < this->_M_impl._M_finish._M_node;
     77   1.1.1.2  mrg 	       ++__cur)
     78  1.1.1.10  mrg 	    std::__uninitialized_default_a(*__cur, *__cur + _S_buffer_size(),
     79   1.1.1.2  mrg 					   _M_get_Tp_allocator());
     80  1.1.1.10  mrg 	  std::__uninitialized_default_a(this->_M_impl._M_finish._M_first,
     81   1.1.1.2  mrg 					 this->_M_impl._M_finish._M_cur,
     82   1.1.1.2  mrg 					 _M_get_Tp_allocator());
     83  1.1.1.10  mrg 	}
     84   1.1.1.2  mrg       __catch(...)
     85  1.1.1.10  mrg 	{
     86  1.1.1.10  mrg 	  std::_Destroy(this->_M_impl._M_start, iterator(*__cur, __cur),
     87   1.1.1.2  mrg 			_M_get_Tp_allocator());
     88  1.1.1.10  mrg 	  __throw_exception_again;
     89  1.1.1.10  mrg 	}
     90   1.1.1.2  mrg     }
     91   1.1.1.2  mrg #endif
     92       1.1  mrg 
     93       1.1  mrg   template <typename _Tp, typename _Alloc>
     94       1.1  mrg     deque<_Tp, _Alloc>&
     95       1.1  mrg     deque<_Tp, _Alloc>::
     96       1.1  mrg     operator=(const deque& __x)
     97       1.1  mrg     {
     98  1.1.1.11  mrg       if (std::__addressof(__x) != this)
     99       1.1  mrg 	{
    100   1.1.1.3  mrg #if __cplusplus >= 201103L
    101   1.1.1.3  mrg 	  if (_Alloc_traits::_S_propagate_on_copy_assign())
    102   1.1.1.3  mrg 	    {
    103   1.1.1.3  mrg 	      if (!_Alloc_traits::_S_always_equal()
    104  1.1.1.10  mrg 		  && _M_get_Tp_allocator() != __x._M_get_Tp_allocator())
    105  1.1.1.10  mrg 		{
    106   1.1.1.3  mrg 		  // Replacement allocator cannot free existing storage,
    107   1.1.1.3  mrg 		  // so deallocate everything and take copy of __x's data.
    108   1.1.1.3  mrg 		  _M_replace_map(__x, __x.get_allocator());
    109   1.1.1.3  mrg 		  std::__alloc_on_copy(_M_get_Tp_allocator(),
    110   1.1.1.3  mrg 				       __x._M_get_Tp_allocator());
    111   1.1.1.3  mrg 		  return *this;
    112   1.1.1.3  mrg 		}
    113   1.1.1.3  mrg 	      std::__alloc_on_copy(_M_get_Tp_allocator(),
    114   1.1.1.3  mrg 				   __x._M_get_Tp_allocator());
    115   1.1.1.3  mrg 	    }
    116   1.1.1.3  mrg #endif
    117   1.1.1.3  mrg 	  const size_type __len = size();
    118       1.1  mrg 	  if (__len >= __x.size())
    119       1.1  mrg 	    _M_erase_at_end(std::copy(__x.begin(), __x.end(),
    120       1.1  mrg 				      this->_M_impl._M_start));
    121       1.1  mrg 	  else
    122       1.1  mrg 	    {
    123       1.1  mrg 	      const_iterator __mid = __x.begin() + difference_type(__len);
    124       1.1  mrg 	      std::copy(__x.begin(), __mid, this->_M_impl._M_start);
    125   1.1.1.5  mrg 	      _M_range_insert_aux(this->_M_impl._M_finish, __mid, __x.end(),
    126   1.1.1.5  mrg 				  std::random_access_iterator_tag());
    127       1.1  mrg 	    }
    128       1.1  mrg 	}
    129       1.1  mrg       return *this;
    130       1.1  mrg     }
    131       1.1  mrg 
    132   1.1.1.2  mrg #if __cplusplus >= 201103L
    133       1.1  mrg   template<typename _Tp, typename _Alloc>
    134       1.1  mrg     template<typename... _Args>
    135   1.1.1.5  mrg #if __cplusplus > 201402L
    136   1.1.1.5  mrg       typename deque<_Tp, _Alloc>::reference
    137   1.1.1.5  mrg #else
    138       1.1  mrg       void
    139   1.1.1.5  mrg #endif
    140       1.1  mrg       deque<_Tp, _Alloc>::
    141       1.1  mrg       emplace_front(_Args&&... __args)
    142       1.1  mrg       {
    143       1.1  mrg 	if (this->_M_impl._M_start._M_cur != this->_M_impl._M_start._M_first)
    144       1.1  mrg 	  {
    145   1.1.1.3  mrg 	    _Alloc_traits::construct(this->_M_impl,
    146  1.1.1.10  mrg 				     this->_M_impl._M_start._M_cur - 1,
    147  1.1.1.10  mrg 				     std::forward<_Args>(__args)...);
    148       1.1  mrg 	    --this->_M_impl._M_start._M_cur;
    149       1.1  mrg 	  }
    150       1.1  mrg 	else
    151       1.1  mrg 	  _M_push_front_aux(std::forward<_Args>(__args)...);
    152   1.1.1.5  mrg #if __cplusplus > 201402L
    153   1.1.1.5  mrg 	return front();
    154   1.1.1.5  mrg #endif
    155       1.1  mrg       }
    156       1.1  mrg 
    157       1.1  mrg   template<typename _Tp, typename _Alloc>
    158       1.1  mrg     template<typename... _Args>
    159   1.1.1.5  mrg #if __cplusplus > 201402L
    160   1.1.1.5  mrg       typename deque<_Tp, _Alloc>::reference
    161   1.1.1.5  mrg #else
    162       1.1  mrg       void
    163   1.1.1.5  mrg #endif
    164       1.1  mrg       deque<_Tp, _Alloc>::
    165       1.1  mrg       emplace_back(_Args&&... __args)
    166       1.1  mrg       {
    167       1.1  mrg 	if (this->_M_impl._M_finish._M_cur
    168       1.1  mrg 	    != this->_M_impl._M_finish._M_last - 1)
    169       1.1  mrg 	  {
    170   1.1.1.3  mrg 	    _Alloc_traits::construct(this->_M_impl,
    171  1.1.1.10  mrg 				     this->_M_impl._M_finish._M_cur,
    172  1.1.1.10  mrg 				     std::forward<_Args>(__args)...);
    173       1.1  mrg 	    ++this->_M_impl._M_finish._M_cur;
    174       1.1  mrg 	  }
    175       1.1  mrg 	else
    176       1.1  mrg 	  _M_push_back_aux(std::forward<_Args>(__args)...);
    177   1.1.1.5  mrg #if __cplusplus > 201402L
    178   1.1.1.5  mrg 	return back();
    179   1.1.1.5  mrg #endif
    180       1.1  mrg       }
    181       1.1  mrg #endif
    182       1.1  mrg 
    183   1.1.1.2  mrg #if __cplusplus >= 201103L
    184       1.1  mrg   template<typename _Tp, typename _Alloc>
    185       1.1  mrg     template<typename... _Args>
    186       1.1  mrg       typename deque<_Tp, _Alloc>::iterator
    187       1.1  mrg       deque<_Tp, _Alloc>::
    188   1.1.1.3  mrg       emplace(const_iterator __position, _Args&&... __args)
    189       1.1  mrg       {
    190       1.1  mrg 	if (__position._M_cur == this->_M_impl._M_start._M_cur)
    191       1.1  mrg 	  {
    192   1.1.1.2  mrg 	    emplace_front(std::forward<_Args>(__args)...);
    193       1.1  mrg 	    return this->_M_impl._M_start;
    194       1.1  mrg 	  }
    195       1.1  mrg 	else if (__position._M_cur == this->_M_impl._M_finish._M_cur)
    196       1.1  mrg 	  {
    197   1.1.1.2  mrg 	    emplace_back(std::forward<_Args>(__args)...);
    198       1.1  mrg 	    iterator __tmp = this->_M_impl._M_finish;
    199       1.1  mrg 	    --__tmp;
    200       1.1  mrg 	    return __tmp;
    201       1.1  mrg 	  }
    202       1.1  mrg 	else
    203  1.1.1.13  mrg 	  return _M_emplace_aux(__position._M_const_cast(),
    204  1.1.1.13  mrg 				std::forward<_Args>(__args)...);
    205       1.1  mrg       }
    206       1.1  mrg #endif
    207       1.1  mrg 
    208       1.1  mrg   template <typename _Tp, typename _Alloc>
    209       1.1  mrg     typename deque<_Tp, _Alloc>::iterator
    210       1.1  mrg     deque<_Tp, _Alloc>::
    211   1.1.1.3  mrg #if __cplusplus >= 201103L
    212   1.1.1.3  mrg     insert(const_iterator __position, const value_type& __x)
    213   1.1.1.3  mrg #else
    214   1.1.1.3  mrg     insert(iterator __position, const value_type& __x)
    215   1.1.1.3  mrg #endif
    216   1.1.1.3  mrg     {
    217   1.1.1.3  mrg       if (__position._M_cur == this->_M_impl._M_start._M_cur)
    218   1.1.1.3  mrg 	{
    219   1.1.1.3  mrg 	  push_front(__x);
    220   1.1.1.3  mrg 	  return this->_M_impl._M_start;
    221   1.1.1.3  mrg 	}
    222   1.1.1.3  mrg       else if (__position._M_cur == this->_M_impl._M_finish._M_cur)
    223   1.1.1.3  mrg 	{
    224   1.1.1.3  mrg 	  push_back(__x);
    225   1.1.1.3  mrg 	  iterator __tmp = this->_M_impl._M_finish;
    226   1.1.1.3  mrg 	  --__tmp;
    227   1.1.1.3  mrg 	  return __tmp;
    228   1.1.1.3  mrg 	}
    229   1.1.1.3  mrg       else
    230   1.1.1.3  mrg 	return _M_insert_aux(__position._M_const_cast(), __x);
    231   1.1.1.3  mrg    }
    232   1.1.1.3  mrg 
    233   1.1.1.3  mrg   template <typename _Tp, typename _Alloc>
    234   1.1.1.3  mrg     typename deque<_Tp, _Alloc>::iterator
    235   1.1.1.3  mrg     deque<_Tp, _Alloc>::
    236   1.1.1.3  mrg     _M_erase(iterator __position)
    237       1.1  mrg     {
    238       1.1  mrg       iterator __next = __position;
    239       1.1  mrg       ++__next;
    240       1.1  mrg       const difference_type __index = __position - begin();
    241       1.1  mrg       if (static_cast<size_type>(__index) < (size() >> 1))
    242       1.1  mrg 	{
    243       1.1  mrg 	  if (__position != begin())
    244       1.1  mrg 	    _GLIBCXX_MOVE_BACKWARD3(begin(), __position, __next);
    245       1.1  mrg 	  pop_front();
    246       1.1  mrg 	}
    247       1.1  mrg       else
    248       1.1  mrg 	{
    249       1.1  mrg 	  if (__next != end())
    250       1.1  mrg 	    _GLIBCXX_MOVE3(__next, end(), __position);
    251       1.1  mrg 	  pop_back();
    252       1.1  mrg 	}
    253       1.1  mrg       return begin() + __index;
    254       1.1  mrg     }
    255       1.1  mrg 
    256       1.1  mrg   template <typename _Tp, typename _Alloc>
    257       1.1  mrg     typename deque<_Tp, _Alloc>::iterator
    258       1.1  mrg     deque<_Tp, _Alloc>::
    259   1.1.1.3  mrg     _M_erase(iterator __first, iterator __last)
    260       1.1  mrg     {
    261   1.1.1.2  mrg       if (__first == __last)
    262   1.1.1.2  mrg 	return __first;
    263   1.1.1.2  mrg       else if (__first == begin() && __last == end())
    264       1.1  mrg 	{
    265       1.1  mrg 	  clear();
    266       1.1  mrg 	  return end();
    267       1.1  mrg 	}
    268       1.1  mrg       else
    269       1.1  mrg 	{
    270       1.1  mrg 	  const difference_type __n = __last - __first;
    271       1.1  mrg 	  const difference_type __elems_before = __first - begin();
    272       1.1  mrg 	  if (static_cast<size_type>(__elems_before) <= (size() - __n) / 2)
    273       1.1  mrg 	    {
    274       1.1  mrg 	      if (__first != begin())
    275       1.1  mrg 		_GLIBCXX_MOVE_BACKWARD3(begin(), __first, __last);
    276       1.1  mrg 	      _M_erase_at_begin(begin() + __n);
    277       1.1  mrg 	    }
    278       1.1  mrg 	  else
    279       1.1  mrg 	    {
    280       1.1  mrg 	      if (__last != end())
    281       1.1  mrg 		_GLIBCXX_MOVE3(__last, end(), __first);
    282       1.1  mrg 	      _M_erase_at_end(end() - __n);
    283       1.1  mrg 	    }
    284       1.1  mrg 	  return begin() + __elems_before;
    285       1.1  mrg 	}
    286       1.1  mrg     }
    287       1.1  mrg 
    288       1.1  mrg   template <typename _Tp, class _Alloc>
    289       1.1  mrg     template <typename _InputIterator>
    290       1.1  mrg       void
    291       1.1  mrg       deque<_Tp, _Alloc>::
    292       1.1  mrg       _M_assign_aux(_InputIterator __first, _InputIterator __last,
    293       1.1  mrg 		    std::input_iterator_tag)
    294       1.1  mrg       {
    295  1.1.1.10  mrg 	iterator __cur = begin();
    296  1.1.1.10  mrg 	for (; __first != __last && __cur != end(); ++__cur, (void)++__first)
    297  1.1.1.10  mrg 	  *__cur = *__first;
    298  1.1.1.10  mrg 	if (__first == __last)
    299  1.1.1.10  mrg 	  _M_erase_at_end(__cur);
    300  1.1.1.10  mrg 	else
    301  1.1.1.10  mrg 	  _M_range_insert_aux(end(), __first, __last,
    302   1.1.1.5  mrg 			      std::__iterator_category(__first));
    303       1.1  mrg       }
    304       1.1  mrg 
    305       1.1  mrg   template <typename _Tp, typename _Alloc>
    306       1.1  mrg     void
    307       1.1  mrg     deque<_Tp, _Alloc>::
    308       1.1  mrg     _M_fill_insert(iterator __pos, size_type __n, const value_type& __x)
    309       1.1  mrg     {
    310       1.1  mrg       if (__pos._M_cur == this->_M_impl._M_start._M_cur)
    311       1.1  mrg 	{
    312       1.1  mrg 	  iterator __new_start = _M_reserve_elements_at_front(__n);
    313       1.1  mrg 	  __try
    314       1.1  mrg 	    {
    315       1.1  mrg 	      std::__uninitialized_fill_a(__new_start, this->_M_impl._M_start,
    316       1.1  mrg 					  __x, _M_get_Tp_allocator());
    317       1.1  mrg 	      this->_M_impl._M_start = __new_start;
    318       1.1  mrg 	    }
    319       1.1  mrg 	  __catch(...)
    320       1.1  mrg 	    {
    321       1.1  mrg 	      _M_destroy_nodes(__new_start._M_node,
    322       1.1  mrg 			       this->_M_impl._M_start._M_node);
    323       1.1  mrg 	      __throw_exception_again;
    324       1.1  mrg 	    }
    325       1.1  mrg 	}
    326       1.1  mrg       else if (__pos._M_cur == this->_M_impl._M_finish._M_cur)
    327       1.1  mrg 	{
    328       1.1  mrg 	  iterator __new_finish = _M_reserve_elements_at_back(__n);
    329       1.1  mrg 	  __try
    330       1.1  mrg 	    {
    331       1.1  mrg 	      std::__uninitialized_fill_a(this->_M_impl._M_finish,
    332       1.1  mrg 					  __new_finish, __x,
    333       1.1  mrg 					  _M_get_Tp_allocator());
    334       1.1  mrg 	      this->_M_impl._M_finish = __new_finish;
    335       1.1  mrg 	    }
    336       1.1  mrg 	  __catch(...)
    337       1.1  mrg 	    {
    338       1.1  mrg 	      _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
    339       1.1  mrg 			       __new_finish._M_node + 1);
    340       1.1  mrg 	      __throw_exception_again;
    341       1.1  mrg 	    }
    342       1.1  mrg 	}
    343       1.1  mrg       else
    344  1.1.1.10  mrg 	_M_insert_aux(__pos, __n, __x);
    345       1.1  mrg     }
    346       1.1  mrg 
    347   1.1.1.2  mrg #if __cplusplus >= 201103L
    348   1.1.1.2  mrg   template <typename _Tp, typename _Alloc>
    349   1.1.1.2  mrg     void
    350   1.1.1.2  mrg     deque<_Tp, _Alloc>::
    351   1.1.1.2  mrg     _M_default_append(size_type __n)
    352   1.1.1.2  mrg     {
    353   1.1.1.2  mrg       if (__n)
    354   1.1.1.2  mrg 	{
    355   1.1.1.2  mrg 	  iterator __new_finish = _M_reserve_elements_at_back(__n);
    356   1.1.1.2  mrg 	  __try
    357   1.1.1.2  mrg 	    {
    358   1.1.1.2  mrg 	      std::__uninitialized_default_a(this->_M_impl._M_finish,
    359   1.1.1.2  mrg 					     __new_finish,
    360   1.1.1.2  mrg 					     _M_get_Tp_allocator());
    361   1.1.1.2  mrg 	      this->_M_impl._M_finish = __new_finish;
    362   1.1.1.2  mrg 	    }
    363   1.1.1.2  mrg 	  __catch(...)
    364   1.1.1.2  mrg 	    {
    365   1.1.1.2  mrg 	      _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
    366   1.1.1.2  mrg 			       __new_finish._M_node + 1);
    367   1.1.1.2  mrg 	      __throw_exception_again;
    368   1.1.1.2  mrg 	    }
    369   1.1.1.2  mrg 	}
    370   1.1.1.2  mrg     }
    371   1.1.1.2  mrg 
    372   1.1.1.2  mrg   template <typename _Tp, typename _Alloc>
    373   1.1.1.2  mrg     bool
    374   1.1.1.2  mrg     deque<_Tp, _Alloc>::
    375   1.1.1.2  mrg     _M_shrink_to_fit()
    376   1.1.1.2  mrg     {
    377   1.1.1.2  mrg       const difference_type __front_capacity
    378   1.1.1.2  mrg 	= (this->_M_impl._M_start._M_cur - this->_M_impl._M_start._M_first);
    379   1.1.1.2  mrg       if (__front_capacity == 0)
    380   1.1.1.2  mrg 	return false;
    381   1.1.1.2  mrg 
    382   1.1.1.2  mrg       const difference_type __back_capacity
    383   1.1.1.2  mrg 	= (this->_M_impl._M_finish._M_last - this->_M_impl._M_finish._M_cur);
    384   1.1.1.2  mrg       if (__front_capacity + __back_capacity < _S_buffer_size())
    385   1.1.1.2  mrg 	return false;
    386   1.1.1.2  mrg 
    387   1.1.1.2  mrg       return std::__shrink_to_fit_aux<deque>::_S_do_it(*this);
    388   1.1.1.2  mrg     }
    389   1.1.1.2  mrg #endif
    390   1.1.1.2  mrg 
    391       1.1  mrg   template <typename _Tp, typename _Alloc>
    392       1.1  mrg     void
    393       1.1  mrg     deque<_Tp, _Alloc>::
    394       1.1  mrg     _M_fill_initialize(const value_type& __value)
    395       1.1  mrg     {
    396       1.1  mrg       _Map_pointer __cur;
    397       1.1  mrg       __try
    398  1.1.1.10  mrg 	{
    399  1.1.1.10  mrg 	  for (__cur = this->_M_impl._M_start._M_node;
    400       1.1  mrg 	       __cur < this->_M_impl._M_finish._M_node;
    401       1.1  mrg 	       ++__cur)
    402  1.1.1.10  mrg 	    std::__uninitialized_fill_a(*__cur, *__cur + _S_buffer_size(),
    403       1.1  mrg 					__value, _M_get_Tp_allocator());
    404  1.1.1.10  mrg 	  std::__uninitialized_fill_a(this->_M_impl._M_finish._M_first,
    405       1.1  mrg 				      this->_M_impl._M_finish._M_cur,
    406       1.1  mrg 				      __value, _M_get_Tp_allocator());
    407  1.1.1.10  mrg 	}
    408       1.1  mrg       __catch(...)
    409  1.1.1.10  mrg 	{
    410  1.1.1.10  mrg 	  std::_Destroy(this->_M_impl._M_start, iterator(*__cur, __cur),
    411       1.1  mrg 			_M_get_Tp_allocator());
    412  1.1.1.10  mrg 	  __throw_exception_again;
    413  1.1.1.10  mrg 	}
    414       1.1  mrg     }
    415       1.1  mrg 
    416       1.1  mrg   template <typename _Tp, typename _Alloc>
    417       1.1  mrg     template <typename _InputIterator>
    418       1.1  mrg       void
    419       1.1  mrg       deque<_Tp, _Alloc>::
    420       1.1  mrg       _M_range_initialize(_InputIterator __first, _InputIterator __last,
    421  1.1.1.10  mrg 			  std::input_iterator_tag)
    422       1.1  mrg       {
    423  1.1.1.10  mrg 	this->_M_initialize_map(0);
    424  1.1.1.10  mrg 	__try
    425  1.1.1.10  mrg 	  {
    426  1.1.1.10  mrg 	    for (; __first != __last; ++__first)
    427   1.1.1.2  mrg #if __cplusplus >= 201103L
    428   1.1.1.2  mrg 	      emplace_back(*__first);
    429   1.1.1.2  mrg #else
    430  1.1.1.10  mrg 	      push_back(*__first);
    431   1.1.1.2  mrg #endif
    432  1.1.1.10  mrg 	  }
    433  1.1.1.10  mrg 	__catch(...)
    434  1.1.1.10  mrg 	  {
    435  1.1.1.10  mrg 	    clear();
    436  1.1.1.10  mrg 	    __throw_exception_again;
    437  1.1.1.10  mrg 	  }
    438       1.1  mrg       }
    439       1.1  mrg 
    440       1.1  mrg   template <typename _Tp, typename _Alloc>
    441       1.1  mrg     template <typename _ForwardIterator>
    442       1.1  mrg       void
    443       1.1  mrg       deque<_Tp, _Alloc>::
    444       1.1  mrg       _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
    445  1.1.1.10  mrg 			  std::forward_iterator_tag)
    446       1.1  mrg       {
    447  1.1.1.10  mrg 	const size_type __n = std::distance(__first, __last);
    448  1.1.1.10  mrg 	this->_M_initialize_map(_S_check_init_len(__n, _M_get_Tp_allocator()));
    449       1.1  mrg 
    450  1.1.1.10  mrg 	_Map_pointer __cur_node;
    451  1.1.1.10  mrg 	__try
    452  1.1.1.10  mrg 	  {
    453  1.1.1.10  mrg 	    for (__cur_node = this->_M_impl._M_start._M_node;
    454  1.1.1.10  mrg 		 __cur_node < this->_M_impl._M_finish._M_node;
    455  1.1.1.10  mrg 		 ++__cur_node)
    456       1.1  mrg 	      {
    457  1.1.1.11  mrg 		if (__n < _S_buffer_size())
    458  1.1.1.11  mrg 		  __builtin_unreachable(); // See PR 100516
    459  1.1.1.11  mrg 
    460       1.1  mrg 		_ForwardIterator __mid = __first;
    461       1.1  mrg 		std::advance(__mid, _S_buffer_size());
    462       1.1  mrg 		std::__uninitialized_copy_a(__first, __mid, *__cur_node,
    463       1.1  mrg 					    _M_get_Tp_allocator());
    464       1.1  mrg 		__first = __mid;
    465       1.1  mrg 	      }
    466  1.1.1.10  mrg 	    std::__uninitialized_copy_a(__first, __last,
    467       1.1  mrg 					this->_M_impl._M_finish._M_first,
    468       1.1  mrg 					_M_get_Tp_allocator());
    469  1.1.1.10  mrg 	  }
    470  1.1.1.10  mrg 	__catch(...)
    471  1.1.1.10  mrg 	  {
    472  1.1.1.10  mrg 	    std::_Destroy(this->_M_impl._M_start,
    473       1.1  mrg 			  iterator(*__cur_node, __cur_node),
    474       1.1  mrg 			  _M_get_Tp_allocator());
    475  1.1.1.10  mrg 	    __throw_exception_again;
    476  1.1.1.10  mrg 	  }
    477       1.1  mrg       }
    478       1.1  mrg 
    479       1.1  mrg   // Called only if _M_impl._M_finish._M_cur == _M_impl._M_finish._M_last - 1.
    480       1.1  mrg   template<typename _Tp, typename _Alloc>
    481   1.1.1.2  mrg #if __cplusplus >= 201103L
    482       1.1  mrg     template<typename... _Args>
    483       1.1  mrg       void
    484       1.1  mrg       deque<_Tp, _Alloc>::
    485       1.1  mrg       _M_push_back_aux(_Args&&... __args)
    486       1.1  mrg #else
    487       1.1  mrg       void
    488       1.1  mrg       deque<_Tp, _Alloc>::
    489       1.1  mrg       _M_push_back_aux(const value_type& __t)
    490       1.1  mrg #endif
    491       1.1  mrg       {
    492   1.1.1.9  mrg 	if (size() == max_size())
    493   1.1.1.9  mrg 	  __throw_length_error(
    494   1.1.1.9  mrg 	      __N("cannot create std::deque larger than max_size()"));
    495   1.1.1.9  mrg 
    496       1.1  mrg 	_M_reserve_map_at_back();
    497       1.1  mrg 	*(this->_M_impl._M_finish._M_node + 1) = this->_M_allocate_node();
    498       1.1  mrg 	__try
    499       1.1  mrg 	  {
    500   1.1.1.2  mrg #if __cplusplus >= 201103L
    501   1.1.1.3  mrg 	    _Alloc_traits::construct(this->_M_impl,
    502  1.1.1.10  mrg 				     this->_M_impl._M_finish._M_cur,
    503  1.1.1.10  mrg 				     std::forward<_Args>(__args)...);
    504       1.1  mrg #else
    505       1.1  mrg 	    this->_M_impl.construct(this->_M_impl._M_finish._M_cur, __t);
    506       1.1  mrg #endif
    507       1.1  mrg 	    this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node
    508       1.1  mrg 						+ 1);
    509       1.1  mrg 	    this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_first;
    510       1.1  mrg 	  }
    511       1.1  mrg 	__catch(...)
    512       1.1  mrg 	  {
    513       1.1  mrg 	    _M_deallocate_node(*(this->_M_impl._M_finish._M_node + 1));
    514       1.1  mrg 	    __throw_exception_again;
    515       1.1  mrg 	  }
    516       1.1  mrg       }
    517       1.1  mrg 
    518       1.1  mrg   // Called only if _M_impl._M_start._M_cur == _M_impl._M_start._M_first.
    519       1.1  mrg   template<typename _Tp, typename _Alloc>
    520   1.1.1.2  mrg #if __cplusplus >= 201103L
    521       1.1  mrg     template<typename... _Args>
    522       1.1  mrg       void
    523       1.1  mrg       deque<_Tp, _Alloc>::
    524       1.1  mrg       _M_push_front_aux(_Args&&... __args)
    525       1.1  mrg #else
    526       1.1  mrg       void
    527       1.1  mrg       deque<_Tp, _Alloc>::
    528       1.1  mrg       _M_push_front_aux(const value_type& __t)
    529       1.1  mrg #endif
    530       1.1  mrg       {
    531   1.1.1.9  mrg 	if (size() == max_size())
    532   1.1.1.9  mrg 	  __throw_length_error(
    533   1.1.1.9  mrg 	      __N("cannot create std::deque larger than max_size()"));
    534   1.1.1.9  mrg 
    535       1.1  mrg 	_M_reserve_map_at_front();
    536       1.1  mrg 	*(this->_M_impl._M_start._M_node - 1) = this->_M_allocate_node();
    537       1.1  mrg 	__try
    538       1.1  mrg 	  {
    539       1.1  mrg 	    this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node
    540       1.1  mrg 					       - 1);
    541       1.1  mrg 	    this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_last - 1;
    542   1.1.1.2  mrg #if __cplusplus >= 201103L
    543   1.1.1.3  mrg 	    _Alloc_traits::construct(this->_M_impl,
    544  1.1.1.10  mrg 				     this->_M_impl._M_start._M_cur,
    545  1.1.1.10  mrg 				     std::forward<_Args>(__args)...);
    546       1.1  mrg #else
    547       1.1  mrg 	    this->_M_impl.construct(this->_M_impl._M_start._M_cur, __t);
    548       1.1  mrg #endif
    549       1.1  mrg 	  }
    550       1.1  mrg 	__catch(...)
    551       1.1  mrg 	  {
    552       1.1  mrg 	    ++this->_M_impl._M_start;
    553       1.1  mrg 	    _M_deallocate_node(*(this->_M_impl._M_start._M_node - 1));
    554       1.1  mrg 	    __throw_exception_again;
    555       1.1  mrg 	  }
    556       1.1  mrg       }
    557       1.1  mrg 
    558       1.1  mrg   // Called only if _M_impl._M_finish._M_cur == _M_impl._M_finish._M_first.
    559       1.1  mrg   template <typename _Tp, typename _Alloc>
    560       1.1  mrg     void deque<_Tp, _Alloc>::
    561       1.1  mrg     _M_pop_back_aux()
    562       1.1  mrg     {
    563       1.1  mrg       _M_deallocate_node(this->_M_impl._M_finish._M_first);
    564       1.1  mrg       this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node - 1);
    565       1.1  mrg       this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_last - 1;
    566   1.1.1.3  mrg       _Alloc_traits::destroy(_M_get_Tp_allocator(),
    567   1.1.1.3  mrg 			     this->_M_impl._M_finish._M_cur);
    568       1.1  mrg     }
    569       1.1  mrg 
    570       1.1  mrg   // Called only if _M_impl._M_start._M_cur == _M_impl._M_start._M_last - 1.
    571       1.1  mrg   // Note that if the deque has at least one element (a precondition for this
    572       1.1  mrg   // member function), and if
    573       1.1  mrg   //   _M_impl._M_start._M_cur == _M_impl._M_start._M_last,
    574       1.1  mrg   // then the deque must have at least two nodes.
    575       1.1  mrg   template <typename _Tp, typename _Alloc>
    576       1.1  mrg     void deque<_Tp, _Alloc>::
    577       1.1  mrg     _M_pop_front_aux()
    578       1.1  mrg     {
    579   1.1.1.3  mrg       _Alloc_traits::destroy(_M_get_Tp_allocator(),
    580   1.1.1.3  mrg 			     this->_M_impl._M_start._M_cur);
    581       1.1  mrg       _M_deallocate_node(this->_M_impl._M_start._M_first);
    582       1.1  mrg       this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node + 1);
    583       1.1  mrg       this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_first;
    584       1.1  mrg     }
    585       1.1  mrg 
    586       1.1  mrg   template <typename _Tp, typename _Alloc>
    587       1.1  mrg     template <typename _InputIterator>
    588       1.1  mrg       void
    589       1.1  mrg       deque<_Tp, _Alloc>::
    590       1.1  mrg       _M_range_insert_aux(iterator __pos,
    591  1.1.1.10  mrg 			  _InputIterator __first, _InputIterator __last,
    592  1.1.1.10  mrg 			  std::input_iterator_tag)
    593       1.1  mrg       { std::copy(__first, __last, std::inserter(*this, __pos)); }
    594       1.1  mrg 
    595       1.1  mrg   template <typename _Tp, typename _Alloc>
    596       1.1  mrg     template <typename _ForwardIterator>
    597       1.1  mrg       void
    598       1.1  mrg       deque<_Tp, _Alloc>::
    599       1.1  mrg       _M_range_insert_aux(iterator __pos,
    600  1.1.1.10  mrg 			  _ForwardIterator __first, _ForwardIterator __last,
    601  1.1.1.10  mrg 			  std::forward_iterator_tag)
    602       1.1  mrg       {
    603  1.1.1.10  mrg 	const size_type __n = std::distance(__first, __last);
    604  1.1.1.12  mrg 	if (__builtin_expect(__n == 0, 0))
    605  1.1.1.12  mrg 	  return;
    606  1.1.1.12  mrg 
    607  1.1.1.10  mrg 	if (__pos._M_cur == this->_M_impl._M_start._M_cur)
    608       1.1  mrg 	  {
    609       1.1  mrg 	    iterator __new_start = _M_reserve_elements_at_front(__n);
    610       1.1  mrg 	    __try
    611       1.1  mrg 	      {
    612       1.1  mrg 		std::__uninitialized_copy_a(__first, __last, __new_start,
    613       1.1  mrg 					    _M_get_Tp_allocator());
    614       1.1  mrg 		this->_M_impl._M_start = __new_start;
    615       1.1  mrg 	      }
    616       1.1  mrg 	    __catch(...)
    617       1.1  mrg 	      {
    618       1.1  mrg 		_M_destroy_nodes(__new_start._M_node,
    619       1.1  mrg 				 this->_M_impl._M_start._M_node);
    620       1.1  mrg 		__throw_exception_again;
    621       1.1  mrg 	      }
    622       1.1  mrg 	  }
    623  1.1.1.10  mrg 	else if (__pos._M_cur == this->_M_impl._M_finish._M_cur)
    624       1.1  mrg 	  {
    625       1.1  mrg 	    iterator __new_finish = _M_reserve_elements_at_back(__n);
    626       1.1  mrg 	    __try
    627       1.1  mrg 	      {
    628       1.1  mrg 		std::__uninitialized_copy_a(__first, __last,
    629       1.1  mrg 					    this->_M_impl._M_finish,
    630       1.1  mrg 					    _M_get_Tp_allocator());
    631       1.1  mrg 		this->_M_impl._M_finish = __new_finish;
    632       1.1  mrg 	      }
    633       1.1  mrg 	    __catch(...)
    634       1.1  mrg 	      {
    635       1.1  mrg 		_M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
    636       1.1  mrg 				 __new_finish._M_node + 1);
    637       1.1  mrg 		__throw_exception_again;
    638       1.1  mrg 	      }
    639       1.1  mrg 	  }
    640  1.1.1.10  mrg 	else
    641  1.1.1.10  mrg 	  _M_insert_aux(__pos, __first, __last, __n);
    642       1.1  mrg       }
    643       1.1  mrg 
    644       1.1  mrg   template<typename _Tp, typename _Alloc>
    645   1.1.1.2  mrg #if __cplusplus >= 201103L
    646       1.1  mrg     template<typename... _Args>
    647       1.1  mrg       typename deque<_Tp, _Alloc>::iterator
    648       1.1  mrg       deque<_Tp, _Alloc>::
    649  1.1.1.13  mrg       _M_emplace_aux(iterator __pos, _Args&&... __args)
    650       1.1  mrg       {
    651       1.1  mrg 	value_type __x_copy(std::forward<_Args>(__args)...); // XXX copy
    652       1.1  mrg #else
    653       1.1  mrg     typename deque<_Tp, _Alloc>::iterator
    654       1.1  mrg       deque<_Tp, _Alloc>::
    655       1.1  mrg       _M_insert_aux(iterator __pos, const value_type& __x)
    656       1.1  mrg       {
    657       1.1  mrg 	value_type __x_copy = __x; // XXX copy
    658       1.1  mrg #endif
    659       1.1  mrg 	difference_type __index = __pos - this->_M_impl._M_start;
    660       1.1  mrg 	if (static_cast<size_type>(__index) < size() / 2)
    661       1.1  mrg 	  {
    662       1.1  mrg 	    push_front(_GLIBCXX_MOVE(front()));
    663       1.1  mrg 	    iterator __front1 = this->_M_impl._M_start;
    664       1.1  mrg 	    ++__front1;
    665       1.1  mrg 	    iterator __front2 = __front1;
    666       1.1  mrg 	    ++__front2;
    667       1.1  mrg 	    __pos = this->_M_impl._M_start + __index;
    668       1.1  mrg 	    iterator __pos1 = __pos;
    669       1.1  mrg 	    ++__pos1;
    670       1.1  mrg 	    _GLIBCXX_MOVE3(__front2, __pos1, __front1);
    671       1.1  mrg 	  }
    672       1.1  mrg 	else
    673       1.1  mrg 	  {
    674       1.1  mrg 	    push_back(_GLIBCXX_MOVE(back()));
    675       1.1  mrg 	    iterator __back1 = this->_M_impl._M_finish;
    676       1.1  mrg 	    --__back1;
    677       1.1  mrg 	    iterator __back2 = __back1;
    678       1.1  mrg 	    --__back2;
    679       1.1  mrg 	    __pos = this->_M_impl._M_start + __index;
    680       1.1  mrg 	    _GLIBCXX_MOVE_BACKWARD3(__pos, __back2, __back1);
    681       1.1  mrg 	  }
    682       1.1  mrg 	*__pos = _GLIBCXX_MOVE(__x_copy);
    683       1.1  mrg 	return __pos;
    684       1.1  mrg       }
    685       1.1  mrg 
    686       1.1  mrg   template <typename _Tp, typename _Alloc>
    687       1.1  mrg     void
    688       1.1  mrg     deque<_Tp, _Alloc>::
    689       1.1  mrg     _M_insert_aux(iterator __pos, size_type __n, const value_type& __x)
    690       1.1  mrg     {
    691       1.1  mrg       const difference_type __elems_before = __pos - this->_M_impl._M_start;
    692       1.1  mrg       const size_type __length = this->size();
    693       1.1  mrg       value_type __x_copy = __x;
    694       1.1  mrg       if (__elems_before < difference_type(__length / 2))
    695       1.1  mrg 	{
    696       1.1  mrg 	  iterator __new_start = _M_reserve_elements_at_front(__n);
    697       1.1  mrg 	  iterator __old_start = this->_M_impl._M_start;
    698       1.1  mrg 	  __pos = this->_M_impl._M_start + __elems_before;
    699       1.1  mrg 	  __try
    700       1.1  mrg 	    {
    701       1.1  mrg 	      if (__elems_before >= difference_type(__n))
    702       1.1  mrg 		{
    703       1.1  mrg 		  iterator __start_n = (this->_M_impl._M_start
    704       1.1  mrg 					+ difference_type(__n));
    705       1.1  mrg 		  std::__uninitialized_move_a(this->_M_impl._M_start,
    706       1.1  mrg 					      __start_n, __new_start,
    707       1.1  mrg 					      _M_get_Tp_allocator());
    708       1.1  mrg 		  this->_M_impl._M_start = __new_start;
    709       1.1  mrg 		  _GLIBCXX_MOVE3(__start_n, __pos, __old_start);
    710       1.1  mrg 		  std::fill(__pos - difference_type(__n), __pos, __x_copy);
    711       1.1  mrg 		}
    712       1.1  mrg 	      else
    713       1.1  mrg 		{
    714       1.1  mrg 		  std::__uninitialized_move_fill(this->_M_impl._M_start,
    715       1.1  mrg 						 __pos, __new_start,
    716       1.1  mrg 						 this->_M_impl._M_start,
    717       1.1  mrg 						 __x_copy,
    718       1.1  mrg 						 _M_get_Tp_allocator());
    719       1.1  mrg 		  this->_M_impl._M_start = __new_start;
    720       1.1  mrg 		  std::fill(__old_start, __pos, __x_copy);
    721       1.1  mrg 		}
    722       1.1  mrg 	    }
    723       1.1  mrg 	  __catch(...)
    724       1.1  mrg 	    {
    725       1.1  mrg 	      _M_destroy_nodes(__new_start._M_node,
    726       1.1  mrg 			       this->_M_impl._M_start._M_node);
    727       1.1  mrg 	      __throw_exception_again;
    728       1.1  mrg 	    }
    729       1.1  mrg 	}
    730       1.1  mrg       else
    731       1.1  mrg 	{
    732       1.1  mrg 	  iterator __new_finish = _M_reserve_elements_at_back(__n);
    733       1.1  mrg 	  iterator __old_finish = this->_M_impl._M_finish;
    734       1.1  mrg 	  const difference_type __elems_after =
    735       1.1  mrg 	    difference_type(__length) - __elems_before;
    736       1.1  mrg 	  __pos = this->_M_impl._M_finish - __elems_after;
    737       1.1  mrg 	  __try
    738       1.1  mrg 	    {
    739       1.1  mrg 	      if (__elems_after > difference_type(__n))
    740       1.1  mrg 		{
    741       1.1  mrg 		  iterator __finish_n = (this->_M_impl._M_finish
    742       1.1  mrg 					 - difference_type(__n));
    743       1.1  mrg 		  std::__uninitialized_move_a(__finish_n,
    744       1.1  mrg 					      this->_M_impl._M_finish,
    745       1.1  mrg 					      this->_M_impl._M_finish,
    746       1.1  mrg 					      _M_get_Tp_allocator());
    747       1.1  mrg 		  this->_M_impl._M_finish = __new_finish;
    748       1.1  mrg 		  _GLIBCXX_MOVE_BACKWARD3(__pos, __finish_n, __old_finish);
    749       1.1  mrg 		  std::fill(__pos, __pos + difference_type(__n), __x_copy);
    750       1.1  mrg 		}
    751       1.1  mrg 	      else
    752       1.1  mrg 		{
    753       1.1  mrg 		  std::__uninitialized_fill_move(this->_M_impl._M_finish,
    754       1.1  mrg 						 __pos + difference_type(__n),
    755       1.1  mrg 						 __x_copy, __pos,
    756       1.1  mrg 						 this->_M_impl._M_finish,
    757       1.1  mrg 						 _M_get_Tp_allocator());
    758       1.1  mrg 		  this->_M_impl._M_finish = __new_finish;
    759       1.1  mrg 		  std::fill(__pos, __old_finish, __x_copy);
    760       1.1  mrg 		}
    761       1.1  mrg 	    }
    762       1.1  mrg 	  __catch(...)
    763       1.1  mrg 	    {
    764       1.1  mrg 	      _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
    765       1.1  mrg 			       __new_finish._M_node + 1);
    766       1.1  mrg 	      __throw_exception_again;
    767       1.1  mrg 	    }
    768       1.1  mrg 	}
    769       1.1  mrg     }
    770       1.1  mrg 
    771       1.1  mrg   template <typename _Tp, typename _Alloc>
    772       1.1  mrg     template <typename _ForwardIterator>
    773       1.1  mrg       void
    774       1.1  mrg       deque<_Tp, _Alloc>::
    775       1.1  mrg       _M_insert_aux(iterator __pos,
    776  1.1.1.10  mrg 		    _ForwardIterator __first, _ForwardIterator __last,
    777  1.1.1.10  mrg 		    size_type __n)
    778       1.1  mrg       {
    779  1.1.1.10  mrg 	const difference_type __elemsbefore = __pos - this->_M_impl._M_start;
    780  1.1.1.10  mrg 	const size_type __length = size();
    781  1.1.1.10  mrg 	if (static_cast<size_type>(__elemsbefore) < __length / 2)
    782       1.1  mrg 	  {
    783       1.1  mrg 	    iterator __new_start = _M_reserve_elements_at_front(__n);
    784       1.1  mrg 	    iterator __old_start = this->_M_impl._M_start;
    785       1.1  mrg 	    __pos = this->_M_impl._M_start + __elemsbefore;
    786       1.1  mrg 	    __try
    787       1.1  mrg 	      {
    788       1.1  mrg 		if (__elemsbefore >= difference_type(__n))
    789       1.1  mrg 		  {
    790       1.1  mrg 		    iterator __start_n = (this->_M_impl._M_start
    791       1.1  mrg 					  + difference_type(__n));
    792       1.1  mrg 		    std::__uninitialized_move_a(this->_M_impl._M_start,
    793       1.1  mrg 						__start_n, __new_start,
    794       1.1  mrg 						_M_get_Tp_allocator());
    795       1.1  mrg 		    this->_M_impl._M_start = __new_start;
    796       1.1  mrg 		    _GLIBCXX_MOVE3(__start_n, __pos, __old_start);
    797       1.1  mrg 		    std::copy(__first, __last, __pos - difference_type(__n));
    798       1.1  mrg 		  }
    799       1.1  mrg 		else
    800       1.1  mrg 		  {
    801       1.1  mrg 		    _ForwardIterator __mid = __first;
    802       1.1  mrg 		    std::advance(__mid, difference_type(__n) - __elemsbefore);
    803       1.1  mrg 		    std::__uninitialized_move_copy(this->_M_impl._M_start,
    804       1.1  mrg 						   __pos, __first, __mid,
    805       1.1  mrg 						   __new_start,
    806       1.1  mrg 						   _M_get_Tp_allocator());
    807       1.1  mrg 		    this->_M_impl._M_start = __new_start;
    808       1.1  mrg 		    std::copy(__mid, __last, __old_start);
    809       1.1  mrg 		  }
    810       1.1  mrg 	      }
    811       1.1  mrg 	    __catch(...)
    812       1.1  mrg 	      {
    813       1.1  mrg 		_M_destroy_nodes(__new_start._M_node,
    814       1.1  mrg 				 this->_M_impl._M_start._M_node);
    815       1.1  mrg 		__throw_exception_again;
    816       1.1  mrg 	      }
    817       1.1  mrg 	  }
    818  1.1.1.10  mrg 	else
    819  1.1.1.10  mrg 	{
    820  1.1.1.10  mrg 	  iterator __new_finish = _M_reserve_elements_at_back(__n);
    821  1.1.1.10  mrg 	  iterator __old_finish = this->_M_impl._M_finish;
    822  1.1.1.10  mrg 	  const difference_type __elemsafter =
    823  1.1.1.10  mrg 	    difference_type(__length) - __elemsbefore;
    824  1.1.1.10  mrg 	  __pos = this->_M_impl._M_finish - __elemsafter;
    825  1.1.1.10  mrg 	  __try
    826  1.1.1.10  mrg 	    {
    827  1.1.1.10  mrg 	      if (__elemsafter > difference_type(__n))
    828       1.1  mrg 		{
    829       1.1  mrg 		  iterator __finish_n = (this->_M_impl._M_finish
    830       1.1  mrg 					 - difference_type(__n));
    831       1.1  mrg 		  std::__uninitialized_move_a(__finish_n,
    832       1.1  mrg 					      this->_M_impl._M_finish,
    833       1.1  mrg 					      this->_M_impl._M_finish,
    834       1.1  mrg 					      _M_get_Tp_allocator());
    835       1.1  mrg 		  this->_M_impl._M_finish = __new_finish;
    836       1.1  mrg 		  _GLIBCXX_MOVE_BACKWARD3(__pos, __finish_n, __old_finish);
    837       1.1  mrg 		  std::copy(__first, __last, __pos);
    838       1.1  mrg 		}
    839  1.1.1.10  mrg 	      else
    840       1.1  mrg 		{
    841       1.1  mrg 		  _ForwardIterator __mid = __first;
    842       1.1  mrg 		  std::advance(__mid, __elemsafter);
    843       1.1  mrg 		  std::__uninitialized_copy_move(__mid, __last, __pos,
    844       1.1  mrg 						 this->_M_impl._M_finish,
    845       1.1  mrg 						 this->_M_impl._M_finish,
    846       1.1  mrg 						 _M_get_Tp_allocator());
    847       1.1  mrg 		  this->_M_impl._M_finish = __new_finish;
    848       1.1  mrg 		  std::copy(__first, __mid, __pos);
    849       1.1  mrg 		}
    850  1.1.1.10  mrg 	    }
    851  1.1.1.10  mrg 	  __catch(...)
    852  1.1.1.10  mrg 	    {
    853  1.1.1.10  mrg 	      _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
    854       1.1  mrg 			       __new_finish._M_node + 1);
    855  1.1.1.10  mrg 	      __throw_exception_again;
    856  1.1.1.10  mrg 	    }
    857  1.1.1.10  mrg 	}
    858       1.1  mrg       }
    859       1.1  mrg 
    860       1.1  mrg    template<typename _Tp, typename _Alloc>
    861       1.1  mrg      void
    862       1.1  mrg      deque<_Tp, _Alloc>::
    863       1.1  mrg      _M_destroy_data_aux(iterator __first, iterator __last)
    864       1.1  mrg      {
    865       1.1  mrg        for (_Map_pointer __node = __first._M_node + 1;
    866       1.1  mrg 	    __node < __last._M_node; ++__node)
    867       1.1  mrg 	 std::_Destroy(*__node, *__node + _S_buffer_size(),
    868       1.1  mrg 		       _M_get_Tp_allocator());
    869       1.1  mrg 
    870       1.1  mrg        if (__first._M_node != __last._M_node)
    871       1.1  mrg 	 {
    872       1.1  mrg 	   std::_Destroy(__first._M_cur, __first._M_last,
    873       1.1  mrg 			 _M_get_Tp_allocator());
    874       1.1  mrg 	   std::_Destroy(__last._M_first, __last._M_cur,
    875       1.1  mrg 			 _M_get_Tp_allocator());
    876       1.1  mrg 	 }
    877       1.1  mrg        else
    878       1.1  mrg 	 std::_Destroy(__first._M_cur, __last._M_cur,
    879       1.1  mrg 		       _M_get_Tp_allocator());
    880       1.1  mrg      }
    881       1.1  mrg 
    882       1.1  mrg   template <typename _Tp, typename _Alloc>
    883       1.1  mrg     void
    884       1.1  mrg     deque<_Tp, _Alloc>::
    885       1.1  mrg     _M_new_elements_at_front(size_type __new_elems)
    886       1.1  mrg     {
    887       1.1  mrg       if (this->max_size() - this->size() < __new_elems)
    888       1.1  mrg 	__throw_length_error(__N("deque::_M_new_elements_at_front"));
    889       1.1  mrg 
    890       1.1  mrg       const size_type __new_nodes = ((__new_elems + _S_buffer_size() - 1)
    891       1.1  mrg 				     / _S_buffer_size());
    892       1.1  mrg       _M_reserve_map_at_front(__new_nodes);
    893       1.1  mrg       size_type __i;
    894       1.1  mrg       __try
    895  1.1.1.10  mrg 	{
    896  1.1.1.10  mrg 	  for (__i = 1; __i <= __new_nodes; ++__i)
    897  1.1.1.10  mrg 	    *(this->_M_impl._M_start._M_node - __i) = this->_M_allocate_node();
    898  1.1.1.10  mrg 	}
    899       1.1  mrg       __catch(...)
    900  1.1.1.10  mrg 	{
    901  1.1.1.10  mrg 	  for (size_type __j = 1; __j < __i; ++__j)
    902  1.1.1.10  mrg 	    _M_deallocate_node(*(this->_M_impl._M_start._M_node - __j));
    903  1.1.1.10  mrg 	  __throw_exception_again;
    904  1.1.1.10  mrg 	}
    905       1.1  mrg     }
    906       1.1  mrg 
    907       1.1  mrg   template <typename _Tp, typename _Alloc>
    908       1.1  mrg     void
    909       1.1  mrg     deque<_Tp, _Alloc>::
    910       1.1  mrg     _M_new_elements_at_back(size_type __new_elems)
    911       1.1  mrg     {
    912       1.1  mrg       if (this->max_size() - this->size() < __new_elems)
    913       1.1  mrg 	__throw_length_error(__N("deque::_M_new_elements_at_back"));
    914       1.1  mrg 
    915       1.1  mrg       const size_type __new_nodes = ((__new_elems + _S_buffer_size() - 1)
    916       1.1  mrg 				     / _S_buffer_size());
    917       1.1  mrg       _M_reserve_map_at_back(__new_nodes);
    918       1.1  mrg       size_type __i;
    919       1.1  mrg       __try
    920  1.1.1.10  mrg 	{
    921  1.1.1.10  mrg 	  for (__i = 1; __i <= __new_nodes; ++__i)
    922  1.1.1.10  mrg 	    *(this->_M_impl._M_finish._M_node + __i) = this->_M_allocate_node();
    923  1.1.1.10  mrg 	}
    924       1.1  mrg       __catch(...)
    925  1.1.1.10  mrg 	{
    926  1.1.1.10  mrg 	  for (size_type __j = 1; __j < __i; ++__j)
    927  1.1.1.10  mrg 	    _M_deallocate_node(*(this->_M_impl._M_finish._M_node + __j));
    928  1.1.1.10  mrg 	  __throw_exception_again;
    929  1.1.1.10  mrg 	}
    930       1.1  mrg     }
    931       1.1  mrg 
    932       1.1  mrg   template <typename _Tp, typename _Alloc>
    933       1.1  mrg     void
    934       1.1  mrg     deque<_Tp, _Alloc>::
    935       1.1  mrg     _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front)
    936       1.1  mrg     {
    937       1.1  mrg       const size_type __old_num_nodes
    938       1.1  mrg 	= this->_M_impl._M_finish._M_node - this->_M_impl._M_start._M_node + 1;
    939       1.1  mrg       const size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;
    940       1.1  mrg 
    941       1.1  mrg       _Map_pointer __new_nstart;
    942       1.1  mrg       if (this->_M_impl._M_map_size > 2 * __new_num_nodes)
    943       1.1  mrg 	{
    944       1.1  mrg 	  __new_nstart = this->_M_impl._M_map + (this->_M_impl._M_map_size
    945       1.1  mrg 					 - __new_num_nodes) / 2
    946  1.1.1.10  mrg 			 + (__add_at_front ? __nodes_to_add : 0);
    947       1.1  mrg 	  if (__new_nstart < this->_M_impl._M_start._M_node)
    948       1.1  mrg 	    std::copy(this->_M_impl._M_start._M_node,
    949       1.1  mrg 		      this->_M_impl._M_finish._M_node + 1,
    950       1.1  mrg 		      __new_nstart);
    951       1.1  mrg 	  else
    952       1.1  mrg 	    std::copy_backward(this->_M_impl._M_start._M_node,
    953       1.1  mrg 			       this->_M_impl._M_finish._M_node + 1,
    954       1.1  mrg 			       __new_nstart + __old_num_nodes);
    955       1.1  mrg 	}
    956       1.1  mrg       else
    957       1.1  mrg 	{
    958       1.1  mrg 	  size_type __new_map_size = this->_M_impl._M_map_size
    959  1.1.1.10  mrg 				     + std::max(this->_M_impl._M_map_size,
    960       1.1  mrg 						__nodes_to_add) + 2;
    961       1.1  mrg 
    962       1.1  mrg 	  _Map_pointer __new_map = this->_M_allocate_map(__new_map_size);
    963       1.1  mrg 	  __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2
    964  1.1.1.10  mrg 			 + (__add_at_front ? __nodes_to_add : 0);
    965       1.1  mrg 	  std::copy(this->_M_impl._M_start._M_node,
    966       1.1  mrg 		    this->_M_impl._M_finish._M_node + 1,
    967       1.1  mrg 		    __new_nstart);
    968       1.1  mrg 	  _M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size);
    969       1.1  mrg 
    970       1.1  mrg 	  this->_M_impl._M_map = __new_map;
    971       1.1  mrg 	  this->_M_impl._M_map_size = __new_map_size;
    972       1.1  mrg 	}
    973       1.1  mrg 
    974       1.1  mrg       this->_M_impl._M_start._M_set_node(__new_nstart);
    975       1.1  mrg       this->_M_impl._M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);
    976       1.1  mrg     }
    977       1.1  mrg 
    978  1.1.1.10  mrg _GLIBCXX_END_NAMESPACE_CONTAINER
    979  1.1.1.10  mrg 
    980       1.1  mrg   // Overload for deque::iterators, exploiting the "segmented-iterator
    981       1.1  mrg   // optimization".
    982  1.1.1.10  mrg   template<typename _Tp, typename _VTp>
    983       1.1  mrg     void
    984  1.1.1.10  mrg     __fill_a1(const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>& __first,
    985  1.1.1.10  mrg 	      const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>& __last,
    986  1.1.1.10  mrg 	      const _VTp& __value)
    987       1.1  mrg     {
    988  1.1.1.10  mrg       typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> _Iter;
    989  1.1.1.10  mrg       if (__first._M_node != __last._M_node)
    990  1.1.1.10  mrg 	{
    991  1.1.1.10  mrg 	  std::__fill_a1(__first._M_cur, __first._M_last, __value);
    992       1.1  mrg 
    993  1.1.1.10  mrg 	  for (typename _Iter::_Map_pointer __node = __first._M_node + 1;
    994  1.1.1.10  mrg 	       __node < __last._M_node; ++__node)
    995  1.1.1.10  mrg 	    std::__fill_a1(*__node, *__node + _Iter::_S_buffer_size(), __value);
    996  1.1.1.10  mrg 
    997  1.1.1.10  mrg 	  std::__fill_a1(__last._M_first, __last._M_cur, __value);
    998  1.1.1.10  mrg 	}
    999  1.1.1.10  mrg       else
   1000  1.1.1.10  mrg 	std::__fill_a1(__first._M_cur, __last._M_cur, __value);
   1001  1.1.1.10  mrg     }
   1002       1.1  mrg 
   1003  1.1.1.10  mrg   template<bool _IsMove,
   1004  1.1.1.10  mrg 	   typename _Tp, typename _Ref, typename _Ptr, typename _OI>
   1005  1.1.1.10  mrg     _OI
   1006  1.1.1.10  mrg     __copy_move_dit(_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __first,
   1007  1.1.1.10  mrg 		    _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __last,
   1008  1.1.1.10  mrg 		    _OI __result)
   1009  1.1.1.10  mrg     {
   1010  1.1.1.10  mrg       typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> _Iter;
   1011       1.1  mrg       if (__first._M_node != __last._M_node)
   1012       1.1  mrg 	{
   1013  1.1.1.10  mrg 	  __result
   1014  1.1.1.10  mrg 	    = std::__copy_move_a1<_IsMove>(__first._M_cur, __first._M_last,
   1015  1.1.1.10  mrg 					   __result);
   1016  1.1.1.10  mrg 
   1017  1.1.1.10  mrg 	  for (typename _Iter::_Map_pointer __node = __first._M_node + 1;
   1018  1.1.1.10  mrg 	       __node != __last._M_node; ++__node)
   1019  1.1.1.10  mrg 	    __result
   1020  1.1.1.10  mrg 	      = std::__copy_move_a1<_IsMove>(*__node,
   1021  1.1.1.10  mrg 					     *__node + _Iter::_S_buffer_size(),
   1022  1.1.1.10  mrg 					     __result);
   1023  1.1.1.10  mrg 
   1024  1.1.1.10  mrg 	  return std::__copy_move_a1<_IsMove>(__last._M_first, __last._M_cur,
   1025  1.1.1.10  mrg 					      __result);
   1026       1.1  mrg 	}
   1027  1.1.1.10  mrg 
   1028  1.1.1.10  mrg       return std::__copy_move_a1<_IsMove>(__first._M_cur, __last._M_cur,
   1029  1.1.1.10  mrg 					  __result);
   1030       1.1  mrg     }
   1031       1.1  mrg 
   1032  1.1.1.10  mrg   template<bool _IsMove,
   1033  1.1.1.10  mrg 	   typename _Tp, typename _Ref, typename _Ptr, typename _OI>
   1034  1.1.1.10  mrg     _OI
   1035  1.1.1.10  mrg     __copy_move_a1(_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __first,
   1036  1.1.1.10  mrg 		   _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __last,
   1037  1.1.1.10  mrg 		   _OI __result)
   1038  1.1.1.10  mrg     { return __copy_move_dit<_IsMove>(__first, __last, __result); }
   1039  1.1.1.10  mrg 
   1040  1.1.1.10  mrg   template<bool _IsMove,
   1041  1.1.1.10  mrg 	   typename _ITp, typename _IRef, typename _IPtr, typename _OTp>
   1042  1.1.1.10  mrg     _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*>
   1043  1.1.1.10  mrg     __copy_move_a1(_GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __first,
   1044  1.1.1.10  mrg 		   _GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __last,
   1045  1.1.1.10  mrg 		   _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*> __result)
   1046  1.1.1.10  mrg     { return __copy_move_dit<_IsMove>(__first, __last, __result); }
   1047  1.1.1.10  mrg 
   1048  1.1.1.10  mrg   template<bool _IsMove, typename _II, typename _Tp>
   1049  1.1.1.10  mrg     typename __gnu_cxx::__enable_if<
   1050  1.1.1.10  mrg       __is_random_access_iter<_II>::__value,
   1051  1.1.1.10  mrg       _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> >::__type
   1052  1.1.1.10  mrg     __copy_move_a1(_II __first, _II __last,
   1053  1.1.1.10  mrg 		   _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> __result)
   1054       1.1  mrg     {
   1055  1.1.1.10  mrg       typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> _Iter;
   1056  1.1.1.10  mrg       typedef typename _Iter::difference_type difference_type;
   1057       1.1  mrg 
   1058       1.1  mrg       difference_type __len = __last - __first;
   1059       1.1  mrg       while (__len > 0)
   1060       1.1  mrg 	{
   1061       1.1  mrg 	  const difference_type __clen
   1062  1.1.1.10  mrg 	    = std::min(__len, __result._M_last - __result._M_cur);
   1063  1.1.1.10  mrg 	  std::__copy_move_a1<_IsMove>(__first, __first + __clen,
   1064  1.1.1.10  mrg 				       __result._M_cur);
   1065  1.1.1.10  mrg 
   1066       1.1  mrg 	  __first += __clen;
   1067       1.1  mrg 	  __result += __clen;
   1068       1.1  mrg 	  __len -= __clen;
   1069       1.1  mrg 	}
   1070  1.1.1.10  mrg 
   1071       1.1  mrg       return __result;
   1072       1.1  mrg     }
   1073       1.1  mrg 
   1074  1.1.1.11  mrg   template<bool _IsMove, typename _CharT>
   1075  1.1.1.11  mrg     typename __gnu_cxx::__enable_if<
   1076  1.1.1.11  mrg       __is_char<_CharT>::__value,
   1077  1.1.1.11  mrg       _GLIBCXX_STD_C::_Deque_iterator<_CharT, _CharT&, _CharT*> >::__type
   1078  1.1.1.11  mrg     __copy_move_a2(
   1079  1.1.1.11  mrg 	istreambuf_iterator<_CharT, char_traits<_CharT> > __first,
   1080  1.1.1.11  mrg 	istreambuf_iterator<_CharT, char_traits<_CharT> > __last,
   1081  1.1.1.11  mrg 	_GLIBCXX_STD_C::_Deque_iterator<_CharT, _CharT&, _CharT*> __result)
   1082  1.1.1.11  mrg     {
   1083  1.1.1.11  mrg       if (__first == __last)
   1084  1.1.1.11  mrg 	return __result;
   1085  1.1.1.11  mrg 
   1086  1.1.1.11  mrg       for (;;)
   1087  1.1.1.11  mrg 	{
   1088  1.1.1.11  mrg 	  const std::ptrdiff_t __len = __result._M_last - __result._M_cur;
   1089  1.1.1.11  mrg 	  const std::ptrdiff_t __nb
   1090  1.1.1.11  mrg 	    = std::__copy_n_a(__first, __len, __result._M_cur, false)
   1091  1.1.1.11  mrg 	    - __result._M_cur;
   1092  1.1.1.11  mrg 	  __result += __nb;
   1093  1.1.1.11  mrg 
   1094  1.1.1.11  mrg 	  if (__nb != __len)
   1095  1.1.1.11  mrg 	    break;
   1096  1.1.1.11  mrg 	}
   1097  1.1.1.11  mrg 
   1098  1.1.1.11  mrg       return __result;
   1099  1.1.1.11  mrg     }
   1100  1.1.1.11  mrg 
   1101  1.1.1.11  mrg   template<typename _CharT, typename _Size>
   1102  1.1.1.11  mrg     typename __gnu_cxx::__enable_if<
   1103  1.1.1.11  mrg       __is_char<_CharT>::__value,
   1104  1.1.1.11  mrg       _GLIBCXX_STD_C::_Deque_iterator<_CharT, _CharT&, _CharT*> >::__type
   1105  1.1.1.11  mrg     __copy_n_a(
   1106  1.1.1.11  mrg       istreambuf_iterator<_CharT, char_traits<_CharT> > __it, _Size __size,
   1107  1.1.1.11  mrg       _GLIBCXX_STD_C::_Deque_iterator<_CharT, _CharT&, _CharT*> __result,
   1108  1.1.1.11  mrg       bool __strict)
   1109  1.1.1.11  mrg     {
   1110  1.1.1.11  mrg       if (__size == 0)
   1111  1.1.1.11  mrg 	return __result;
   1112  1.1.1.11  mrg 
   1113  1.1.1.11  mrg       do
   1114  1.1.1.11  mrg 	{
   1115  1.1.1.11  mrg 	  const _Size __len
   1116  1.1.1.11  mrg 	    = std::min<_Size>(__result._M_last - __result._M_cur, __size);
   1117  1.1.1.11  mrg 	  std::__copy_n_a(__it, __len, __result._M_cur, __strict);
   1118  1.1.1.11  mrg 	  __result += __len;
   1119  1.1.1.11  mrg 	  __size -= __len;
   1120  1.1.1.11  mrg 	}
   1121  1.1.1.11  mrg       while (__size != 0);
   1122  1.1.1.11  mrg       return __result;
   1123  1.1.1.11  mrg     }
   1124  1.1.1.11  mrg 
   1125  1.1.1.10  mrg   template<bool _IsMove,
   1126  1.1.1.10  mrg 	   typename _Tp, typename _Ref, typename _Ptr, typename _OI>
   1127  1.1.1.10  mrg     _OI
   1128  1.1.1.10  mrg     __copy_move_backward_dit(
   1129  1.1.1.10  mrg 		_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __first,
   1130  1.1.1.10  mrg 		_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __last,
   1131  1.1.1.10  mrg 		_OI __result)
   1132  1.1.1.10  mrg     {
   1133  1.1.1.10  mrg       typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> _Iter;
   1134  1.1.1.10  mrg       if (__first._M_node != __last._M_node)
   1135  1.1.1.10  mrg 	{
   1136  1.1.1.10  mrg 	  __result = std::__copy_move_backward_a1<_IsMove>(
   1137  1.1.1.10  mrg 		__last._M_first, __last._M_cur, __result);
   1138  1.1.1.10  mrg 
   1139  1.1.1.10  mrg 	  for (typename _Iter::_Map_pointer __node = __last._M_node - 1;
   1140  1.1.1.10  mrg 	       __node != __first._M_node; --__node)
   1141  1.1.1.10  mrg 	    __result = std::__copy_move_backward_a1<_IsMove>(
   1142  1.1.1.10  mrg 		*__node, *__node + _Iter::_S_buffer_size(), __result);
   1143  1.1.1.10  mrg 
   1144  1.1.1.10  mrg 	  return std::__copy_move_backward_a1<_IsMove>(
   1145  1.1.1.10  mrg 			__first._M_cur, __first._M_last, __result);
   1146  1.1.1.10  mrg 	}
   1147  1.1.1.10  mrg 
   1148  1.1.1.10  mrg       return std::__copy_move_backward_a1<_IsMove>(
   1149  1.1.1.10  mrg 		__first._M_cur, __last._M_cur, __result);
   1150  1.1.1.10  mrg     }
   1151  1.1.1.10  mrg 
   1152  1.1.1.10  mrg   template<bool _IsMove,
   1153  1.1.1.10  mrg 	   typename _Tp, typename _Ref, typename _Ptr, typename _OI>
   1154  1.1.1.10  mrg     _OI
   1155  1.1.1.10  mrg     __copy_move_backward_a1(
   1156  1.1.1.10  mrg 		_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __first,
   1157  1.1.1.10  mrg 		_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __last,
   1158  1.1.1.10  mrg 		_OI __result)
   1159  1.1.1.10  mrg     { return __copy_move_backward_dit<_IsMove>(__first, __last, __result); }
   1160  1.1.1.10  mrg 
   1161  1.1.1.10  mrg   template<bool _IsMove,
   1162  1.1.1.10  mrg 	   typename _ITp, typename _IRef, typename _IPtr, typename _OTp>
   1163  1.1.1.10  mrg     _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*>
   1164  1.1.1.10  mrg     __copy_move_backward_a1(
   1165  1.1.1.10  mrg 		_GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __first,
   1166  1.1.1.10  mrg 		_GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __last,
   1167  1.1.1.10  mrg 		_GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*> __result)
   1168  1.1.1.10  mrg     { return __copy_move_backward_dit<_IsMove>(__first, __last, __result); }
   1169  1.1.1.10  mrg 
   1170  1.1.1.10  mrg   template<bool _IsMove, typename _II, typename _Tp>
   1171  1.1.1.10  mrg     typename __gnu_cxx::__enable_if<
   1172  1.1.1.10  mrg       __is_random_access_iter<_II>::__value,
   1173  1.1.1.10  mrg       _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> >::__type
   1174  1.1.1.10  mrg     __copy_move_backward_a1(_II __first, _II __last,
   1175  1.1.1.10  mrg 		_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> __result)
   1176       1.1  mrg     {
   1177  1.1.1.10  mrg       typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> _Iter;
   1178  1.1.1.10  mrg       typedef typename _Iter::difference_type difference_type;
   1179       1.1  mrg 
   1180       1.1  mrg       difference_type __len = __last - __first;
   1181       1.1  mrg       while (__len > 0)
   1182       1.1  mrg 	{
   1183       1.1  mrg 	  difference_type __rlen = __result._M_cur - __result._M_first;
   1184       1.1  mrg 	  _Tp* __rend = __result._M_cur;
   1185       1.1  mrg 	  if (!__rlen)
   1186       1.1  mrg 	    {
   1187  1.1.1.10  mrg 	      __rlen = _Iter::_S_buffer_size();
   1188       1.1  mrg 	      __rend = *(__result._M_node - 1) + __rlen;
   1189       1.1  mrg 	    }
   1190       1.1  mrg 
   1191  1.1.1.10  mrg 	  const difference_type __clen = std::min(__len, __rlen);
   1192  1.1.1.10  mrg 	  std::__copy_move_backward_a1<_IsMove>(__last - __clen, __last, __rend);
   1193  1.1.1.10  mrg 
   1194       1.1  mrg 	  __last -= __clen;
   1195       1.1  mrg 	  __result -= __clen;
   1196       1.1  mrg 	  __len -= __clen;
   1197       1.1  mrg 	}
   1198  1.1.1.10  mrg 
   1199       1.1  mrg       return __result;
   1200       1.1  mrg     }
   1201       1.1  mrg 
   1202  1.1.1.10  mrg   template<typename _Tp, typename _Ref, typename _Ptr, typename _II>
   1203  1.1.1.10  mrg     bool
   1204  1.1.1.10  mrg     __equal_dit(
   1205  1.1.1.10  mrg 	const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr>& __first1,
   1206  1.1.1.10  mrg 	const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr>& __last1,
   1207  1.1.1.10  mrg 	_II __first2)
   1208       1.1  mrg     {
   1209  1.1.1.10  mrg       typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> _Iter;
   1210  1.1.1.10  mrg       if (__first1._M_node != __last1._M_node)
   1211       1.1  mrg 	{
   1212  1.1.1.10  mrg 	  if (!std::__equal_aux1(__first1._M_cur, __first1._M_last, __first2))
   1213  1.1.1.10  mrg 	    return false;
   1214  1.1.1.10  mrg 
   1215  1.1.1.10  mrg 	  __first2 += __first1._M_last - __first1._M_cur;
   1216  1.1.1.10  mrg 	  for (typename _Iter::_Map_pointer __node = __first1._M_node + 1;
   1217  1.1.1.10  mrg 	       __node != __last1._M_node;
   1218  1.1.1.10  mrg 	       __first2 += _Iter::_S_buffer_size(), ++__node)
   1219  1.1.1.10  mrg 	    if (!std::__equal_aux1(*__node, *__node + _Iter::_S_buffer_size(),
   1220  1.1.1.10  mrg 				  __first2))
   1221  1.1.1.10  mrg 	      return false;
   1222  1.1.1.10  mrg 
   1223  1.1.1.10  mrg 	  return std::__equal_aux1(__last1._M_first, __last1._M_cur, __first2);
   1224       1.1  mrg 	}
   1225  1.1.1.10  mrg 
   1226  1.1.1.10  mrg       return std::__equal_aux1(__first1._M_cur, __last1._M_cur, __first2);
   1227       1.1  mrg     }
   1228       1.1  mrg 
   1229  1.1.1.10  mrg   template<typename _Tp, typename _Ref, typename _Ptr, typename _II>
   1230  1.1.1.10  mrg     typename __gnu_cxx::__enable_if<
   1231  1.1.1.10  mrg       __is_random_access_iter<_II>::__value, bool>::__type
   1232  1.1.1.10  mrg     __equal_aux1(_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __first1,
   1233  1.1.1.10  mrg 		 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __last1,
   1234  1.1.1.10  mrg 		 _II __first2)
   1235  1.1.1.10  mrg     { return std::__equal_dit(__first1, __last1, __first2); }
   1236  1.1.1.10  mrg 
   1237  1.1.1.10  mrg   template<typename _Tp1, typename _Ref1, typename _Ptr1,
   1238  1.1.1.10  mrg 	   typename _Tp2, typename _Ref2, typename _Ptr2>
   1239  1.1.1.10  mrg     bool
   1240  1.1.1.10  mrg     __equal_aux1(_GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1> __first1,
   1241  1.1.1.10  mrg 		 _GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1> __last1,
   1242  1.1.1.10  mrg 		 _GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2> __first2)
   1243  1.1.1.10  mrg     { return std::__equal_dit(__first1, __last1, __first2); }
   1244  1.1.1.10  mrg 
   1245  1.1.1.10  mrg   template<typename _II, typename _Tp, typename _Ref, typename _Ptr>
   1246  1.1.1.10  mrg     typename __gnu_cxx::__enable_if<
   1247  1.1.1.10  mrg       __is_random_access_iter<_II>::__value, bool>::__type
   1248  1.1.1.10  mrg     __equal_aux1(_II __first1, _II __last1,
   1249  1.1.1.10  mrg 		_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __first2)
   1250       1.1  mrg     {
   1251  1.1.1.10  mrg       typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> _Iter;
   1252  1.1.1.10  mrg       typedef typename _Iter::difference_type difference_type;
   1253       1.1  mrg 
   1254  1.1.1.10  mrg       difference_type __len = __last1 - __first1;
   1255       1.1  mrg       while (__len > 0)
   1256       1.1  mrg 	{
   1257  1.1.1.10  mrg 	  const difference_type __clen
   1258  1.1.1.10  mrg 	    = std::min(__len, __first2._M_last - __first2._M_cur);
   1259  1.1.1.10  mrg 	  if (!std::__equal_aux1(__first1, __first1 + __clen, __first2._M_cur))
   1260  1.1.1.10  mrg 	    return false;
   1261       1.1  mrg 
   1262  1.1.1.10  mrg 	  __first1 += __clen;
   1263       1.1  mrg 	  __len -= __clen;
   1264  1.1.1.10  mrg 	  __first2 += __clen;
   1265       1.1  mrg 	}
   1266  1.1.1.10  mrg 
   1267  1.1.1.10  mrg       return true;
   1268       1.1  mrg     }
   1269       1.1  mrg 
   1270  1.1.1.11  mrg   template<typename _Tp1, typename _Ref, typename _Ptr, typename _Tp2>
   1271  1.1.1.11  mrg     int
   1272  1.1.1.11  mrg     __lex_cmp_dit(
   1273  1.1.1.11  mrg 	_GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref, _Ptr> __first1,
   1274  1.1.1.11  mrg 	_GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref, _Ptr> __last1,
   1275  1.1.1.11  mrg 	const _Tp2* __first2, const _Tp2* __last2)
   1276  1.1.1.11  mrg     {
   1277  1.1.1.11  mrg       const bool __simple =
   1278  1.1.1.11  mrg 	(__is_memcmp_ordered_with<_Tp1, _Tp2>::__value
   1279  1.1.1.11  mrg 	 && __is_pointer<_Ptr>::__value
   1280  1.1.1.11  mrg #if __cplusplus > 201703L && __cpp_lib_concepts
   1281  1.1.1.11  mrg 	 // For C++20 iterator_traits<volatile T*>::value_type is non-volatile
   1282  1.1.1.11  mrg 	 // so __is_byte<T> could be true, but we can't use memcmp with
   1283  1.1.1.11  mrg 	 // volatile data.
   1284  1.1.1.11  mrg 	 && !is_volatile_v<_Tp1>
   1285  1.1.1.11  mrg 	 && !is_volatile_v<_Tp2>
   1286  1.1.1.11  mrg #endif
   1287  1.1.1.11  mrg 	 );
   1288  1.1.1.11  mrg       typedef std::__lexicographical_compare<__simple> _Lc;
   1289  1.1.1.11  mrg 
   1290  1.1.1.11  mrg       while (__first1._M_node != __last1._M_node)
   1291  1.1.1.11  mrg 	{
   1292  1.1.1.11  mrg 	  const ptrdiff_t __len1 = __first1._M_last - __first1._M_cur;
   1293  1.1.1.11  mrg 	  const ptrdiff_t __len2 = __last2 - __first2;
   1294  1.1.1.11  mrg 	  const ptrdiff_t __len = std::min(__len1, __len2);
   1295  1.1.1.11  mrg 	  // if __len1 > __len2 this will return a positive value:
   1296  1.1.1.11  mrg 	  if (int __ret = _Lc::__3way(__first1._M_cur, __first1._M_last,
   1297  1.1.1.11  mrg 				      __first2, __first2 + __len))
   1298  1.1.1.11  mrg 	    return __ret;
   1299  1.1.1.11  mrg 
   1300  1.1.1.11  mrg 	  __first1 += __len;
   1301  1.1.1.11  mrg 	  __first2 += __len;
   1302  1.1.1.11  mrg 	}
   1303  1.1.1.11  mrg       return _Lc::__3way(__first1._M_cur, __last1._M_cur,
   1304  1.1.1.11  mrg 			 __first2, __last2);
   1305  1.1.1.11  mrg     }
   1306  1.1.1.11  mrg 
   1307  1.1.1.11  mrg   template<typename _Tp1, typename _Ref1, typename _Ptr1,
   1308  1.1.1.11  mrg 	   typename _Tp2>
   1309  1.1.1.11  mrg     inline bool
   1310  1.1.1.11  mrg     __lexicographical_compare_aux1(
   1311  1.1.1.11  mrg 	_GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1> __first1,
   1312  1.1.1.11  mrg 	_GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1> __last1,
   1313  1.1.1.11  mrg 	_Tp2* __first2, _Tp2* __last2)
   1314  1.1.1.11  mrg     { return std::__lex_cmp_dit(__first1, __last1, __first2, __last2) < 0; }
   1315  1.1.1.11  mrg 
   1316  1.1.1.11  mrg   template<typename _Tp1,
   1317  1.1.1.11  mrg 	   typename _Tp2, typename _Ref2, typename _Ptr2>
   1318  1.1.1.11  mrg     inline  bool
   1319  1.1.1.11  mrg     __lexicographical_compare_aux1(_Tp1* __first1, _Tp1* __last1,
   1320  1.1.1.11  mrg 	_GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2> __first2,
   1321  1.1.1.11  mrg 	_GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2> __last2)
   1322  1.1.1.11  mrg     { return std::__lex_cmp_dit(__first2, __last2, __first1, __last1) > 0; }
   1323  1.1.1.11  mrg 
   1324  1.1.1.11  mrg   template<typename _Tp1, typename _Ref1, typename _Ptr1,
   1325  1.1.1.11  mrg 	   typename _Tp2, typename _Ref2, typename _Ptr2>
   1326  1.1.1.11  mrg     inline bool
   1327  1.1.1.11  mrg     __lexicographical_compare_aux1(
   1328  1.1.1.11  mrg 		_GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1> __first1,
   1329  1.1.1.11  mrg 		_GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1> __last1,
   1330  1.1.1.11  mrg 		_GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2> __first2,
   1331  1.1.1.11  mrg 		_GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2> __last2)
   1332  1.1.1.11  mrg     {
   1333  1.1.1.11  mrg       const bool __simple =
   1334  1.1.1.11  mrg 	(__is_memcmp_ordered_with<_Tp1, _Tp2>::__value
   1335  1.1.1.11  mrg 	 && __is_pointer<_Ptr1>::__value
   1336  1.1.1.11  mrg 	 && __is_pointer<_Ptr2>::__value
   1337  1.1.1.11  mrg #if __cplusplus > 201703L && __cpp_lib_concepts
   1338  1.1.1.11  mrg 	 // For C++20 iterator_traits<volatile T*>::value_type is non-volatile
   1339  1.1.1.11  mrg 	 // so __is_byte<T> could be true, but we can't use memcmp with
   1340  1.1.1.11  mrg 	 // volatile data.
   1341  1.1.1.11  mrg 	 && !is_volatile_v<_Tp1>
   1342  1.1.1.11  mrg 	 && !is_volatile_v<_Tp2>
   1343  1.1.1.11  mrg #endif
   1344  1.1.1.11  mrg 	 );
   1345  1.1.1.11  mrg       typedef std::__lexicographical_compare<__simple> _Lc;
   1346  1.1.1.11  mrg 
   1347  1.1.1.11  mrg       while (__first1 != __last1)
   1348  1.1.1.11  mrg 	{
   1349  1.1.1.11  mrg 	  const ptrdiff_t __len2 = __first2._M_node == __last2._M_node
   1350  1.1.1.11  mrg 	    ? __last2._M_cur - __first2._M_cur
   1351  1.1.1.11  mrg 	    : __first2._M_last - __first2._M_cur;
   1352  1.1.1.11  mrg 	  if (__len2 == 0)
   1353  1.1.1.11  mrg 	    return false;
   1354  1.1.1.11  mrg 	  const ptrdiff_t __len1 = __first1._M_node == __last1._M_node
   1355  1.1.1.11  mrg 	    ? __last1._M_cur - __first1._M_cur
   1356  1.1.1.11  mrg 	    : __first1._M_last - __first1._M_cur;
   1357  1.1.1.11  mrg 	  const ptrdiff_t __len = std::min(__len1, __len2);
   1358  1.1.1.11  mrg 	  if (int __ret = _Lc::__3way(__first1._M_cur, __first1._M_cur + __len,
   1359  1.1.1.11  mrg 				      __first2._M_cur, __first2._M_cur + __len))
   1360  1.1.1.11  mrg 	    return __ret < 0;
   1361  1.1.1.11  mrg 
   1362  1.1.1.11  mrg 	  __first1 += __len;
   1363  1.1.1.11  mrg 	  __first2 += __len;
   1364  1.1.1.11  mrg 	}
   1365  1.1.1.11  mrg 
   1366  1.1.1.11  mrg       return __last2 != __first2;
   1367  1.1.1.11  mrg     }
   1368  1.1.1.11  mrg 
   1369   1.1.1.8  mrg _GLIBCXX_END_NAMESPACE_VERSION
   1370   1.1.1.2  mrg } // namespace std
   1371       1.1  mrg 
   1372       1.1  mrg #endif
   1373