1*e4b17023SJohn Marino // Vector implementation (out of line) -*- C++ -*- 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 4*e4b17023SJohn Marino // 2011 Free Software Foundation, Inc. 5*e4b17023SJohn Marino // 6*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library. This library is free 7*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the 8*e4b17023SJohn Marino // terms of the GNU General Public License as published by the 9*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option) 10*e4b17023SJohn Marino // any later version. 11*e4b17023SJohn Marino 12*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful, 13*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of 14*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*e4b17023SJohn Marino // GNU General Public License for more details. 16*e4b17023SJohn Marino 17*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional 18*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version 19*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation. 20*e4b17023SJohn Marino 21*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and 22*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program; 23*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>. 25*e4b17023SJohn Marino 26*e4b17023SJohn Marino /* 27*e4b17023SJohn Marino * 28*e4b17023SJohn Marino * Copyright (c) 1994 29*e4b17023SJohn Marino * Hewlett-Packard Company 30*e4b17023SJohn Marino * 31*e4b17023SJohn Marino * Permission to use, copy, modify, distribute and sell this software 32*e4b17023SJohn Marino * and its documentation for any purpose is hereby granted without fee, 33*e4b17023SJohn Marino * provided that the above copyright notice appear in all copies and 34*e4b17023SJohn Marino * that both that copyright notice and this permission notice appear 35*e4b17023SJohn Marino * in supporting documentation. Hewlett-Packard Company makes no 36*e4b17023SJohn Marino * representations about the suitability of this software for any 37*e4b17023SJohn Marino * purpose. It is provided "as is" without express or implied warranty. 38*e4b17023SJohn Marino * 39*e4b17023SJohn Marino * 40*e4b17023SJohn Marino * Copyright (c) 1996 41*e4b17023SJohn Marino * Silicon Graphics Computer Systems, Inc. 42*e4b17023SJohn Marino * 43*e4b17023SJohn Marino * Permission to use, copy, modify, distribute and sell this software 44*e4b17023SJohn Marino * and its documentation for any purpose is hereby granted without fee, 45*e4b17023SJohn Marino * provided that the above copyright notice appear in all copies and 46*e4b17023SJohn Marino * that both that copyright notice and this permission notice appear 47*e4b17023SJohn Marino * in supporting documentation. Silicon Graphics makes no 48*e4b17023SJohn Marino * representations about the suitability of this software for any 49*e4b17023SJohn Marino * purpose. It is provided "as is" without express or implied warranty. 50*e4b17023SJohn Marino */ 51*e4b17023SJohn Marino 52*e4b17023SJohn Marino /** @file bits/vector.tcc 53*e4b17023SJohn Marino * This is an internal header file, included by other library headers. 54*e4b17023SJohn Marino * Do not attempt to use it directly. @headername{vector} 55*e4b17023SJohn Marino */ 56*e4b17023SJohn Marino 57*e4b17023SJohn Marino #ifndef _VECTOR_TCC 58*e4b17023SJohn Marino #define _VECTOR_TCC 1 59*e4b17023SJohn Marino 60*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default) 61*e4b17023SJohn Marino { 62*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 63*e4b17023SJohn Marino 64*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 65*e4b17023SJohn Marino void 66*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 67*e4b17023SJohn Marino reserve(size_type __n) 68*e4b17023SJohn Marino { 69*e4b17023SJohn Marino if (__n > this->max_size()) 70*e4b17023SJohn Marino __throw_length_error(__N("vector::reserve")); 71*e4b17023SJohn Marino if (this->capacity() < __n) 72*e4b17023SJohn Marino { 73*e4b17023SJohn Marino const size_type __old_size = size(); 74*e4b17023SJohn Marino pointer __tmp = _M_allocate_and_copy(__n, 75*e4b17023SJohn Marino _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(this->_M_impl._M_start), 76*e4b17023SJohn Marino _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(this->_M_impl._M_finish)); 77*e4b17023SJohn Marino std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, 78*e4b17023SJohn Marino _M_get_Tp_allocator()); 79*e4b17023SJohn Marino _M_deallocate(this->_M_impl._M_start, 80*e4b17023SJohn Marino this->_M_impl._M_end_of_storage 81*e4b17023SJohn Marino - this->_M_impl._M_start); 82*e4b17023SJohn Marino this->_M_impl._M_start = __tmp; 83*e4b17023SJohn Marino this->_M_impl._M_finish = __tmp + __old_size; 84*e4b17023SJohn Marino this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n; 85*e4b17023SJohn Marino } 86*e4b17023SJohn Marino } 87*e4b17023SJohn Marino 88*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__ 89*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 90*e4b17023SJohn Marino template<typename... _Args> 91*e4b17023SJohn Marino void 92*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 93*e4b17023SJohn Marino emplace_back(_Args&&... __args) 94*e4b17023SJohn Marino { 95*e4b17023SJohn Marino if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage) 96*e4b17023SJohn Marino { 97*e4b17023SJohn Marino _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish, 98*e4b17023SJohn Marino std::forward<_Args>(__args)...); 99*e4b17023SJohn Marino ++this->_M_impl._M_finish; 100*e4b17023SJohn Marino } 101*e4b17023SJohn Marino else 102*e4b17023SJohn Marino _M_emplace_back_aux(std::forward<_Args>(__args)...); 103*e4b17023SJohn Marino } 104*e4b17023SJohn Marino #endif 105*e4b17023SJohn Marino 106*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 107*e4b17023SJohn Marino typename vector<_Tp, _Alloc>::iterator 108*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 109*e4b17023SJohn Marino insert(iterator __position, const value_type& __x) 110*e4b17023SJohn Marino { 111*e4b17023SJohn Marino const size_type __n = __position - begin(); 112*e4b17023SJohn Marino if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage 113*e4b17023SJohn Marino && __position == end()) 114*e4b17023SJohn Marino { 115*e4b17023SJohn Marino _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish, __x); 116*e4b17023SJohn Marino ++this->_M_impl._M_finish; 117*e4b17023SJohn Marino } 118*e4b17023SJohn Marino else 119*e4b17023SJohn Marino { 120*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__ 121*e4b17023SJohn Marino if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage) 122*e4b17023SJohn Marino { 123*e4b17023SJohn Marino _Tp __x_copy = __x; 124*e4b17023SJohn Marino _M_insert_aux(__position, std::move(__x_copy)); 125*e4b17023SJohn Marino } 126*e4b17023SJohn Marino else 127*e4b17023SJohn Marino #endif 128*e4b17023SJohn Marino _M_insert_aux(__position, __x); 129*e4b17023SJohn Marino } 130*e4b17023SJohn Marino return iterator(this->_M_impl._M_start + __n); 131*e4b17023SJohn Marino } 132*e4b17023SJohn Marino 133*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 134*e4b17023SJohn Marino typename vector<_Tp, _Alloc>::iterator 135*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 136*e4b17023SJohn Marino erase(iterator __position) 137*e4b17023SJohn Marino { 138*e4b17023SJohn Marino if (__position + 1 != end()) 139*e4b17023SJohn Marino _GLIBCXX_MOVE3(__position + 1, end(), __position); 140*e4b17023SJohn Marino --this->_M_impl._M_finish; 141*e4b17023SJohn Marino _Alloc_traits::destroy(this->_M_impl, this->_M_impl._M_finish); 142*e4b17023SJohn Marino return __position; 143*e4b17023SJohn Marino } 144*e4b17023SJohn Marino 145*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 146*e4b17023SJohn Marino typename vector<_Tp, _Alloc>::iterator 147*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 148*e4b17023SJohn Marino erase(iterator __first, iterator __last) 149*e4b17023SJohn Marino { 150*e4b17023SJohn Marino if (__first != __last) 151*e4b17023SJohn Marino { 152*e4b17023SJohn Marino if (__last != end()) 153*e4b17023SJohn Marino _GLIBCXX_MOVE3(__last, end(), __first); 154*e4b17023SJohn Marino _M_erase_at_end(__first.base() + (end() - __last)); 155*e4b17023SJohn Marino } 156*e4b17023SJohn Marino return __first; 157*e4b17023SJohn Marino } 158*e4b17023SJohn Marino 159*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 160*e4b17023SJohn Marino vector<_Tp, _Alloc>& 161*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 162*e4b17023SJohn Marino operator=(const vector<_Tp, _Alloc>& __x) 163*e4b17023SJohn Marino { 164*e4b17023SJohn Marino if (&__x != this) 165*e4b17023SJohn Marino { 166*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__ 167*e4b17023SJohn Marino if (_Alloc_traits::_S_propagate_on_copy_assign()) 168*e4b17023SJohn Marino { 169*e4b17023SJohn Marino if (!_Alloc_traits::_S_always_equal() 170*e4b17023SJohn Marino && _M_get_Tp_allocator() != __x._M_get_Tp_allocator()) 171*e4b17023SJohn Marino { 172*e4b17023SJohn Marino // replacement allocator cannot free existing storage 173*e4b17023SJohn Marino this->clear(); 174*e4b17023SJohn Marino _M_deallocate(this->_M_impl._M_start, 175*e4b17023SJohn Marino this->_M_impl._M_end_of_storage 176*e4b17023SJohn Marino - this->_M_impl._M_start); 177*e4b17023SJohn Marino } 178*e4b17023SJohn Marino std::__alloc_on_copy(_M_get_Tp_allocator(), 179*e4b17023SJohn Marino __x._M_get_Tp_allocator()); 180*e4b17023SJohn Marino } 181*e4b17023SJohn Marino #endif 182*e4b17023SJohn Marino const size_type __xlen = __x.size(); 183*e4b17023SJohn Marino if (__xlen > capacity()) 184*e4b17023SJohn Marino { 185*e4b17023SJohn Marino pointer __tmp = _M_allocate_and_copy(__xlen, __x.begin(), 186*e4b17023SJohn Marino __x.end()); 187*e4b17023SJohn Marino std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, 188*e4b17023SJohn Marino _M_get_Tp_allocator()); 189*e4b17023SJohn Marino _M_deallocate(this->_M_impl._M_start, 190*e4b17023SJohn Marino this->_M_impl._M_end_of_storage 191*e4b17023SJohn Marino - this->_M_impl._M_start); 192*e4b17023SJohn Marino this->_M_impl._M_start = __tmp; 193*e4b17023SJohn Marino this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __xlen; 194*e4b17023SJohn Marino } 195*e4b17023SJohn Marino else if (size() >= __xlen) 196*e4b17023SJohn Marino { 197*e4b17023SJohn Marino std::_Destroy(std::copy(__x.begin(), __x.end(), begin()), 198*e4b17023SJohn Marino end(), _M_get_Tp_allocator()); 199*e4b17023SJohn Marino } 200*e4b17023SJohn Marino else 201*e4b17023SJohn Marino { 202*e4b17023SJohn Marino std::copy(__x._M_impl._M_start, __x._M_impl._M_start + size(), 203*e4b17023SJohn Marino this->_M_impl._M_start); 204*e4b17023SJohn Marino std::__uninitialized_copy_a(__x._M_impl._M_start + size(), 205*e4b17023SJohn Marino __x._M_impl._M_finish, 206*e4b17023SJohn Marino this->_M_impl._M_finish, 207*e4b17023SJohn Marino _M_get_Tp_allocator()); 208*e4b17023SJohn Marino } 209*e4b17023SJohn Marino this->_M_impl._M_finish = this->_M_impl._M_start + __xlen; 210*e4b17023SJohn Marino } 211*e4b17023SJohn Marino return *this; 212*e4b17023SJohn Marino } 213*e4b17023SJohn Marino 214*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 215*e4b17023SJohn Marino void 216*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 217*e4b17023SJohn Marino _M_fill_assign(size_t __n, const value_type& __val) 218*e4b17023SJohn Marino { 219*e4b17023SJohn Marino if (__n > capacity()) 220*e4b17023SJohn Marino { 221*e4b17023SJohn Marino vector __tmp(__n, __val, _M_get_Tp_allocator()); 222*e4b17023SJohn Marino __tmp.swap(*this); 223*e4b17023SJohn Marino } 224*e4b17023SJohn Marino else if (__n > size()) 225*e4b17023SJohn Marino { 226*e4b17023SJohn Marino std::fill(begin(), end(), __val); 227*e4b17023SJohn Marino std::__uninitialized_fill_n_a(this->_M_impl._M_finish, 228*e4b17023SJohn Marino __n - size(), __val, 229*e4b17023SJohn Marino _M_get_Tp_allocator()); 230*e4b17023SJohn Marino this->_M_impl._M_finish += __n - size(); 231*e4b17023SJohn Marino } 232*e4b17023SJohn Marino else 233*e4b17023SJohn Marino _M_erase_at_end(std::fill_n(this->_M_impl._M_start, __n, __val)); 234*e4b17023SJohn Marino } 235*e4b17023SJohn Marino 236*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 237*e4b17023SJohn Marino template<typename _InputIterator> 238*e4b17023SJohn Marino void 239*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 240*e4b17023SJohn Marino _M_assign_aux(_InputIterator __first, _InputIterator __last, 241*e4b17023SJohn Marino std::input_iterator_tag) 242*e4b17023SJohn Marino { 243*e4b17023SJohn Marino pointer __cur(this->_M_impl._M_start); 244*e4b17023SJohn Marino for (; __first != __last && __cur != this->_M_impl._M_finish; 245*e4b17023SJohn Marino ++__cur, ++__first) 246*e4b17023SJohn Marino *__cur = *__first; 247*e4b17023SJohn Marino if (__first == __last) 248*e4b17023SJohn Marino _M_erase_at_end(__cur); 249*e4b17023SJohn Marino else 250*e4b17023SJohn Marino insert(end(), __first, __last); 251*e4b17023SJohn Marino } 252*e4b17023SJohn Marino 253*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 254*e4b17023SJohn Marino template<typename _ForwardIterator> 255*e4b17023SJohn Marino void 256*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 257*e4b17023SJohn Marino _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last, 258*e4b17023SJohn Marino std::forward_iterator_tag) 259*e4b17023SJohn Marino { 260*e4b17023SJohn Marino const size_type __len = std::distance(__first, __last); 261*e4b17023SJohn Marino 262*e4b17023SJohn Marino if (__len > capacity()) 263*e4b17023SJohn Marino { 264*e4b17023SJohn Marino pointer __tmp(_M_allocate_and_copy(__len, __first, __last)); 265*e4b17023SJohn Marino std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, 266*e4b17023SJohn Marino _M_get_Tp_allocator()); 267*e4b17023SJohn Marino _M_deallocate(this->_M_impl._M_start, 268*e4b17023SJohn Marino this->_M_impl._M_end_of_storage 269*e4b17023SJohn Marino - this->_M_impl._M_start); 270*e4b17023SJohn Marino this->_M_impl._M_start = __tmp; 271*e4b17023SJohn Marino this->_M_impl._M_finish = this->_M_impl._M_start + __len; 272*e4b17023SJohn Marino this->_M_impl._M_end_of_storage = this->_M_impl._M_finish; 273*e4b17023SJohn Marino } 274*e4b17023SJohn Marino else if (size() >= __len) 275*e4b17023SJohn Marino _M_erase_at_end(std::copy(__first, __last, this->_M_impl._M_start)); 276*e4b17023SJohn Marino else 277*e4b17023SJohn Marino { 278*e4b17023SJohn Marino _ForwardIterator __mid = __first; 279*e4b17023SJohn Marino std::advance(__mid, size()); 280*e4b17023SJohn Marino std::copy(__first, __mid, this->_M_impl._M_start); 281*e4b17023SJohn Marino this->_M_impl._M_finish = 282*e4b17023SJohn Marino std::__uninitialized_copy_a(__mid, __last, 283*e4b17023SJohn Marino this->_M_impl._M_finish, 284*e4b17023SJohn Marino _M_get_Tp_allocator()); 285*e4b17023SJohn Marino } 286*e4b17023SJohn Marino } 287*e4b17023SJohn Marino 288*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__ 289*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 290*e4b17023SJohn Marino template<typename... _Args> 291*e4b17023SJohn Marino typename vector<_Tp, _Alloc>::iterator 292*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 293*e4b17023SJohn Marino emplace(iterator __position, _Args&&... __args) 294*e4b17023SJohn Marino { 295*e4b17023SJohn Marino const size_type __n = __position - begin(); 296*e4b17023SJohn Marino if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage 297*e4b17023SJohn Marino && __position == end()) 298*e4b17023SJohn Marino { 299*e4b17023SJohn Marino _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish, 300*e4b17023SJohn Marino std::forward<_Args>(__args)...); 301*e4b17023SJohn Marino ++this->_M_impl._M_finish; 302*e4b17023SJohn Marino } 303*e4b17023SJohn Marino else 304*e4b17023SJohn Marino _M_insert_aux(__position, std::forward<_Args>(__args)...); 305*e4b17023SJohn Marino return iterator(this->_M_impl._M_start + __n); 306*e4b17023SJohn Marino } 307*e4b17023SJohn Marino 308*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 309*e4b17023SJohn Marino template<typename... _Args> 310*e4b17023SJohn Marino void 311*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 312*e4b17023SJohn Marino _M_insert_aux(iterator __position, _Args&&... __args) 313*e4b17023SJohn Marino #else 314*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 315*e4b17023SJohn Marino void 316*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 317*e4b17023SJohn Marino _M_insert_aux(iterator __position, const _Tp& __x) 318*e4b17023SJohn Marino #endif 319*e4b17023SJohn Marino { 320*e4b17023SJohn Marino if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage) 321*e4b17023SJohn Marino { 322*e4b17023SJohn Marino _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish, 323*e4b17023SJohn Marino _GLIBCXX_MOVE(*(this->_M_impl._M_finish 324*e4b17023SJohn Marino - 1))); 325*e4b17023SJohn Marino ++this->_M_impl._M_finish; 326*e4b17023SJohn Marino #ifndef __GXX_EXPERIMENTAL_CXX0X__ 327*e4b17023SJohn Marino _Tp __x_copy = __x; 328*e4b17023SJohn Marino #endif 329*e4b17023SJohn Marino _GLIBCXX_MOVE_BACKWARD3(__position.base(), 330*e4b17023SJohn Marino this->_M_impl._M_finish - 2, 331*e4b17023SJohn Marino this->_M_impl._M_finish - 1); 332*e4b17023SJohn Marino #ifndef __GXX_EXPERIMENTAL_CXX0X__ 333*e4b17023SJohn Marino *__position = __x_copy; 334*e4b17023SJohn Marino #else 335*e4b17023SJohn Marino *__position = _Tp(std::forward<_Args>(__args)...); 336*e4b17023SJohn Marino #endif 337*e4b17023SJohn Marino } 338*e4b17023SJohn Marino else 339*e4b17023SJohn Marino { 340*e4b17023SJohn Marino const size_type __len = 341*e4b17023SJohn Marino _M_check_len(size_type(1), "vector::_M_insert_aux"); 342*e4b17023SJohn Marino const size_type __elems_before = __position - begin(); 343*e4b17023SJohn Marino pointer __new_start(this->_M_allocate(__len)); 344*e4b17023SJohn Marino pointer __new_finish(__new_start); 345*e4b17023SJohn Marino __try 346*e4b17023SJohn Marino { 347*e4b17023SJohn Marino // The order of the three operations is dictated by the C++0x 348*e4b17023SJohn Marino // case, where the moves could alter a new element belonging 349*e4b17023SJohn Marino // to the existing vector. This is an issue only for callers 350*e4b17023SJohn Marino // taking the element by const lvalue ref (see 23.1/13). 351*e4b17023SJohn Marino _Alloc_traits::construct(this->_M_impl, 352*e4b17023SJohn Marino __new_start + __elems_before, 353*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__ 354*e4b17023SJohn Marino std::forward<_Args>(__args)...); 355*e4b17023SJohn Marino #else 356*e4b17023SJohn Marino __x); 357*e4b17023SJohn Marino #endif 358*e4b17023SJohn Marino __new_finish = 0; 359*e4b17023SJohn Marino 360*e4b17023SJohn Marino __new_finish 361*e4b17023SJohn Marino = std::__uninitialized_move_if_noexcept_a 362*e4b17023SJohn Marino (this->_M_impl._M_start, __position.base(), 363*e4b17023SJohn Marino __new_start, _M_get_Tp_allocator()); 364*e4b17023SJohn Marino 365*e4b17023SJohn Marino ++__new_finish; 366*e4b17023SJohn Marino 367*e4b17023SJohn Marino __new_finish 368*e4b17023SJohn Marino = std::__uninitialized_move_if_noexcept_a 369*e4b17023SJohn Marino (__position.base(), this->_M_impl._M_finish, 370*e4b17023SJohn Marino __new_finish, _M_get_Tp_allocator()); 371*e4b17023SJohn Marino } 372*e4b17023SJohn Marino __catch(...) 373*e4b17023SJohn Marino { 374*e4b17023SJohn Marino if (!__new_finish) 375*e4b17023SJohn Marino _Alloc_traits::destroy(this->_M_impl, 376*e4b17023SJohn Marino __new_start + __elems_before); 377*e4b17023SJohn Marino else 378*e4b17023SJohn Marino std::_Destroy(__new_start, __new_finish, _M_get_Tp_allocator()); 379*e4b17023SJohn Marino _M_deallocate(__new_start, __len); 380*e4b17023SJohn Marino __throw_exception_again; 381*e4b17023SJohn Marino } 382*e4b17023SJohn Marino std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, 383*e4b17023SJohn Marino _M_get_Tp_allocator()); 384*e4b17023SJohn Marino _M_deallocate(this->_M_impl._M_start, 385*e4b17023SJohn Marino this->_M_impl._M_end_of_storage 386*e4b17023SJohn Marino - this->_M_impl._M_start); 387*e4b17023SJohn Marino this->_M_impl._M_start = __new_start; 388*e4b17023SJohn Marino this->_M_impl._M_finish = __new_finish; 389*e4b17023SJohn Marino this->_M_impl._M_end_of_storage = __new_start + __len; 390*e4b17023SJohn Marino } 391*e4b17023SJohn Marino } 392*e4b17023SJohn Marino 393*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__ 394*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 395*e4b17023SJohn Marino template<typename... _Args> 396*e4b17023SJohn Marino void 397*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 398*e4b17023SJohn Marino _M_emplace_back_aux(_Args&&... __args) 399*e4b17023SJohn Marino { 400*e4b17023SJohn Marino const size_type __len = 401*e4b17023SJohn Marino _M_check_len(size_type(1), "vector::_M_emplace_back_aux"); 402*e4b17023SJohn Marino pointer __new_start(this->_M_allocate(__len)); 403*e4b17023SJohn Marino pointer __new_finish(__new_start); 404*e4b17023SJohn Marino __try 405*e4b17023SJohn Marino { 406*e4b17023SJohn Marino _Alloc_traits::construct(this->_M_impl, __new_start + size(), 407*e4b17023SJohn Marino std::forward<_Args>(__args)...); 408*e4b17023SJohn Marino __new_finish = 0; 409*e4b17023SJohn Marino 410*e4b17023SJohn Marino __new_finish 411*e4b17023SJohn Marino = std::__uninitialized_move_if_noexcept_a 412*e4b17023SJohn Marino (this->_M_impl._M_start, this->_M_impl._M_finish, 413*e4b17023SJohn Marino __new_start, _M_get_Tp_allocator()); 414*e4b17023SJohn Marino 415*e4b17023SJohn Marino ++__new_finish; 416*e4b17023SJohn Marino } 417*e4b17023SJohn Marino __catch(...) 418*e4b17023SJohn Marino { 419*e4b17023SJohn Marino if (!__new_finish) 420*e4b17023SJohn Marino _Alloc_traits::destroy(this->_M_impl, __new_start + size()); 421*e4b17023SJohn Marino else 422*e4b17023SJohn Marino std::_Destroy(__new_start, __new_finish, _M_get_Tp_allocator()); 423*e4b17023SJohn Marino _M_deallocate(__new_start, __len); 424*e4b17023SJohn Marino __throw_exception_again; 425*e4b17023SJohn Marino } 426*e4b17023SJohn Marino std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, 427*e4b17023SJohn Marino _M_get_Tp_allocator()); 428*e4b17023SJohn Marino _M_deallocate(this->_M_impl._M_start, 429*e4b17023SJohn Marino this->_M_impl._M_end_of_storage 430*e4b17023SJohn Marino - this->_M_impl._M_start); 431*e4b17023SJohn Marino this->_M_impl._M_start = __new_start; 432*e4b17023SJohn Marino this->_M_impl._M_finish = __new_finish; 433*e4b17023SJohn Marino this->_M_impl._M_end_of_storage = __new_start + __len; 434*e4b17023SJohn Marino } 435*e4b17023SJohn Marino #endif 436*e4b17023SJohn Marino 437*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 438*e4b17023SJohn Marino void 439*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 440*e4b17023SJohn Marino _M_fill_insert(iterator __position, size_type __n, const value_type& __x) 441*e4b17023SJohn Marino { 442*e4b17023SJohn Marino if (__n != 0) 443*e4b17023SJohn Marino { 444*e4b17023SJohn Marino if (size_type(this->_M_impl._M_end_of_storage 445*e4b17023SJohn Marino - this->_M_impl._M_finish) >= __n) 446*e4b17023SJohn Marino { 447*e4b17023SJohn Marino value_type __x_copy = __x; 448*e4b17023SJohn Marino const size_type __elems_after = end() - __position; 449*e4b17023SJohn Marino pointer __old_finish(this->_M_impl._M_finish); 450*e4b17023SJohn Marino if (__elems_after > __n) 451*e4b17023SJohn Marino { 452*e4b17023SJohn Marino std::__uninitialized_move_a(this->_M_impl._M_finish - __n, 453*e4b17023SJohn Marino this->_M_impl._M_finish, 454*e4b17023SJohn Marino this->_M_impl._M_finish, 455*e4b17023SJohn Marino _M_get_Tp_allocator()); 456*e4b17023SJohn Marino this->_M_impl._M_finish += __n; 457*e4b17023SJohn Marino _GLIBCXX_MOVE_BACKWARD3(__position.base(), 458*e4b17023SJohn Marino __old_finish - __n, __old_finish); 459*e4b17023SJohn Marino std::fill(__position.base(), __position.base() + __n, 460*e4b17023SJohn Marino __x_copy); 461*e4b17023SJohn Marino } 462*e4b17023SJohn Marino else 463*e4b17023SJohn Marino { 464*e4b17023SJohn Marino std::__uninitialized_fill_n_a(this->_M_impl._M_finish, 465*e4b17023SJohn Marino __n - __elems_after, 466*e4b17023SJohn Marino __x_copy, 467*e4b17023SJohn Marino _M_get_Tp_allocator()); 468*e4b17023SJohn Marino this->_M_impl._M_finish += __n - __elems_after; 469*e4b17023SJohn Marino std::__uninitialized_move_a(__position.base(), __old_finish, 470*e4b17023SJohn Marino this->_M_impl._M_finish, 471*e4b17023SJohn Marino _M_get_Tp_allocator()); 472*e4b17023SJohn Marino this->_M_impl._M_finish += __elems_after; 473*e4b17023SJohn Marino std::fill(__position.base(), __old_finish, __x_copy); 474*e4b17023SJohn Marino } 475*e4b17023SJohn Marino } 476*e4b17023SJohn Marino else 477*e4b17023SJohn Marino { 478*e4b17023SJohn Marino const size_type __len = 479*e4b17023SJohn Marino _M_check_len(__n, "vector::_M_fill_insert"); 480*e4b17023SJohn Marino const size_type __elems_before = __position - begin(); 481*e4b17023SJohn Marino pointer __new_start(this->_M_allocate(__len)); 482*e4b17023SJohn Marino pointer __new_finish(__new_start); 483*e4b17023SJohn Marino __try 484*e4b17023SJohn Marino { 485*e4b17023SJohn Marino // See _M_insert_aux above. 486*e4b17023SJohn Marino std::__uninitialized_fill_n_a(__new_start + __elems_before, 487*e4b17023SJohn Marino __n, __x, 488*e4b17023SJohn Marino _M_get_Tp_allocator()); 489*e4b17023SJohn Marino __new_finish = 0; 490*e4b17023SJohn Marino 491*e4b17023SJohn Marino __new_finish 492*e4b17023SJohn Marino = std::__uninitialized_move_if_noexcept_a 493*e4b17023SJohn Marino (this->_M_impl._M_start, __position.base(), 494*e4b17023SJohn Marino __new_start, _M_get_Tp_allocator()); 495*e4b17023SJohn Marino 496*e4b17023SJohn Marino __new_finish += __n; 497*e4b17023SJohn Marino 498*e4b17023SJohn Marino __new_finish 499*e4b17023SJohn Marino = std::__uninitialized_move_if_noexcept_a 500*e4b17023SJohn Marino (__position.base(), this->_M_impl._M_finish, 501*e4b17023SJohn Marino __new_finish, _M_get_Tp_allocator()); 502*e4b17023SJohn Marino } 503*e4b17023SJohn Marino __catch(...) 504*e4b17023SJohn Marino { 505*e4b17023SJohn Marino if (!__new_finish) 506*e4b17023SJohn Marino std::_Destroy(__new_start + __elems_before, 507*e4b17023SJohn Marino __new_start + __elems_before + __n, 508*e4b17023SJohn Marino _M_get_Tp_allocator()); 509*e4b17023SJohn Marino else 510*e4b17023SJohn Marino std::_Destroy(__new_start, __new_finish, 511*e4b17023SJohn Marino _M_get_Tp_allocator()); 512*e4b17023SJohn Marino _M_deallocate(__new_start, __len); 513*e4b17023SJohn Marino __throw_exception_again; 514*e4b17023SJohn Marino } 515*e4b17023SJohn Marino std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, 516*e4b17023SJohn Marino _M_get_Tp_allocator()); 517*e4b17023SJohn Marino _M_deallocate(this->_M_impl._M_start, 518*e4b17023SJohn Marino this->_M_impl._M_end_of_storage 519*e4b17023SJohn Marino - this->_M_impl._M_start); 520*e4b17023SJohn Marino this->_M_impl._M_start = __new_start; 521*e4b17023SJohn Marino this->_M_impl._M_finish = __new_finish; 522*e4b17023SJohn Marino this->_M_impl._M_end_of_storage = __new_start + __len; 523*e4b17023SJohn Marino } 524*e4b17023SJohn Marino } 525*e4b17023SJohn Marino } 526*e4b17023SJohn Marino 527*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__ 528*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 529*e4b17023SJohn Marino void 530*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 531*e4b17023SJohn Marino _M_default_append(size_type __n) 532*e4b17023SJohn Marino { 533*e4b17023SJohn Marino if (__n != 0) 534*e4b17023SJohn Marino { 535*e4b17023SJohn Marino if (size_type(this->_M_impl._M_end_of_storage 536*e4b17023SJohn Marino - this->_M_impl._M_finish) >= __n) 537*e4b17023SJohn Marino { 538*e4b17023SJohn Marino std::__uninitialized_default_n_a(this->_M_impl._M_finish, 539*e4b17023SJohn Marino __n, _M_get_Tp_allocator()); 540*e4b17023SJohn Marino this->_M_impl._M_finish += __n; 541*e4b17023SJohn Marino } 542*e4b17023SJohn Marino else 543*e4b17023SJohn Marino { 544*e4b17023SJohn Marino const size_type __len = 545*e4b17023SJohn Marino _M_check_len(__n, "vector::_M_default_append"); 546*e4b17023SJohn Marino const size_type __old_size = this->size(); 547*e4b17023SJohn Marino pointer __new_start(this->_M_allocate(__len)); 548*e4b17023SJohn Marino pointer __new_finish(__new_start); 549*e4b17023SJohn Marino __try 550*e4b17023SJohn Marino { 551*e4b17023SJohn Marino __new_finish 552*e4b17023SJohn Marino = std::__uninitialized_move_if_noexcept_a 553*e4b17023SJohn Marino (this->_M_impl._M_start, this->_M_impl._M_finish, 554*e4b17023SJohn Marino __new_start, _M_get_Tp_allocator()); 555*e4b17023SJohn Marino std::__uninitialized_default_n_a(__new_finish, __n, 556*e4b17023SJohn Marino _M_get_Tp_allocator()); 557*e4b17023SJohn Marino __new_finish += __n; 558*e4b17023SJohn Marino } 559*e4b17023SJohn Marino __catch(...) 560*e4b17023SJohn Marino { 561*e4b17023SJohn Marino std::_Destroy(__new_start, __new_finish, 562*e4b17023SJohn Marino _M_get_Tp_allocator()); 563*e4b17023SJohn Marino _M_deallocate(__new_start, __len); 564*e4b17023SJohn Marino __throw_exception_again; 565*e4b17023SJohn Marino } 566*e4b17023SJohn Marino std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, 567*e4b17023SJohn Marino _M_get_Tp_allocator()); 568*e4b17023SJohn Marino _M_deallocate(this->_M_impl._M_start, 569*e4b17023SJohn Marino this->_M_impl._M_end_of_storage 570*e4b17023SJohn Marino - this->_M_impl._M_start); 571*e4b17023SJohn Marino this->_M_impl._M_start = __new_start; 572*e4b17023SJohn Marino this->_M_impl._M_finish = __new_finish; 573*e4b17023SJohn Marino this->_M_impl._M_end_of_storage = __new_start + __len; 574*e4b17023SJohn Marino } 575*e4b17023SJohn Marino } 576*e4b17023SJohn Marino } 577*e4b17023SJohn Marino 578*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 579*e4b17023SJohn Marino bool 580*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 581*e4b17023SJohn Marino _M_shrink_to_fit() 582*e4b17023SJohn Marino { 583*e4b17023SJohn Marino if (capacity() == size()) 584*e4b17023SJohn Marino return false; 585*e4b17023SJohn Marino return std::__shrink_to_fit_aux<vector>::_S_do_it(*this); 586*e4b17023SJohn Marino } 587*e4b17023SJohn Marino #endif 588*e4b17023SJohn Marino 589*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 590*e4b17023SJohn Marino template<typename _InputIterator> 591*e4b17023SJohn Marino void 592*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 593*e4b17023SJohn Marino _M_range_insert(iterator __pos, _InputIterator __first, 594*e4b17023SJohn Marino _InputIterator __last, std::input_iterator_tag) 595*e4b17023SJohn Marino { 596*e4b17023SJohn Marino for (; __first != __last; ++__first) 597*e4b17023SJohn Marino { 598*e4b17023SJohn Marino __pos = insert(__pos, *__first); 599*e4b17023SJohn Marino ++__pos; 600*e4b17023SJohn Marino } 601*e4b17023SJohn Marino } 602*e4b17023SJohn Marino 603*e4b17023SJohn Marino template<typename _Tp, typename _Alloc> 604*e4b17023SJohn Marino template<typename _ForwardIterator> 605*e4b17023SJohn Marino void 606*e4b17023SJohn Marino vector<_Tp, _Alloc>:: 607*e4b17023SJohn Marino _M_range_insert(iterator __position, _ForwardIterator __first, 608*e4b17023SJohn Marino _ForwardIterator __last, std::forward_iterator_tag) 609*e4b17023SJohn Marino { 610*e4b17023SJohn Marino if (__first != __last) 611*e4b17023SJohn Marino { 612*e4b17023SJohn Marino const size_type __n = std::distance(__first, __last); 613*e4b17023SJohn Marino if (size_type(this->_M_impl._M_end_of_storage 614*e4b17023SJohn Marino - this->_M_impl._M_finish) >= __n) 615*e4b17023SJohn Marino { 616*e4b17023SJohn Marino const size_type __elems_after = end() - __position; 617*e4b17023SJohn Marino pointer __old_finish(this->_M_impl._M_finish); 618*e4b17023SJohn Marino if (__elems_after > __n) 619*e4b17023SJohn Marino { 620*e4b17023SJohn Marino std::__uninitialized_move_a(this->_M_impl._M_finish - __n, 621*e4b17023SJohn Marino this->_M_impl._M_finish, 622*e4b17023SJohn Marino this->_M_impl._M_finish, 623*e4b17023SJohn Marino _M_get_Tp_allocator()); 624*e4b17023SJohn Marino this->_M_impl._M_finish += __n; 625*e4b17023SJohn Marino _GLIBCXX_MOVE_BACKWARD3(__position.base(), 626*e4b17023SJohn Marino __old_finish - __n, __old_finish); 627*e4b17023SJohn Marino std::copy(__first, __last, __position); 628*e4b17023SJohn Marino } 629*e4b17023SJohn Marino else 630*e4b17023SJohn Marino { 631*e4b17023SJohn Marino _ForwardIterator __mid = __first; 632*e4b17023SJohn Marino std::advance(__mid, __elems_after); 633*e4b17023SJohn Marino std::__uninitialized_copy_a(__mid, __last, 634*e4b17023SJohn Marino this->_M_impl._M_finish, 635*e4b17023SJohn Marino _M_get_Tp_allocator()); 636*e4b17023SJohn Marino this->_M_impl._M_finish += __n - __elems_after; 637*e4b17023SJohn Marino std::__uninitialized_move_a(__position.base(), 638*e4b17023SJohn Marino __old_finish, 639*e4b17023SJohn Marino this->_M_impl._M_finish, 640*e4b17023SJohn Marino _M_get_Tp_allocator()); 641*e4b17023SJohn Marino this->_M_impl._M_finish += __elems_after; 642*e4b17023SJohn Marino std::copy(__first, __mid, __position); 643*e4b17023SJohn Marino } 644*e4b17023SJohn Marino } 645*e4b17023SJohn Marino else 646*e4b17023SJohn Marino { 647*e4b17023SJohn Marino const size_type __len = 648*e4b17023SJohn Marino _M_check_len(__n, "vector::_M_range_insert"); 649*e4b17023SJohn Marino pointer __new_start(this->_M_allocate(__len)); 650*e4b17023SJohn Marino pointer __new_finish(__new_start); 651*e4b17023SJohn Marino __try 652*e4b17023SJohn Marino { 653*e4b17023SJohn Marino __new_finish 654*e4b17023SJohn Marino = std::__uninitialized_move_if_noexcept_a 655*e4b17023SJohn Marino (this->_M_impl._M_start, __position.base(), 656*e4b17023SJohn Marino __new_start, _M_get_Tp_allocator()); 657*e4b17023SJohn Marino __new_finish 658*e4b17023SJohn Marino = std::__uninitialized_copy_a(__first, __last, 659*e4b17023SJohn Marino __new_finish, 660*e4b17023SJohn Marino _M_get_Tp_allocator()); 661*e4b17023SJohn Marino __new_finish 662*e4b17023SJohn Marino = std::__uninitialized_move_if_noexcept_a 663*e4b17023SJohn Marino (__position.base(), this->_M_impl._M_finish, 664*e4b17023SJohn Marino __new_finish, _M_get_Tp_allocator()); 665*e4b17023SJohn Marino } 666*e4b17023SJohn Marino __catch(...) 667*e4b17023SJohn Marino { 668*e4b17023SJohn Marino std::_Destroy(__new_start, __new_finish, 669*e4b17023SJohn Marino _M_get_Tp_allocator()); 670*e4b17023SJohn Marino _M_deallocate(__new_start, __len); 671*e4b17023SJohn Marino __throw_exception_again; 672*e4b17023SJohn Marino } 673*e4b17023SJohn Marino std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, 674*e4b17023SJohn Marino _M_get_Tp_allocator()); 675*e4b17023SJohn Marino _M_deallocate(this->_M_impl._M_start, 676*e4b17023SJohn Marino this->_M_impl._M_end_of_storage 677*e4b17023SJohn Marino - this->_M_impl._M_start); 678*e4b17023SJohn Marino this->_M_impl._M_start = __new_start; 679*e4b17023SJohn Marino this->_M_impl._M_finish = __new_finish; 680*e4b17023SJohn Marino this->_M_impl._M_end_of_storage = __new_start + __len; 681*e4b17023SJohn Marino } 682*e4b17023SJohn Marino } 683*e4b17023SJohn Marino } 684*e4b17023SJohn Marino 685*e4b17023SJohn Marino 686*e4b17023SJohn Marino // vector<bool> 687*e4b17023SJohn Marino template<typename _Alloc> 688*e4b17023SJohn Marino void 689*e4b17023SJohn Marino vector<bool, _Alloc>:: 690*e4b17023SJohn Marino _M_reallocate(size_type __n) 691*e4b17023SJohn Marino { 692*e4b17023SJohn Marino _Bit_type* __q = this->_M_allocate(__n); 693*e4b17023SJohn Marino this->_M_impl._M_finish = _M_copy_aligned(begin(), end(), 694*e4b17023SJohn Marino iterator(__q, 0)); 695*e4b17023SJohn Marino this->_M_deallocate(); 696*e4b17023SJohn Marino this->_M_impl._M_start = iterator(__q, 0); 697*e4b17023SJohn Marino this->_M_impl._M_end_of_storage = __q + _S_nword(__n); 698*e4b17023SJohn Marino } 699*e4b17023SJohn Marino 700*e4b17023SJohn Marino template<typename _Alloc> 701*e4b17023SJohn Marino void 702*e4b17023SJohn Marino vector<bool, _Alloc>:: 703*e4b17023SJohn Marino _M_fill_insert(iterator __position, size_type __n, bool __x) 704*e4b17023SJohn Marino { 705*e4b17023SJohn Marino if (__n == 0) 706*e4b17023SJohn Marino return; 707*e4b17023SJohn Marino if (capacity() - size() >= __n) 708*e4b17023SJohn Marino { 709*e4b17023SJohn Marino std::copy_backward(__position, end(), 710*e4b17023SJohn Marino this->_M_impl._M_finish + difference_type(__n)); 711*e4b17023SJohn Marino std::fill(__position, __position + difference_type(__n), __x); 712*e4b17023SJohn Marino this->_M_impl._M_finish += difference_type(__n); 713*e4b17023SJohn Marino } 714*e4b17023SJohn Marino else 715*e4b17023SJohn Marino { 716*e4b17023SJohn Marino const size_type __len = 717*e4b17023SJohn Marino _M_check_len(__n, "vector<bool>::_M_fill_insert"); 718*e4b17023SJohn Marino _Bit_type * __q = this->_M_allocate(__len); 719*e4b17023SJohn Marino iterator __i = _M_copy_aligned(begin(), __position, 720*e4b17023SJohn Marino iterator(__q, 0)); 721*e4b17023SJohn Marino std::fill(__i, __i + difference_type(__n), __x); 722*e4b17023SJohn Marino this->_M_impl._M_finish = std::copy(__position, end(), 723*e4b17023SJohn Marino __i + difference_type(__n)); 724*e4b17023SJohn Marino this->_M_deallocate(); 725*e4b17023SJohn Marino this->_M_impl._M_end_of_storage = __q + _S_nword(__len); 726*e4b17023SJohn Marino this->_M_impl._M_start = iterator(__q, 0); 727*e4b17023SJohn Marino } 728*e4b17023SJohn Marino } 729*e4b17023SJohn Marino 730*e4b17023SJohn Marino template<typename _Alloc> 731*e4b17023SJohn Marino template<typename _ForwardIterator> 732*e4b17023SJohn Marino void 733*e4b17023SJohn Marino vector<bool, _Alloc>:: 734*e4b17023SJohn Marino _M_insert_range(iterator __position, _ForwardIterator __first, 735*e4b17023SJohn Marino _ForwardIterator __last, std::forward_iterator_tag) 736*e4b17023SJohn Marino { 737*e4b17023SJohn Marino if (__first != __last) 738*e4b17023SJohn Marino { 739*e4b17023SJohn Marino size_type __n = std::distance(__first, __last); 740*e4b17023SJohn Marino if (capacity() - size() >= __n) 741*e4b17023SJohn Marino { 742*e4b17023SJohn Marino std::copy_backward(__position, end(), 743*e4b17023SJohn Marino this->_M_impl._M_finish 744*e4b17023SJohn Marino + difference_type(__n)); 745*e4b17023SJohn Marino std::copy(__first, __last, __position); 746*e4b17023SJohn Marino this->_M_impl._M_finish += difference_type(__n); 747*e4b17023SJohn Marino } 748*e4b17023SJohn Marino else 749*e4b17023SJohn Marino { 750*e4b17023SJohn Marino const size_type __len = 751*e4b17023SJohn Marino _M_check_len(__n, "vector<bool>::_M_insert_range"); 752*e4b17023SJohn Marino _Bit_type * __q = this->_M_allocate(__len); 753*e4b17023SJohn Marino iterator __i = _M_copy_aligned(begin(), __position, 754*e4b17023SJohn Marino iterator(__q, 0)); 755*e4b17023SJohn Marino __i = std::copy(__first, __last, __i); 756*e4b17023SJohn Marino this->_M_impl._M_finish = std::copy(__position, end(), __i); 757*e4b17023SJohn Marino this->_M_deallocate(); 758*e4b17023SJohn Marino this->_M_impl._M_end_of_storage = __q + _S_nword(__len); 759*e4b17023SJohn Marino this->_M_impl._M_start = iterator(__q, 0); 760*e4b17023SJohn Marino } 761*e4b17023SJohn Marino } 762*e4b17023SJohn Marino } 763*e4b17023SJohn Marino 764*e4b17023SJohn Marino template<typename _Alloc> 765*e4b17023SJohn Marino void 766*e4b17023SJohn Marino vector<bool, _Alloc>:: 767*e4b17023SJohn Marino _M_insert_aux(iterator __position, bool __x) 768*e4b17023SJohn Marino { 769*e4b17023SJohn Marino if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage) 770*e4b17023SJohn Marino { 771*e4b17023SJohn Marino std::copy_backward(__position, this->_M_impl._M_finish, 772*e4b17023SJohn Marino this->_M_impl._M_finish + 1); 773*e4b17023SJohn Marino *__position = __x; 774*e4b17023SJohn Marino ++this->_M_impl._M_finish; 775*e4b17023SJohn Marino } 776*e4b17023SJohn Marino else 777*e4b17023SJohn Marino { 778*e4b17023SJohn Marino const size_type __len = 779*e4b17023SJohn Marino _M_check_len(size_type(1), "vector<bool>::_M_insert_aux"); 780*e4b17023SJohn Marino _Bit_type * __q = this->_M_allocate(__len); 781*e4b17023SJohn Marino iterator __i = _M_copy_aligned(begin(), __position, 782*e4b17023SJohn Marino iterator(__q, 0)); 783*e4b17023SJohn Marino *__i++ = __x; 784*e4b17023SJohn Marino this->_M_impl._M_finish = std::copy(__position, end(), __i); 785*e4b17023SJohn Marino this->_M_deallocate(); 786*e4b17023SJohn Marino this->_M_impl._M_end_of_storage = __q + _S_nword(__len); 787*e4b17023SJohn Marino this->_M_impl._M_start = iterator(__q, 0); 788*e4b17023SJohn Marino } 789*e4b17023SJohn Marino } 790*e4b17023SJohn Marino 791*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__ 792*e4b17023SJohn Marino template<typename _Alloc> 793*e4b17023SJohn Marino bool 794*e4b17023SJohn Marino vector<bool, _Alloc>:: 795*e4b17023SJohn Marino _M_shrink_to_fit() 796*e4b17023SJohn Marino { 797*e4b17023SJohn Marino if (capacity() - size() < int(_S_word_bit)) 798*e4b17023SJohn Marino return false; 799*e4b17023SJohn Marino __try 800*e4b17023SJohn Marino { 801*e4b17023SJohn Marino _M_reallocate(size()); 802*e4b17023SJohn Marino return true; 803*e4b17023SJohn Marino } 804*e4b17023SJohn Marino __catch(...) 805*e4b17023SJohn Marino { return false; } 806*e4b17023SJohn Marino } 807*e4b17023SJohn Marino #endif 808*e4b17023SJohn Marino 809*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_CONTAINER 810*e4b17023SJohn Marino } // namespace std 811*e4b17023SJohn Marino 812*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__ 813*e4b17023SJohn Marino 814*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default) 815*e4b17023SJohn Marino { 816*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION 817*e4b17023SJohn Marino 818*e4b17023SJohn Marino template<typename _Alloc> 819*e4b17023SJohn Marino size_t 820*e4b17023SJohn Marino hash<_GLIBCXX_STD_C::vector<bool, _Alloc>>:: 821*e4b17023SJohn Marino operator()(const _GLIBCXX_STD_C::vector<bool, _Alloc>& __b) const noexcept 822*e4b17023SJohn Marino { 823*e4b17023SJohn Marino size_t __hash = 0; 824*e4b17023SJohn Marino using _GLIBCXX_STD_C::_S_word_bit; 825*e4b17023SJohn Marino using _GLIBCXX_STD_C::_Bit_type; 826*e4b17023SJohn Marino 827*e4b17023SJohn Marino const size_t __words = __b.size() / _S_word_bit; 828*e4b17023SJohn Marino if (__words) 829*e4b17023SJohn Marino { 830*e4b17023SJohn Marino const size_t __clength = __words * sizeof(_Bit_type); 831*e4b17023SJohn Marino __hash = std::_Hash_impl::hash(__b._M_impl._M_start._M_p, __clength); 832*e4b17023SJohn Marino } 833*e4b17023SJohn Marino 834*e4b17023SJohn Marino const size_t __extrabits = __b.size() % _S_word_bit; 835*e4b17023SJohn Marino if (__extrabits) 836*e4b17023SJohn Marino { 837*e4b17023SJohn Marino _Bit_type __hiword = *__b._M_impl._M_finish._M_p; 838*e4b17023SJohn Marino __hiword &= ~((~static_cast<_Bit_type>(0)) << __extrabits); 839*e4b17023SJohn Marino 840*e4b17023SJohn Marino const size_t __clength 841*e4b17023SJohn Marino = (__extrabits + __CHAR_BIT__ - 1) / __CHAR_BIT__; 842*e4b17023SJohn Marino if (__words) 843*e4b17023SJohn Marino __hash = std::_Hash_impl::hash(&__hiword, __clength, __hash); 844*e4b17023SJohn Marino else 845*e4b17023SJohn Marino __hash = std::_Hash_impl::hash(&__hiword, __clength); 846*e4b17023SJohn Marino } 847*e4b17023SJohn Marino 848*e4b17023SJohn Marino return __hash; 849*e4b17023SJohn Marino } 850*e4b17023SJohn Marino 851*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION 852*e4b17023SJohn Marino } // namespace std 853*e4b17023SJohn Marino 854*e4b17023SJohn Marino #endif // __GXX_EXPERIMENTAL_CXX0X__ 855*e4b17023SJohn Marino 856*e4b17023SJohn Marino #endif /* _VECTOR_TCC */ 857