xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/bits/vector.tcc (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg // Vector implementation (out of line) -*- C++ -*-
21debfc3dSmrg 
3*8feb0f0bSmrg // Copyright (C) 2001-2020 Free Software Foundation, Inc.
41debfc3dSmrg //
51debfc3dSmrg // This file is part of the GNU ISO C++ Library.  This library is free
61debfc3dSmrg // software; you can redistribute it and/or modify it under the
71debfc3dSmrg // terms of the GNU General Public License as published by the
81debfc3dSmrg // Free Software Foundation; either version 3, or (at your option)
91debfc3dSmrg // any later version.
101debfc3dSmrg 
111debfc3dSmrg // This library is distributed in the hope that it will be useful,
121debfc3dSmrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
131debfc3dSmrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
141debfc3dSmrg // GNU General Public License for more details.
151debfc3dSmrg 
161debfc3dSmrg // Under Section 7 of GPL version 3, you are granted additional
171debfc3dSmrg // permissions described in the GCC Runtime Library Exception, version
181debfc3dSmrg // 3.1, as published by the Free Software Foundation.
191debfc3dSmrg 
201debfc3dSmrg // You should have received a copy of the GNU General Public License and
211debfc3dSmrg // a copy of the GCC Runtime Library Exception along with this program;
221debfc3dSmrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
231debfc3dSmrg // <http://www.gnu.org/licenses/>.
241debfc3dSmrg 
251debfc3dSmrg /*
261debfc3dSmrg  *
271debfc3dSmrg  * Copyright (c) 1994
281debfc3dSmrg  * Hewlett-Packard Company
291debfc3dSmrg  *
301debfc3dSmrg  * Permission to use, copy, modify, distribute and sell this software
311debfc3dSmrg  * and its documentation for any purpose is hereby granted without fee,
321debfc3dSmrg  * provided that the above copyright notice appear in all copies and
331debfc3dSmrg  * that both that copyright notice and this permission notice appear
341debfc3dSmrg  * in supporting documentation.  Hewlett-Packard Company makes no
351debfc3dSmrg  * representations about the suitability of this software for any
361debfc3dSmrg  * purpose.  It is provided "as is" without express or implied warranty.
371debfc3dSmrg  *
381debfc3dSmrg  *
391debfc3dSmrg  * Copyright (c) 1996
401debfc3dSmrg  * Silicon Graphics Computer Systems, Inc.
411debfc3dSmrg  *
421debfc3dSmrg  * Permission to use, copy, modify, distribute and sell this software
431debfc3dSmrg  * and its documentation for any purpose is hereby granted without fee,
441debfc3dSmrg  * provided that the above copyright notice appear in all copies and
451debfc3dSmrg  * that both that copyright notice and this permission notice appear
461debfc3dSmrg  * in supporting documentation.  Silicon Graphics makes no
471debfc3dSmrg  * representations about the suitability of this  software for any
481debfc3dSmrg  * purpose.  It is provided "as is" without express or implied warranty.
491debfc3dSmrg  */
501debfc3dSmrg 
511debfc3dSmrg /** @file bits/vector.tcc
521debfc3dSmrg  *  This is an internal header file, included by other library headers.
531debfc3dSmrg  *  Do not attempt to use it directly. @headername{vector}
541debfc3dSmrg  */
551debfc3dSmrg 
561debfc3dSmrg #ifndef _VECTOR_TCC
571debfc3dSmrg #define _VECTOR_TCC 1
581debfc3dSmrg 
591debfc3dSmrg namespace std _GLIBCXX_VISIBILITY(default)
601debfc3dSmrg {
61a2dc1f3fSmrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
621debfc3dSmrg _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
631debfc3dSmrg 
641debfc3dSmrg   template<typename _Tp, typename _Alloc>
651debfc3dSmrg     void
661debfc3dSmrg     vector<_Tp, _Alloc>::
reserve(size_type __n)671debfc3dSmrg     reserve(size_type __n)
681debfc3dSmrg     {
691debfc3dSmrg       if (__n > this->max_size())
701debfc3dSmrg 	__throw_length_error(__N("vector::reserve"));
711debfc3dSmrg       if (this->capacity() < __n)
721debfc3dSmrg 	{
731debfc3dSmrg 	  const size_type __old_size = size();
74c0a68be4Smrg 	  pointer __tmp;
75c0a68be4Smrg #if __cplusplus >= 201103L
76c0a68be4Smrg 	  if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
77c0a68be4Smrg 	    {
78c0a68be4Smrg 	      __tmp = this->_M_allocate(__n);
79c0a68be4Smrg 	      _S_relocate(this->_M_impl._M_start, this->_M_impl._M_finish,
80c0a68be4Smrg 			  __tmp, _M_get_Tp_allocator());
81c0a68be4Smrg 	    }
82c0a68be4Smrg 	  else
83c0a68be4Smrg #endif
84c0a68be4Smrg 	    {
85c0a68be4Smrg 	      __tmp = _M_allocate_and_copy(__n,
861debfc3dSmrg 		_GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(this->_M_impl._M_start),
871debfc3dSmrg 		_GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(this->_M_impl._M_finish));
881debfc3dSmrg 	      std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
891debfc3dSmrg 			    _M_get_Tp_allocator());
90c0a68be4Smrg 	    }
91c0a68be4Smrg 	  _GLIBCXX_ASAN_ANNOTATE_REINIT;
921debfc3dSmrg 	  _M_deallocate(this->_M_impl._M_start,
931debfc3dSmrg 			this->_M_impl._M_end_of_storage
941debfc3dSmrg 			- this->_M_impl._M_start);
951debfc3dSmrg 	  this->_M_impl._M_start = __tmp;
961debfc3dSmrg 	  this->_M_impl._M_finish = __tmp + __old_size;
971debfc3dSmrg 	  this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
981debfc3dSmrg 	}
991debfc3dSmrg     }
1001debfc3dSmrg 
1011debfc3dSmrg #if __cplusplus >= 201103L
1021debfc3dSmrg   template<typename _Tp, typename _Alloc>
1031debfc3dSmrg     template<typename... _Args>
1041debfc3dSmrg #if __cplusplus > 201402L
1051debfc3dSmrg       typename vector<_Tp, _Alloc>::reference
1061debfc3dSmrg #else
1071debfc3dSmrg       void
1081debfc3dSmrg #endif
1091debfc3dSmrg       vector<_Tp, _Alloc>::
emplace_back(_Args &&...__args)1101debfc3dSmrg       emplace_back(_Args&&... __args)
1111debfc3dSmrg       {
1121debfc3dSmrg 	if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
1131debfc3dSmrg 	  {
114a2dc1f3fSmrg 	    _GLIBCXX_ASAN_ANNOTATE_GROW(1);
1151debfc3dSmrg 	    _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
1161debfc3dSmrg 				     std::forward<_Args>(__args)...);
1171debfc3dSmrg 	    ++this->_M_impl._M_finish;
118a2dc1f3fSmrg 	    _GLIBCXX_ASAN_ANNOTATE_GREW(1);
1191debfc3dSmrg 	  }
1201debfc3dSmrg 	else
1211debfc3dSmrg 	  _M_realloc_insert(end(), std::forward<_Args>(__args)...);
1221debfc3dSmrg #if __cplusplus > 201402L
1231debfc3dSmrg 	return back();
1241debfc3dSmrg #endif
1251debfc3dSmrg       }
1261debfc3dSmrg #endif
1271debfc3dSmrg 
1281debfc3dSmrg   template<typename _Tp, typename _Alloc>
1291debfc3dSmrg     typename vector<_Tp, _Alloc>::iterator
1301debfc3dSmrg     vector<_Tp, _Alloc>::
1311debfc3dSmrg #if __cplusplus >= 201103L
insert(const_iterator __position,const value_type & __x)1321debfc3dSmrg     insert(const_iterator __position, const value_type& __x)
1331debfc3dSmrg #else
1341debfc3dSmrg     insert(iterator __position, const value_type& __x)
1351debfc3dSmrg #endif
1361debfc3dSmrg     {
1371debfc3dSmrg       const size_type __n = __position - begin();
1381debfc3dSmrg       if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
1391debfc3dSmrg 	if (__position == end())
1401debfc3dSmrg 	  {
141a2dc1f3fSmrg 	    _GLIBCXX_ASAN_ANNOTATE_GROW(1);
1421debfc3dSmrg 	    _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
1431debfc3dSmrg 				     __x);
1441debfc3dSmrg 	    ++this->_M_impl._M_finish;
145a2dc1f3fSmrg 	    _GLIBCXX_ASAN_ANNOTATE_GREW(1);
1461debfc3dSmrg 	  }
1471debfc3dSmrg 	else
1481debfc3dSmrg 	  {
1491debfc3dSmrg #if __cplusplus >= 201103L
1501debfc3dSmrg 	    const auto __pos = begin() + (__position - cbegin());
1511debfc3dSmrg 	    // __x could be an existing element of this vector, so make a
1521debfc3dSmrg 	    // copy of it before _M_insert_aux moves elements around.
1531debfc3dSmrg 	    _Temporary_value __x_copy(this, __x);
1541debfc3dSmrg 	    _M_insert_aux(__pos, std::move(__x_copy._M_val()));
1551debfc3dSmrg #else
1561debfc3dSmrg 	    _M_insert_aux(__position, __x);
1571debfc3dSmrg #endif
1581debfc3dSmrg 	  }
1591debfc3dSmrg       else
1601debfc3dSmrg #if __cplusplus >= 201103L
1611debfc3dSmrg 	_M_realloc_insert(begin() + (__position - cbegin()), __x);
1621debfc3dSmrg #else
1631debfc3dSmrg 	_M_realloc_insert(__position, __x);
1641debfc3dSmrg #endif
1651debfc3dSmrg 
1661debfc3dSmrg       return iterator(this->_M_impl._M_start + __n);
1671debfc3dSmrg     }
1681debfc3dSmrg 
1691debfc3dSmrg   template<typename _Tp, typename _Alloc>
1701debfc3dSmrg     typename vector<_Tp, _Alloc>::iterator
1711debfc3dSmrg     vector<_Tp, _Alloc>::
_M_erase(iterator __position)1721debfc3dSmrg     _M_erase(iterator __position)
1731debfc3dSmrg     {
1741debfc3dSmrg       if (__position + 1 != end())
1751debfc3dSmrg 	_GLIBCXX_MOVE3(__position + 1, end(), __position);
1761debfc3dSmrg       --this->_M_impl._M_finish;
1771debfc3dSmrg       _Alloc_traits::destroy(this->_M_impl, this->_M_impl._M_finish);
178a2dc1f3fSmrg       _GLIBCXX_ASAN_ANNOTATE_SHRINK(1);
1791debfc3dSmrg       return __position;
1801debfc3dSmrg     }
1811debfc3dSmrg 
1821debfc3dSmrg   template<typename _Tp, typename _Alloc>
1831debfc3dSmrg     typename vector<_Tp, _Alloc>::iterator
1841debfc3dSmrg     vector<_Tp, _Alloc>::
_M_erase(iterator __first,iterator __last)1851debfc3dSmrg     _M_erase(iterator __first, iterator __last)
1861debfc3dSmrg     {
1871debfc3dSmrg       if (__first != __last)
1881debfc3dSmrg 	{
1891debfc3dSmrg 	  if (__last != end())
1901debfc3dSmrg 	    _GLIBCXX_MOVE3(__last, end(), __first);
1911debfc3dSmrg 	  _M_erase_at_end(__first.base() + (end() - __last));
1921debfc3dSmrg 	}
1931debfc3dSmrg       return __first;
1941debfc3dSmrg     }
1951debfc3dSmrg 
1961debfc3dSmrg   template<typename _Tp, typename _Alloc>
1971debfc3dSmrg     vector<_Tp, _Alloc>&
1981debfc3dSmrg     vector<_Tp, _Alloc>::
operator =(const vector<_Tp,_Alloc> & __x)1991debfc3dSmrg     operator=(const vector<_Tp, _Alloc>& __x)
2001debfc3dSmrg     {
2011debfc3dSmrg       if (&__x != this)
2021debfc3dSmrg 	{
203a2dc1f3fSmrg 	  _GLIBCXX_ASAN_ANNOTATE_REINIT;
2041debfc3dSmrg #if __cplusplus >= 201103L
2051debfc3dSmrg 	  if (_Alloc_traits::_S_propagate_on_copy_assign())
2061debfc3dSmrg 	    {
2071debfc3dSmrg 	      if (!_Alloc_traits::_S_always_equal()
2081debfc3dSmrg 	          && _M_get_Tp_allocator() != __x._M_get_Tp_allocator())
2091debfc3dSmrg 	        {
2101debfc3dSmrg 		  // replacement allocator cannot free existing storage
2111debfc3dSmrg 		  this->clear();
2121debfc3dSmrg 		  _M_deallocate(this->_M_impl._M_start,
2131debfc3dSmrg 				this->_M_impl._M_end_of_storage
2141debfc3dSmrg 				- this->_M_impl._M_start);
2151debfc3dSmrg 		  this->_M_impl._M_start = nullptr;
2161debfc3dSmrg 		  this->_M_impl._M_finish = nullptr;
2171debfc3dSmrg 		  this->_M_impl._M_end_of_storage = nullptr;
2181debfc3dSmrg 		}
2191debfc3dSmrg 	      std::__alloc_on_copy(_M_get_Tp_allocator(),
2201debfc3dSmrg 				   __x._M_get_Tp_allocator());
2211debfc3dSmrg 	    }
2221debfc3dSmrg #endif
2231debfc3dSmrg 	  const size_type __xlen = __x.size();
2241debfc3dSmrg 	  if (__xlen > capacity())
2251debfc3dSmrg 	    {
2261debfc3dSmrg 	      pointer __tmp = _M_allocate_and_copy(__xlen, __x.begin(),
2271debfc3dSmrg 						   __x.end());
2281debfc3dSmrg 	      std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
2291debfc3dSmrg 			    _M_get_Tp_allocator());
2301debfc3dSmrg 	      _M_deallocate(this->_M_impl._M_start,
2311debfc3dSmrg 			    this->_M_impl._M_end_of_storage
2321debfc3dSmrg 			    - this->_M_impl._M_start);
2331debfc3dSmrg 	      this->_M_impl._M_start = __tmp;
2341debfc3dSmrg 	      this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __xlen;
2351debfc3dSmrg 	    }
2361debfc3dSmrg 	  else if (size() >= __xlen)
2371debfc3dSmrg 	    {
2381debfc3dSmrg 	      std::_Destroy(std::copy(__x.begin(), __x.end(), begin()),
2391debfc3dSmrg 			    end(), _M_get_Tp_allocator());
2401debfc3dSmrg 	    }
2411debfc3dSmrg 	  else
2421debfc3dSmrg 	    {
2431debfc3dSmrg 	      std::copy(__x._M_impl._M_start, __x._M_impl._M_start + size(),
2441debfc3dSmrg 			this->_M_impl._M_start);
2451debfc3dSmrg 	      std::__uninitialized_copy_a(__x._M_impl._M_start + size(),
2461debfc3dSmrg 					  __x._M_impl._M_finish,
2471debfc3dSmrg 					  this->_M_impl._M_finish,
2481debfc3dSmrg 					  _M_get_Tp_allocator());
2491debfc3dSmrg 	    }
2501debfc3dSmrg 	  this->_M_impl._M_finish = this->_M_impl._M_start + __xlen;
2511debfc3dSmrg 	}
2521debfc3dSmrg       return *this;
2531debfc3dSmrg     }
2541debfc3dSmrg 
2551debfc3dSmrg   template<typename _Tp, typename _Alloc>
2561debfc3dSmrg     void
2571debfc3dSmrg     vector<_Tp, _Alloc>::
_M_fill_assign(size_t __n,const value_type & __val)2581debfc3dSmrg     _M_fill_assign(size_t __n, const value_type& __val)
2591debfc3dSmrg     {
2601debfc3dSmrg       if (__n > capacity())
2611debfc3dSmrg 	{
2621debfc3dSmrg 	  vector __tmp(__n, __val, _M_get_Tp_allocator());
2631debfc3dSmrg 	  __tmp._M_impl._M_swap_data(this->_M_impl);
2641debfc3dSmrg 	}
2651debfc3dSmrg       else if (__n > size())
2661debfc3dSmrg 	{
2671debfc3dSmrg 	  std::fill(begin(), end(), __val);
268a2dc1f3fSmrg 	  const size_type __add = __n - size();
269a2dc1f3fSmrg 	  _GLIBCXX_ASAN_ANNOTATE_GROW(__add);
2701debfc3dSmrg 	  this->_M_impl._M_finish =
2711debfc3dSmrg 	    std::__uninitialized_fill_n_a(this->_M_impl._M_finish,
272a2dc1f3fSmrg 					  __add, __val, _M_get_Tp_allocator());
273a2dc1f3fSmrg 	  _GLIBCXX_ASAN_ANNOTATE_GREW(__add);
2741debfc3dSmrg 	}
2751debfc3dSmrg       else
2761debfc3dSmrg         _M_erase_at_end(std::fill_n(this->_M_impl._M_start, __n, __val));
2771debfc3dSmrg     }
2781debfc3dSmrg 
2791debfc3dSmrg   template<typename _Tp, typename _Alloc>
2801debfc3dSmrg     template<typename _InputIterator>
2811debfc3dSmrg       void
2821debfc3dSmrg       vector<_Tp, _Alloc>::
_M_assign_aux(_InputIterator __first,_InputIterator __last,std::input_iterator_tag)2831debfc3dSmrg       _M_assign_aux(_InputIterator __first, _InputIterator __last,
2841debfc3dSmrg 		    std::input_iterator_tag)
2851debfc3dSmrg       {
2861debfc3dSmrg 	pointer __cur(this->_M_impl._M_start);
2871debfc3dSmrg 	for (; __first != __last && __cur != this->_M_impl._M_finish;
288c0a68be4Smrg 	     ++__cur, (void)++__first)
2891debfc3dSmrg 	  *__cur = *__first;
2901debfc3dSmrg 	if (__first == __last)
2911debfc3dSmrg 	  _M_erase_at_end(__cur);
2921debfc3dSmrg 	else
2931debfc3dSmrg 	  _M_range_insert(end(), __first, __last,
2941debfc3dSmrg 			  std::__iterator_category(__first));
2951debfc3dSmrg       }
2961debfc3dSmrg 
2971debfc3dSmrg   template<typename _Tp, typename _Alloc>
2981debfc3dSmrg     template<typename _ForwardIterator>
2991debfc3dSmrg       void
3001debfc3dSmrg       vector<_Tp, _Alloc>::
_M_assign_aux(_ForwardIterator __first,_ForwardIterator __last,std::forward_iterator_tag)3011debfc3dSmrg       _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
3021debfc3dSmrg 		    std::forward_iterator_tag)
3031debfc3dSmrg       {
3041debfc3dSmrg 	const size_type __len = std::distance(__first, __last);
3051debfc3dSmrg 
3061debfc3dSmrg 	if (__len > capacity())
3071debfc3dSmrg 	  {
308c0a68be4Smrg 	    _S_check_init_len(__len, _M_get_Tp_allocator());
3091debfc3dSmrg 	    pointer __tmp(_M_allocate_and_copy(__len, __first, __last));
3101debfc3dSmrg 	    std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
3111debfc3dSmrg 			  _M_get_Tp_allocator());
312c0a68be4Smrg 	    _GLIBCXX_ASAN_ANNOTATE_REINIT;
3131debfc3dSmrg 	    _M_deallocate(this->_M_impl._M_start,
3141debfc3dSmrg 			  this->_M_impl._M_end_of_storage
3151debfc3dSmrg 			  - this->_M_impl._M_start);
3161debfc3dSmrg 	    this->_M_impl._M_start = __tmp;
3171debfc3dSmrg 	    this->_M_impl._M_finish = this->_M_impl._M_start + __len;
3181debfc3dSmrg 	    this->_M_impl._M_end_of_storage = this->_M_impl._M_finish;
3191debfc3dSmrg 	  }
3201debfc3dSmrg 	else if (size() >= __len)
3211debfc3dSmrg 	  _M_erase_at_end(std::copy(__first, __last, this->_M_impl._M_start));
3221debfc3dSmrg 	else
3231debfc3dSmrg 	  {
3241debfc3dSmrg 	    _ForwardIterator __mid = __first;
3251debfc3dSmrg 	    std::advance(__mid, size());
3261debfc3dSmrg 	    std::copy(__first, __mid, this->_M_impl._M_start);
327a2dc1f3fSmrg 	    const size_type __attribute__((__unused__)) __n = __len - size();
328a2dc1f3fSmrg 	    _GLIBCXX_ASAN_ANNOTATE_GROW(__n);
3291debfc3dSmrg 	    this->_M_impl._M_finish =
3301debfc3dSmrg 	      std::__uninitialized_copy_a(__mid, __last,
3311debfc3dSmrg 					  this->_M_impl._M_finish,
3321debfc3dSmrg 					  _M_get_Tp_allocator());
333a2dc1f3fSmrg 	    _GLIBCXX_ASAN_ANNOTATE_GREW(__n);
3341debfc3dSmrg 	  }
3351debfc3dSmrg       }
3361debfc3dSmrg 
3371debfc3dSmrg #if __cplusplus >= 201103L
3381debfc3dSmrg   template<typename _Tp, typename _Alloc>
3391debfc3dSmrg     auto
3401debfc3dSmrg     vector<_Tp, _Alloc>::
_M_insert_rval(const_iterator __position,value_type && __v)3411debfc3dSmrg     _M_insert_rval(const_iterator __position, value_type&& __v) -> iterator
3421debfc3dSmrg     {
3431debfc3dSmrg       const auto __n = __position - cbegin();
3441debfc3dSmrg       if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
3451debfc3dSmrg 	if (__position == cend())
3461debfc3dSmrg 	  {
347a2dc1f3fSmrg 	    _GLIBCXX_ASAN_ANNOTATE_GROW(1);
3481debfc3dSmrg 	    _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
3491debfc3dSmrg 				     std::move(__v));
3501debfc3dSmrg 	    ++this->_M_impl._M_finish;
351a2dc1f3fSmrg 	    _GLIBCXX_ASAN_ANNOTATE_GREW(1);
3521debfc3dSmrg 	  }
3531debfc3dSmrg 	else
3541debfc3dSmrg 	  _M_insert_aux(begin() + __n, std::move(__v));
3551debfc3dSmrg       else
3561debfc3dSmrg 	_M_realloc_insert(begin() + __n, std::move(__v));
3571debfc3dSmrg 
3581debfc3dSmrg       return iterator(this->_M_impl._M_start + __n);
3591debfc3dSmrg     }
3601debfc3dSmrg 
3611debfc3dSmrg   template<typename _Tp, typename _Alloc>
3621debfc3dSmrg     template<typename... _Args>
3631debfc3dSmrg       auto
3641debfc3dSmrg       vector<_Tp, _Alloc>::
_M_emplace_aux(const_iterator __position,_Args &&...__args)3651debfc3dSmrg       _M_emplace_aux(const_iterator __position, _Args&&... __args)
3661debfc3dSmrg       -> iterator
3671debfc3dSmrg       {
3681debfc3dSmrg 	const auto __n = __position - cbegin();
3691debfc3dSmrg 	if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
3701debfc3dSmrg 	  if (__position == cend())
3711debfc3dSmrg 	    {
372a2dc1f3fSmrg 	      _GLIBCXX_ASAN_ANNOTATE_GROW(1);
3731debfc3dSmrg 	      _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
3741debfc3dSmrg 				       std::forward<_Args>(__args)...);
3751debfc3dSmrg 	      ++this->_M_impl._M_finish;
376a2dc1f3fSmrg 	      _GLIBCXX_ASAN_ANNOTATE_GREW(1);
3771debfc3dSmrg 	    }
3781debfc3dSmrg 	  else
3791debfc3dSmrg 	    {
3801debfc3dSmrg 	      // We need to construct a temporary because something in __args...
3811debfc3dSmrg 	      // could alias one of the elements of the container and so we
3821debfc3dSmrg 	      // need to use it before _M_insert_aux moves elements around.
3831debfc3dSmrg 	      _Temporary_value __tmp(this, std::forward<_Args>(__args)...);
3841debfc3dSmrg 	      _M_insert_aux(begin() + __n, std::move(__tmp._M_val()));
3851debfc3dSmrg 	    }
3861debfc3dSmrg 	else
3871debfc3dSmrg 	  _M_realloc_insert(begin() + __n, std::forward<_Args>(__args)...);
3881debfc3dSmrg 
3891debfc3dSmrg 	return iterator(this->_M_impl._M_start + __n);
3901debfc3dSmrg       }
3911debfc3dSmrg 
3921debfc3dSmrg   template<typename _Tp, typename _Alloc>
3931debfc3dSmrg     template<typename _Arg>
3941debfc3dSmrg       void
3951debfc3dSmrg       vector<_Tp, _Alloc>::
_M_insert_aux(iterator __position,_Arg && __arg)3961debfc3dSmrg       _M_insert_aux(iterator __position, _Arg&& __arg)
3971debfc3dSmrg #else
3981debfc3dSmrg   template<typename _Tp, typename _Alloc>
3991debfc3dSmrg     void
4001debfc3dSmrg     vector<_Tp, _Alloc>::
4011debfc3dSmrg     _M_insert_aux(iterator __position, const _Tp& __x)
4021debfc3dSmrg #endif
4031debfc3dSmrg     {
404a2dc1f3fSmrg       _GLIBCXX_ASAN_ANNOTATE_GROW(1);
4051debfc3dSmrg       _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
406a2dc1f3fSmrg 			       _GLIBCXX_MOVE(*(this->_M_impl._M_finish - 1)));
4071debfc3dSmrg       ++this->_M_impl._M_finish;
408a2dc1f3fSmrg       _GLIBCXX_ASAN_ANNOTATE_GREW(1);
4091debfc3dSmrg #if __cplusplus < 201103L
4101debfc3dSmrg       _Tp __x_copy = __x;
4111debfc3dSmrg #endif
4121debfc3dSmrg       _GLIBCXX_MOVE_BACKWARD3(__position.base(),
4131debfc3dSmrg 			      this->_M_impl._M_finish - 2,
4141debfc3dSmrg 			      this->_M_impl._M_finish - 1);
4151debfc3dSmrg #if __cplusplus < 201103L
4161debfc3dSmrg       *__position = __x_copy;
4171debfc3dSmrg #else
4181debfc3dSmrg       *__position = std::forward<_Arg>(__arg);
4191debfc3dSmrg #endif
4201debfc3dSmrg     }
4211debfc3dSmrg 
4221debfc3dSmrg #if __cplusplus >= 201103L
4231debfc3dSmrg   template<typename _Tp, typename _Alloc>
4241debfc3dSmrg     template<typename... _Args>
4251debfc3dSmrg       void
4261debfc3dSmrg       vector<_Tp, _Alloc>::
_M_realloc_insert(iterator __position,_Args &&...__args)4271debfc3dSmrg       _M_realloc_insert(iterator __position, _Args&&... __args)
4281debfc3dSmrg #else
4291debfc3dSmrg   template<typename _Tp, typename _Alloc>
4301debfc3dSmrg     void
4311debfc3dSmrg     vector<_Tp, _Alloc>::
4321debfc3dSmrg     _M_realloc_insert(iterator __position, const _Tp& __x)
4331debfc3dSmrg #endif
4341debfc3dSmrg     {
4351debfc3dSmrg       const size_type __len =
4361debfc3dSmrg 	_M_check_len(size_type(1), "vector::_M_realloc_insert");
437a2dc1f3fSmrg       pointer __old_start = this->_M_impl._M_start;
438a2dc1f3fSmrg       pointer __old_finish = this->_M_impl._M_finish;
4391debfc3dSmrg       const size_type __elems_before = __position - begin();
4401debfc3dSmrg       pointer __new_start(this->_M_allocate(__len));
4411debfc3dSmrg       pointer __new_finish(__new_start);
4421debfc3dSmrg       __try
4431debfc3dSmrg 	{
4441debfc3dSmrg 	  // The order of the three operations is dictated by the C++11
4451debfc3dSmrg 	  // case, where the moves could alter a new element belonging
4461debfc3dSmrg 	  // to the existing vector.  This is an issue only for callers
4471debfc3dSmrg 	  // taking the element by lvalue ref (see last bullet of C++11
4481debfc3dSmrg 	  // [res.on.arguments]).
4491debfc3dSmrg 	  _Alloc_traits::construct(this->_M_impl,
4501debfc3dSmrg 				   __new_start + __elems_before,
4511debfc3dSmrg #if __cplusplus >= 201103L
4521debfc3dSmrg 				   std::forward<_Args>(__args)...);
4531debfc3dSmrg #else
4541debfc3dSmrg 				   __x);
4551debfc3dSmrg #endif
4561debfc3dSmrg 	  __new_finish = pointer();
4571debfc3dSmrg 
458c0a68be4Smrg #if __cplusplus >= 201103L
459c0a68be4Smrg 	  if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
460c0a68be4Smrg 	    {
461c0a68be4Smrg 	      __new_finish = _S_relocate(__old_start, __position.base(),
462c0a68be4Smrg 					 __new_start, _M_get_Tp_allocator());
463c0a68be4Smrg 
464c0a68be4Smrg 	      ++__new_finish;
465c0a68be4Smrg 
466c0a68be4Smrg 	      __new_finish = _S_relocate(__position.base(), __old_finish,
467c0a68be4Smrg 					 __new_finish, _M_get_Tp_allocator());
468c0a68be4Smrg 	    }
469c0a68be4Smrg 	  else
470c0a68be4Smrg #endif
471c0a68be4Smrg 	    {
4721debfc3dSmrg 	      __new_finish
4731debfc3dSmrg 		= std::__uninitialized_move_if_noexcept_a
474a2dc1f3fSmrg 		(__old_start, __position.base(),
4751debfc3dSmrg 		 __new_start, _M_get_Tp_allocator());
4761debfc3dSmrg 
4771debfc3dSmrg 	      ++__new_finish;
4781debfc3dSmrg 
4791debfc3dSmrg 	      __new_finish
4801debfc3dSmrg 		= std::__uninitialized_move_if_noexcept_a
481a2dc1f3fSmrg 		(__position.base(), __old_finish,
4821debfc3dSmrg 		 __new_finish, _M_get_Tp_allocator());
4831debfc3dSmrg 	    }
484c0a68be4Smrg 	}
4851debfc3dSmrg       __catch(...)
4861debfc3dSmrg 	{
4871debfc3dSmrg 	  if (!__new_finish)
4881debfc3dSmrg 	    _Alloc_traits::destroy(this->_M_impl,
4891debfc3dSmrg 				   __new_start + __elems_before);
4901debfc3dSmrg 	  else
4911debfc3dSmrg 	    std::_Destroy(__new_start, __new_finish, _M_get_Tp_allocator());
4921debfc3dSmrg 	  _M_deallocate(__new_start, __len);
4931debfc3dSmrg 	  __throw_exception_again;
4941debfc3dSmrg 	}
495c0a68be4Smrg #if __cplusplus >= 201103L
496c0a68be4Smrg       if _GLIBCXX17_CONSTEXPR (!_S_use_relocate())
497c0a68be4Smrg #endif
498a2dc1f3fSmrg 	std::_Destroy(__old_start, __old_finish, _M_get_Tp_allocator());
499c0a68be4Smrg       _GLIBCXX_ASAN_ANNOTATE_REINIT;
500a2dc1f3fSmrg       _M_deallocate(__old_start,
501a2dc1f3fSmrg 		    this->_M_impl._M_end_of_storage - __old_start);
5021debfc3dSmrg       this->_M_impl._M_start = __new_start;
5031debfc3dSmrg       this->_M_impl._M_finish = __new_finish;
5041debfc3dSmrg       this->_M_impl._M_end_of_storage = __new_start + __len;
5051debfc3dSmrg     }
5061debfc3dSmrg 
5071debfc3dSmrg   template<typename _Tp, typename _Alloc>
5081debfc3dSmrg     void
5091debfc3dSmrg     vector<_Tp, _Alloc>::
_M_fill_insert(iterator __position,size_type __n,const value_type & __x)5101debfc3dSmrg     _M_fill_insert(iterator __position, size_type __n, const value_type& __x)
5111debfc3dSmrg     {
5121debfc3dSmrg       if (__n != 0)
5131debfc3dSmrg 	{
5141debfc3dSmrg 	  if (size_type(this->_M_impl._M_end_of_storage
5151debfc3dSmrg 			- this->_M_impl._M_finish) >= __n)
5161debfc3dSmrg 	    {
5171debfc3dSmrg #if __cplusplus < 201103L
5181debfc3dSmrg 	      value_type __x_copy = __x;
5191debfc3dSmrg #else
5201debfc3dSmrg 	      _Temporary_value __tmp(this, __x);
5211debfc3dSmrg 	      value_type& __x_copy = __tmp._M_val();
5221debfc3dSmrg #endif
5231debfc3dSmrg 	      const size_type __elems_after = end() - __position;
5241debfc3dSmrg 	      pointer __old_finish(this->_M_impl._M_finish);
5251debfc3dSmrg 	      if (__elems_after > __n)
5261debfc3dSmrg 		{
527a2dc1f3fSmrg 		  _GLIBCXX_ASAN_ANNOTATE_GROW(__n);
5281debfc3dSmrg 		  std::__uninitialized_move_a(this->_M_impl._M_finish - __n,
5291debfc3dSmrg 					      this->_M_impl._M_finish,
5301debfc3dSmrg 					      this->_M_impl._M_finish,
5311debfc3dSmrg 					      _M_get_Tp_allocator());
5321debfc3dSmrg 		  this->_M_impl._M_finish += __n;
533a2dc1f3fSmrg 		  _GLIBCXX_ASAN_ANNOTATE_GREW(__n);
5341debfc3dSmrg 		  _GLIBCXX_MOVE_BACKWARD3(__position.base(),
5351debfc3dSmrg 					  __old_finish - __n, __old_finish);
5361debfc3dSmrg 		  std::fill(__position.base(), __position.base() + __n,
5371debfc3dSmrg 			    __x_copy);
5381debfc3dSmrg 		}
5391debfc3dSmrg 	      else
5401debfc3dSmrg 		{
541a2dc1f3fSmrg 		  _GLIBCXX_ASAN_ANNOTATE_GROW(__n);
5421debfc3dSmrg 		  this->_M_impl._M_finish =
5431debfc3dSmrg 		    std::__uninitialized_fill_n_a(this->_M_impl._M_finish,
5441debfc3dSmrg 						  __n - __elems_after,
5451debfc3dSmrg 						  __x_copy,
5461debfc3dSmrg 						  _M_get_Tp_allocator());
547a2dc1f3fSmrg 		  _GLIBCXX_ASAN_ANNOTATE_GREW(__n - __elems_after);
5481debfc3dSmrg 		  std::__uninitialized_move_a(__position.base(), __old_finish,
5491debfc3dSmrg 					      this->_M_impl._M_finish,
5501debfc3dSmrg 					      _M_get_Tp_allocator());
5511debfc3dSmrg 		  this->_M_impl._M_finish += __elems_after;
552a2dc1f3fSmrg 		  _GLIBCXX_ASAN_ANNOTATE_GREW(__elems_after);
5531debfc3dSmrg 		  std::fill(__position.base(), __old_finish, __x_copy);
5541debfc3dSmrg 		}
5551debfc3dSmrg 	    }
5561debfc3dSmrg 	  else
5571debfc3dSmrg 	    {
5581debfc3dSmrg 	      const size_type __len =
5591debfc3dSmrg 		_M_check_len(__n, "vector::_M_fill_insert");
5601debfc3dSmrg 	      const size_type __elems_before = __position - begin();
5611debfc3dSmrg 	      pointer __new_start(this->_M_allocate(__len));
5621debfc3dSmrg 	      pointer __new_finish(__new_start);
5631debfc3dSmrg 	      __try
5641debfc3dSmrg 		{
5651debfc3dSmrg 		  // See _M_realloc_insert above.
5661debfc3dSmrg 		  std::__uninitialized_fill_n_a(__new_start + __elems_before,
5671debfc3dSmrg 						__n, __x,
5681debfc3dSmrg 						_M_get_Tp_allocator());
5691debfc3dSmrg 		  __new_finish = pointer();
5701debfc3dSmrg 
5711debfc3dSmrg 		  __new_finish
5721debfc3dSmrg 		    = std::__uninitialized_move_if_noexcept_a
5731debfc3dSmrg 		    (this->_M_impl._M_start, __position.base(),
5741debfc3dSmrg 		     __new_start, _M_get_Tp_allocator());
5751debfc3dSmrg 
5761debfc3dSmrg 		  __new_finish += __n;
5771debfc3dSmrg 
5781debfc3dSmrg 		  __new_finish
5791debfc3dSmrg 		    = std::__uninitialized_move_if_noexcept_a
5801debfc3dSmrg 		    (__position.base(), this->_M_impl._M_finish,
5811debfc3dSmrg 		     __new_finish, _M_get_Tp_allocator());
5821debfc3dSmrg 		}
5831debfc3dSmrg 	      __catch(...)
5841debfc3dSmrg 		{
5851debfc3dSmrg 		  if (!__new_finish)
5861debfc3dSmrg 		    std::_Destroy(__new_start + __elems_before,
5871debfc3dSmrg 				  __new_start + __elems_before + __n,
5881debfc3dSmrg 				  _M_get_Tp_allocator());
5891debfc3dSmrg 		  else
5901debfc3dSmrg 		    std::_Destroy(__new_start, __new_finish,
5911debfc3dSmrg 				  _M_get_Tp_allocator());
5921debfc3dSmrg 		  _M_deallocate(__new_start, __len);
5931debfc3dSmrg 		  __throw_exception_again;
5941debfc3dSmrg 		}
5951debfc3dSmrg 	      std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
5961debfc3dSmrg 			    _M_get_Tp_allocator());
597c0a68be4Smrg 	      _GLIBCXX_ASAN_ANNOTATE_REINIT;
5981debfc3dSmrg 	      _M_deallocate(this->_M_impl._M_start,
5991debfc3dSmrg 			    this->_M_impl._M_end_of_storage
6001debfc3dSmrg 			    - this->_M_impl._M_start);
6011debfc3dSmrg 	      this->_M_impl._M_start = __new_start;
6021debfc3dSmrg 	      this->_M_impl._M_finish = __new_finish;
6031debfc3dSmrg 	      this->_M_impl._M_end_of_storage = __new_start + __len;
6041debfc3dSmrg 	    }
6051debfc3dSmrg 	}
6061debfc3dSmrg     }
6071debfc3dSmrg 
6081debfc3dSmrg #if __cplusplus >= 201103L
6091debfc3dSmrg   template<typename _Tp, typename _Alloc>
6101debfc3dSmrg     void
6111debfc3dSmrg     vector<_Tp, _Alloc>::
_M_default_append(size_type __n)6121debfc3dSmrg     _M_default_append(size_type __n)
6131debfc3dSmrg     {
6141debfc3dSmrg       if (__n != 0)
6151debfc3dSmrg 	{
616a2dc1f3fSmrg 	  const size_type __size = size();
617a2dc1f3fSmrg 	  size_type __navail = size_type(this->_M_impl._M_end_of_storage
618a2dc1f3fSmrg 					 - this->_M_impl._M_finish);
619a2dc1f3fSmrg 
620a2dc1f3fSmrg 	  if (__size > max_size() || __navail > max_size() - __size)
621a2dc1f3fSmrg 	    __builtin_unreachable();
622a2dc1f3fSmrg 
623a2dc1f3fSmrg 	  if (__navail >= __n)
6241debfc3dSmrg 	    {
625a2dc1f3fSmrg 	      _GLIBCXX_ASAN_ANNOTATE_GROW(__n);
6261debfc3dSmrg 	      this->_M_impl._M_finish =
6271debfc3dSmrg 		std::__uninitialized_default_n_a(this->_M_impl._M_finish,
6281debfc3dSmrg 						 __n, _M_get_Tp_allocator());
629a2dc1f3fSmrg 	      _GLIBCXX_ASAN_ANNOTATE_GREW(__n);
6301debfc3dSmrg 	    }
6311debfc3dSmrg 	  else
6321debfc3dSmrg 	    {
6331debfc3dSmrg 	      const size_type __len =
6341debfc3dSmrg 		_M_check_len(__n, "vector::_M_default_append");
6351debfc3dSmrg 	      pointer __new_start(this->_M_allocate(__len));
636c0a68be4Smrg 	      if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
637c0a68be4Smrg 		{
638c0a68be4Smrg 		  __try
639c0a68be4Smrg 		    {
640c0a68be4Smrg 		      std::__uninitialized_default_n_a(__new_start + __size,
641c0a68be4Smrg 			      __n, _M_get_Tp_allocator());
642c0a68be4Smrg 		    }
643c0a68be4Smrg 		  __catch(...)
644c0a68be4Smrg 		    {
645c0a68be4Smrg 		      _M_deallocate(__new_start, __len);
646c0a68be4Smrg 		      __throw_exception_again;
647c0a68be4Smrg 		    }
648c0a68be4Smrg 		  _S_relocate(this->_M_impl._M_start, this->_M_impl._M_finish,
649c0a68be4Smrg 			      __new_start, _M_get_Tp_allocator());
650c0a68be4Smrg 		}
651c0a68be4Smrg 	      else
652c0a68be4Smrg 		{
6531debfc3dSmrg 		  pointer __destroy_from = pointer();
6541debfc3dSmrg 		  __try
6551debfc3dSmrg 		    {
6561debfc3dSmrg 		      std::__uninitialized_default_n_a(__new_start + __size,
6571debfc3dSmrg 			      __n, _M_get_Tp_allocator());
6581debfc3dSmrg 		      __destroy_from = __new_start + __size;
6591debfc3dSmrg 		      std::__uninitialized_move_if_noexcept_a(
6601debfc3dSmrg 			      this->_M_impl._M_start, this->_M_impl._M_finish,
6611debfc3dSmrg 			      __new_start, _M_get_Tp_allocator());
6621debfc3dSmrg 		    }
6631debfc3dSmrg 		  __catch(...)
6641debfc3dSmrg 		    {
6651debfc3dSmrg 		      if (__destroy_from)
6661debfc3dSmrg 			std::_Destroy(__destroy_from, __destroy_from + __n,
6671debfc3dSmrg 				      _M_get_Tp_allocator());
6681debfc3dSmrg 		      _M_deallocate(__new_start, __len);
6691debfc3dSmrg 		      __throw_exception_again;
6701debfc3dSmrg 		    }
6711debfc3dSmrg 		  std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
6721debfc3dSmrg 				_M_get_Tp_allocator());
673c0a68be4Smrg 		}
674c0a68be4Smrg 	      _GLIBCXX_ASAN_ANNOTATE_REINIT;
6751debfc3dSmrg 	      _M_deallocate(this->_M_impl._M_start,
6761debfc3dSmrg 			    this->_M_impl._M_end_of_storage
6771debfc3dSmrg 			    - this->_M_impl._M_start);
6781debfc3dSmrg 	      this->_M_impl._M_start = __new_start;
6791debfc3dSmrg 	      this->_M_impl._M_finish = __new_start + __size + __n;
6801debfc3dSmrg 	      this->_M_impl._M_end_of_storage = __new_start + __len;
6811debfc3dSmrg 	    }
6821debfc3dSmrg 	}
6831debfc3dSmrg     }
6841debfc3dSmrg 
6851debfc3dSmrg   template<typename _Tp, typename _Alloc>
6861debfc3dSmrg     bool
6871debfc3dSmrg     vector<_Tp, _Alloc>::
_M_shrink_to_fit()6881debfc3dSmrg     _M_shrink_to_fit()
6891debfc3dSmrg     {
6901debfc3dSmrg       if (capacity() == size())
6911debfc3dSmrg 	return false;
692a2dc1f3fSmrg       _GLIBCXX_ASAN_ANNOTATE_REINIT;
6931debfc3dSmrg       return std::__shrink_to_fit_aux<vector>::_S_do_it(*this);
6941debfc3dSmrg     }
6951debfc3dSmrg #endif
6961debfc3dSmrg 
6971debfc3dSmrg   template<typename _Tp, typename _Alloc>
6981debfc3dSmrg     template<typename _InputIterator>
6991debfc3dSmrg       void
7001debfc3dSmrg       vector<_Tp, _Alloc>::
_M_range_insert(iterator __pos,_InputIterator __first,_InputIterator __last,std::input_iterator_tag)7011debfc3dSmrg       _M_range_insert(iterator __pos, _InputIterator __first,
7021debfc3dSmrg 		      _InputIterator __last, std::input_iterator_tag)
7031debfc3dSmrg       {
704a2dc1f3fSmrg 	if (__pos == end())
7051debfc3dSmrg 	  {
706a2dc1f3fSmrg 	    for (; __first != __last; ++__first)
707a2dc1f3fSmrg 	      insert(end(), *__first);
708a2dc1f3fSmrg 	  }
709a2dc1f3fSmrg 	else if (__first != __last)
710a2dc1f3fSmrg 	  {
711a2dc1f3fSmrg 	    vector __tmp(__first, __last, _M_get_Tp_allocator());
712a2dc1f3fSmrg 	    insert(__pos,
713a2dc1f3fSmrg 		   _GLIBCXX_MAKE_MOVE_ITERATOR(__tmp.begin()),
714a2dc1f3fSmrg 		   _GLIBCXX_MAKE_MOVE_ITERATOR(__tmp.end()));
7151debfc3dSmrg 	  }
7161debfc3dSmrg       }
7171debfc3dSmrg 
7181debfc3dSmrg   template<typename _Tp, typename _Alloc>
7191debfc3dSmrg     template<typename _ForwardIterator>
7201debfc3dSmrg       void
7211debfc3dSmrg       vector<_Tp, _Alloc>::
_M_range_insert(iterator __position,_ForwardIterator __first,_ForwardIterator __last,std::forward_iterator_tag)7221debfc3dSmrg       _M_range_insert(iterator __position, _ForwardIterator __first,
7231debfc3dSmrg 		      _ForwardIterator __last, std::forward_iterator_tag)
7241debfc3dSmrg       {
7251debfc3dSmrg 	if (__first != __last)
7261debfc3dSmrg 	  {
7271debfc3dSmrg 	    const size_type __n = std::distance(__first, __last);
7281debfc3dSmrg 	    if (size_type(this->_M_impl._M_end_of_storage
7291debfc3dSmrg 			  - this->_M_impl._M_finish) >= __n)
7301debfc3dSmrg 	      {
7311debfc3dSmrg 		const size_type __elems_after = end() - __position;
7321debfc3dSmrg 		pointer __old_finish(this->_M_impl._M_finish);
7331debfc3dSmrg 		if (__elems_after > __n)
7341debfc3dSmrg 		  {
735a2dc1f3fSmrg 		    _GLIBCXX_ASAN_ANNOTATE_GROW(__n);
7361debfc3dSmrg 		    std::__uninitialized_move_a(this->_M_impl._M_finish - __n,
7371debfc3dSmrg 						this->_M_impl._M_finish,
7381debfc3dSmrg 						this->_M_impl._M_finish,
7391debfc3dSmrg 						_M_get_Tp_allocator());
7401debfc3dSmrg 		    this->_M_impl._M_finish += __n;
741a2dc1f3fSmrg 		    _GLIBCXX_ASAN_ANNOTATE_GREW(__n);
7421debfc3dSmrg 		    _GLIBCXX_MOVE_BACKWARD3(__position.base(),
7431debfc3dSmrg 					    __old_finish - __n, __old_finish);
7441debfc3dSmrg 		    std::copy(__first, __last, __position);
7451debfc3dSmrg 		  }
7461debfc3dSmrg 		else
7471debfc3dSmrg 		  {
7481debfc3dSmrg 		    _ForwardIterator __mid = __first;
7491debfc3dSmrg 		    std::advance(__mid, __elems_after);
750a2dc1f3fSmrg 		    _GLIBCXX_ASAN_ANNOTATE_GROW(__n);
7511debfc3dSmrg 		    std::__uninitialized_copy_a(__mid, __last,
7521debfc3dSmrg 						this->_M_impl._M_finish,
7531debfc3dSmrg 						_M_get_Tp_allocator());
7541debfc3dSmrg 		    this->_M_impl._M_finish += __n - __elems_after;
755a2dc1f3fSmrg 		    _GLIBCXX_ASAN_ANNOTATE_GREW(__n - __elems_after);
7561debfc3dSmrg 		    std::__uninitialized_move_a(__position.base(),
7571debfc3dSmrg 						__old_finish,
7581debfc3dSmrg 						this->_M_impl._M_finish,
7591debfc3dSmrg 						_M_get_Tp_allocator());
7601debfc3dSmrg 		    this->_M_impl._M_finish += __elems_after;
761a2dc1f3fSmrg 		    _GLIBCXX_ASAN_ANNOTATE_GREW(__elems_after);
7621debfc3dSmrg 		    std::copy(__first, __mid, __position);
7631debfc3dSmrg 		  }
7641debfc3dSmrg 	      }
7651debfc3dSmrg 	    else
7661debfc3dSmrg 	      {
7671debfc3dSmrg 		const size_type __len =
7681debfc3dSmrg 		  _M_check_len(__n, "vector::_M_range_insert");
7691debfc3dSmrg 		pointer __new_start(this->_M_allocate(__len));
7701debfc3dSmrg 		pointer __new_finish(__new_start);
7711debfc3dSmrg 		__try
7721debfc3dSmrg 		  {
7731debfc3dSmrg 		    __new_finish
7741debfc3dSmrg 		      = std::__uninitialized_move_if_noexcept_a
7751debfc3dSmrg 		      (this->_M_impl._M_start, __position.base(),
7761debfc3dSmrg 		       __new_start, _M_get_Tp_allocator());
7771debfc3dSmrg 		    __new_finish
7781debfc3dSmrg 		      = std::__uninitialized_copy_a(__first, __last,
7791debfc3dSmrg 						    __new_finish,
7801debfc3dSmrg 						    _M_get_Tp_allocator());
7811debfc3dSmrg 		    __new_finish
7821debfc3dSmrg 		      = std::__uninitialized_move_if_noexcept_a
7831debfc3dSmrg 		      (__position.base(), this->_M_impl._M_finish,
7841debfc3dSmrg 		       __new_finish, _M_get_Tp_allocator());
7851debfc3dSmrg 		  }
7861debfc3dSmrg 		__catch(...)
7871debfc3dSmrg 		  {
7881debfc3dSmrg 		    std::_Destroy(__new_start, __new_finish,
7891debfc3dSmrg 				  _M_get_Tp_allocator());
7901debfc3dSmrg 		    _M_deallocate(__new_start, __len);
7911debfc3dSmrg 		    __throw_exception_again;
7921debfc3dSmrg 		  }
7931debfc3dSmrg 		std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
7941debfc3dSmrg 			      _M_get_Tp_allocator());
795c0a68be4Smrg 		_GLIBCXX_ASAN_ANNOTATE_REINIT;
7961debfc3dSmrg 		_M_deallocate(this->_M_impl._M_start,
7971debfc3dSmrg 			      this->_M_impl._M_end_of_storage
7981debfc3dSmrg 			      - this->_M_impl._M_start);
7991debfc3dSmrg 		this->_M_impl._M_start = __new_start;
8001debfc3dSmrg 		this->_M_impl._M_finish = __new_finish;
8011debfc3dSmrg 		this->_M_impl._M_end_of_storage = __new_start + __len;
8021debfc3dSmrg 	      }
8031debfc3dSmrg 	  }
8041debfc3dSmrg       }
8051debfc3dSmrg 
8061debfc3dSmrg 
8071debfc3dSmrg   // vector<bool>
8081debfc3dSmrg   template<typename _Alloc>
8091debfc3dSmrg     void
8101debfc3dSmrg     vector<bool, _Alloc>::
_M_reallocate(size_type __n)8111debfc3dSmrg     _M_reallocate(size_type __n)
8121debfc3dSmrg     {
8131debfc3dSmrg       _Bit_pointer __q = this->_M_allocate(__n);
8141debfc3dSmrg       iterator __start(std::__addressof(*__q), 0);
8151debfc3dSmrg       iterator __finish(_M_copy_aligned(begin(), end(), __start));
8161debfc3dSmrg       this->_M_deallocate();
8171debfc3dSmrg       this->_M_impl._M_start = __start;
8181debfc3dSmrg       this->_M_impl._M_finish = __finish;
8191debfc3dSmrg       this->_M_impl._M_end_of_storage = __q + _S_nword(__n);
8201debfc3dSmrg     }
8211debfc3dSmrg 
8221debfc3dSmrg   template<typename _Alloc>
8231debfc3dSmrg     void
8241debfc3dSmrg     vector<bool, _Alloc>::
_M_fill_insert(iterator __position,size_type __n,bool __x)8251debfc3dSmrg     _M_fill_insert(iterator __position, size_type __n, bool __x)
8261debfc3dSmrg     {
8271debfc3dSmrg       if (__n == 0)
8281debfc3dSmrg 	return;
8291debfc3dSmrg       if (capacity() - size() >= __n)
8301debfc3dSmrg 	{
8311debfc3dSmrg 	  std::copy_backward(__position, end(),
8321debfc3dSmrg 			     this->_M_impl._M_finish + difference_type(__n));
8331debfc3dSmrg 	  std::fill(__position, __position + difference_type(__n), __x);
8341debfc3dSmrg 	  this->_M_impl._M_finish += difference_type(__n);
8351debfc3dSmrg 	}
8361debfc3dSmrg       else
8371debfc3dSmrg 	{
8381debfc3dSmrg 	  const size_type __len =
8391debfc3dSmrg 	    _M_check_len(__n, "vector<bool>::_M_fill_insert");
8401debfc3dSmrg 	  _Bit_pointer __q = this->_M_allocate(__len);
8411debfc3dSmrg 	  iterator __start(std::__addressof(*__q), 0);
8421debfc3dSmrg 	  iterator __i = _M_copy_aligned(begin(), __position, __start);
8431debfc3dSmrg 	  std::fill(__i, __i + difference_type(__n), __x);
8441debfc3dSmrg 	  iterator __finish = std::copy(__position, end(),
8451debfc3dSmrg 					__i + difference_type(__n));
8461debfc3dSmrg 	  this->_M_deallocate();
8471debfc3dSmrg 	  this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
8481debfc3dSmrg 	  this->_M_impl._M_start = __start;
8491debfc3dSmrg 	  this->_M_impl._M_finish = __finish;
8501debfc3dSmrg 	}
8511debfc3dSmrg     }
8521debfc3dSmrg 
8531debfc3dSmrg   template<typename _Alloc>
8541debfc3dSmrg     template<typename _ForwardIterator>
8551debfc3dSmrg       void
8561debfc3dSmrg       vector<bool, _Alloc>::
_M_insert_range(iterator __position,_ForwardIterator __first,_ForwardIterator __last,std::forward_iterator_tag)8571debfc3dSmrg       _M_insert_range(iterator __position, _ForwardIterator __first,
8581debfc3dSmrg 		      _ForwardIterator __last, std::forward_iterator_tag)
8591debfc3dSmrg       {
8601debfc3dSmrg 	if (__first != __last)
8611debfc3dSmrg 	  {
8621debfc3dSmrg 	    size_type __n = std::distance(__first, __last);
8631debfc3dSmrg 	    if (capacity() - size() >= __n)
8641debfc3dSmrg 	      {
8651debfc3dSmrg 		std::copy_backward(__position, end(),
8661debfc3dSmrg 				   this->_M_impl._M_finish
8671debfc3dSmrg 				   + difference_type(__n));
8681debfc3dSmrg 		std::copy(__first, __last, __position);
8691debfc3dSmrg 		this->_M_impl._M_finish += difference_type(__n);
8701debfc3dSmrg 	      }
8711debfc3dSmrg 	    else
8721debfc3dSmrg 	      {
8731debfc3dSmrg 		const size_type __len =
8741debfc3dSmrg 		  _M_check_len(__n, "vector<bool>::_M_insert_range");
8751debfc3dSmrg 		_Bit_pointer __q = this->_M_allocate(__len);
8761debfc3dSmrg 		iterator __start(std::__addressof(*__q), 0);
8771debfc3dSmrg 		iterator __i = _M_copy_aligned(begin(), __position, __start);
8781debfc3dSmrg 		__i = std::copy(__first, __last, __i);
8791debfc3dSmrg 		iterator __finish = std::copy(__position, end(), __i);
8801debfc3dSmrg 		this->_M_deallocate();
8811debfc3dSmrg 		this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
8821debfc3dSmrg 		this->_M_impl._M_start = __start;
8831debfc3dSmrg 		this->_M_impl._M_finish = __finish;
8841debfc3dSmrg 	      }
8851debfc3dSmrg 	  }
8861debfc3dSmrg       }
8871debfc3dSmrg 
8881debfc3dSmrg   template<typename _Alloc>
8891debfc3dSmrg     void
8901debfc3dSmrg     vector<bool, _Alloc>::
_M_insert_aux(iterator __position,bool __x)8911debfc3dSmrg     _M_insert_aux(iterator __position, bool __x)
8921debfc3dSmrg     {
8931debfc3dSmrg       if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr())
8941debfc3dSmrg 	{
8951debfc3dSmrg 	  std::copy_backward(__position, this->_M_impl._M_finish,
8961debfc3dSmrg 			     this->_M_impl._M_finish + 1);
8971debfc3dSmrg 	  *__position = __x;
8981debfc3dSmrg 	  ++this->_M_impl._M_finish;
8991debfc3dSmrg 	}
9001debfc3dSmrg       else
9011debfc3dSmrg 	{
9021debfc3dSmrg 	  const size_type __len =
9031debfc3dSmrg 	    _M_check_len(size_type(1), "vector<bool>::_M_insert_aux");
9041debfc3dSmrg 	  _Bit_pointer __q = this->_M_allocate(__len);
9051debfc3dSmrg 	  iterator __start(std::__addressof(*__q), 0);
9061debfc3dSmrg 	  iterator __i = _M_copy_aligned(begin(), __position, __start);
9071debfc3dSmrg 	  *__i++ = __x;
9081debfc3dSmrg 	  iterator __finish = std::copy(__position, end(), __i);
9091debfc3dSmrg 	  this->_M_deallocate();
9101debfc3dSmrg 	  this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
9111debfc3dSmrg 	  this->_M_impl._M_start = __start;
9121debfc3dSmrg 	  this->_M_impl._M_finish = __finish;
9131debfc3dSmrg 	}
9141debfc3dSmrg     }
9151debfc3dSmrg 
9161debfc3dSmrg   template<typename _Alloc>
9171debfc3dSmrg     typename vector<bool, _Alloc>::iterator
9181debfc3dSmrg     vector<bool, _Alloc>::
_M_erase(iterator __position)9191debfc3dSmrg     _M_erase(iterator __position)
9201debfc3dSmrg     {
9211debfc3dSmrg       if (__position + 1 != end())
9221debfc3dSmrg         std::copy(__position + 1, end(), __position);
9231debfc3dSmrg       --this->_M_impl._M_finish;
9241debfc3dSmrg       return __position;
9251debfc3dSmrg     }
9261debfc3dSmrg 
9271debfc3dSmrg   template<typename _Alloc>
9281debfc3dSmrg     typename vector<bool, _Alloc>::iterator
9291debfc3dSmrg     vector<bool, _Alloc>::
_M_erase(iterator __first,iterator __last)9301debfc3dSmrg     _M_erase(iterator __first, iterator __last)
9311debfc3dSmrg     {
9321debfc3dSmrg       if (__first != __last)
9331debfc3dSmrg 	_M_erase_at_end(std::copy(__last, end(), __first));
9341debfc3dSmrg       return __first;
9351debfc3dSmrg     }
9361debfc3dSmrg 
9371debfc3dSmrg #if __cplusplus >= 201103L
9381debfc3dSmrg   template<typename _Alloc>
9391debfc3dSmrg     bool
9401debfc3dSmrg     vector<bool, _Alloc>::
_M_shrink_to_fit()9411debfc3dSmrg     _M_shrink_to_fit()
9421debfc3dSmrg     {
9431debfc3dSmrg       if (capacity() - size() < int(_S_word_bit))
9441debfc3dSmrg 	return false;
9451debfc3dSmrg       __try
9461debfc3dSmrg 	{
947*8feb0f0bSmrg 	  if (size_type __n = size())
948*8feb0f0bSmrg 	    _M_reallocate(__n);
949*8feb0f0bSmrg 	  else
950*8feb0f0bSmrg 	    {
951*8feb0f0bSmrg 	      this->_M_deallocate();
952*8feb0f0bSmrg 	      this->_M_impl._M_reset();
953*8feb0f0bSmrg 	    }
9541debfc3dSmrg 	  return true;
9551debfc3dSmrg 	}
9561debfc3dSmrg       __catch(...)
9571debfc3dSmrg 	{ return false; }
9581debfc3dSmrg     }
9591debfc3dSmrg #endif
9601debfc3dSmrg 
9611debfc3dSmrg _GLIBCXX_END_NAMESPACE_CONTAINER
962a2dc1f3fSmrg _GLIBCXX_END_NAMESPACE_VERSION
9631debfc3dSmrg } // namespace std
9641debfc3dSmrg 
9651debfc3dSmrg #if __cplusplus >= 201103L
9661debfc3dSmrg 
9671debfc3dSmrg namespace std _GLIBCXX_VISIBILITY(default)
9681debfc3dSmrg {
9691debfc3dSmrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
9701debfc3dSmrg 
9711debfc3dSmrg   template<typename _Alloc>
9721debfc3dSmrg     size_t
9731debfc3dSmrg     hash<_GLIBCXX_STD_C::vector<bool, _Alloc>>::
operator ()(const _GLIBCXX_STD_C::vector<bool,_Alloc> & __b) const9741debfc3dSmrg     operator()(const _GLIBCXX_STD_C::vector<bool, _Alloc>& __b) const noexcept
9751debfc3dSmrg     {
9761debfc3dSmrg       size_t __hash = 0;
9771debfc3dSmrg       using _GLIBCXX_STD_C::_S_word_bit;
9781debfc3dSmrg       using _GLIBCXX_STD_C::_Bit_type;
9791debfc3dSmrg 
9801debfc3dSmrg       const size_t __words = __b.size() / _S_word_bit;
9811debfc3dSmrg       if (__words)
9821debfc3dSmrg 	{
9831debfc3dSmrg 	  const size_t __clength = __words * sizeof(_Bit_type);
9841debfc3dSmrg 	  __hash = std::_Hash_impl::hash(__b._M_impl._M_start._M_p, __clength);
9851debfc3dSmrg 	}
9861debfc3dSmrg 
9871debfc3dSmrg       const size_t __extrabits = __b.size() % _S_word_bit;
9881debfc3dSmrg       if (__extrabits)
9891debfc3dSmrg 	{
9901debfc3dSmrg 	  _Bit_type __hiword = *__b._M_impl._M_finish._M_p;
9911debfc3dSmrg 	  __hiword &= ~((~static_cast<_Bit_type>(0)) << __extrabits);
9921debfc3dSmrg 
9931debfc3dSmrg 	  const size_t __clength
9941debfc3dSmrg 	    = (__extrabits + __CHAR_BIT__ - 1) / __CHAR_BIT__;
9951debfc3dSmrg 	  if (__words)
9961debfc3dSmrg 	    __hash = std::_Hash_impl::hash(&__hiword, __clength, __hash);
9971debfc3dSmrg 	  else
9981debfc3dSmrg 	    __hash = std::_Hash_impl::hash(&__hiword, __clength);
9991debfc3dSmrg 	}
10001debfc3dSmrg 
10011debfc3dSmrg       return __hash;
10021debfc3dSmrg     }
10031debfc3dSmrg 
10041debfc3dSmrg _GLIBCXX_END_NAMESPACE_VERSION
10051debfc3dSmrg } // namespace std
10061debfc3dSmrg 
10071debfc3dSmrg #endif // C++11
10081debfc3dSmrg 
1009a2dc1f3fSmrg #undef _GLIBCXX_ASAN_ANNOTATE_REINIT
1010a2dc1f3fSmrg #undef _GLIBCXX_ASAN_ANNOTATE_GROW
1011a2dc1f3fSmrg #undef _GLIBCXX_ASAN_ANNOTATE_GREW
1012a2dc1f3fSmrg #undef _GLIBCXX_ASAN_ANNOTATE_SHRINK
1013a2dc1f3fSmrg 
10141debfc3dSmrg #endif /* _VECTOR_TCC */
1015