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