1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===------------------------------ vector --------------------------------===// 3*4d6fc14bSjoerg// 4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg// 8*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg#ifndef _LIBCPP_VECTOR 11*4d6fc14bSjoerg#define _LIBCPP_VECTOR 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg/* 14*4d6fc14bSjoerg vector synopsis 15*4d6fc14bSjoerg 16*4d6fc14bSjoergnamespace std 17*4d6fc14bSjoerg{ 18*4d6fc14bSjoerg 19*4d6fc14bSjoergtemplate <class T, class Allocator = allocator<T> > 20*4d6fc14bSjoergclass vector 21*4d6fc14bSjoerg{ 22*4d6fc14bSjoergpublic: 23*4d6fc14bSjoerg typedef T value_type; 24*4d6fc14bSjoerg typedef Allocator allocator_type; 25*4d6fc14bSjoerg typedef typename allocator_type::reference reference; 26*4d6fc14bSjoerg typedef typename allocator_type::const_reference const_reference; 27*4d6fc14bSjoerg typedef implementation-defined iterator; 28*4d6fc14bSjoerg typedef implementation-defined const_iterator; 29*4d6fc14bSjoerg typedef typename allocator_type::size_type size_type; 30*4d6fc14bSjoerg typedef typename allocator_type::difference_type difference_type; 31*4d6fc14bSjoerg typedef typename allocator_type::pointer pointer; 32*4d6fc14bSjoerg typedef typename allocator_type::const_pointer const_pointer; 33*4d6fc14bSjoerg typedef std::reverse_iterator<iterator> reverse_iterator; 34*4d6fc14bSjoerg typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 35*4d6fc14bSjoerg 36*4d6fc14bSjoerg vector() 37*4d6fc14bSjoerg noexcept(is_nothrow_default_constructible<allocator_type>::value); 38*4d6fc14bSjoerg explicit vector(const allocator_type&); 39*4d6fc14bSjoerg explicit vector(size_type n); 40*4d6fc14bSjoerg explicit vector(size_type n, const allocator_type&); // C++14 41*4d6fc14bSjoerg vector(size_type n, const value_type& value, const allocator_type& = allocator_type()); 42*4d6fc14bSjoerg template <class InputIterator> 43*4d6fc14bSjoerg vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type()); 44*4d6fc14bSjoerg vector(const vector& x); 45*4d6fc14bSjoerg vector(vector&& x) 46*4d6fc14bSjoerg noexcept(is_nothrow_move_constructible<allocator_type>::value); 47*4d6fc14bSjoerg vector(initializer_list<value_type> il); 48*4d6fc14bSjoerg vector(initializer_list<value_type> il, const allocator_type& a); 49*4d6fc14bSjoerg ~vector(); 50*4d6fc14bSjoerg vector& operator=(const vector& x); 51*4d6fc14bSjoerg vector& operator=(vector&& x) 52*4d6fc14bSjoerg noexcept( 53*4d6fc14bSjoerg allocator_type::propagate_on_container_move_assignment::value || 54*4d6fc14bSjoerg allocator_type::is_always_equal::value); // C++17 55*4d6fc14bSjoerg vector& operator=(initializer_list<value_type> il); 56*4d6fc14bSjoerg template <class InputIterator> 57*4d6fc14bSjoerg void assign(InputIterator first, InputIterator last); 58*4d6fc14bSjoerg void assign(size_type n, const value_type& u); 59*4d6fc14bSjoerg void assign(initializer_list<value_type> il); 60*4d6fc14bSjoerg 61*4d6fc14bSjoerg allocator_type get_allocator() const noexcept; 62*4d6fc14bSjoerg 63*4d6fc14bSjoerg iterator begin() noexcept; 64*4d6fc14bSjoerg const_iterator begin() const noexcept; 65*4d6fc14bSjoerg iterator end() noexcept; 66*4d6fc14bSjoerg const_iterator end() const noexcept; 67*4d6fc14bSjoerg 68*4d6fc14bSjoerg reverse_iterator rbegin() noexcept; 69*4d6fc14bSjoerg const_reverse_iterator rbegin() const noexcept; 70*4d6fc14bSjoerg reverse_iterator rend() noexcept; 71*4d6fc14bSjoerg const_reverse_iterator rend() const noexcept; 72*4d6fc14bSjoerg 73*4d6fc14bSjoerg const_iterator cbegin() const noexcept; 74*4d6fc14bSjoerg const_iterator cend() const noexcept; 75*4d6fc14bSjoerg const_reverse_iterator crbegin() const noexcept; 76*4d6fc14bSjoerg const_reverse_iterator crend() const noexcept; 77*4d6fc14bSjoerg 78*4d6fc14bSjoerg size_type size() const noexcept; 79*4d6fc14bSjoerg size_type max_size() const noexcept; 80*4d6fc14bSjoerg size_type capacity() const noexcept; 81*4d6fc14bSjoerg bool empty() const noexcept; 82*4d6fc14bSjoerg void reserve(size_type n); 83*4d6fc14bSjoerg void shrink_to_fit() noexcept; 84*4d6fc14bSjoerg 85*4d6fc14bSjoerg reference operator[](size_type n); 86*4d6fc14bSjoerg const_reference operator[](size_type n) const; 87*4d6fc14bSjoerg reference at(size_type n); 88*4d6fc14bSjoerg const_reference at(size_type n) const; 89*4d6fc14bSjoerg 90*4d6fc14bSjoerg reference front(); 91*4d6fc14bSjoerg const_reference front() const; 92*4d6fc14bSjoerg reference back(); 93*4d6fc14bSjoerg const_reference back() const; 94*4d6fc14bSjoerg 95*4d6fc14bSjoerg value_type* data() noexcept; 96*4d6fc14bSjoerg const value_type* data() const noexcept; 97*4d6fc14bSjoerg 98*4d6fc14bSjoerg void push_back(const value_type& x); 99*4d6fc14bSjoerg void push_back(value_type&& x); 100*4d6fc14bSjoerg template <class... Args> 101*4d6fc14bSjoerg reference emplace_back(Args&&... args); // reference in C++17 102*4d6fc14bSjoerg void pop_back(); 103*4d6fc14bSjoerg 104*4d6fc14bSjoerg template <class... Args> iterator emplace(const_iterator position, Args&&... args); 105*4d6fc14bSjoerg iterator insert(const_iterator position, const value_type& x); 106*4d6fc14bSjoerg iterator insert(const_iterator position, value_type&& x); 107*4d6fc14bSjoerg iterator insert(const_iterator position, size_type n, const value_type& x); 108*4d6fc14bSjoerg template <class InputIterator> 109*4d6fc14bSjoerg iterator insert(const_iterator position, InputIterator first, InputIterator last); 110*4d6fc14bSjoerg iterator insert(const_iterator position, initializer_list<value_type> il); 111*4d6fc14bSjoerg 112*4d6fc14bSjoerg iterator erase(const_iterator position); 113*4d6fc14bSjoerg iterator erase(const_iterator first, const_iterator last); 114*4d6fc14bSjoerg 115*4d6fc14bSjoerg void clear() noexcept; 116*4d6fc14bSjoerg 117*4d6fc14bSjoerg void resize(size_type sz); 118*4d6fc14bSjoerg void resize(size_type sz, const value_type& c); 119*4d6fc14bSjoerg 120*4d6fc14bSjoerg void swap(vector&) 121*4d6fc14bSjoerg noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value || 122*4d6fc14bSjoerg allocator_traits<allocator_type>::is_always_equal::value); // C++17 123*4d6fc14bSjoerg 124*4d6fc14bSjoerg bool __invariants() const; 125*4d6fc14bSjoerg}; 126*4d6fc14bSjoerg 127*4d6fc14bSjoergtemplate <class Allocator = allocator<T> > 128*4d6fc14bSjoergclass vector<bool, Allocator> 129*4d6fc14bSjoerg{ 130*4d6fc14bSjoergpublic: 131*4d6fc14bSjoerg typedef bool value_type; 132*4d6fc14bSjoerg typedef Allocator allocator_type; 133*4d6fc14bSjoerg typedef implementation-defined iterator; 134*4d6fc14bSjoerg typedef implementation-defined const_iterator; 135*4d6fc14bSjoerg typedef typename allocator_type::size_type size_type; 136*4d6fc14bSjoerg typedef typename allocator_type::difference_type difference_type; 137*4d6fc14bSjoerg typedef iterator pointer; 138*4d6fc14bSjoerg typedef const_iterator const_pointer; 139*4d6fc14bSjoerg typedef std::reverse_iterator<iterator> reverse_iterator; 140*4d6fc14bSjoerg typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 141*4d6fc14bSjoerg 142*4d6fc14bSjoerg class reference 143*4d6fc14bSjoerg { 144*4d6fc14bSjoerg public: 145*4d6fc14bSjoerg reference(const reference&) noexcept; 146*4d6fc14bSjoerg operator bool() const noexcept; 147*4d6fc14bSjoerg reference& operator=(const bool x) noexcept; 148*4d6fc14bSjoerg reference& operator=(const reference& x) noexcept; 149*4d6fc14bSjoerg iterator operator&() const noexcept; 150*4d6fc14bSjoerg void flip() noexcept; 151*4d6fc14bSjoerg }; 152*4d6fc14bSjoerg 153*4d6fc14bSjoerg class const_reference 154*4d6fc14bSjoerg { 155*4d6fc14bSjoerg public: 156*4d6fc14bSjoerg const_reference(const reference&) noexcept; 157*4d6fc14bSjoerg operator bool() const noexcept; 158*4d6fc14bSjoerg const_iterator operator&() const noexcept; 159*4d6fc14bSjoerg }; 160*4d6fc14bSjoerg 161*4d6fc14bSjoerg vector() 162*4d6fc14bSjoerg noexcept(is_nothrow_default_constructible<allocator_type>::value); 163*4d6fc14bSjoerg explicit vector(const allocator_type&); 164*4d6fc14bSjoerg explicit vector(size_type n, const allocator_type& a = allocator_type()); // C++14 165*4d6fc14bSjoerg vector(size_type n, const value_type& value, const allocator_type& = allocator_type()); 166*4d6fc14bSjoerg template <class InputIterator> 167*4d6fc14bSjoerg vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type()); 168*4d6fc14bSjoerg vector(const vector& x); 169*4d6fc14bSjoerg vector(vector&& x) 170*4d6fc14bSjoerg noexcept(is_nothrow_move_constructible<allocator_type>::value); 171*4d6fc14bSjoerg vector(initializer_list<value_type> il); 172*4d6fc14bSjoerg vector(initializer_list<value_type> il, const allocator_type& a); 173*4d6fc14bSjoerg ~vector(); 174*4d6fc14bSjoerg vector& operator=(const vector& x); 175*4d6fc14bSjoerg vector& operator=(vector&& x) 176*4d6fc14bSjoerg noexcept( 177*4d6fc14bSjoerg allocator_type::propagate_on_container_move_assignment::value || 178*4d6fc14bSjoerg allocator_type::is_always_equal::value); // C++17 179*4d6fc14bSjoerg vector& operator=(initializer_list<value_type> il); 180*4d6fc14bSjoerg template <class InputIterator> 181*4d6fc14bSjoerg void assign(InputIterator first, InputIterator last); 182*4d6fc14bSjoerg void assign(size_type n, const value_type& u); 183*4d6fc14bSjoerg void assign(initializer_list<value_type> il); 184*4d6fc14bSjoerg 185*4d6fc14bSjoerg allocator_type get_allocator() const noexcept; 186*4d6fc14bSjoerg 187*4d6fc14bSjoerg iterator begin() noexcept; 188*4d6fc14bSjoerg const_iterator begin() const noexcept; 189*4d6fc14bSjoerg iterator end() noexcept; 190*4d6fc14bSjoerg const_iterator end() const noexcept; 191*4d6fc14bSjoerg 192*4d6fc14bSjoerg reverse_iterator rbegin() noexcept; 193*4d6fc14bSjoerg const_reverse_iterator rbegin() const noexcept; 194*4d6fc14bSjoerg reverse_iterator rend() noexcept; 195*4d6fc14bSjoerg const_reverse_iterator rend() const noexcept; 196*4d6fc14bSjoerg 197*4d6fc14bSjoerg const_iterator cbegin() const noexcept; 198*4d6fc14bSjoerg const_iterator cend() const noexcept; 199*4d6fc14bSjoerg const_reverse_iterator crbegin() const noexcept; 200*4d6fc14bSjoerg const_reverse_iterator crend() const noexcept; 201*4d6fc14bSjoerg 202*4d6fc14bSjoerg size_type size() const noexcept; 203*4d6fc14bSjoerg size_type max_size() const noexcept; 204*4d6fc14bSjoerg size_type capacity() const noexcept; 205*4d6fc14bSjoerg bool empty() const noexcept; 206*4d6fc14bSjoerg void reserve(size_type n); 207*4d6fc14bSjoerg void shrink_to_fit() noexcept; 208*4d6fc14bSjoerg 209*4d6fc14bSjoerg reference operator[](size_type n); 210*4d6fc14bSjoerg const_reference operator[](size_type n) const; 211*4d6fc14bSjoerg reference at(size_type n); 212*4d6fc14bSjoerg const_reference at(size_type n) const; 213*4d6fc14bSjoerg 214*4d6fc14bSjoerg reference front(); 215*4d6fc14bSjoerg const_reference front() const; 216*4d6fc14bSjoerg reference back(); 217*4d6fc14bSjoerg const_reference back() const; 218*4d6fc14bSjoerg 219*4d6fc14bSjoerg void push_back(const value_type& x); 220*4d6fc14bSjoerg template <class... Args> reference emplace_back(Args&&... args); // C++14; reference in C++17 221*4d6fc14bSjoerg void pop_back(); 222*4d6fc14bSjoerg 223*4d6fc14bSjoerg template <class... Args> iterator emplace(const_iterator position, Args&&... args); // C++14 224*4d6fc14bSjoerg iterator insert(const_iterator position, const value_type& x); 225*4d6fc14bSjoerg iterator insert(const_iterator position, size_type n, const value_type& x); 226*4d6fc14bSjoerg template <class InputIterator> 227*4d6fc14bSjoerg iterator insert(const_iterator position, InputIterator first, InputIterator last); 228*4d6fc14bSjoerg iterator insert(const_iterator position, initializer_list<value_type> il); 229*4d6fc14bSjoerg 230*4d6fc14bSjoerg iterator erase(const_iterator position); 231*4d6fc14bSjoerg iterator erase(const_iterator first, const_iterator last); 232*4d6fc14bSjoerg 233*4d6fc14bSjoerg void clear() noexcept; 234*4d6fc14bSjoerg 235*4d6fc14bSjoerg void resize(size_type sz); 236*4d6fc14bSjoerg void resize(size_type sz, value_type x); 237*4d6fc14bSjoerg 238*4d6fc14bSjoerg void swap(vector&) 239*4d6fc14bSjoerg noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value || 240*4d6fc14bSjoerg allocator_traits<allocator_type>::is_always_equal::value); // C++17 241*4d6fc14bSjoerg void flip() noexcept; 242*4d6fc14bSjoerg 243*4d6fc14bSjoerg bool __invariants() const; 244*4d6fc14bSjoerg}; 245*4d6fc14bSjoerg 246*4d6fc14bSjoergtemplate <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>> 247*4d6fc14bSjoerg vector(InputIterator, InputIterator, Allocator = Allocator()) 248*4d6fc14bSjoerg -> vector<typename iterator_traits<InputIterator>::value_type, Allocator>; 249*4d6fc14bSjoerg 250*4d6fc14bSjoergtemplate <class Allocator> struct hash<std::vector<bool, Allocator>>; 251*4d6fc14bSjoerg 252*4d6fc14bSjoergtemplate <class T, class Allocator> bool operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y); 253*4d6fc14bSjoergtemplate <class T, class Allocator> bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y); 254*4d6fc14bSjoergtemplate <class T, class Allocator> bool operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); 255*4d6fc14bSjoergtemplate <class T, class Allocator> bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y); 256*4d6fc14bSjoergtemplate <class T, class Allocator> bool operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); 257*4d6fc14bSjoergtemplate <class T, class Allocator> bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); 258*4d6fc14bSjoerg 259*4d6fc14bSjoergtemplate <class T, class Allocator> 260*4d6fc14bSjoergvoid swap(vector<T,Allocator>& x, vector<T,Allocator>& y) 261*4d6fc14bSjoerg noexcept(noexcept(x.swap(y))); 262*4d6fc14bSjoerg 263*4d6fc14bSjoergtemplate <class T, class Allocator, class U> 264*4d6fc14bSjoergtypename vector<T, Allocator>::size_type 265*4d6fc14bSjoergerase(vector<T, Allocator>& c, const U& value); // C++20 266*4d6fc14bSjoergtemplate <class T, class Allocator, class Predicate> 267*4d6fc14bSjoergtypename vector<T, Allocator>::size_type 268*4d6fc14bSjoergerase_if(vector<T, Allocator>& c, Predicate pred); // C++20 269*4d6fc14bSjoerg 270*4d6fc14bSjoerg} // std 271*4d6fc14bSjoerg 272*4d6fc14bSjoerg*/ 273*4d6fc14bSjoerg 274*4d6fc14bSjoerg#include <__config> 275*4d6fc14bSjoerg#include <iosfwd> // for forward declaration of vector 276*4d6fc14bSjoerg#include <__bit_reference> 277*4d6fc14bSjoerg#include <type_traits> 278*4d6fc14bSjoerg#include <climits> 279*4d6fc14bSjoerg#include <compare> 280*4d6fc14bSjoerg#include <limits> 281*4d6fc14bSjoerg#include <initializer_list> 282*4d6fc14bSjoerg#include <memory> 283*4d6fc14bSjoerg#include <stdexcept> 284*4d6fc14bSjoerg#include <algorithm> 285*4d6fc14bSjoerg#include <cstring> 286*4d6fc14bSjoerg#include <version> 287*4d6fc14bSjoerg#include <__split_buffer> 288*4d6fc14bSjoerg#include <__functional_base> 289*4d6fc14bSjoerg 290*4d6fc14bSjoerg#include <__debug> 291*4d6fc14bSjoerg 292*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 293*4d6fc14bSjoerg#pragma GCC system_header 294*4d6fc14bSjoerg#endif 295*4d6fc14bSjoerg 296*4d6fc14bSjoerg_LIBCPP_PUSH_MACROS 297*4d6fc14bSjoerg#include <__undef_macros> 298*4d6fc14bSjoerg 299*4d6fc14bSjoerg 300*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD 301*4d6fc14bSjoerg 302*4d6fc14bSjoergtemplate <bool> 303*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS __vector_base_common 304*4d6fc14bSjoerg{ 305*4d6fc14bSjoergprotected: 306*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __vector_base_common() {} 307*4d6fc14bSjoerg _LIBCPP_NORETURN void __throw_length_error() const; 308*4d6fc14bSjoerg _LIBCPP_NORETURN void __throw_out_of_range() const; 309*4d6fc14bSjoerg}; 310*4d6fc14bSjoerg 311*4d6fc14bSjoergtemplate <bool __b> 312*4d6fc14bSjoergvoid 313*4d6fc14bSjoerg__vector_base_common<__b>::__throw_length_error() const 314*4d6fc14bSjoerg{ 315*4d6fc14bSjoerg _VSTD::__throw_length_error("vector"); 316*4d6fc14bSjoerg} 317*4d6fc14bSjoerg 318*4d6fc14bSjoergtemplate <bool __b> 319*4d6fc14bSjoergvoid 320*4d6fc14bSjoerg__vector_base_common<__b>::__throw_out_of_range() const 321*4d6fc14bSjoerg{ 322*4d6fc14bSjoerg _VSTD::__throw_out_of_range("vector"); 323*4d6fc14bSjoerg} 324*4d6fc14bSjoerg 325*4d6fc14bSjoerg_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __vector_base_common<true>) 326*4d6fc14bSjoerg 327*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 328*4d6fc14bSjoergclass __vector_base 329*4d6fc14bSjoerg : protected __vector_base_common<true> 330*4d6fc14bSjoerg{ 331*4d6fc14bSjoergpublic: 332*4d6fc14bSjoerg typedef _Allocator allocator_type; 333*4d6fc14bSjoerg typedef allocator_traits<allocator_type> __alloc_traits; 334*4d6fc14bSjoerg typedef typename __alloc_traits::size_type size_type; 335*4d6fc14bSjoergprotected: 336*4d6fc14bSjoerg typedef _Tp value_type; 337*4d6fc14bSjoerg typedef value_type& reference; 338*4d6fc14bSjoerg typedef const value_type& const_reference; 339*4d6fc14bSjoerg typedef typename __alloc_traits::difference_type difference_type; 340*4d6fc14bSjoerg typedef typename __alloc_traits::pointer pointer; 341*4d6fc14bSjoerg typedef typename __alloc_traits::const_pointer const_pointer; 342*4d6fc14bSjoerg typedef pointer iterator; 343*4d6fc14bSjoerg typedef const_pointer const_iterator; 344*4d6fc14bSjoerg 345*4d6fc14bSjoerg pointer __begin_; 346*4d6fc14bSjoerg pointer __end_; 347*4d6fc14bSjoerg __compressed_pair<pointer, allocator_type> __end_cap_; 348*4d6fc14bSjoerg 349*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 350*4d6fc14bSjoerg allocator_type& __alloc() _NOEXCEPT 351*4d6fc14bSjoerg {return __end_cap_.second();} 352*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 353*4d6fc14bSjoerg const allocator_type& __alloc() const _NOEXCEPT 354*4d6fc14bSjoerg {return __end_cap_.second();} 355*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 356*4d6fc14bSjoerg pointer& __end_cap() _NOEXCEPT 357*4d6fc14bSjoerg {return __end_cap_.first();} 358*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 359*4d6fc14bSjoerg const pointer& __end_cap() const _NOEXCEPT 360*4d6fc14bSjoerg {return __end_cap_.first();} 361*4d6fc14bSjoerg 362*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 363*4d6fc14bSjoerg __vector_base() 364*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); 365*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __vector_base(const allocator_type& __a); 366*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 367*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY __vector_base(allocator_type&& __a) _NOEXCEPT; 368*4d6fc14bSjoerg#endif 369*4d6fc14bSjoerg ~__vector_base(); 370*4d6fc14bSjoerg 371*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 372*4d6fc14bSjoerg void clear() _NOEXCEPT {__destruct_at_end(__begin_);} 373*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 374*4d6fc14bSjoerg size_type capacity() const _NOEXCEPT 375*4d6fc14bSjoerg {return static_cast<size_type>(__end_cap() - __begin_);} 376*4d6fc14bSjoerg 377*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 378*4d6fc14bSjoerg void __destruct_at_end(pointer __new_last) _NOEXCEPT; 379*4d6fc14bSjoerg 380*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 381*4d6fc14bSjoerg void __copy_assign_alloc(const __vector_base& __c) 382*4d6fc14bSjoerg {__copy_assign_alloc(__c, integral_constant<bool, 383*4d6fc14bSjoerg __alloc_traits::propagate_on_container_copy_assignment::value>());} 384*4d6fc14bSjoerg 385*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 386*4d6fc14bSjoerg void __move_assign_alloc(__vector_base& __c) 387*4d6fc14bSjoerg _NOEXCEPT_( 388*4d6fc14bSjoerg !__alloc_traits::propagate_on_container_move_assignment::value || 389*4d6fc14bSjoerg is_nothrow_move_assignable<allocator_type>::value) 390*4d6fc14bSjoerg {__move_assign_alloc(__c, integral_constant<bool, 391*4d6fc14bSjoerg __alloc_traits::propagate_on_container_move_assignment::value>());} 392*4d6fc14bSjoergprivate: 393*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 394*4d6fc14bSjoerg void __copy_assign_alloc(const __vector_base& __c, true_type) 395*4d6fc14bSjoerg { 396*4d6fc14bSjoerg if (__alloc() != __c.__alloc()) 397*4d6fc14bSjoerg { 398*4d6fc14bSjoerg clear(); 399*4d6fc14bSjoerg __alloc_traits::deallocate(__alloc(), __begin_, capacity()); 400*4d6fc14bSjoerg __begin_ = __end_ = __end_cap() = nullptr; 401*4d6fc14bSjoerg } 402*4d6fc14bSjoerg __alloc() = __c.__alloc(); 403*4d6fc14bSjoerg } 404*4d6fc14bSjoerg 405*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 406*4d6fc14bSjoerg void __copy_assign_alloc(const __vector_base&, false_type) 407*4d6fc14bSjoerg {} 408*4d6fc14bSjoerg 409*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 410*4d6fc14bSjoerg void __move_assign_alloc(__vector_base& __c, true_type) 411*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 412*4d6fc14bSjoerg { 413*4d6fc14bSjoerg __alloc() = _VSTD::move(__c.__alloc()); 414*4d6fc14bSjoerg } 415*4d6fc14bSjoerg 416*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 417*4d6fc14bSjoerg void __move_assign_alloc(__vector_base&, false_type) 418*4d6fc14bSjoerg _NOEXCEPT 419*4d6fc14bSjoerg {} 420*4d6fc14bSjoerg}; 421*4d6fc14bSjoerg 422*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 423*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 424*4d6fc14bSjoergvoid 425*4d6fc14bSjoerg__vector_base<_Tp, _Allocator>::__destruct_at_end(pointer __new_last) _NOEXCEPT 426*4d6fc14bSjoerg{ 427*4d6fc14bSjoerg pointer __soon_to_be_end = __end_; 428*4d6fc14bSjoerg while (__new_last != __soon_to_be_end) 429*4d6fc14bSjoerg __alloc_traits::destroy(__alloc(), _VSTD::__to_address(--__soon_to_be_end)); 430*4d6fc14bSjoerg __end_ = __new_last; 431*4d6fc14bSjoerg} 432*4d6fc14bSjoerg 433*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 434*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 435*4d6fc14bSjoerg__vector_base<_Tp, _Allocator>::__vector_base() 436*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) 437*4d6fc14bSjoerg : __begin_(nullptr), 438*4d6fc14bSjoerg __end_(nullptr), 439*4d6fc14bSjoerg __end_cap_(nullptr, __default_init_tag()) 440*4d6fc14bSjoerg{ 441*4d6fc14bSjoerg} 442*4d6fc14bSjoerg 443*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 444*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 445*4d6fc14bSjoerg__vector_base<_Tp, _Allocator>::__vector_base(const allocator_type& __a) 446*4d6fc14bSjoerg : __begin_(nullptr), 447*4d6fc14bSjoerg __end_(nullptr), 448*4d6fc14bSjoerg __end_cap_(nullptr, __a) 449*4d6fc14bSjoerg{ 450*4d6fc14bSjoerg} 451*4d6fc14bSjoerg 452*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 453*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 454*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 455*4d6fc14bSjoerg__vector_base<_Tp, _Allocator>::__vector_base(allocator_type&& __a) _NOEXCEPT 456*4d6fc14bSjoerg : __begin_(nullptr), 457*4d6fc14bSjoerg __end_(nullptr), 458*4d6fc14bSjoerg __end_cap_(nullptr, _VSTD::move(__a)) {} 459*4d6fc14bSjoerg#endif 460*4d6fc14bSjoerg 461*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 462*4d6fc14bSjoerg__vector_base<_Tp, _Allocator>::~__vector_base() 463*4d6fc14bSjoerg{ 464*4d6fc14bSjoerg if (__begin_ != nullptr) 465*4d6fc14bSjoerg { 466*4d6fc14bSjoerg clear(); 467*4d6fc14bSjoerg __alloc_traits::deallocate(__alloc(), __begin_, capacity()); 468*4d6fc14bSjoerg } 469*4d6fc14bSjoerg} 470*4d6fc14bSjoerg 471*4d6fc14bSjoergtemplate <class _Tp, class _Allocator /* = allocator<_Tp> */> 472*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS vector 473*4d6fc14bSjoerg : private __vector_base<_Tp, _Allocator> 474*4d6fc14bSjoerg{ 475*4d6fc14bSjoergprivate: 476*4d6fc14bSjoerg typedef __vector_base<_Tp, _Allocator> __base; 477*4d6fc14bSjoerg typedef allocator<_Tp> __default_allocator_type; 478*4d6fc14bSjoergpublic: 479*4d6fc14bSjoerg typedef vector __self; 480*4d6fc14bSjoerg typedef _Tp value_type; 481*4d6fc14bSjoerg typedef _Allocator allocator_type; 482*4d6fc14bSjoerg typedef typename __base::__alloc_traits __alloc_traits; 483*4d6fc14bSjoerg typedef typename __base::reference reference; 484*4d6fc14bSjoerg typedef typename __base::const_reference const_reference; 485*4d6fc14bSjoerg typedef typename __base::size_type size_type; 486*4d6fc14bSjoerg typedef typename __base::difference_type difference_type; 487*4d6fc14bSjoerg typedef typename __base::pointer pointer; 488*4d6fc14bSjoerg typedef typename __base::const_pointer const_pointer; 489*4d6fc14bSjoerg typedef __wrap_iter<pointer> iterator; 490*4d6fc14bSjoerg typedef __wrap_iter<const_pointer> const_iterator; 491*4d6fc14bSjoerg typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 492*4d6fc14bSjoerg typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 493*4d6fc14bSjoerg 494*4d6fc14bSjoerg static_assert((is_same<typename allocator_type::value_type, value_type>::value), 495*4d6fc14bSjoerg "Allocator::value_type must be same type as value_type"); 496*4d6fc14bSjoerg 497*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 498*4d6fc14bSjoerg vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) 499*4d6fc14bSjoerg { 500*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 501*4d6fc14bSjoerg __get_db()->__insert_c(this); 502*4d6fc14bSjoerg#endif 503*4d6fc14bSjoerg } 504*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a) 505*4d6fc14bSjoerg#if _LIBCPP_STD_VER <= 14 506*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value) 507*4d6fc14bSjoerg#else 508*4d6fc14bSjoerg _NOEXCEPT 509*4d6fc14bSjoerg#endif 510*4d6fc14bSjoerg : __base(__a) 511*4d6fc14bSjoerg { 512*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 513*4d6fc14bSjoerg __get_db()->__insert_c(this); 514*4d6fc14bSjoerg#endif 515*4d6fc14bSjoerg } 516*4d6fc14bSjoerg explicit vector(size_type __n); 517*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 11 518*4d6fc14bSjoerg explicit vector(size_type __n, const allocator_type& __a); 519*4d6fc14bSjoerg#endif 520*4d6fc14bSjoerg vector(size_type __n, const value_type& __x); 521*4d6fc14bSjoerg vector(size_type __n, const value_type& __x, const allocator_type& __a); 522*4d6fc14bSjoerg template <class _InputIterator> 523*4d6fc14bSjoerg vector(_InputIterator __first, 524*4d6fc14bSjoerg typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value && 525*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value && 526*4d6fc14bSjoerg is_constructible< 527*4d6fc14bSjoerg value_type, 528*4d6fc14bSjoerg typename iterator_traits<_InputIterator>::reference>::value, 529*4d6fc14bSjoerg _InputIterator>::type __last); 530*4d6fc14bSjoerg template <class _InputIterator> 531*4d6fc14bSjoerg vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, 532*4d6fc14bSjoerg typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value && 533*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value && 534*4d6fc14bSjoerg is_constructible< 535*4d6fc14bSjoerg value_type, 536*4d6fc14bSjoerg typename iterator_traits<_InputIterator>::reference>::value>::type* = 0); 537*4d6fc14bSjoerg template <class _ForwardIterator> 538*4d6fc14bSjoerg vector(_ForwardIterator __first, 539*4d6fc14bSjoerg typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value && 540*4d6fc14bSjoerg is_constructible< 541*4d6fc14bSjoerg value_type, 542*4d6fc14bSjoerg typename iterator_traits<_ForwardIterator>::reference>::value, 543*4d6fc14bSjoerg _ForwardIterator>::type __last); 544*4d6fc14bSjoerg template <class _ForwardIterator> 545*4d6fc14bSjoerg vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, 546*4d6fc14bSjoerg typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value && 547*4d6fc14bSjoerg is_constructible< 548*4d6fc14bSjoerg value_type, 549*4d6fc14bSjoerg typename iterator_traits<_ForwardIterator>::reference>::value>::type* = 0); 550*4d6fc14bSjoerg 551*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 552*4d6fc14bSjoerg ~vector() 553*4d6fc14bSjoerg { 554*4d6fc14bSjoerg __annotate_delete(); 555*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 556*4d6fc14bSjoerg __get_db()->__erase_c(this); 557*4d6fc14bSjoerg#endif 558*4d6fc14bSjoerg } 559*4d6fc14bSjoerg 560*4d6fc14bSjoerg vector(const vector& __x); 561*4d6fc14bSjoerg vector(const vector& __x, const allocator_type& __a); 562*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 563*4d6fc14bSjoerg vector& operator=(const vector& __x); 564*4d6fc14bSjoerg 565*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 566*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 567*4d6fc14bSjoerg vector(initializer_list<value_type> __il); 568*4d6fc14bSjoerg 569*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 570*4d6fc14bSjoerg vector(initializer_list<value_type> __il, const allocator_type& __a); 571*4d6fc14bSjoerg 572*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 573*4d6fc14bSjoerg vector(vector&& __x) 574*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 575*4d6fc14bSjoerg _NOEXCEPT; 576*4d6fc14bSjoerg#else 577*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); 578*4d6fc14bSjoerg#endif 579*4d6fc14bSjoerg 580*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 581*4d6fc14bSjoerg vector(vector&& __x, const allocator_type& __a); 582*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 583*4d6fc14bSjoerg vector& operator=(vector&& __x) 584*4d6fc14bSjoerg _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)); 585*4d6fc14bSjoerg 586*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 587*4d6fc14bSjoerg vector& operator=(initializer_list<value_type> __il) 588*4d6fc14bSjoerg {assign(__il.begin(), __il.end()); return *this;} 589*4d6fc14bSjoerg 590*4d6fc14bSjoerg#endif // !_LIBCPP_CXX03_LANG 591*4d6fc14bSjoerg 592*4d6fc14bSjoerg template <class _InputIterator> 593*4d6fc14bSjoerg typename enable_if 594*4d6fc14bSjoerg < 595*4d6fc14bSjoerg __is_cpp17_input_iterator <_InputIterator>::value && 596*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value && 597*4d6fc14bSjoerg is_constructible< 598*4d6fc14bSjoerg value_type, 599*4d6fc14bSjoerg typename iterator_traits<_InputIterator>::reference>::value, 600*4d6fc14bSjoerg void 601*4d6fc14bSjoerg >::type 602*4d6fc14bSjoerg assign(_InputIterator __first, _InputIterator __last); 603*4d6fc14bSjoerg template <class _ForwardIterator> 604*4d6fc14bSjoerg typename enable_if 605*4d6fc14bSjoerg < 606*4d6fc14bSjoerg __is_cpp17_forward_iterator<_ForwardIterator>::value && 607*4d6fc14bSjoerg is_constructible< 608*4d6fc14bSjoerg value_type, 609*4d6fc14bSjoerg typename iterator_traits<_ForwardIterator>::reference>::value, 610*4d6fc14bSjoerg void 611*4d6fc14bSjoerg >::type 612*4d6fc14bSjoerg assign(_ForwardIterator __first, _ForwardIterator __last); 613*4d6fc14bSjoerg 614*4d6fc14bSjoerg void assign(size_type __n, const_reference __u); 615*4d6fc14bSjoerg 616*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 617*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 618*4d6fc14bSjoerg void assign(initializer_list<value_type> __il) 619*4d6fc14bSjoerg {assign(__il.begin(), __il.end());} 620*4d6fc14bSjoerg#endif 621*4d6fc14bSjoerg 622*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 623*4d6fc14bSjoerg allocator_type get_allocator() const _NOEXCEPT 624*4d6fc14bSjoerg {return this->__alloc();} 625*4d6fc14bSjoerg 626*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT; 627*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT; 628*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY iterator end() _NOEXCEPT; 629*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY const_iterator end() const _NOEXCEPT; 630*4d6fc14bSjoerg 631*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 632*4d6fc14bSjoerg reverse_iterator rbegin() _NOEXCEPT 633*4d6fc14bSjoerg {return reverse_iterator(end());} 634*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 635*4d6fc14bSjoerg const_reverse_iterator rbegin() const _NOEXCEPT 636*4d6fc14bSjoerg {return const_reverse_iterator(end());} 637*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 638*4d6fc14bSjoerg reverse_iterator rend() _NOEXCEPT 639*4d6fc14bSjoerg {return reverse_iterator(begin());} 640*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 641*4d6fc14bSjoerg const_reverse_iterator rend() const _NOEXCEPT 642*4d6fc14bSjoerg {return const_reverse_iterator(begin());} 643*4d6fc14bSjoerg 644*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 645*4d6fc14bSjoerg const_iterator cbegin() const _NOEXCEPT 646*4d6fc14bSjoerg {return begin();} 647*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 648*4d6fc14bSjoerg const_iterator cend() const _NOEXCEPT 649*4d6fc14bSjoerg {return end();} 650*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 651*4d6fc14bSjoerg const_reverse_iterator crbegin() const _NOEXCEPT 652*4d6fc14bSjoerg {return rbegin();} 653*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 654*4d6fc14bSjoerg const_reverse_iterator crend() const _NOEXCEPT 655*4d6fc14bSjoerg {return rend();} 656*4d6fc14bSjoerg 657*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 658*4d6fc14bSjoerg size_type size() const _NOEXCEPT 659*4d6fc14bSjoerg {return static_cast<size_type>(this->__end_ - this->__begin_);} 660*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 661*4d6fc14bSjoerg size_type capacity() const _NOEXCEPT 662*4d6fc14bSjoerg {return __base::capacity();} 663*4d6fc14bSjoerg _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 664*4d6fc14bSjoerg bool empty() const _NOEXCEPT 665*4d6fc14bSjoerg {return this->__begin_ == this->__end_;} 666*4d6fc14bSjoerg size_type max_size() const _NOEXCEPT; 667*4d6fc14bSjoerg void reserve(size_type __n); 668*4d6fc14bSjoerg void shrink_to_fit() _NOEXCEPT; 669*4d6fc14bSjoerg 670*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) _NOEXCEPT; 671*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const _NOEXCEPT; 672*4d6fc14bSjoerg reference at(size_type __n); 673*4d6fc14bSjoerg const_reference at(size_type __n) const; 674*4d6fc14bSjoerg 675*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY reference front() _NOEXCEPT 676*4d6fc14bSjoerg { 677*4d6fc14bSjoerg _LIBCPP_ASSERT(!empty(), "front() called on an empty vector"); 678*4d6fc14bSjoerg return *this->__begin_; 679*4d6fc14bSjoerg } 680*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY const_reference front() const _NOEXCEPT 681*4d6fc14bSjoerg { 682*4d6fc14bSjoerg _LIBCPP_ASSERT(!empty(), "front() called on an empty vector"); 683*4d6fc14bSjoerg return *this->__begin_; 684*4d6fc14bSjoerg } 685*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY reference back() _NOEXCEPT 686*4d6fc14bSjoerg { 687*4d6fc14bSjoerg _LIBCPP_ASSERT(!empty(), "back() called on an empty vector"); 688*4d6fc14bSjoerg return *(this->__end_ - 1); 689*4d6fc14bSjoerg } 690*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY const_reference back() const _NOEXCEPT 691*4d6fc14bSjoerg { 692*4d6fc14bSjoerg _LIBCPP_ASSERT(!empty(), "back() called on an empty vector"); 693*4d6fc14bSjoerg return *(this->__end_ - 1); 694*4d6fc14bSjoerg } 695*4d6fc14bSjoerg 696*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 697*4d6fc14bSjoerg value_type* data() _NOEXCEPT 698*4d6fc14bSjoerg {return _VSTD::__to_address(this->__begin_);} 699*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 700*4d6fc14bSjoerg const value_type* data() const _NOEXCEPT 701*4d6fc14bSjoerg {return _VSTD::__to_address(this->__begin_);} 702*4d6fc14bSjoerg 703*4d6fc14bSjoerg#ifdef _LIBCPP_CXX03_LANG 704*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 705*4d6fc14bSjoerg void __emplace_back(const value_type& __x) { push_back(__x); } 706*4d6fc14bSjoerg#else 707*4d6fc14bSjoerg template <class _Arg> 708*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 709*4d6fc14bSjoerg void __emplace_back(_Arg&& __arg) { 710*4d6fc14bSjoerg emplace_back(_VSTD::forward<_Arg>(__arg)); 711*4d6fc14bSjoerg } 712*4d6fc14bSjoerg#endif 713*4d6fc14bSjoerg 714*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x); 715*4d6fc14bSjoerg 716*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 717*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void push_back(value_type&& __x); 718*4d6fc14bSjoerg 719*4d6fc14bSjoerg template <class... _Args> 720*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 721*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 722*4d6fc14bSjoerg reference emplace_back(_Args&&... __args); 723*4d6fc14bSjoerg#else 724*4d6fc14bSjoerg void emplace_back(_Args&&... __args); 725*4d6fc14bSjoerg#endif 726*4d6fc14bSjoerg#endif // !_LIBCPP_CXX03_LANG 727*4d6fc14bSjoerg 728*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 729*4d6fc14bSjoerg void pop_back(); 730*4d6fc14bSjoerg 731*4d6fc14bSjoerg iterator insert(const_iterator __position, const_reference __x); 732*4d6fc14bSjoerg 733*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 734*4d6fc14bSjoerg iterator insert(const_iterator __position, value_type&& __x); 735*4d6fc14bSjoerg template <class... _Args> 736*4d6fc14bSjoerg iterator emplace(const_iterator __position, _Args&&... __args); 737*4d6fc14bSjoerg#endif // !_LIBCPP_CXX03_LANG 738*4d6fc14bSjoerg 739*4d6fc14bSjoerg iterator insert(const_iterator __position, size_type __n, const_reference __x); 740*4d6fc14bSjoerg template <class _InputIterator> 741*4d6fc14bSjoerg typename enable_if 742*4d6fc14bSjoerg < 743*4d6fc14bSjoerg __is_cpp17_input_iterator <_InputIterator>::value && 744*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value && 745*4d6fc14bSjoerg is_constructible< 746*4d6fc14bSjoerg value_type, 747*4d6fc14bSjoerg typename iterator_traits<_InputIterator>::reference>::value, 748*4d6fc14bSjoerg iterator 749*4d6fc14bSjoerg >::type 750*4d6fc14bSjoerg insert(const_iterator __position, _InputIterator __first, _InputIterator __last); 751*4d6fc14bSjoerg template <class _ForwardIterator> 752*4d6fc14bSjoerg typename enable_if 753*4d6fc14bSjoerg < 754*4d6fc14bSjoerg __is_cpp17_forward_iterator<_ForwardIterator>::value && 755*4d6fc14bSjoerg is_constructible< 756*4d6fc14bSjoerg value_type, 757*4d6fc14bSjoerg typename iterator_traits<_ForwardIterator>::reference>::value, 758*4d6fc14bSjoerg iterator 759*4d6fc14bSjoerg >::type 760*4d6fc14bSjoerg insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last); 761*4d6fc14bSjoerg 762*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 763*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 764*4d6fc14bSjoerg iterator insert(const_iterator __position, initializer_list<value_type> __il) 765*4d6fc14bSjoerg {return insert(__position, __il.begin(), __il.end());} 766*4d6fc14bSjoerg#endif 767*4d6fc14bSjoerg 768*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position); 769*4d6fc14bSjoerg iterator erase(const_iterator __first, const_iterator __last); 770*4d6fc14bSjoerg 771*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 772*4d6fc14bSjoerg void clear() _NOEXCEPT 773*4d6fc14bSjoerg { 774*4d6fc14bSjoerg size_type __old_size = size(); 775*4d6fc14bSjoerg __base::clear(); 776*4d6fc14bSjoerg __annotate_shrink(__old_size); 777*4d6fc14bSjoerg __invalidate_all_iterators(); 778*4d6fc14bSjoerg } 779*4d6fc14bSjoerg 780*4d6fc14bSjoerg void resize(size_type __sz); 781*4d6fc14bSjoerg void resize(size_type __sz, const_reference __x); 782*4d6fc14bSjoerg 783*4d6fc14bSjoerg void swap(vector&) 784*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 14 785*4d6fc14bSjoerg _NOEXCEPT; 786*4d6fc14bSjoerg#else 787*4d6fc14bSjoerg _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 788*4d6fc14bSjoerg __is_nothrow_swappable<allocator_type>::value); 789*4d6fc14bSjoerg#endif 790*4d6fc14bSjoerg 791*4d6fc14bSjoerg bool __invariants() const; 792*4d6fc14bSjoerg 793*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 794*4d6fc14bSjoerg 795*4d6fc14bSjoerg bool __dereferenceable(const const_iterator* __i) const; 796*4d6fc14bSjoerg bool __decrementable(const const_iterator* __i) const; 797*4d6fc14bSjoerg bool __addable(const const_iterator* __i, ptrdiff_t __n) const; 798*4d6fc14bSjoerg bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const; 799*4d6fc14bSjoerg 800*4d6fc14bSjoerg#endif // _LIBCPP_DEBUG_LEVEL == 2 801*4d6fc14bSjoerg 802*4d6fc14bSjoergprivate: 803*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators(); 804*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(pointer __new_last); 805*4d6fc14bSjoerg void __vallocate(size_type __n); 806*4d6fc14bSjoerg void __vdeallocate() _NOEXCEPT; 807*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const; 808*4d6fc14bSjoerg void __construct_at_end(size_type __n); 809*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 810*4d6fc14bSjoerg void __construct_at_end(size_type __n, const_reference __x); 811*4d6fc14bSjoerg template <class _ForwardIterator> 812*4d6fc14bSjoerg typename enable_if 813*4d6fc14bSjoerg < 814*4d6fc14bSjoerg __is_cpp17_forward_iterator<_ForwardIterator>::value, 815*4d6fc14bSjoerg void 816*4d6fc14bSjoerg >::type 817*4d6fc14bSjoerg __construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n); 818*4d6fc14bSjoerg void __append(size_type __n); 819*4d6fc14bSjoerg void __append(size_type __n, const_reference __x); 820*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 821*4d6fc14bSjoerg iterator __make_iter(pointer __p) _NOEXCEPT; 822*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 823*4d6fc14bSjoerg const_iterator __make_iter(const_pointer __p) const _NOEXCEPT; 824*4d6fc14bSjoerg void __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v); 825*4d6fc14bSjoerg pointer __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p); 826*4d6fc14bSjoerg void __move_range(pointer __from_s, pointer __from_e, pointer __to); 827*4d6fc14bSjoerg void __move_assign(vector& __c, true_type) 828*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); 829*4d6fc14bSjoerg void __move_assign(vector& __c, false_type) 830*4d6fc14bSjoerg _NOEXCEPT_(__alloc_traits::is_always_equal::value); 831*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 832*4d6fc14bSjoerg void __destruct_at_end(pointer __new_last) _NOEXCEPT 833*4d6fc14bSjoerg { 834*4d6fc14bSjoerg __invalidate_iterators_past(__new_last); 835*4d6fc14bSjoerg size_type __old_size = size(); 836*4d6fc14bSjoerg __base::__destruct_at_end(__new_last); 837*4d6fc14bSjoerg __annotate_shrink(__old_size); 838*4d6fc14bSjoerg } 839*4d6fc14bSjoerg 840*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 841*4d6fc14bSjoerg template <class _Up> 842*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 843*4d6fc14bSjoerg inline void __push_back_slow_path(_Up&& __x); 844*4d6fc14bSjoerg 845*4d6fc14bSjoerg template <class... _Args> 846*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 847*4d6fc14bSjoerg inline void __emplace_back_slow_path(_Args&&... __args); 848*4d6fc14bSjoerg#else 849*4d6fc14bSjoerg template <class _Up> 850*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 851*4d6fc14bSjoerg inline void __push_back_slow_path(_Up& __x); 852*4d6fc14bSjoerg#endif 853*4d6fc14bSjoerg 854*4d6fc14bSjoerg // The following functions are no-ops outside of AddressSanitizer mode. 855*4d6fc14bSjoerg // We call annotatations only for the default Allocator because other allocators 856*4d6fc14bSjoerg // may not meet the AddressSanitizer alignment constraints. 857*4d6fc14bSjoerg // See the documentation for __sanitizer_annotate_contiguous_container for more details. 858*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_ASAN 859*4d6fc14bSjoerg void __annotate_contiguous_container(const void *__beg, const void *__end, 860*4d6fc14bSjoerg const void *__old_mid, 861*4d6fc14bSjoerg const void *__new_mid) const 862*4d6fc14bSjoerg { 863*4d6fc14bSjoerg 864*4d6fc14bSjoerg if (__beg && is_same<allocator_type, __default_allocator_type>::value) 865*4d6fc14bSjoerg __sanitizer_annotate_contiguous_container(__beg, __end, __old_mid, __new_mid); 866*4d6fc14bSjoerg } 867*4d6fc14bSjoerg#else 868*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 869*4d6fc14bSjoerg void __annotate_contiguous_container(const void*, const void*, const void*, 870*4d6fc14bSjoerg const void*) const _NOEXCEPT {} 871*4d6fc14bSjoerg#endif 872*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 873*4d6fc14bSjoerg void __annotate_new(size_type __current_size) const _NOEXCEPT { 874*4d6fc14bSjoerg __annotate_contiguous_container(data(), data() + capacity(), 875*4d6fc14bSjoerg data() + capacity(), data() + __current_size); 876*4d6fc14bSjoerg } 877*4d6fc14bSjoerg 878*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 879*4d6fc14bSjoerg void __annotate_delete() const _NOEXCEPT { 880*4d6fc14bSjoerg __annotate_contiguous_container(data(), data() + capacity(), 881*4d6fc14bSjoerg data() + size(), data() + capacity()); 882*4d6fc14bSjoerg } 883*4d6fc14bSjoerg 884*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 885*4d6fc14bSjoerg void __annotate_increase(size_type __n) const _NOEXCEPT 886*4d6fc14bSjoerg { 887*4d6fc14bSjoerg __annotate_contiguous_container(data(), data() + capacity(), 888*4d6fc14bSjoerg data() + size(), data() + size() + __n); 889*4d6fc14bSjoerg } 890*4d6fc14bSjoerg 891*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 892*4d6fc14bSjoerg void __annotate_shrink(size_type __old_size) const _NOEXCEPT 893*4d6fc14bSjoerg { 894*4d6fc14bSjoerg __annotate_contiguous_container(data(), data() + capacity(), 895*4d6fc14bSjoerg data() + __old_size, data() + size()); 896*4d6fc14bSjoerg } 897*4d6fc14bSjoerg 898*4d6fc14bSjoerg struct _ConstructTransaction { 899*4d6fc14bSjoerg explicit _ConstructTransaction(vector &__v, size_type __n) 900*4d6fc14bSjoerg : __v_(__v), __pos_(__v.__end_), __new_end_(__v.__end_ + __n) { 901*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_ASAN 902*4d6fc14bSjoerg __v_.__annotate_increase(__n); 903*4d6fc14bSjoerg#endif 904*4d6fc14bSjoerg } 905*4d6fc14bSjoerg ~_ConstructTransaction() { 906*4d6fc14bSjoerg __v_.__end_ = __pos_; 907*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_ASAN 908*4d6fc14bSjoerg if (__pos_ != __new_end_) { 909*4d6fc14bSjoerg __v_.__annotate_shrink(__new_end_ - __v_.__begin_); 910*4d6fc14bSjoerg } 911*4d6fc14bSjoerg#endif 912*4d6fc14bSjoerg } 913*4d6fc14bSjoerg 914*4d6fc14bSjoerg vector &__v_; 915*4d6fc14bSjoerg pointer __pos_; 916*4d6fc14bSjoerg const_pointer const __new_end_; 917*4d6fc14bSjoerg 918*4d6fc14bSjoerg private: 919*4d6fc14bSjoerg _ConstructTransaction(_ConstructTransaction const&) = delete; 920*4d6fc14bSjoerg _ConstructTransaction& operator=(_ConstructTransaction const&) = delete; 921*4d6fc14bSjoerg }; 922*4d6fc14bSjoerg 923*4d6fc14bSjoerg template <class ..._Args> 924*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 925*4d6fc14bSjoerg void __construct_one_at_end(_Args&& ...__args) { 926*4d6fc14bSjoerg _ConstructTransaction __tx(*this, 1); 927*4d6fc14bSjoerg __alloc_traits::construct(this->__alloc(), _VSTD::__to_address(__tx.__pos_), 928*4d6fc14bSjoerg _VSTD::forward<_Args>(__args)...); 929*4d6fc14bSjoerg ++__tx.__pos_; 930*4d6fc14bSjoerg } 931*4d6fc14bSjoerg}; 932*4d6fc14bSjoerg 933*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES 934*4d6fc14bSjoergtemplate<class _InputIterator, 935*4d6fc14bSjoerg class _Alloc = allocator<__iter_value_type<_InputIterator>>, 936*4d6fc14bSjoerg class = _EnableIf<__is_allocator<_Alloc>::value> 937*4d6fc14bSjoerg > 938*4d6fc14bSjoergvector(_InputIterator, _InputIterator) 939*4d6fc14bSjoerg -> vector<__iter_value_type<_InputIterator>, _Alloc>; 940*4d6fc14bSjoerg 941*4d6fc14bSjoergtemplate<class _InputIterator, 942*4d6fc14bSjoerg class _Alloc, 943*4d6fc14bSjoerg class = _EnableIf<__is_allocator<_Alloc>::value> 944*4d6fc14bSjoerg > 945*4d6fc14bSjoergvector(_InputIterator, _InputIterator, _Alloc) 946*4d6fc14bSjoerg -> vector<__iter_value_type<_InputIterator>, _Alloc>; 947*4d6fc14bSjoerg#endif 948*4d6fc14bSjoerg 949*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 950*4d6fc14bSjoergvoid 951*4d6fc14bSjoergvector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v) 952*4d6fc14bSjoerg{ 953*4d6fc14bSjoerg 954*4d6fc14bSjoerg __annotate_delete(); 955*4d6fc14bSjoerg _VSTD::__construct_backward_with_exception_guarantees(this->__alloc(), this->__begin_, this->__end_, __v.__begin_); 956*4d6fc14bSjoerg _VSTD::swap(this->__begin_, __v.__begin_); 957*4d6fc14bSjoerg _VSTD::swap(this->__end_, __v.__end_); 958*4d6fc14bSjoerg _VSTD::swap(this->__end_cap(), __v.__end_cap()); 959*4d6fc14bSjoerg __v.__first_ = __v.__begin_; 960*4d6fc14bSjoerg __annotate_new(size()); 961*4d6fc14bSjoerg __invalidate_all_iterators(); 962*4d6fc14bSjoerg} 963*4d6fc14bSjoerg 964*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 965*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::pointer 966*4d6fc14bSjoergvector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p) 967*4d6fc14bSjoerg{ 968*4d6fc14bSjoerg __annotate_delete(); 969*4d6fc14bSjoerg pointer __r = __v.__begin_; 970*4d6fc14bSjoerg _VSTD::__construct_backward_with_exception_guarantees(this->__alloc(), this->__begin_, __p, __v.__begin_); 971*4d6fc14bSjoerg _VSTD::__construct_forward_with_exception_guarantees(this->__alloc(), __p, this->__end_, __v.__end_); 972*4d6fc14bSjoerg _VSTD::swap(this->__begin_, __v.__begin_); 973*4d6fc14bSjoerg _VSTD::swap(this->__end_, __v.__end_); 974*4d6fc14bSjoerg _VSTD::swap(this->__end_cap(), __v.__end_cap()); 975*4d6fc14bSjoerg __v.__first_ = __v.__begin_; 976*4d6fc14bSjoerg __annotate_new(size()); 977*4d6fc14bSjoerg __invalidate_all_iterators(); 978*4d6fc14bSjoerg return __r; 979*4d6fc14bSjoerg} 980*4d6fc14bSjoerg 981*4d6fc14bSjoerg// Allocate space for __n objects 982*4d6fc14bSjoerg// throws length_error if __n > max_size() 983*4d6fc14bSjoerg// throws (probably bad_alloc) if memory run out 984*4d6fc14bSjoerg// Precondition: __begin_ == __end_ == __end_cap() == 0 985*4d6fc14bSjoerg// Precondition: __n > 0 986*4d6fc14bSjoerg// Postcondition: capacity() == __n 987*4d6fc14bSjoerg// Postcondition: size() == 0 988*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 989*4d6fc14bSjoergvoid 990*4d6fc14bSjoergvector<_Tp, _Allocator>::__vallocate(size_type __n) 991*4d6fc14bSjoerg{ 992*4d6fc14bSjoerg if (__n > max_size()) 993*4d6fc14bSjoerg this->__throw_length_error(); 994*4d6fc14bSjoerg this->__begin_ = this->__end_ = __alloc_traits::allocate(this->__alloc(), __n); 995*4d6fc14bSjoerg this->__end_cap() = this->__begin_ + __n; 996*4d6fc14bSjoerg __annotate_new(0); 997*4d6fc14bSjoerg} 998*4d6fc14bSjoerg 999*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1000*4d6fc14bSjoergvoid 1001*4d6fc14bSjoergvector<_Tp, _Allocator>::__vdeallocate() _NOEXCEPT 1002*4d6fc14bSjoerg{ 1003*4d6fc14bSjoerg if (this->__begin_ != nullptr) 1004*4d6fc14bSjoerg { 1005*4d6fc14bSjoerg clear(); 1006*4d6fc14bSjoerg __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity()); 1007*4d6fc14bSjoerg this->__begin_ = this->__end_ = this->__end_cap() = nullptr; 1008*4d6fc14bSjoerg } 1009*4d6fc14bSjoerg} 1010*4d6fc14bSjoerg 1011*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1012*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::size_type 1013*4d6fc14bSjoergvector<_Tp, _Allocator>::max_size() const _NOEXCEPT 1014*4d6fc14bSjoerg{ 1015*4d6fc14bSjoerg return _VSTD::min<size_type>(__alloc_traits::max_size(this->__alloc()), 1016*4d6fc14bSjoerg numeric_limits<difference_type>::max()); 1017*4d6fc14bSjoerg} 1018*4d6fc14bSjoerg 1019*4d6fc14bSjoerg// Precondition: __new_size > capacity() 1020*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1021*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1022*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::size_type 1023*4d6fc14bSjoergvector<_Tp, _Allocator>::__recommend(size_type __new_size) const 1024*4d6fc14bSjoerg{ 1025*4d6fc14bSjoerg const size_type __ms = max_size(); 1026*4d6fc14bSjoerg if (__new_size > __ms) 1027*4d6fc14bSjoerg this->__throw_length_error(); 1028*4d6fc14bSjoerg const size_type __cap = capacity(); 1029*4d6fc14bSjoerg if (__cap >= __ms / 2) 1030*4d6fc14bSjoerg return __ms; 1031*4d6fc14bSjoerg return _VSTD::max<size_type>(2*__cap, __new_size); 1032*4d6fc14bSjoerg} 1033*4d6fc14bSjoerg 1034*4d6fc14bSjoerg// Default constructs __n objects starting at __end_ 1035*4d6fc14bSjoerg// throws if construction throws 1036*4d6fc14bSjoerg// Precondition: __n > 0 1037*4d6fc14bSjoerg// Precondition: size() + __n <= capacity() 1038*4d6fc14bSjoerg// Postcondition: size() == size() + __n 1039*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1040*4d6fc14bSjoergvoid 1041*4d6fc14bSjoergvector<_Tp, _Allocator>::__construct_at_end(size_type __n) 1042*4d6fc14bSjoerg{ 1043*4d6fc14bSjoerg _ConstructTransaction __tx(*this, __n); 1044*4d6fc14bSjoerg const_pointer __new_end = __tx.__new_end_; 1045*4d6fc14bSjoerg for (pointer __pos = __tx.__pos_; __pos != __new_end; ++__pos, __tx.__pos_ = __pos) { 1046*4d6fc14bSjoerg __alloc_traits::construct(this->__alloc(), _VSTD::__to_address(__pos)); 1047*4d6fc14bSjoerg } 1048*4d6fc14bSjoerg} 1049*4d6fc14bSjoerg 1050*4d6fc14bSjoerg// Copy constructs __n objects starting at __end_ from __x 1051*4d6fc14bSjoerg// throws if construction throws 1052*4d6fc14bSjoerg// Precondition: __n > 0 1053*4d6fc14bSjoerg// Precondition: size() + __n <= capacity() 1054*4d6fc14bSjoerg// Postcondition: size() == old size() + __n 1055*4d6fc14bSjoerg// Postcondition: [i] == __x for all i in [size() - __n, __n) 1056*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1057*4d6fc14bSjoerginline 1058*4d6fc14bSjoergvoid 1059*4d6fc14bSjoergvector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x) 1060*4d6fc14bSjoerg{ 1061*4d6fc14bSjoerg _ConstructTransaction __tx(*this, __n); 1062*4d6fc14bSjoerg const_pointer __new_end = __tx.__new_end_; 1063*4d6fc14bSjoerg for (pointer __pos = __tx.__pos_; __pos != __new_end; ++__pos, __tx.__pos_ = __pos) { 1064*4d6fc14bSjoerg __alloc_traits::construct(this->__alloc(), _VSTD::__to_address(__pos), __x); 1065*4d6fc14bSjoerg } 1066*4d6fc14bSjoerg} 1067*4d6fc14bSjoerg 1068*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1069*4d6fc14bSjoergtemplate <class _ForwardIterator> 1070*4d6fc14bSjoergtypename enable_if 1071*4d6fc14bSjoerg< 1072*4d6fc14bSjoerg __is_cpp17_forward_iterator<_ForwardIterator>::value, 1073*4d6fc14bSjoerg void 1074*4d6fc14bSjoerg>::type 1075*4d6fc14bSjoergvector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n) 1076*4d6fc14bSjoerg{ 1077*4d6fc14bSjoerg _ConstructTransaction __tx(*this, __n); 1078*4d6fc14bSjoerg _VSTD::__construct_range_forward(this->__alloc(), __first, __last, __tx.__pos_); 1079*4d6fc14bSjoerg} 1080*4d6fc14bSjoerg 1081*4d6fc14bSjoerg// Default constructs __n objects starting at __end_ 1082*4d6fc14bSjoerg// throws if construction throws 1083*4d6fc14bSjoerg// Postcondition: size() == size() + __n 1084*4d6fc14bSjoerg// Exception safety: strong. 1085*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1086*4d6fc14bSjoergvoid 1087*4d6fc14bSjoergvector<_Tp, _Allocator>::__append(size_type __n) 1088*4d6fc14bSjoerg{ 1089*4d6fc14bSjoerg if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n) 1090*4d6fc14bSjoerg this->__construct_at_end(__n); 1091*4d6fc14bSjoerg else 1092*4d6fc14bSjoerg { 1093*4d6fc14bSjoerg allocator_type& __a = this->__alloc(); 1094*4d6fc14bSjoerg __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a); 1095*4d6fc14bSjoerg __v.__construct_at_end(__n); 1096*4d6fc14bSjoerg __swap_out_circular_buffer(__v); 1097*4d6fc14bSjoerg } 1098*4d6fc14bSjoerg} 1099*4d6fc14bSjoerg 1100*4d6fc14bSjoerg// Default constructs __n objects starting at __end_ 1101*4d6fc14bSjoerg// throws if construction throws 1102*4d6fc14bSjoerg// Postcondition: size() == size() + __n 1103*4d6fc14bSjoerg// Exception safety: strong. 1104*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1105*4d6fc14bSjoergvoid 1106*4d6fc14bSjoergvector<_Tp, _Allocator>::__append(size_type __n, const_reference __x) 1107*4d6fc14bSjoerg{ 1108*4d6fc14bSjoerg if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n) 1109*4d6fc14bSjoerg this->__construct_at_end(__n, __x); 1110*4d6fc14bSjoerg else 1111*4d6fc14bSjoerg { 1112*4d6fc14bSjoerg allocator_type& __a = this->__alloc(); 1113*4d6fc14bSjoerg __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a); 1114*4d6fc14bSjoerg __v.__construct_at_end(__n, __x); 1115*4d6fc14bSjoerg __swap_out_circular_buffer(__v); 1116*4d6fc14bSjoerg } 1117*4d6fc14bSjoerg} 1118*4d6fc14bSjoerg 1119*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1120*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(size_type __n) 1121*4d6fc14bSjoerg{ 1122*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1123*4d6fc14bSjoerg __get_db()->__insert_c(this); 1124*4d6fc14bSjoerg#endif 1125*4d6fc14bSjoerg if (__n > 0) 1126*4d6fc14bSjoerg { 1127*4d6fc14bSjoerg __vallocate(__n); 1128*4d6fc14bSjoerg __construct_at_end(__n); 1129*4d6fc14bSjoerg } 1130*4d6fc14bSjoerg} 1131*4d6fc14bSjoerg 1132*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 11 1133*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1134*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(size_type __n, const allocator_type& __a) 1135*4d6fc14bSjoerg : __base(__a) 1136*4d6fc14bSjoerg{ 1137*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1138*4d6fc14bSjoerg __get_db()->__insert_c(this); 1139*4d6fc14bSjoerg#endif 1140*4d6fc14bSjoerg if (__n > 0) 1141*4d6fc14bSjoerg { 1142*4d6fc14bSjoerg __vallocate(__n); 1143*4d6fc14bSjoerg __construct_at_end(__n); 1144*4d6fc14bSjoerg } 1145*4d6fc14bSjoerg} 1146*4d6fc14bSjoerg#endif 1147*4d6fc14bSjoerg 1148*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1149*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x) 1150*4d6fc14bSjoerg{ 1151*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1152*4d6fc14bSjoerg __get_db()->__insert_c(this); 1153*4d6fc14bSjoerg#endif 1154*4d6fc14bSjoerg if (__n > 0) 1155*4d6fc14bSjoerg { 1156*4d6fc14bSjoerg __vallocate(__n); 1157*4d6fc14bSjoerg __construct_at_end(__n, __x); 1158*4d6fc14bSjoerg } 1159*4d6fc14bSjoerg} 1160*4d6fc14bSjoerg 1161*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1162*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a) 1163*4d6fc14bSjoerg : __base(__a) 1164*4d6fc14bSjoerg{ 1165*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1166*4d6fc14bSjoerg __get_db()->__insert_c(this); 1167*4d6fc14bSjoerg#endif 1168*4d6fc14bSjoerg if (__n > 0) 1169*4d6fc14bSjoerg { 1170*4d6fc14bSjoerg __vallocate(__n); 1171*4d6fc14bSjoerg __construct_at_end(__n, __x); 1172*4d6fc14bSjoerg } 1173*4d6fc14bSjoerg} 1174*4d6fc14bSjoerg 1175*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1176*4d6fc14bSjoergtemplate <class _InputIterator> 1177*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(_InputIterator __first, 1178*4d6fc14bSjoerg typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value && 1179*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value && 1180*4d6fc14bSjoerg is_constructible< 1181*4d6fc14bSjoerg value_type, 1182*4d6fc14bSjoerg typename iterator_traits<_InputIterator>::reference>::value, 1183*4d6fc14bSjoerg _InputIterator>::type __last) 1184*4d6fc14bSjoerg{ 1185*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1186*4d6fc14bSjoerg __get_db()->__insert_c(this); 1187*4d6fc14bSjoerg#endif 1188*4d6fc14bSjoerg for (; __first != __last; ++__first) 1189*4d6fc14bSjoerg __emplace_back(*__first); 1190*4d6fc14bSjoerg} 1191*4d6fc14bSjoerg 1192*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1193*4d6fc14bSjoergtemplate <class _InputIterator> 1194*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, 1195*4d6fc14bSjoerg typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value && 1196*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value && 1197*4d6fc14bSjoerg is_constructible< 1198*4d6fc14bSjoerg value_type, 1199*4d6fc14bSjoerg typename iterator_traits<_InputIterator>::reference>::value>::type*) 1200*4d6fc14bSjoerg : __base(__a) 1201*4d6fc14bSjoerg{ 1202*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1203*4d6fc14bSjoerg __get_db()->__insert_c(this); 1204*4d6fc14bSjoerg#endif 1205*4d6fc14bSjoerg for (; __first != __last; ++__first) 1206*4d6fc14bSjoerg __emplace_back(*__first); 1207*4d6fc14bSjoerg} 1208*4d6fc14bSjoerg 1209*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1210*4d6fc14bSjoergtemplate <class _ForwardIterator> 1211*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(_ForwardIterator __first, 1212*4d6fc14bSjoerg typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value && 1213*4d6fc14bSjoerg is_constructible< 1214*4d6fc14bSjoerg value_type, 1215*4d6fc14bSjoerg typename iterator_traits<_ForwardIterator>::reference>::value, 1216*4d6fc14bSjoerg _ForwardIterator>::type __last) 1217*4d6fc14bSjoerg{ 1218*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1219*4d6fc14bSjoerg __get_db()->__insert_c(this); 1220*4d6fc14bSjoerg#endif 1221*4d6fc14bSjoerg size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); 1222*4d6fc14bSjoerg if (__n > 0) 1223*4d6fc14bSjoerg { 1224*4d6fc14bSjoerg __vallocate(__n); 1225*4d6fc14bSjoerg __construct_at_end(__first, __last, __n); 1226*4d6fc14bSjoerg } 1227*4d6fc14bSjoerg} 1228*4d6fc14bSjoerg 1229*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1230*4d6fc14bSjoergtemplate <class _ForwardIterator> 1231*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, 1232*4d6fc14bSjoerg typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value && 1233*4d6fc14bSjoerg is_constructible< 1234*4d6fc14bSjoerg value_type, 1235*4d6fc14bSjoerg typename iterator_traits<_ForwardIterator>::reference>::value>::type*) 1236*4d6fc14bSjoerg : __base(__a) 1237*4d6fc14bSjoerg{ 1238*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1239*4d6fc14bSjoerg __get_db()->__insert_c(this); 1240*4d6fc14bSjoerg#endif 1241*4d6fc14bSjoerg size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); 1242*4d6fc14bSjoerg if (__n > 0) 1243*4d6fc14bSjoerg { 1244*4d6fc14bSjoerg __vallocate(__n); 1245*4d6fc14bSjoerg __construct_at_end(__first, __last, __n); 1246*4d6fc14bSjoerg } 1247*4d6fc14bSjoerg} 1248*4d6fc14bSjoerg 1249*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1250*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(const vector& __x) 1251*4d6fc14bSjoerg : __base(__alloc_traits::select_on_container_copy_construction(__x.__alloc())) 1252*4d6fc14bSjoerg{ 1253*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1254*4d6fc14bSjoerg __get_db()->__insert_c(this); 1255*4d6fc14bSjoerg#endif 1256*4d6fc14bSjoerg size_type __n = __x.size(); 1257*4d6fc14bSjoerg if (__n > 0) 1258*4d6fc14bSjoerg { 1259*4d6fc14bSjoerg __vallocate(__n); 1260*4d6fc14bSjoerg __construct_at_end(__x.__begin_, __x.__end_, __n); 1261*4d6fc14bSjoerg } 1262*4d6fc14bSjoerg} 1263*4d6fc14bSjoerg 1264*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1265*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(const vector& __x, const allocator_type& __a) 1266*4d6fc14bSjoerg : __base(__a) 1267*4d6fc14bSjoerg{ 1268*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1269*4d6fc14bSjoerg __get_db()->__insert_c(this); 1270*4d6fc14bSjoerg#endif 1271*4d6fc14bSjoerg size_type __n = __x.size(); 1272*4d6fc14bSjoerg if (__n > 0) 1273*4d6fc14bSjoerg { 1274*4d6fc14bSjoerg __vallocate(__n); 1275*4d6fc14bSjoerg __construct_at_end(__x.__begin_, __x.__end_, __n); 1276*4d6fc14bSjoerg } 1277*4d6fc14bSjoerg} 1278*4d6fc14bSjoerg 1279*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 1280*4d6fc14bSjoerg 1281*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1282*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1283*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(vector&& __x) 1284*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 1285*4d6fc14bSjoerg _NOEXCEPT 1286*4d6fc14bSjoerg#else 1287*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) 1288*4d6fc14bSjoerg#endif 1289*4d6fc14bSjoerg : __base(_VSTD::move(__x.__alloc())) 1290*4d6fc14bSjoerg{ 1291*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1292*4d6fc14bSjoerg __get_db()->__insert_c(this); 1293*4d6fc14bSjoerg __get_db()->swap(this, &__x); 1294*4d6fc14bSjoerg#endif 1295*4d6fc14bSjoerg this->__begin_ = __x.__begin_; 1296*4d6fc14bSjoerg this->__end_ = __x.__end_; 1297*4d6fc14bSjoerg this->__end_cap() = __x.__end_cap(); 1298*4d6fc14bSjoerg __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr; 1299*4d6fc14bSjoerg} 1300*4d6fc14bSjoerg 1301*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1302*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1303*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(vector&& __x, const allocator_type& __a) 1304*4d6fc14bSjoerg : __base(__a) 1305*4d6fc14bSjoerg{ 1306*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1307*4d6fc14bSjoerg __get_db()->__insert_c(this); 1308*4d6fc14bSjoerg#endif 1309*4d6fc14bSjoerg if (__a == __x.__alloc()) 1310*4d6fc14bSjoerg { 1311*4d6fc14bSjoerg this->__begin_ = __x.__begin_; 1312*4d6fc14bSjoerg this->__end_ = __x.__end_; 1313*4d6fc14bSjoerg this->__end_cap() = __x.__end_cap(); 1314*4d6fc14bSjoerg __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr; 1315*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1316*4d6fc14bSjoerg __get_db()->swap(this, &__x); 1317*4d6fc14bSjoerg#endif 1318*4d6fc14bSjoerg } 1319*4d6fc14bSjoerg else 1320*4d6fc14bSjoerg { 1321*4d6fc14bSjoerg typedef move_iterator<iterator> _Ip; 1322*4d6fc14bSjoerg assign(_Ip(__x.begin()), _Ip(__x.end())); 1323*4d6fc14bSjoerg } 1324*4d6fc14bSjoerg} 1325*4d6fc14bSjoerg 1326*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1327*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1328*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(initializer_list<value_type> __il) 1329*4d6fc14bSjoerg{ 1330*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1331*4d6fc14bSjoerg __get_db()->__insert_c(this); 1332*4d6fc14bSjoerg#endif 1333*4d6fc14bSjoerg if (__il.size() > 0) 1334*4d6fc14bSjoerg { 1335*4d6fc14bSjoerg __vallocate(__il.size()); 1336*4d6fc14bSjoerg __construct_at_end(__il.begin(), __il.end(), __il.size()); 1337*4d6fc14bSjoerg } 1338*4d6fc14bSjoerg} 1339*4d6fc14bSjoerg 1340*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1341*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1342*4d6fc14bSjoergvector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a) 1343*4d6fc14bSjoerg : __base(__a) 1344*4d6fc14bSjoerg{ 1345*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1346*4d6fc14bSjoerg __get_db()->__insert_c(this); 1347*4d6fc14bSjoerg#endif 1348*4d6fc14bSjoerg if (__il.size() > 0) 1349*4d6fc14bSjoerg { 1350*4d6fc14bSjoerg __vallocate(__il.size()); 1351*4d6fc14bSjoerg __construct_at_end(__il.begin(), __il.end(), __il.size()); 1352*4d6fc14bSjoerg } 1353*4d6fc14bSjoerg} 1354*4d6fc14bSjoerg 1355*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1356*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1357*4d6fc14bSjoergvector<_Tp, _Allocator>& 1358*4d6fc14bSjoergvector<_Tp, _Allocator>::operator=(vector&& __x) 1359*4d6fc14bSjoerg _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)) 1360*4d6fc14bSjoerg{ 1361*4d6fc14bSjoerg __move_assign(__x, integral_constant<bool, 1362*4d6fc14bSjoerg __alloc_traits::propagate_on_container_move_assignment::value>()); 1363*4d6fc14bSjoerg return *this; 1364*4d6fc14bSjoerg} 1365*4d6fc14bSjoerg 1366*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1367*4d6fc14bSjoergvoid 1368*4d6fc14bSjoergvector<_Tp, _Allocator>::__move_assign(vector& __c, false_type) 1369*4d6fc14bSjoerg _NOEXCEPT_(__alloc_traits::is_always_equal::value) 1370*4d6fc14bSjoerg{ 1371*4d6fc14bSjoerg if (__base::__alloc() != __c.__alloc()) 1372*4d6fc14bSjoerg { 1373*4d6fc14bSjoerg typedef move_iterator<iterator> _Ip; 1374*4d6fc14bSjoerg assign(_Ip(__c.begin()), _Ip(__c.end())); 1375*4d6fc14bSjoerg } 1376*4d6fc14bSjoerg else 1377*4d6fc14bSjoerg __move_assign(__c, true_type()); 1378*4d6fc14bSjoerg} 1379*4d6fc14bSjoerg 1380*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1381*4d6fc14bSjoergvoid 1382*4d6fc14bSjoergvector<_Tp, _Allocator>::__move_assign(vector& __c, true_type) 1383*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 1384*4d6fc14bSjoerg{ 1385*4d6fc14bSjoerg __vdeallocate(); 1386*4d6fc14bSjoerg __base::__move_assign_alloc(__c); // this can throw 1387*4d6fc14bSjoerg this->__begin_ = __c.__begin_; 1388*4d6fc14bSjoerg this->__end_ = __c.__end_; 1389*4d6fc14bSjoerg this->__end_cap() = __c.__end_cap(); 1390*4d6fc14bSjoerg __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr; 1391*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1392*4d6fc14bSjoerg __get_db()->swap(this, &__c); 1393*4d6fc14bSjoerg#endif 1394*4d6fc14bSjoerg} 1395*4d6fc14bSjoerg 1396*4d6fc14bSjoerg#endif // !_LIBCPP_CXX03_LANG 1397*4d6fc14bSjoerg 1398*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1399*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1400*4d6fc14bSjoergvector<_Tp, _Allocator>& 1401*4d6fc14bSjoergvector<_Tp, _Allocator>::operator=(const vector& __x) 1402*4d6fc14bSjoerg{ 1403*4d6fc14bSjoerg if (this != &__x) 1404*4d6fc14bSjoerg { 1405*4d6fc14bSjoerg __base::__copy_assign_alloc(__x); 1406*4d6fc14bSjoerg assign(__x.__begin_, __x.__end_); 1407*4d6fc14bSjoerg } 1408*4d6fc14bSjoerg return *this; 1409*4d6fc14bSjoerg} 1410*4d6fc14bSjoerg 1411*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1412*4d6fc14bSjoergtemplate <class _InputIterator> 1413*4d6fc14bSjoergtypename enable_if 1414*4d6fc14bSjoerg< 1415*4d6fc14bSjoerg __is_cpp17_input_iterator <_InputIterator>::value && 1416*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value && 1417*4d6fc14bSjoerg is_constructible< 1418*4d6fc14bSjoerg _Tp, 1419*4d6fc14bSjoerg typename iterator_traits<_InputIterator>::reference>::value, 1420*4d6fc14bSjoerg void 1421*4d6fc14bSjoerg>::type 1422*4d6fc14bSjoergvector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last) 1423*4d6fc14bSjoerg{ 1424*4d6fc14bSjoerg clear(); 1425*4d6fc14bSjoerg for (; __first != __last; ++__first) 1426*4d6fc14bSjoerg __emplace_back(*__first); 1427*4d6fc14bSjoerg} 1428*4d6fc14bSjoerg 1429*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1430*4d6fc14bSjoergtemplate <class _ForwardIterator> 1431*4d6fc14bSjoergtypename enable_if 1432*4d6fc14bSjoerg< 1433*4d6fc14bSjoerg __is_cpp17_forward_iterator<_ForwardIterator>::value && 1434*4d6fc14bSjoerg is_constructible< 1435*4d6fc14bSjoerg _Tp, 1436*4d6fc14bSjoerg typename iterator_traits<_ForwardIterator>::reference>::value, 1437*4d6fc14bSjoerg void 1438*4d6fc14bSjoerg>::type 1439*4d6fc14bSjoergvector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) 1440*4d6fc14bSjoerg{ 1441*4d6fc14bSjoerg size_type __new_size = static_cast<size_type>(_VSTD::distance(__first, __last)); 1442*4d6fc14bSjoerg if (__new_size <= capacity()) 1443*4d6fc14bSjoerg { 1444*4d6fc14bSjoerg _ForwardIterator __mid = __last; 1445*4d6fc14bSjoerg bool __growing = false; 1446*4d6fc14bSjoerg if (__new_size > size()) 1447*4d6fc14bSjoerg { 1448*4d6fc14bSjoerg __growing = true; 1449*4d6fc14bSjoerg __mid = __first; 1450*4d6fc14bSjoerg _VSTD::advance(__mid, size()); 1451*4d6fc14bSjoerg } 1452*4d6fc14bSjoerg pointer __m = _VSTD::copy(__first, __mid, this->__begin_); 1453*4d6fc14bSjoerg if (__growing) 1454*4d6fc14bSjoerg __construct_at_end(__mid, __last, __new_size - size()); 1455*4d6fc14bSjoerg else 1456*4d6fc14bSjoerg this->__destruct_at_end(__m); 1457*4d6fc14bSjoerg } 1458*4d6fc14bSjoerg else 1459*4d6fc14bSjoerg { 1460*4d6fc14bSjoerg __vdeallocate(); 1461*4d6fc14bSjoerg __vallocate(__recommend(__new_size)); 1462*4d6fc14bSjoerg __construct_at_end(__first, __last, __new_size); 1463*4d6fc14bSjoerg } 1464*4d6fc14bSjoerg __invalidate_all_iterators(); 1465*4d6fc14bSjoerg} 1466*4d6fc14bSjoerg 1467*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1468*4d6fc14bSjoergvoid 1469*4d6fc14bSjoergvector<_Tp, _Allocator>::assign(size_type __n, const_reference __u) 1470*4d6fc14bSjoerg{ 1471*4d6fc14bSjoerg if (__n <= capacity()) 1472*4d6fc14bSjoerg { 1473*4d6fc14bSjoerg size_type __s = size(); 1474*4d6fc14bSjoerg _VSTD::fill_n(this->__begin_, _VSTD::min(__n, __s), __u); 1475*4d6fc14bSjoerg if (__n > __s) 1476*4d6fc14bSjoerg __construct_at_end(__n - __s, __u); 1477*4d6fc14bSjoerg else 1478*4d6fc14bSjoerg this->__destruct_at_end(this->__begin_ + __n); 1479*4d6fc14bSjoerg } 1480*4d6fc14bSjoerg else 1481*4d6fc14bSjoerg { 1482*4d6fc14bSjoerg __vdeallocate(); 1483*4d6fc14bSjoerg __vallocate(__recommend(static_cast<size_type>(__n))); 1484*4d6fc14bSjoerg __construct_at_end(__n, __u); 1485*4d6fc14bSjoerg } 1486*4d6fc14bSjoerg __invalidate_all_iterators(); 1487*4d6fc14bSjoerg} 1488*4d6fc14bSjoerg 1489*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1490*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1491*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::iterator 1492*4d6fc14bSjoergvector<_Tp, _Allocator>::__make_iter(pointer __p) _NOEXCEPT 1493*4d6fc14bSjoerg{ 1494*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1495*4d6fc14bSjoerg return iterator(this, __p); 1496*4d6fc14bSjoerg#else 1497*4d6fc14bSjoerg return iterator(__p); 1498*4d6fc14bSjoerg#endif 1499*4d6fc14bSjoerg} 1500*4d6fc14bSjoerg 1501*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1502*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1503*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::const_iterator 1504*4d6fc14bSjoergvector<_Tp, _Allocator>::__make_iter(const_pointer __p) const _NOEXCEPT 1505*4d6fc14bSjoerg{ 1506*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1507*4d6fc14bSjoerg return const_iterator(this, __p); 1508*4d6fc14bSjoerg#else 1509*4d6fc14bSjoerg return const_iterator(__p); 1510*4d6fc14bSjoerg#endif 1511*4d6fc14bSjoerg} 1512*4d6fc14bSjoerg 1513*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1514*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1515*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::iterator 1516*4d6fc14bSjoergvector<_Tp, _Allocator>::begin() _NOEXCEPT 1517*4d6fc14bSjoerg{ 1518*4d6fc14bSjoerg return __make_iter(this->__begin_); 1519*4d6fc14bSjoerg} 1520*4d6fc14bSjoerg 1521*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1522*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1523*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::const_iterator 1524*4d6fc14bSjoergvector<_Tp, _Allocator>::begin() const _NOEXCEPT 1525*4d6fc14bSjoerg{ 1526*4d6fc14bSjoerg return __make_iter(this->__begin_); 1527*4d6fc14bSjoerg} 1528*4d6fc14bSjoerg 1529*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1530*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1531*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::iterator 1532*4d6fc14bSjoergvector<_Tp, _Allocator>::end() _NOEXCEPT 1533*4d6fc14bSjoerg{ 1534*4d6fc14bSjoerg return __make_iter(this->__end_); 1535*4d6fc14bSjoerg} 1536*4d6fc14bSjoerg 1537*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1538*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1539*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::const_iterator 1540*4d6fc14bSjoergvector<_Tp, _Allocator>::end() const _NOEXCEPT 1541*4d6fc14bSjoerg{ 1542*4d6fc14bSjoerg return __make_iter(this->__end_); 1543*4d6fc14bSjoerg} 1544*4d6fc14bSjoerg 1545*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1546*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1547*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::reference 1548*4d6fc14bSjoergvector<_Tp, _Allocator>::operator[](size_type __n) _NOEXCEPT 1549*4d6fc14bSjoerg{ 1550*4d6fc14bSjoerg _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds"); 1551*4d6fc14bSjoerg return this->__begin_[__n]; 1552*4d6fc14bSjoerg} 1553*4d6fc14bSjoerg 1554*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1555*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1556*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::const_reference 1557*4d6fc14bSjoergvector<_Tp, _Allocator>::operator[](size_type __n) const _NOEXCEPT 1558*4d6fc14bSjoerg{ 1559*4d6fc14bSjoerg _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds"); 1560*4d6fc14bSjoerg return this->__begin_[__n]; 1561*4d6fc14bSjoerg} 1562*4d6fc14bSjoerg 1563*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1564*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::reference 1565*4d6fc14bSjoergvector<_Tp, _Allocator>::at(size_type __n) 1566*4d6fc14bSjoerg{ 1567*4d6fc14bSjoerg if (__n >= size()) 1568*4d6fc14bSjoerg this->__throw_out_of_range(); 1569*4d6fc14bSjoerg return this->__begin_[__n]; 1570*4d6fc14bSjoerg} 1571*4d6fc14bSjoerg 1572*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1573*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::const_reference 1574*4d6fc14bSjoergvector<_Tp, _Allocator>::at(size_type __n) const 1575*4d6fc14bSjoerg{ 1576*4d6fc14bSjoerg if (__n >= size()) 1577*4d6fc14bSjoerg this->__throw_out_of_range(); 1578*4d6fc14bSjoerg return this->__begin_[__n]; 1579*4d6fc14bSjoerg} 1580*4d6fc14bSjoerg 1581*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1582*4d6fc14bSjoergvoid 1583*4d6fc14bSjoergvector<_Tp, _Allocator>::reserve(size_type __n) 1584*4d6fc14bSjoerg{ 1585*4d6fc14bSjoerg if (__n > capacity()) 1586*4d6fc14bSjoerg { 1587*4d6fc14bSjoerg allocator_type& __a = this->__alloc(); 1588*4d6fc14bSjoerg __split_buffer<value_type, allocator_type&> __v(__n, size(), __a); 1589*4d6fc14bSjoerg __swap_out_circular_buffer(__v); 1590*4d6fc14bSjoerg } 1591*4d6fc14bSjoerg} 1592*4d6fc14bSjoerg 1593*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1594*4d6fc14bSjoergvoid 1595*4d6fc14bSjoergvector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT 1596*4d6fc14bSjoerg{ 1597*4d6fc14bSjoerg if (capacity() > size()) 1598*4d6fc14bSjoerg { 1599*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 1600*4d6fc14bSjoerg try 1601*4d6fc14bSjoerg { 1602*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 1603*4d6fc14bSjoerg allocator_type& __a = this->__alloc(); 1604*4d6fc14bSjoerg __split_buffer<value_type, allocator_type&> __v(size(), size(), __a); 1605*4d6fc14bSjoerg __swap_out_circular_buffer(__v); 1606*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 1607*4d6fc14bSjoerg } 1608*4d6fc14bSjoerg catch (...) 1609*4d6fc14bSjoerg { 1610*4d6fc14bSjoerg } 1611*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 1612*4d6fc14bSjoerg } 1613*4d6fc14bSjoerg} 1614*4d6fc14bSjoerg 1615*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1616*4d6fc14bSjoergtemplate <class _Up> 1617*4d6fc14bSjoergvoid 1618*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 1619*4d6fc14bSjoergvector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x) 1620*4d6fc14bSjoerg#else 1621*4d6fc14bSjoergvector<_Tp, _Allocator>::__push_back_slow_path(_Up& __x) 1622*4d6fc14bSjoerg#endif 1623*4d6fc14bSjoerg{ 1624*4d6fc14bSjoerg allocator_type& __a = this->__alloc(); 1625*4d6fc14bSjoerg __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a); 1626*4d6fc14bSjoerg // __v.push_back(_VSTD::forward<_Up>(__x)); 1627*4d6fc14bSjoerg __alloc_traits::construct(__a, _VSTD::__to_address(__v.__end_), _VSTD::forward<_Up>(__x)); 1628*4d6fc14bSjoerg __v.__end_++; 1629*4d6fc14bSjoerg __swap_out_circular_buffer(__v); 1630*4d6fc14bSjoerg} 1631*4d6fc14bSjoerg 1632*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1633*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1634*4d6fc14bSjoergvoid 1635*4d6fc14bSjoergvector<_Tp, _Allocator>::push_back(const_reference __x) 1636*4d6fc14bSjoerg{ 1637*4d6fc14bSjoerg if (this->__end_ != this->__end_cap()) 1638*4d6fc14bSjoerg { 1639*4d6fc14bSjoerg __construct_one_at_end(__x); 1640*4d6fc14bSjoerg } 1641*4d6fc14bSjoerg else 1642*4d6fc14bSjoerg __push_back_slow_path(__x); 1643*4d6fc14bSjoerg} 1644*4d6fc14bSjoerg 1645*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 1646*4d6fc14bSjoerg 1647*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1648*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1649*4d6fc14bSjoergvoid 1650*4d6fc14bSjoergvector<_Tp, _Allocator>::push_back(value_type&& __x) 1651*4d6fc14bSjoerg{ 1652*4d6fc14bSjoerg if (this->__end_ < this->__end_cap()) 1653*4d6fc14bSjoerg { 1654*4d6fc14bSjoerg __construct_one_at_end(_VSTD::move(__x)); 1655*4d6fc14bSjoerg } 1656*4d6fc14bSjoerg else 1657*4d6fc14bSjoerg __push_back_slow_path(_VSTD::move(__x)); 1658*4d6fc14bSjoerg} 1659*4d6fc14bSjoerg 1660*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1661*4d6fc14bSjoergtemplate <class... _Args> 1662*4d6fc14bSjoergvoid 1663*4d6fc14bSjoergvector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args) 1664*4d6fc14bSjoerg{ 1665*4d6fc14bSjoerg allocator_type& __a = this->__alloc(); 1666*4d6fc14bSjoerg __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a); 1667*4d6fc14bSjoerg// __v.emplace_back(_VSTD::forward<_Args>(__args)...); 1668*4d6fc14bSjoerg __alloc_traits::construct(__a, _VSTD::__to_address(__v.__end_), _VSTD::forward<_Args>(__args)...); 1669*4d6fc14bSjoerg __v.__end_++; 1670*4d6fc14bSjoerg __swap_out_circular_buffer(__v); 1671*4d6fc14bSjoerg} 1672*4d6fc14bSjoerg 1673*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1674*4d6fc14bSjoergtemplate <class... _Args> 1675*4d6fc14bSjoerginline 1676*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 1677*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::reference 1678*4d6fc14bSjoerg#else 1679*4d6fc14bSjoergvoid 1680*4d6fc14bSjoerg#endif 1681*4d6fc14bSjoergvector<_Tp, _Allocator>::emplace_back(_Args&&... __args) 1682*4d6fc14bSjoerg{ 1683*4d6fc14bSjoerg if (this->__end_ < this->__end_cap()) 1684*4d6fc14bSjoerg { 1685*4d6fc14bSjoerg __construct_one_at_end(_VSTD::forward<_Args>(__args)...); 1686*4d6fc14bSjoerg } 1687*4d6fc14bSjoerg else 1688*4d6fc14bSjoerg __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...); 1689*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 1690*4d6fc14bSjoerg return this->back(); 1691*4d6fc14bSjoerg#endif 1692*4d6fc14bSjoerg} 1693*4d6fc14bSjoerg 1694*4d6fc14bSjoerg#endif // !_LIBCPP_CXX03_LANG 1695*4d6fc14bSjoerg 1696*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1697*4d6fc14bSjoerginline 1698*4d6fc14bSjoergvoid 1699*4d6fc14bSjoergvector<_Tp, _Allocator>::pop_back() 1700*4d6fc14bSjoerg{ 1701*4d6fc14bSjoerg _LIBCPP_ASSERT(!empty(), "vector::pop_back called on an empty vector"); 1702*4d6fc14bSjoerg this->__destruct_at_end(this->__end_ - 1); 1703*4d6fc14bSjoerg} 1704*4d6fc14bSjoerg 1705*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1706*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1707*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::iterator 1708*4d6fc14bSjoergvector<_Tp, _Allocator>::erase(const_iterator __position) 1709*4d6fc14bSjoerg{ 1710*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1711*4d6fc14bSjoerg _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1712*4d6fc14bSjoerg "vector::erase(iterator) called with an iterator not" 1713*4d6fc14bSjoerg " referring to this vector"); 1714*4d6fc14bSjoerg#endif 1715*4d6fc14bSjoerg _LIBCPP_ASSERT(__position != end(), 1716*4d6fc14bSjoerg "vector::erase(iterator) called with a non-dereferenceable iterator"); 1717*4d6fc14bSjoerg difference_type __ps = __position - cbegin(); 1718*4d6fc14bSjoerg pointer __p = this->__begin_ + __ps; 1719*4d6fc14bSjoerg this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p)); 1720*4d6fc14bSjoerg this->__invalidate_iterators_past(__p-1); 1721*4d6fc14bSjoerg iterator __r = __make_iter(__p); 1722*4d6fc14bSjoerg return __r; 1723*4d6fc14bSjoerg} 1724*4d6fc14bSjoerg 1725*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1726*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::iterator 1727*4d6fc14bSjoergvector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last) 1728*4d6fc14bSjoerg{ 1729*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1730*4d6fc14bSjoerg _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this, 1731*4d6fc14bSjoerg "vector::erase(iterator, iterator) called with an iterator not" 1732*4d6fc14bSjoerg " referring to this vector"); 1733*4d6fc14bSjoerg _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__last) == this, 1734*4d6fc14bSjoerg "vector::erase(iterator, iterator) called with an iterator not" 1735*4d6fc14bSjoerg " referring to this vector"); 1736*4d6fc14bSjoerg#endif 1737*4d6fc14bSjoerg _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range"); 1738*4d6fc14bSjoerg pointer __p = this->__begin_ + (__first - begin()); 1739*4d6fc14bSjoerg if (__first != __last) { 1740*4d6fc14bSjoerg this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p)); 1741*4d6fc14bSjoerg this->__invalidate_iterators_past(__p - 1); 1742*4d6fc14bSjoerg } 1743*4d6fc14bSjoerg iterator __r = __make_iter(__p); 1744*4d6fc14bSjoerg return __r; 1745*4d6fc14bSjoerg} 1746*4d6fc14bSjoerg 1747*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1748*4d6fc14bSjoergvoid 1749*4d6fc14bSjoergvector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to) 1750*4d6fc14bSjoerg{ 1751*4d6fc14bSjoerg pointer __old_last = this->__end_; 1752*4d6fc14bSjoerg difference_type __n = __old_last - __to; 1753*4d6fc14bSjoerg { 1754*4d6fc14bSjoerg pointer __i = __from_s + __n; 1755*4d6fc14bSjoerg _ConstructTransaction __tx(*this, __from_e - __i); 1756*4d6fc14bSjoerg for (pointer __pos = __tx.__pos_; __i < __from_e; 1757*4d6fc14bSjoerg ++__i, ++__pos, __tx.__pos_ = __pos) { 1758*4d6fc14bSjoerg __alloc_traits::construct(this->__alloc(), 1759*4d6fc14bSjoerg _VSTD::__to_address(__pos), 1760*4d6fc14bSjoerg _VSTD::move(*__i)); 1761*4d6fc14bSjoerg } 1762*4d6fc14bSjoerg } 1763*4d6fc14bSjoerg _VSTD::move_backward(__from_s, __from_s + __n, __old_last); 1764*4d6fc14bSjoerg} 1765*4d6fc14bSjoerg 1766*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1767*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::iterator 1768*4d6fc14bSjoergvector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x) 1769*4d6fc14bSjoerg{ 1770*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1771*4d6fc14bSjoerg _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1772*4d6fc14bSjoerg "vector::insert(iterator, x) called with an iterator not" 1773*4d6fc14bSjoerg " referring to this vector"); 1774*4d6fc14bSjoerg#endif 1775*4d6fc14bSjoerg pointer __p = this->__begin_ + (__position - begin()); 1776*4d6fc14bSjoerg if (this->__end_ < this->__end_cap()) 1777*4d6fc14bSjoerg { 1778*4d6fc14bSjoerg if (__p == this->__end_) 1779*4d6fc14bSjoerg { 1780*4d6fc14bSjoerg __construct_one_at_end(__x); 1781*4d6fc14bSjoerg } 1782*4d6fc14bSjoerg else 1783*4d6fc14bSjoerg { 1784*4d6fc14bSjoerg __move_range(__p, this->__end_, __p + 1); 1785*4d6fc14bSjoerg const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x); 1786*4d6fc14bSjoerg if (__p <= __xr && __xr < this->__end_) 1787*4d6fc14bSjoerg ++__xr; 1788*4d6fc14bSjoerg *__p = *__xr; 1789*4d6fc14bSjoerg } 1790*4d6fc14bSjoerg } 1791*4d6fc14bSjoerg else 1792*4d6fc14bSjoerg { 1793*4d6fc14bSjoerg allocator_type& __a = this->__alloc(); 1794*4d6fc14bSjoerg __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); 1795*4d6fc14bSjoerg __v.push_back(__x); 1796*4d6fc14bSjoerg __p = __swap_out_circular_buffer(__v, __p); 1797*4d6fc14bSjoerg } 1798*4d6fc14bSjoerg return __make_iter(__p); 1799*4d6fc14bSjoerg} 1800*4d6fc14bSjoerg 1801*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 1802*4d6fc14bSjoerg 1803*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1804*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::iterator 1805*4d6fc14bSjoergvector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x) 1806*4d6fc14bSjoerg{ 1807*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1808*4d6fc14bSjoerg _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1809*4d6fc14bSjoerg "vector::insert(iterator, x) called with an iterator not" 1810*4d6fc14bSjoerg " referring to this vector"); 1811*4d6fc14bSjoerg#endif 1812*4d6fc14bSjoerg pointer __p = this->__begin_ + (__position - begin()); 1813*4d6fc14bSjoerg if (this->__end_ < this->__end_cap()) 1814*4d6fc14bSjoerg { 1815*4d6fc14bSjoerg if (__p == this->__end_) 1816*4d6fc14bSjoerg { 1817*4d6fc14bSjoerg __construct_one_at_end(_VSTD::move(__x)); 1818*4d6fc14bSjoerg } 1819*4d6fc14bSjoerg else 1820*4d6fc14bSjoerg { 1821*4d6fc14bSjoerg __move_range(__p, this->__end_, __p + 1); 1822*4d6fc14bSjoerg *__p = _VSTD::move(__x); 1823*4d6fc14bSjoerg } 1824*4d6fc14bSjoerg } 1825*4d6fc14bSjoerg else 1826*4d6fc14bSjoerg { 1827*4d6fc14bSjoerg allocator_type& __a = this->__alloc(); 1828*4d6fc14bSjoerg __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); 1829*4d6fc14bSjoerg __v.push_back(_VSTD::move(__x)); 1830*4d6fc14bSjoerg __p = __swap_out_circular_buffer(__v, __p); 1831*4d6fc14bSjoerg } 1832*4d6fc14bSjoerg return __make_iter(__p); 1833*4d6fc14bSjoerg} 1834*4d6fc14bSjoerg 1835*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1836*4d6fc14bSjoergtemplate <class... _Args> 1837*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::iterator 1838*4d6fc14bSjoergvector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args) 1839*4d6fc14bSjoerg{ 1840*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1841*4d6fc14bSjoerg _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1842*4d6fc14bSjoerg "vector::emplace(iterator, x) called with an iterator not" 1843*4d6fc14bSjoerg " referring to this vector"); 1844*4d6fc14bSjoerg#endif 1845*4d6fc14bSjoerg pointer __p = this->__begin_ + (__position - begin()); 1846*4d6fc14bSjoerg if (this->__end_ < this->__end_cap()) 1847*4d6fc14bSjoerg { 1848*4d6fc14bSjoerg if (__p == this->__end_) 1849*4d6fc14bSjoerg { 1850*4d6fc14bSjoerg __construct_one_at_end(_VSTD::forward<_Args>(__args)...); 1851*4d6fc14bSjoerg } 1852*4d6fc14bSjoerg else 1853*4d6fc14bSjoerg { 1854*4d6fc14bSjoerg __temp_value<value_type, _Allocator> __tmp(this->__alloc(), _VSTD::forward<_Args>(__args)...); 1855*4d6fc14bSjoerg __move_range(__p, this->__end_, __p + 1); 1856*4d6fc14bSjoerg *__p = _VSTD::move(__tmp.get()); 1857*4d6fc14bSjoerg } 1858*4d6fc14bSjoerg } 1859*4d6fc14bSjoerg else 1860*4d6fc14bSjoerg { 1861*4d6fc14bSjoerg allocator_type& __a = this->__alloc(); 1862*4d6fc14bSjoerg __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); 1863*4d6fc14bSjoerg __v.emplace_back(_VSTD::forward<_Args>(__args)...); 1864*4d6fc14bSjoerg __p = __swap_out_circular_buffer(__v, __p); 1865*4d6fc14bSjoerg } 1866*4d6fc14bSjoerg return __make_iter(__p); 1867*4d6fc14bSjoerg} 1868*4d6fc14bSjoerg 1869*4d6fc14bSjoerg#endif // !_LIBCPP_CXX03_LANG 1870*4d6fc14bSjoerg 1871*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1872*4d6fc14bSjoergtypename vector<_Tp, _Allocator>::iterator 1873*4d6fc14bSjoergvector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x) 1874*4d6fc14bSjoerg{ 1875*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1876*4d6fc14bSjoerg _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1877*4d6fc14bSjoerg "vector::insert(iterator, n, x) called with an iterator not" 1878*4d6fc14bSjoerg " referring to this vector"); 1879*4d6fc14bSjoerg#endif 1880*4d6fc14bSjoerg pointer __p = this->__begin_ + (__position - begin()); 1881*4d6fc14bSjoerg if (__n > 0) 1882*4d6fc14bSjoerg { 1883*4d6fc14bSjoerg if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_)) 1884*4d6fc14bSjoerg { 1885*4d6fc14bSjoerg size_type __old_n = __n; 1886*4d6fc14bSjoerg pointer __old_last = this->__end_; 1887*4d6fc14bSjoerg if (__n > static_cast<size_type>(this->__end_ - __p)) 1888*4d6fc14bSjoerg { 1889*4d6fc14bSjoerg size_type __cx = __n - (this->__end_ - __p); 1890*4d6fc14bSjoerg __construct_at_end(__cx, __x); 1891*4d6fc14bSjoerg __n -= __cx; 1892*4d6fc14bSjoerg } 1893*4d6fc14bSjoerg if (__n > 0) 1894*4d6fc14bSjoerg { 1895*4d6fc14bSjoerg __move_range(__p, __old_last, __p + __old_n); 1896*4d6fc14bSjoerg const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x); 1897*4d6fc14bSjoerg if (__p <= __xr && __xr < this->__end_) 1898*4d6fc14bSjoerg __xr += __old_n; 1899*4d6fc14bSjoerg _VSTD::fill_n(__p, __n, *__xr); 1900*4d6fc14bSjoerg } 1901*4d6fc14bSjoerg } 1902*4d6fc14bSjoerg else 1903*4d6fc14bSjoerg { 1904*4d6fc14bSjoerg allocator_type& __a = this->__alloc(); 1905*4d6fc14bSjoerg __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a); 1906*4d6fc14bSjoerg __v.__construct_at_end(__n, __x); 1907*4d6fc14bSjoerg __p = __swap_out_circular_buffer(__v, __p); 1908*4d6fc14bSjoerg } 1909*4d6fc14bSjoerg } 1910*4d6fc14bSjoerg return __make_iter(__p); 1911*4d6fc14bSjoerg} 1912*4d6fc14bSjoerg 1913*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1914*4d6fc14bSjoergtemplate <class _InputIterator> 1915*4d6fc14bSjoergtypename enable_if 1916*4d6fc14bSjoerg< 1917*4d6fc14bSjoerg __is_cpp17_input_iterator <_InputIterator>::value && 1918*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value && 1919*4d6fc14bSjoerg is_constructible< 1920*4d6fc14bSjoerg _Tp, 1921*4d6fc14bSjoerg typename iterator_traits<_InputIterator>::reference>::value, 1922*4d6fc14bSjoerg typename vector<_Tp, _Allocator>::iterator 1923*4d6fc14bSjoerg>::type 1924*4d6fc14bSjoergvector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last) 1925*4d6fc14bSjoerg{ 1926*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1927*4d6fc14bSjoerg _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1928*4d6fc14bSjoerg "vector::insert(iterator, range) called with an iterator not" 1929*4d6fc14bSjoerg " referring to this vector"); 1930*4d6fc14bSjoerg#endif 1931*4d6fc14bSjoerg difference_type __off = __position - begin(); 1932*4d6fc14bSjoerg pointer __p = this->__begin_ + __off; 1933*4d6fc14bSjoerg allocator_type& __a = this->__alloc(); 1934*4d6fc14bSjoerg pointer __old_last = this->__end_; 1935*4d6fc14bSjoerg for (; this->__end_ != this->__end_cap() && __first != __last; ++__first) 1936*4d6fc14bSjoerg { 1937*4d6fc14bSjoerg __construct_one_at_end(*__first); 1938*4d6fc14bSjoerg } 1939*4d6fc14bSjoerg __split_buffer<value_type, allocator_type&> __v(__a); 1940*4d6fc14bSjoerg if (__first != __last) 1941*4d6fc14bSjoerg { 1942*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 1943*4d6fc14bSjoerg try 1944*4d6fc14bSjoerg { 1945*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 1946*4d6fc14bSjoerg __v.__construct_at_end(__first, __last); 1947*4d6fc14bSjoerg difference_type __old_size = __old_last - this->__begin_; 1948*4d6fc14bSjoerg difference_type __old_p = __p - this->__begin_; 1949*4d6fc14bSjoerg reserve(__recommend(size() + __v.size())); 1950*4d6fc14bSjoerg __p = this->__begin_ + __old_p; 1951*4d6fc14bSjoerg __old_last = this->__begin_ + __old_size; 1952*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 1953*4d6fc14bSjoerg } 1954*4d6fc14bSjoerg catch (...) 1955*4d6fc14bSjoerg { 1956*4d6fc14bSjoerg erase(__make_iter(__old_last), end()); 1957*4d6fc14bSjoerg throw; 1958*4d6fc14bSjoerg } 1959*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 1960*4d6fc14bSjoerg } 1961*4d6fc14bSjoerg __p = _VSTD::rotate(__p, __old_last, this->__end_); 1962*4d6fc14bSjoerg insert(__make_iter(__p), _VSTD::make_move_iterator(__v.begin()), 1963*4d6fc14bSjoerg _VSTD::make_move_iterator(__v.end())); 1964*4d6fc14bSjoerg return begin() + __off; 1965*4d6fc14bSjoerg} 1966*4d6fc14bSjoerg 1967*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 1968*4d6fc14bSjoergtemplate <class _ForwardIterator> 1969*4d6fc14bSjoergtypename enable_if 1970*4d6fc14bSjoerg< 1971*4d6fc14bSjoerg __is_cpp17_forward_iterator<_ForwardIterator>::value && 1972*4d6fc14bSjoerg is_constructible< 1973*4d6fc14bSjoerg _Tp, 1974*4d6fc14bSjoerg typename iterator_traits<_ForwardIterator>::reference>::value, 1975*4d6fc14bSjoerg typename vector<_Tp, _Allocator>::iterator 1976*4d6fc14bSjoerg>::type 1977*4d6fc14bSjoergvector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last) 1978*4d6fc14bSjoerg{ 1979*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 1980*4d6fc14bSjoerg _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1981*4d6fc14bSjoerg "vector::insert(iterator, range) called with an iterator not" 1982*4d6fc14bSjoerg " referring to this vector"); 1983*4d6fc14bSjoerg#endif 1984*4d6fc14bSjoerg pointer __p = this->__begin_ + (__position - begin()); 1985*4d6fc14bSjoerg difference_type __n = _VSTD::distance(__first, __last); 1986*4d6fc14bSjoerg if (__n > 0) 1987*4d6fc14bSjoerg { 1988*4d6fc14bSjoerg if (__n <= this->__end_cap() - this->__end_) 1989*4d6fc14bSjoerg { 1990*4d6fc14bSjoerg size_type __old_n = __n; 1991*4d6fc14bSjoerg pointer __old_last = this->__end_; 1992*4d6fc14bSjoerg _ForwardIterator __m = __last; 1993*4d6fc14bSjoerg difference_type __dx = this->__end_ - __p; 1994*4d6fc14bSjoerg if (__n > __dx) 1995*4d6fc14bSjoerg { 1996*4d6fc14bSjoerg __m = __first; 1997*4d6fc14bSjoerg difference_type __diff = this->__end_ - __p; 1998*4d6fc14bSjoerg _VSTD::advance(__m, __diff); 1999*4d6fc14bSjoerg __construct_at_end(__m, __last, __n - __diff); 2000*4d6fc14bSjoerg __n = __dx; 2001*4d6fc14bSjoerg } 2002*4d6fc14bSjoerg if (__n > 0) 2003*4d6fc14bSjoerg { 2004*4d6fc14bSjoerg __move_range(__p, __old_last, __p + __old_n); 2005*4d6fc14bSjoerg _VSTD::copy(__first, __m, __p); 2006*4d6fc14bSjoerg } 2007*4d6fc14bSjoerg } 2008*4d6fc14bSjoerg else 2009*4d6fc14bSjoerg { 2010*4d6fc14bSjoerg allocator_type& __a = this->__alloc(); 2011*4d6fc14bSjoerg __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a); 2012*4d6fc14bSjoerg __v.__construct_at_end(__first, __last); 2013*4d6fc14bSjoerg __p = __swap_out_circular_buffer(__v, __p); 2014*4d6fc14bSjoerg } 2015*4d6fc14bSjoerg } 2016*4d6fc14bSjoerg return __make_iter(__p); 2017*4d6fc14bSjoerg} 2018*4d6fc14bSjoerg 2019*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 2020*4d6fc14bSjoergvoid 2021*4d6fc14bSjoergvector<_Tp, _Allocator>::resize(size_type __sz) 2022*4d6fc14bSjoerg{ 2023*4d6fc14bSjoerg size_type __cs = size(); 2024*4d6fc14bSjoerg if (__cs < __sz) 2025*4d6fc14bSjoerg this->__append(__sz - __cs); 2026*4d6fc14bSjoerg else if (__cs > __sz) 2027*4d6fc14bSjoerg this->__destruct_at_end(this->__begin_ + __sz); 2028*4d6fc14bSjoerg} 2029*4d6fc14bSjoerg 2030*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 2031*4d6fc14bSjoergvoid 2032*4d6fc14bSjoergvector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x) 2033*4d6fc14bSjoerg{ 2034*4d6fc14bSjoerg size_type __cs = size(); 2035*4d6fc14bSjoerg if (__cs < __sz) 2036*4d6fc14bSjoerg this->__append(__sz - __cs, __x); 2037*4d6fc14bSjoerg else if (__cs > __sz) 2038*4d6fc14bSjoerg this->__destruct_at_end(this->__begin_ + __sz); 2039*4d6fc14bSjoerg} 2040*4d6fc14bSjoerg 2041*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 2042*4d6fc14bSjoergvoid 2043*4d6fc14bSjoergvector<_Tp, _Allocator>::swap(vector& __x) 2044*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 14 2045*4d6fc14bSjoerg _NOEXCEPT 2046*4d6fc14bSjoerg#else 2047*4d6fc14bSjoerg _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 2048*4d6fc14bSjoerg __is_nothrow_swappable<allocator_type>::value) 2049*4d6fc14bSjoerg#endif 2050*4d6fc14bSjoerg{ 2051*4d6fc14bSjoerg _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value || 2052*4d6fc14bSjoerg this->__alloc() == __x.__alloc(), 2053*4d6fc14bSjoerg "vector::swap: Either propagate_on_container_swap must be true" 2054*4d6fc14bSjoerg " or the allocators must compare equal"); 2055*4d6fc14bSjoerg _VSTD::swap(this->__begin_, __x.__begin_); 2056*4d6fc14bSjoerg _VSTD::swap(this->__end_, __x.__end_); 2057*4d6fc14bSjoerg _VSTD::swap(this->__end_cap(), __x.__end_cap()); 2058*4d6fc14bSjoerg _VSTD::__swap_allocator(this->__alloc(), __x.__alloc(), 2059*4d6fc14bSjoerg integral_constant<bool,__alloc_traits::propagate_on_container_swap::value>()); 2060*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 2061*4d6fc14bSjoerg __get_db()->swap(this, &__x); 2062*4d6fc14bSjoerg#endif 2063*4d6fc14bSjoerg} 2064*4d6fc14bSjoerg 2065*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 2066*4d6fc14bSjoergbool 2067*4d6fc14bSjoergvector<_Tp, _Allocator>::__invariants() const 2068*4d6fc14bSjoerg{ 2069*4d6fc14bSjoerg if (this->__begin_ == nullptr) 2070*4d6fc14bSjoerg { 2071*4d6fc14bSjoerg if (this->__end_ != nullptr || this->__end_cap() != nullptr) 2072*4d6fc14bSjoerg return false; 2073*4d6fc14bSjoerg } 2074*4d6fc14bSjoerg else 2075*4d6fc14bSjoerg { 2076*4d6fc14bSjoerg if (this->__begin_ > this->__end_) 2077*4d6fc14bSjoerg return false; 2078*4d6fc14bSjoerg if (this->__begin_ == this->__end_cap()) 2079*4d6fc14bSjoerg return false; 2080*4d6fc14bSjoerg if (this->__end_ > this->__end_cap()) 2081*4d6fc14bSjoerg return false; 2082*4d6fc14bSjoerg } 2083*4d6fc14bSjoerg return true; 2084*4d6fc14bSjoerg} 2085*4d6fc14bSjoerg 2086*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 2087*4d6fc14bSjoerg 2088*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 2089*4d6fc14bSjoergbool 2090*4d6fc14bSjoergvector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const 2091*4d6fc14bSjoerg{ 2092*4d6fc14bSjoerg return this->__begin_ <= __i->base() && __i->base() < this->__end_; 2093*4d6fc14bSjoerg} 2094*4d6fc14bSjoerg 2095*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 2096*4d6fc14bSjoergbool 2097*4d6fc14bSjoergvector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const 2098*4d6fc14bSjoerg{ 2099*4d6fc14bSjoerg return this->__begin_ < __i->base() && __i->base() <= this->__end_; 2100*4d6fc14bSjoerg} 2101*4d6fc14bSjoerg 2102*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 2103*4d6fc14bSjoergbool 2104*4d6fc14bSjoergvector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const 2105*4d6fc14bSjoerg{ 2106*4d6fc14bSjoerg const_pointer __p = __i->base() + __n; 2107*4d6fc14bSjoerg return this->__begin_ <= __p && __p <= this->__end_; 2108*4d6fc14bSjoerg} 2109*4d6fc14bSjoerg 2110*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 2111*4d6fc14bSjoergbool 2112*4d6fc14bSjoergvector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const 2113*4d6fc14bSjoerg{ 2114*4d6fc14bSjoerg const_pointer __p = __i->base() + __n; 2115*4d6fc14bSjoerg return this->__begin_ <= __p && __p < this->__end_; 2116*4d6fc14bSjoerg} 2117*4d6fc14bSjoerg 2118*4d6fc14bSjoerg#endif // _LIBCPP_DEBUG_LEVEL == 2 2119*4d6fc14bSjoerg 2120*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 2121*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 2122*4d6fc14bSjoergvoid 2123*4d6fc14bSjoergvector<_Tp, _Allocator>::__invalidate_all_iterators() 2124*4d6fc14bSjoerg{ 2125*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 2126*4d6fc14bSjoerg __get_db()->__invalidate_all(this); 2127*4d6fc14bSjoerg#endif 2128*4d6fc14bSjoerg} 2129*4d6fc14bSjoerg 2130*4d6fc14bSjoerg 2131*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 2132*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 2133*4d6fc14bSjoergvoid 2134*4d6fc14bSjoergvector<_Tp, _Allocator>::__invalidate_iterators_past(pointer __new_last) { 2135*4d6fc14bSjoerg#if _LIBCPP_DEBUG_LEVEL == 2 2136*4d6fc14bSjoerg __c_node* __c = __get_db()->__find_c_and_lock(this); 2137*4d6fc14bSjoerg for (__i_node** __p = __c->end_; __p != __c->beg_; ) { 2138*4d6fc14bSjoerg --__p; 2139*4d6fc14bSjoerg const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_); 2140*4d6fc14bSjoerg if (__i->base() > __new_last) { 2141*4d6fc14bSjoerg (*__p)->__c_ = nullptr; 2142*4d6fc14bSjoerg if (--__c->end_ != __p) 2143*4d6fc14bSjoerg _VSTD::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*)); 2144*4d6fc14bSjoerg } 2145*4d6fc14bSjoerg } 2146*4d6fc14bSjoerg __get_db()->unlock(); 2147*4d6fc14bSjoerg#else 2148*4d6fc14bSjoerg ((void)__new_last); 2149*4d6fc14bSjoerg#endif 2150*4d6fc14bSjoerg} 2151*4d6fc14bSjoerg 2152*4d6fc14bSjoerg// vector<bool> 2153*4d6fc14bSjoerg 2154*4d6fc14bSjoergtemplate <class _Allocator> class vector<bool, _Allocator>; 2155*4d6fc14bSjoerg 2156*4d6fc14bSjoergtemplate <class _Allocator> struct hash<vector<bool, _Allocator> >; 2157*4d6fc14bSjoerg 2158*4d6fc14bSjoergtemplate <class _Allocator> 2159*4d6fc14bSjoergstruct __has_storage_type<vector<bool, _Allocator> > 2160*4d6fc14bSjoerg{ 2161*4d6fc14bSjoerg static const bool value = true; 2162*4d6fc14bSjoerg}; 2163*4d6fc14bSjoerg 2164*4d6fc14bSjoergtemplate <class _Allocator> 2165*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS vector<bool, _Allocator> 2166*4d6fc14bSjoerg : private __vector_base_common<true> 2167*4d6fc14bSjoerg{ 2168*4d6fc14bSjoergpublic: 2169*4d6fc14bSjoerg typedef vector __self; 2170*4d6fc14bSjoerg typedef bool value_type; 2171*4d6fc14bSjoerg typedef _Allocator allocator_type; 2172*4d6fc14bSjoerg typedef allocator_traits<allocator_type> __alloc_traits; 2173*4d6fc14bSjoerg typedef typename __alloc_traits::size_type size_type; 2174*4d6fc14bSjoerg typedef typename __alloc_traits::difference_type difference_type; 2175*4d6fc14bSjoerg typedef size_type __storage_type; 2176*4d6fc14bSjoerg typedef __bit_iterator<vector, false> pointer; 2177*4d6fc14bSjoerg typedef __bit_iterator<vector, true> const_pointer; 2178*4d6fc14bSjoerg typedef pointer iterator; 2179*4d6fc14bSjoerg typedef const_pointer const_iterator; 2180*4d6fc14bSjoerg typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 2181*4d6fc14bSjoerg typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 2182*4d6fc14bSjoerg 2183*4d6fc14bSjoergprivate: 2184*4d6fc14bSjoerg typedef typename __rebind_alloc_helper<__alloc_traits, __storage_type>::type __storage_allocator; 2185*4d6fc14bSjoerg typedef allocator_traits<__storage_allocator> __storage_traits; 2186*4d6fc14bSjoerg typedef typename __storage_traits::pointer __storage_pointer; 2187*4d6fc14bSjoerg typedef typename __storage_traits::const_pointer __const_storage_pointer; 2188*4d6fc14bSjoerg 2189*4d6fc14bSjoerg __storage_pointer __begin_; 2190*4d6fc14bSjoerg size_type __size_; 2191*4d6fc14bSjoerg __compressed_pair<size_type, __storage_allocator> __cap_alloc_; 2192*4d6fc14bSjoergpublic: 2193*4d6fc14bSjoerg typedef __bit_reference<vector> reference; 2194*4d6fc14bSjoerg typedef __bit_const_reference<vector> const_reference; 2195*4d6fc14bSjoergprivate: 2196*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2197*4d6fc14bSjoerg size_type& __cap() _NOEXCEPT 2198*4d6fc14bSjoerg {return __cap_alloc_.first();} 2199*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2200*4d6fc14bSjoerg const size_type& __cap() const _NOEXCEPT 2201*4d6fc14bSjoerg {return __cap_alloc_.first();} 2202*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2203*4d6fc14bSjoerg __storage_allocator& __alloc() _NOEXCEPT 2204*4d6fc14bSjoerg {return __cap_alloc_.second();} 2205*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2206*4d6fc14bSjoerg const __storage_allocator& __alloc() const _NOEXCEPT 2207*4d6fc14bSjoerg {return __cap_alloc_.second();} 2208*4d6fc14bSjoerg 2209*4d6fc14bSjoerg static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT); 2210*4d6fc14bSjoerg 2211*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2212*4d6fc14bSjoerg static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT 2213*4d6fc14bSjoerg {return __n * __bits_per_word;} 2214*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2215*4d6fc14bSjoerg static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT 2216*4d6fc14bSjoerg {return (__n - 1) / __bits_per_word + 1;} 2217*4d6fc14bSjoerg 2218*4d6fc14bSjoergpublic: 2219*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2220*4d6fc14bSjoerg vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); 2221*4d6fc14bSjoerg 2222*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a) 2223*4d6fc14bSjoerg#if _LIBCPP_STD_VER <= 14 2224*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value); 2225*4d6fc14bSjoerg#else 2226*4d6fc14bSjoerg _NOEXCEPT; 2227*4d6fc14bSjoerg#endif 2228*4d6fc14bSjoerg ~vector(); 2229*4d6fc14bSjoerg explicit vector(size_type __n); 2230*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 11 2231*4d6fc14bSjoerg explicit vector(size_type __n, const allocator_type& __a); 2232*4d6fc14bSjoerg#endif 2233*4d6fc14bSjoerg vector(size_type __n, const value_type& __v); 2234*4d6fc14bSjoerg vector(size_type __n, const value_type& __v, const allocator_type& __a); 2235*4d6fc14bSjoerg template <class _InputIterator> 2236*4d6fc14bSjoerg vector(_InputIterator __first, _InputIterator __last, 2237*4d6fc14bSjoerg typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value && 2238*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value>::type* = 0); 2239*4d6fc14bSjoerg template <class _InputIterator> 2240*4d6fc14bSjoerg vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, 2241*4d6fc14bSjoerg typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value && 2242*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value>::type* = 0); 2243*4d6fc14bSjoerg template <class _ForwardIterator> 2244*4d6fc14bSjoerg vector(_ForwardIterator __first, _ForwardIterator __last, 2245*4d6fc14bSjoerg typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value>::type* = 0); 2246*4d6fc14bSjoerg template <class _ForwardIterator> 2247*4d6fc14bSjoerg vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, 2248*4d6fc14bSjoerg typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value>::type* = 0); 2249*4d6fc14bSjoerg 2250*4d6fc14bSjoerg vector(const vector& __v); 2251*4d6fc14bSjoerg vector(const vector& __v, const allocator_type& __a); 2252*4d6fc14bSjoerg vector& operator=(const vector& __v); 2253*4d6fc14bSjoerg 2254*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 2255*4d6fc14bSjoerg vector(initializer_list<value_type> __il); 2256*4d6fc14bSjoerg vector(initializer_list<value_type> __il, const allocator_type& __a); 2257*4d6fc14bSjoerg 2258*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2259*4d6fc14bSjoerg vector(vector&& __v) 2260*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 2261*4d6fc14bSjoerg _NOEXCEPT; 2262*4d6fc14bSjoerg#else 2263*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); 2264*4d6fc14bSjoerg#endif 2265*4d6fc14bSjoerg vector(vector&& __v, const allocator_type& __a); 2266*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2267*4d6fc14bSjoerg vector& operator=(vector&& __v) 2268*4d6fc14bSjoerg _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)); 2269*4d6fc14bSjoerg 2270*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2271*4d6fc14bSjoerg vector& operator=(initializer_list<value_type> __il) 2272*4d6fc14bSjoerg {assign(__il.begin(), __il.end()); return *this;} 2273*4d6fc14bSjoerg 2274*4d6fc14bSjoerg#endif // !_LIBCPP_CXX03_LANG 2275*4d6fc14bSjoerg 2276*4d6fc14bSjoerg template <class _InputIterator> 2277*4d6fc14bSjoerg typename enable_if 2278*4d6fc14bSjoerg < 2279*4d6fc14bSjoerg __is_cpp17_input_iterator<_InputIterator>::value && 2280*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value, 2281*4d6fc14bSjoerg void 2282*4d6fc14bSjoerg >::type 2283*4d6fc14bSjoerg assign(_InputIterator __first, _InputIterator __last); 2284*4d6fc14bSjoerg template <class _ForwardIterator> 2285*4d6fc14bSjoerg typename enable_if 2286*4d6fc14bSjoerg < 2287*4d6fc14bSjoerg __is_cpp17_forward_iterator<_ForwardIterator>::value, 2288*4d6fc14bSjoerg void 2289*4d6fc14bSjoerg >::type 2290*4d6fc14bSjoerg assign(_ForwardIterator __first, _ForwardIterator __last); 2291*4d6fc14bSjoerg 2292*4d6fc14bSjoerg void assign(size_type __n, const value_type& __x); 2293*4d6fc14bSjoerg 2294*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 2295*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2296*4d6fc14bSjoerg void assign(initializer_list<value_type> __il) 2297*4d6fc14bSjoerg {assign(__il.begin(), __il.end());} 2298*4d6fc14bSjoerg#endif 2299*4d6fc14bSjoerg 2300*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT 2301*4d6fc14bSjoerg {return allocator_type(this->__alloc());} 2302*4d6fc14bSjoerg 2303*4d6fc14bSjoerg size_type max_size() const _NOEXCEPT; 2304*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2305*4d6fc14bSjoerg size_type capacity() const _NOEXCEPT 2306*4d6fc14bSjoerg {return __internal_cap_to_external(__cap());} 2307*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2308*4d6fc14bSjoerg size_type size() const _NOEXCEPT 2309*4d6fc14bSjoerg {return __size_;} 2310*4d6fc14bSjoerg _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 2311*4d6fc14bSjoerg bool empty() const _NOEXCEPT 2312*4d6fc14bSjoerg {return __size_ == 0;} 2313*4d6fc14bSjoerg void reserve(size_type __n); 2314*4d6fc14bSjoerg void shrink_to_fit() _NOEXCEPT; 2315*4d6fc14bSjoerg 2316*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2317*4d6fc14bSjoerg iterator begin() _NOEXCEPT 2318*4d6fc14bSjoerg {return __make_iter(0);} 2319*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2320*4d6fc14bSjoerg const_iterator begin() const _NOEXCEPT 2321*4d6fc14bSjoerg {return __make_iter(0);} 2322*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2323*4d6fc14bSjoerg iterator end() _NOEXCEPT 2324*4d6fc14bSjoerg {return __make_iter(__size_);} 2325*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2326*4d6fc14bSjoerg const_iterator end() const _NOEXCEPT 2327*4d6fc14bSjoerg {return __make_iter(__size_);} 2328*4d6fc14bSjoerg 2329*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2330*4d6fc14bSjoerg reverse_iterator rbegin() _NOEXCEPT 2331*4d6fc14bSjoerg {return reverse_iterator(end());} 2332*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2333*4d6fc14bSjoerg const_reverse_iterator rbegin() const _NOEXCEPT 2334*4d6fc14bSjoerg {return const_reverse_iterator(end());} 2335*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2336*4d6fc14bSjoerg reverse_iterator rend() _NOEXCEPT 2337*4d6fc14bSjoerg {return reverse_iterator(begin());} 2338*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2339*4d6fc14bSjoerg const_reverse_iterator rend() const _NOEXCEPT 2340*4d6fc14bSjoerg {return const_reverse_iterator(begin());} 2341*4d6fc14bSjoerg 2342*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2343*4d6fc14bSjoerg const_iterator cbegin() const _NOEXCEPT 2344*4d6fc14bSjoerg {return __make_iter(0);} 2345*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2346*4d6fc14bSjoerg const_iterator cend() const _NOEXCEPT 2347*4d6fc14bSjoerg {return __make_iter(__size_);} 2348*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2349*4d6fc14bSjoerg const_reverse_iterator crbegin() const _NOEXCEPT 2350*4d6fc14bSjoerg {return rbegin();} 2351*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2352*4d6fc14bSjoerg const_reverse_iterator crend() const _NOEXCEPT 2353*4d6fc14bSjoerg {return rend();} 2354*4d6fc14bSjoerg 2355*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __make_ref(__n);} 2356*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);} 2357*4d6fc14bSjoerg reference at(size_type __n); 2358*4d6fc14bSjoerg const_reference at(size_type __n) const; 2359*4d6fc14bSjoerg 2360*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY reference front() {return __make_ref(0);} 2361*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);} 2362*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY reference back() {return __make_ref(__size_ - 1);} 2363*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __make_ref(__size_ - 1);} 2364*4d6fc14bSjoerg 2365*4d6fc14bSjoerg void push_back(const value_type& __x); 2366*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 11 2367*4d6fc14bSjoerg template <class... _Args> 2368*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 2369*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY reference emplace_back(_Args&&... __args) 2370*4d6fc14bSjoerg#else 2371*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void emplace_back(_Args&&... __args) 2372*4d6fc14bSjoerg#endif 2373*4d6fc14bSjoerg { 2374*4d6fc14bSjoerg push_back ( value_type ( _VSTD::forward<_Args>(__args)... )); 2375*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 2376*4d6fc14bSjoerg return this->back(); 2377*4d6fc14bSjoerg#endif 2378*4d6fc14bSjoerg } 2379*4d6fc14bSjoerg#endif 2380*4d6fc14bSjoerg 2381*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;} 2382*4d6fc14bSjoerg 2383*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 11 2384*4d6fc14bSjoerg template <class... _Args> 2385*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY iterator emplace(const_iterator position, _Args&&... __args) 2386*4d6fc14bSjoerg { return insert ( position, value_type ( _VSTD::forward<_Args>(__args)... )); } 2387*4d6fc14bSjoerg#endif 2388*4d6fc14bSjoerg 2389*4d6fc14bSjoerg iterator insert(const_iterator __position, const value_type& __x); 2390*4d6fc14bSjoerg iterator insert(const_iterator __position, size_type __n, const value_type& __x); 2391*4d6fc14bSjoerg iterator insert(const_iterator __position, size_type __n, const_reference __x); 2392*4d6fc14bSjoerg template <class _InputIterator> 2393*4d6fc14bSjoerg typename enable_if 2394*4d6fc14bSjoerg < 2395*4d6fc14bSjoerg __is_cpp17_input_iterator <_InputIterator>::value && 2396*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value, 2397*4d6fc14bSjoerg iterator 2398*4d6fc14bSjoerg >::type 2399*4d6fc14bSjoerg insert(const_iterator __position, _InputIterator __first, _InputIterator __last); 2400*4d6fc14bSjoerg template <class _ForwardIterator> 2401*4d6fc14bSjoerg typename enable_if 2402*4d6fc14bSjoerg < 2403*4d6fc14bSjoerg __is_cpp17_forward_iterator<_ForwardIterator>::value, 2404*4d6fc14bSjoerg iterator 2405*4d6fc14bSjoerg >::type 2406*4d6fc14bSjoerg insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last); 2407*4d6fc14bSjoerg 2408*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 2409*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2410*4d6fc14bSjoerg iterator insert(const_iterator __position, initializer_list<value_type> __il) 2411*4d6fc14bSjoerg {return insert(__position, __il.begin(), __il.end());} 2412*4d6fc14bSjoerg#endif 2413*4d6fc14bSjoerg 2414*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position); 2415*4d6fc14bSjoerg iterator erase(const_iterator __first, const_iterator __last); 2416*4d6fc14bSjoerg 2417*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2418*4d6fc14bSjoerg void clear() _NOEXCEPT {__size_ = 0;} 2419*4d6fc14bSjoerg 2420*4d6fc14bSjoerg void swap(vector&) 2421*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 14 2422*4d6fc14bSjoerg _NOEXCEPT; 2423*4d6fc14bSjoerg#else 2424*4d6fc14bSjoerg _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 2425*4d6fc14bSjoerg __is_nothrow_swappable<allocator_type>::value); 2426*4d6fc14bSjoerg#endif 2427*4d6fc14bSjoerg static void swap(reference __x, reference __y) _NOEXCEPT { _VSTD::swap(__x, __y); } 2428*4d6fc14bSjoerg 2429*4d6fc14bSjoerg void resize(size_type __sz, value_type __x = false); 2430*4d6fc14bSjoerg void flip() _NOEXCEPT; 2431*4d6fc14bSjoerg 2432*4d6fc14bSjoerg bool __invariants() const; 2433*4d6fc14bSjoerg 2434*4d6fc14bSjoergprivate: 2435*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators(); 2436*4d6fc14bSjoerg void __vallocate(size_type __n); 2437*4d6fc14bSjoerg void __vdeallocate() _NOEXCEPT; 2438*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2439*4d6fc14bSjoerg static size_type __align_it(size_type __new_size) _NOEXCEPT 2440*4d6fc14bSjoerg {return __new_size + (__bits_per_word-1) & ~((size_type)__bits_per_word-1);} 2441*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const; 2442*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x); 2443*4d6fc14bSjoerg template <class _ForwardIterator> 2444*4d6fc14bSjoerg typename enable_if 2445*4d6fc14bSjoerg < 2446*4d6fc14bSjoerg __is_cpp17_forward_iterator<_ForwardIterator>::value, 2447*4d6fc14bSjoerg void 2448*4d6fc14bSjoerg >::type 2449*4d6fc14bSjoerg __construct_at_end(_ForwardIterator __first, _ForwardIterator __last); 2450*4d6fc14bSjoerg void __append(size_type __n, const_reference __x); 2451*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2452*4d6fc14bSjoerg reference __make_ref(size_type __pos) _NOEXCEPT 2453*4d6fc14bSjoerg {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);} 2454*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2455*4d6fc14bSjoerg const_reference __make_ref(size_type __pos) const _NOEXCEPT 2456*4d6fc14bSjoerg {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);} 2457*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2458*4d6fc14bSjoerg iterator __make_iter(size_type __pos) _NOEXCEPT 2459*4d6fc14bSjoerg {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));} 2460*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2461*4d6fc14bSjoerg const_iterator __make_iter(size_type __pos) const _NOEXCEPT 2462*4d6fc14bSjoerg {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));} 2463*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2464*4d6fc14bSjoerg iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT 2465*4d6fc14bSjoerg {return begin() + (__p - cbegin());} 2466*4d6fc14bSjoerg 2467*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2468*4d6fc14bSjoerg void __copy_assign_alloc(const vector& __v) 2469*4d6fc14bSjoerg {__copy_assign_alloc(__v, integral_constant<bool, 2470*4d6fc14bSjoerg __storage_traits::propagate_on_container_copy_assignment::value>());} 2471*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2472*4d6fc14bSjoerg void __copy_assign_alloc(const vector& __c, true_type) 2473*4d6fc14bSjoerg { 2474*4d6fc14bSjoerg if (__alloc() != __c.__alloc()) 2475*4d6fc14bSjoerg __vdeallocate(); 2476*4d6fc14bSjoerg __alloc() = __c.__alloc(); 2477*4d6fc14bSjoerg } 2478*4d6fc14bSjoerg 2479*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2480*4d6fc14bSjoerg void __copy_assign_alloc(const vector&, false_type) 2481*4d6fc14bSjoerg {} 2482*4d6fc14bSjoerg 2483*4d6fc14bSjoerg void __move_assign(vector& __c, false_type); 2484*4d6fc14bSjoerg void __move_assign(vector& __c, true_type) 2485*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); 2486*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2487*4d6fc14bSjoerg void __move_assign_alloc(vector& __c) 2488*4d6fc14bSjoerg _NOEXCEPT_( 2489*4d6fc14bSjoerg !__storage_traits::propagate_on_container_move_assignment::value || 2490*4d6fc14bSjoerg is_nothrow_move_assignable<allocator_type>::value) 2491*4d6fc14bSjoerg {__move_assign_alloc(__c, integral_constant<bool, 2492*4d6fc14bSjoerg __storage_traits::propagate_on_container_move_assignment::value>());} 2493*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2494*4d6fc14bSjoerg void __move_assign_alloc(vector& __c, true_type) 2495*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 2496*4d6fc14bSjoerg { 2497*4d6fc14bSjoerg __alloc() = _VSTD::move(__c.__alloc()); 2498*4d6fc14bSjoerg } 2499*4d6fc14bSjoerg 2500*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2501*4d6fc14bSjoerg void __move_assign_alloc(vector&, false_type) 2502*4d6fc14bSjoerg _NOEXCEPT 2503*4d6fc14bSjoerg {} 2504*4d6fc14bSjoerg 2505*4d6fc14bSjoerg size_t __hash_code() const _NOEXCEPT; 2506*4d6fc14bSjoerg 2507*4d6fc14bSjoerg friend class __bit_reference<vector>; 2508*4d6fc14bSjoerg friend class __bit_const_reference<vector>; 2509*4d6fc14bSjoerg friend class __bit_iterator<vector, false>; 2510*4d6fc14bSjoerg friend class __bit_iterator<vector, true>; 2511*4d6fc14bSjoerg friend struct __bit_array<vector>; 2512*4d6fc14bSjoerg friend struct _LIBCPP_TEMPLATE_VIS hash<vector>; 2513*4d6fc14bSjoerg}; 2514*4d6fc14bSjoerg 2515*4d6fc14bSjoergtemplate <class _Allocator> 2516*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 2517*4d6fc14bSjoergvoid 2518*4d6fc14bSjoergvector<bool, _Allocator>::__invalidate_all_iterators() 2519*4d6fc14bSjoerg{ 2520*4d6fc14bSjoerg} 2521*4d6fc14bSjoerg 2522*4d6fc14bSjoerg// Allocate space for __n objects 2523*4d6fc14bSjoerg// throws length_error if __n > max_size() 2524*4d6fc14bSjoerg// throws (probably bad_alloc) if memory run out 2525*4d6fc14bSjoerg// Precondition: __begin_ == __end_ == __cap() == 0 2526*4d6fc14bSjoerg// Precondition: __n > 0 2527*4d6fc14bSjoerg// Postcondition: capacity() == __n 2528*4d6fc14bSjoerg// Postcondition: size() == 0 2529*4d6fc14bSjoergtemplate <class _Allocator> 2530*4d6fc14bSjoergvoid 2531*4d6fc14bSjoergvector<bool, _Allocator>::__vallocate(size_type __n) 2532*4d6fc14bSjoerg{ 2533*4d6fc14bSjoerg if (__n > max_size()) 2534*4d6fc14bSjoerg this->__throw_length_error(); 2535*4d6fc14bSjoerg __n = __external_cap_to_internal(__n); 2536*4d6fc14bSjoerg this->__begin_ = __storage_traits::allocate(this->__alloc(), __n); 2537*4d6fc14bSjoerg this->__size_ = 0; 2538*4d6fc14bSjoerg this->__cap() = __n; 2539*4d6fc14bSjoerg} 2540*4d6fc14bSjoerg 2541*4d6fc14bSjoergtemplate <class _Allocator> 2542*4d6fc14bSjoergvoid 2543*4d6fc14bSjoergvector<bool, _Allocator>::__vdeallocate() _NOEXCEPT 2544*4d6fc14bSjoerg{ 2545*4d6fc14bSjoerg if (this->__begin_ != nullptr) 2546*4d6fc14bSjoerg { 2547*4d6fc14bSjoerg __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap()); 2548*4d6fc14bSjoerg __invalidate_all_iterators(); 2549*4d6fc14bSjoerg this->__begin_ = nullptr; 2550*4d6fc14bSjoerg this->__size_ = this->__cap() = 0; 2551*4d6fc14bSjoerg } 2552*4d6fc14bSjoerg} 2553*4d6fc14bSjoerg 2554*4d6fc14bSjoergtemplate <class _Allocator> 2555*4d6fc14bSjoergtypename vector<bool, _Allocator>::size_type 2556*4d6fc14bSjoergvector<bool, _Allocator>::max_size() const _NOEXCEPT 2557*4d6fc14bSjoerg{ 2558*4d6fc14bSjoerg size_type __amax = __storage_traits::max_size(__alloc()); 2559*4d6fc14bSjoerg size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always 2560*4d6fc14bSjoerg if (__nmax / __bits_per_word <= __amax) 2561*4d6fc14bSjoerg return __nmax; 2562*4d6fc14bSjoerg return __internal_cap_to_external(__amax); 2563*4d6fc14bSjoerg} 2564*4d6fc14bSjoerg 2565*4d6fc14bSjoerg// Precondition: __new_size > capacity() 2566*4d6fc14bSjoergtemplate <class _Allocator> 2567*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 2568*4d6fc14bSjoergtypename vector<bool, _Allocator>::size_type 2569*4d6fc14bSjoergvector<bool, _Allocator>::__recommend(size_type __new_size) const 2570*4d6fc14bSjoerg{ 2571*4d6fc14bSjoerg const size_type __ms = max_size(); 2572*4d6fc14bSjoerg if (__new_size > __ms) 2573*4d6fc14bSjoerg this->__throw_length_error(); 2574*4d6fc14bSjoerg const size_type __cap = capacity(); 2575*4d6fc14bSjoerg if (__cap >= __ms / 2) 2576*4d6fc14bSjoerg return __ms; 2577*4d6fc14bSjoerg return _VSTD::max(2*__cap, __align_it(__new_size)); 2578*4d6fc14bSjoerg} 2579*4d6fc14bSjoerg 2580*4d6fc14bSjoerg// Default constructs __n objects starting at __end_ 2581*4d6fc14bSjoerg// Precondition: __n > 0 2582*4d6fc14bSjoerg// Precondition: size() + __n <= capacity() 2583*4d6fc14bSjoerg// Postcondition: size() == size() + __n 2584*4d6fc14bSjoergtemplate <class _Allocator> 2585*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 2586*4d6fc14bSjoergvoid 2587*4d6fc14bSjoergvector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x) 2588*4d6fc14bSjoerg{ 2589*4d6fc14bSjoerg size_type __old_size = this->__size_; 2590*4d6fc14bSjoerg this->__size_ += __n; 2591*4d6fc14bSjoerg if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word)) 2592*4d6fc14bSjoerg { 2593*4d6fc14bSjoerg if (this->__size_ <= __bits_per_word) 2594*4d6fc14bSjoerg this->__begin_[0] = __storage_type(0); 2595*4d6fc14bSjoerg else 2596*4d6fc14bSjoerg this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0); 2597*4d6fc14bSjoerg } 2598*4d6fc14bSjoerg _VSTD::fill_n(__make_iter(__old_size), __n, __x); 2599*4d6fc14bSjoerg} 2600*4d6fc14bSjoerg 2601*4d6fc14bSjoergtemplate <class _Allocator> 2602*4d6fc14bSjoergtemplate <class _ForwardIterator> 2603*4d6fc14bSjoergtypename enable_if 2604*4d6fc14bSjoerg< 2605*4d6fc14bSjoerg __is_cpp17_forward_iterator<_ForwardIterator>::value, 2606*4d6fc14bSjoerg void 2607*4d6fc14bSjoerg>::type 2608*4d6fc14bSjoergvector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last) 2609*4d6fc14bSjoerg{ 2610*4d6fc14bSjoerg size_type __old_size = this->__size_; 2611*4d6fc14bSjoerg this->__size_ += _VSTD::distance(__first, __last); 2612*4d6fc14bSjoerg if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word)) 2613*4d6fc14bSjoerg { 2614*4d6fc14bSjoerg if (this->__size_ <= __bits_per_word) 2615*4d6fc14bSjoerg this->__begin_[0] = __storage_type(0); 2616*4d6fc14bSjoerg else 2617*4d6fc14bSjoerg this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0); 2618*4d6fc14bSjoerg } 2619*4d6fc14bSjoerg _VSTD::copy(__first, __last, __make_iter(__old_size)); 2620*4d6fc14bSjoerg} 2621*4d6fc14bSjoerg 2622*4d6fc14bSjoergtemplate <class _Allocator> 2623*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 2624*4d6fc14bSjoergvector<bool, _Allocator>::vector() 2625*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) 2626*4d6fc14bSjoerg : __begin_(nullptr), 2627*4d6fc14bSjoerg __size_(0), 2628*4d6fc14bSjoerg __cap_alloc_(0, __default_init_tag()) 2629*4d6fc14bSjoerg{ 2630*4d6fc14bSjoerg} 2631*4d6fc14bSjoerg 2632*4d6fc14bSjoergtemplate <class _Allocator> 2633*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 2634*4d6fc14bSjoergvector<bool, _Allocator>::vector(const allocator_type& __a) 2635*4d6fc14bSjoerg#if _LIBCPP_STD_VER <= 14 2636*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value) 2637*4d6fc14bSjoerg#else 2638*4d6fc14bSjoerg _NOEXCEPT 2639*4d6fc14bSjoerg#endif 2640*4d6fc14bSjoerg : __begin_(nullptr), 2641*4d6fc14bSjoerg __size_(0), 2642*4d6fc14bSjoerg __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 2643*4d6fc14bSjoerg{ 2644*4d6fc14bSjoerg} 2645*4d6fc14bSjoerg 2646*4d6fc14bSjoergtemplate <class _Allocator> 2647*4d6fc14bSjoergvector<bool, _Allocator>::vector(size_type __n) 2648*4d6fc14bSjoerg : __begin_(nullptr), 2649*4d6fc14bSjoerg __size_(0), 2650*4d6fc14bSjoerg __cap_alloc_(0, __default_init_tag()) 2651*4d6fc14bSjoerg{ 2652*4d6fc14bSjoerg if (__n > 0) 2653*4d6fc14bSjoerg { 2654*4d6fc14bSjoerg __vallocate(__n); 2655*4d6fc14bSjoerg __construct_at_end(__n, false); 2656*4d6fc14bSjoerg } 2657*4d6fc14bSjoerg} 2658*4d6fc14bSjoerg 2659*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 11 2660*4d6fc14bSjoergtemplate <class _Allocator> 2661*4d6fc14bSjoergvector<bool, _Allocator>::vector(size_type __n, const allocator_type& __a) 2662*4d6fc14bSjoerg : __begin_(nullptr), 2663*4d6fc14bSjoerg __size_(0), 2664*4d6fc14bSjoerg __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 2665*4d6fc14bSjoerg{ 2666*4d6fc14bSjoerg if (__n > 0) 2667*4d6fc14bSjoerg { 2668*4d6fc14bSjoerg __vallocate(__n); 2669*4d6fc14bSjoerg __construct_at_end(__n, false); 2670*4d6fc14bSjoerg } 2671*4d6fc14bSjoerg} 2672*4d6fc14bSjoerg#endif 2673*4d6fc14bSjoerg 2674*4d6fc14bSjoergtemplate <class _Allocator> 2675*4d6fc14bSjoergvector<bool, _Allocator>::vector(size_type __n, const value_type& __x) 2676*4d6fc14bSjoerg : __begin_(nullptr), 2677*4d6fc14bSjoerg __size_(0), 2678*4d6fc14bSjoerg __cap_alloc_(0, __default_init_tag()) 2679*4d6fc14bSjoerg{ 2680*4d6fc14bSjoerg if (__n > 0) 2681*4d6fc14bSjoerg { 2682*4d6fc14bSjoerg __vallocate(__n); 2683*4d6fc14bSjoerg __construct_at_end(__n, __x); 2684*4d6fc14bSjoerg } 2685*4d6fc14bSjoerg} 2686*4d6fc14bSjoerg 2687*4d6fc14bSjoergtemplate <class _Allocator> 2688*4d6fc14bSjoergvector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a) 2689*4d6fc14bSjoerg : __begin_(nullptr), 2690*4d6fc14bSjoerg __size_(0), 2691*4d6fc14bSjoerg __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 2692*4d6fc14bSjoerg{ 2693*4d6fc14bSjoerg if (__n > 0) 2694*4d6fc14bSjoerg { 2695*4d6fc14bSjoerg __vallocate(__n); 2696*4d6fc14bSjoerg __construct_at_end(__n, __x); 2697*4d6fc14bSjoerg } 2698*4d6fc14bSjoerg} 2699*4d6fc14bSjoerg 2700*4d6fc14bSjoergtemplate <class _Allocator> 2701*4d6fc14bSjoergtemplate <class _InputIterator> 2702*4d6fc14bSjoergvector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, 2703*4d6fc14bSjoerg typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value && 2704*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value>::type*) 2705*4d6fc14bSjoerg : __begin_(nullptr), 2706*4d6fc14bSjoerg __size_(0), 2707*4d6fc14bSjoerg __cap_alloc_(0, __default_init_tag()) 2708*4d6fc14bSjoerg{ 2709*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2710*4d6fc14bSjoerg try 2711*4d6fc14bSjoerg { 2712*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2713*4d6fc14bSjoerg for (; __first != __last; ++__first) 2714*4d6fc14bSjoerg push_back(*__first); 2715*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2716*4d6fc14bSjoerg } 2717*4d6fc14bSjoerg catch (...) 2718*4d6fc14bSjoerg { 2719*4d6fc14bSjoerg if (__begin_ != nullptr) 2720*4d6fc14bSjoerg __storage_traits::deallocate(__alloc(), __begin_, __cap()); 2721*4d6fc14bSjoerg __invalidate_all_iterators(); 2722*4d6fc14bSjoerg throw; 2723*4d6fc14bSjoerg } 2724*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2725*4d6fc14bSjoerg} 2726*4d6fc14bSjoerg 2727*4d6fc14bSjoergtemplate <class _Allocator> 2728*4d6fc14bSjoergtemplate <class _InputIterator> 2729*4d6fc14bSjoergvector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, 2730*4d6fc14bSjoerg typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value && 2731*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value>::type*) 2732*4d6fc14bSjoerg : __begin_(nullptr), 2733*4d6fc14bSjoerg __size_(0), 2734*4d6fc14bSjoerg __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 2735*4d6fc14bSjoerg{ 2736*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2737*4d6fc14bSjoerg try 2738*4d6fc14bSjoerg { 2739*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2740*4d6fc14bSjoerg for (; __first != __last; ++__first) 2741*4d6fc14bSjoerg push_back(*__first); 2742*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2743*4d6fc14bSjoerg } 2744*4d6fc14bSjoerg catch (...) 2745*4d6fc14bSjoerg { 2746*4d6fc14bSjoerg if (__begin_ != nullptr) 2747*4d6fc14bSjoerg __storage_traits::deallocate(__alloc(), __begin_, __cap()); 2748*4d6fc14bSjoerg __invalidate_all_iterators(); 2749*4d6fc14bSjoerg throw; 2750*4d6fc14bSjoerg } 2751*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2752*4d6fc14bSjoerg} 2753*4d6fc14bSjoerg 2754*4d6fc14bSjoergtemplate <class _Allocator> 2755*4d6fc14bSjoergtemplate <class _ForwardIterator> 2756*4d6fc14bSjoergvector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, 2757*4d6fc14bSjoerg typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value>::type*) 2758*4d6fc14bSjoerg : __begin_(nullptr), 2759*4d6fc14bSjoerg __size_(0), 2760*4d6fc14bSjoerg __cap_alloc_(0, __default_init_tag()) 2761*4d6fc14bSjoerg{ 2762*4d6fc14bSjoerg size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); 2763*4d6fc14bSjoerg if (__n > 0) 2764*4d6fc14bSjoerg { 2765*4d6fc14bSjoerg __vallocate(__n); 2766*4d6fc14bSjoerg __construct_at_end(__first, __last); 2767*4d6fc14bSjoerg } 2768*4d6fc14bSjoerg} 2769*4d6fc14bSjoerg 2770*4d6fc14bSjoergtemplate <class _Allocator> 2771*4d6fc14bSjoergtemplate <class _ForwardIterator> 2772*4d6fc14bSjoergvector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, 2773*4d6fc14bSjoerg typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value>::type*) 2774*4d6fc14bSjoerg : __begin_(nullptr), 2775*4d6fc14bSjoerg __size_(0), 2776*4d6fc14bSjoerg __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 2777*4d6fc14bSjoerg{ 2778*4d6fc14bSjoerg size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); 2779*4d6fc14bSjoerg if (__n > 0) 2780*4d6fc14bSjoerg { 2781*4d6fc14bSjoerg __vallocate(__n); 2782*4d6fc14bSjoerg __construct_at_end(__first, __last); 2783*4d6fc14bSjoerg } 2784*4d6fc14bSjoerg} 2785*4d6fc14bSjoerg 2786*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 2787*4d6fc14bSjoerg 2788*4d6fc14bSjoergtemplate <class _Allocator> 2789*4d6fc14bSjoergvector<bool, _Allocator>::vector(initializer_list<value_type> __il) 2790*4d6fc14bSjoerg : __begin_(nullptr), 2791*4d6fc14bSjoerg __size_(0), 2792*4d6fc14bSjoerg __cap_alloc_(0, __default_init_tag()) 2793*4d6fc14bSjoerg{ 2794*4d6fc14bSjoerg size_type __n = static_cast<size_type>(__il.size()); 2795*4d6fc14bSjoerg if (__n > 0) 2796*4d6fc14bSjoerg { 2797*4d6fc14bSjoerg __vallocate(__n); 2798*4d6fc14bSjoerg __construct_at_end(__il.begin(), __il.end()); 2799*4d6fc14bSjoerg } 2800*4d6fc14bSjoerg} 2801*4d6fc14bSjoerg 2802*4d6fc14bSjoergtemplate <class _Allocator> 2803*4d6fc14bSjoergvector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a) 2804*4d6fc14bSjoerg : __begin_(nullptr), 2805*4d6fc14bSjoerg __size_(0), 2806*4d6fc14bSjoerg __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 2807*4d6fc14bSjoerg{ 2808*4d6fc14bSjoerg size_type __n = static_cast<size_type>(__il.size()); 2809*4d6fc14bSjoerg if (__n > 0) 2810*4d6fc14bSjoerg { 2811*4d6fc14bSjoerg __vallocate(__n); 2812*4d6fc14bSjoerg __construct_at_end(__il.begin(), __il.end()); 2813*4d6fc14bSjoerg } 2814*4d6fc14bSjoerg} 2815*4d6fc14bSjoerg 2816*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 2817*4d6fc14bSjoerg 2818*4d6fc14bSjoergtemplate <class _Allocator> 2819*4d6fc14bSjoergvector<bool, _Allocator>::~vector() 2820*4d6fc14bSjoerg{ 2821*4d6fc14bSjoerg if (__begin_ != nullptr) 2822*4d6fc14bSjoerg __storage_traits::deallocate(__alloc(), __begin_, __cap()); 2823*4d6fc14bSjoerg __invalidate_all_iterators(); 2824*4d6fc14bSjoerg} 2825*4d6fc14bSjoerg 2826*4d6fc14bSjoergtemplate <class _Allocator> 2827*4d6fc14bSjoergvector<bool, _Allocator>::vector(const vector& __v) 2828*4d6fc14bSjoerg : __begin_(nullptr), 2829*4d6fc14bSjoerg __size_(0), 2830*4d6fc14bSjoerg __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc())) 2831*4d6fc14bSjoerg{ 2832*4d6fc14bSjoerg if (__v.size() > 0) 2833*4d6fc14bSjoerg { 2834*4d6fc14bSjoerg __vallocate(__v.size()); 2835*4d6fc14bSjoerg __construct_at_end(__v.begin(), __v.end()); 2836*4d6fc14bSjoerg } 2837*4d6fc14bSjoerg} 2838*4d6fc14bSjoerg 2839*4d6fc14bSjoergtemplate <class _Allocator> 2840*4d6fc14bSjoergvector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a) 2841*4d6fc14bSjoerg : __begin_(nullptr), 2842*4d6fc14bSjoerg __size_(0), 2843*4d6fc14bSjoerg __cap_alloc_(0, __a) 2844*4d6fc14bSjoerg{ 2845*4d6fc14bSjoerg if (__v.size() > 0) 2846*4d6fc14bSjoerg { 2847*4d6fc14bSjoerg __vallocate(__v.size()); 2848*4d6fc14bSjoerg __construct_at_end(__v.begin(), __v.end()); 2849*4d6fc14bSjoerg } 2850*4d6fc14bSjoerg} 2851*4d6fc14bSjoerg 2852*4d6fc14bSjoergtemplate <class _Allocator> 2853*4d6fc14bSjoergvector<bool, _Allocator>& 2854*4d6fc14bSjoergvector<bool, _Allocator>::operator=(const vector& __v) 2855*4d6fc14bSjoerg{ 2856*4d6fc14bSjoerg if (this != &__v) 2857*4d6fc14bSjoerg { 2858*4d6fc14bSjoerg __copy_assign_alloc(__v); 2859*4d6fc14bSjoerg if (__v.__size_) 2860*4d6fc14bSjoerg { 2861*4d6fc14bSjoerg if (__v.__size_ > capacity()) 2862*4d6fc14bSjoerg { 2863*4d6fc14bSjoerg __vdeallocate(); 2864*4d6fc14bSjoerg __vallocate(__v.__size_); 2865*4d6fc14bSjoerg } 2866*4d6fc14bSjoerg _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_); 2867*4d6fc14bSjoerg } 2868*4d6fc14bSjoerg __size_ = __v.__size_; 2869*4d6fc14bSjoerg } 2870*4d6fc14bSjoerg return *this; 2871*4d6fc14bSjoerg} 2872*4d6fc14bSjoerg 2873*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 2874*4d6fc14bSjoerg 2875*4d6fc14bSjoergtemplate <class _Allocator> 2876*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY vector<bool, _Allocator>::vector(vector&& __v) 2877*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 2878*4d6fc14bSjoerg _NOEXCEPT 2879*4d6fc14bSjoerg#else 2880*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) 2881*4d6fc14bSjoerg#endif 2882*4d6fc14bSjoerg : __begin_(__v.__begin_), 2883*4d6fc14bSjoerg __size_(__v.__size_), 2884*4d6fc14bSjoerg __cap_alloc_(_VSTD::move(__v.__cap_alloc_)) { 2885*4d6fc14bSjoerg __v.__begin_ = nullptr; 2886*4d6fc14bSjoerg __v.__size_ = 0; 2887*4d6fc14bSjoerg __v.__cap() = 0; 2888*4d6fc14bSjoerg} 2889*4d6fc14bSjoerg 2890*4d6fc14bSjoergtemplate <class _Allocator> 2891*4d6fc14bSjoergvector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a) 2892*4d6fc14bSjoerg : __begin_(nullptr), 2893*4d6fc14bSjoerg __size_(0), 2894*4d6fc14bSjoerg __cap_alloc_(0, __a) 2895*4d6fc14bSjoerg{ 2896*4d6fc14bSjoerg if (__a == allocator_type(__v.__alloc())) 2897*4d6fc14bSjoerg { 2898*4d6fc14bSjoerg this->__begin_ = __v.__begin_; 2899*4d6fc14bSjoerg this->__size_ = __v.__size_; 2900*4d6fc14bSjoerg this->__cap() = __v.__cap(); 2901*4d6fc14bSjoerg __v.__begin_ = nullptr; 2902*4d6fc14bSjoerg __v.__cap() = __v.__size_ = 0; 2903*4d6fc14bSjoerg } 2904*4d6fc14bSjoerg else if (__v.size() > 0) 2905*4d6fc14bSjoerg { 2906*4d6fc14bSjoerg __vallocate(__v.size()); 2907*4d6fc14bSjoerg __construct_at_end(__v.begin(), __v.end()); 2908*4d6fc14bSjoerg } 2909*4d6fc14bSjoerg} 2910*4d6fc14bSjoerg 2911*4d6fc14bSjoergtemplate <class _Allocator> 2912*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 2913*4d6fc14bSjoergvector<bool, _Allocator>& 2914*4d6fc14bSjoergvector<bool, _Allocator>::operator=(vector&& __v) 2915*4d6fc14bSjoerg _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)) 2916*4d6fc14bSjoerg{ 2917*4d6fc14bSjoerg __move_assign(__v, integral_constant<bool, 2918*4d6fc14bSjoerg __storage_traits::propagate_on_container_move_assignment::value>()); 2919*4d6fc14bSjoerg return *this; 2920*4d6fc14bSjoerg} 2921*4d6fc14bSjoerg 2922*4d6fc14bSjoergtemplate <class _Allocator> 2923*4d6fc14bSjoergvoid 2924*4d6fc14bSjoergvector<bool, _Allocator>::__move_assign(vector& __c, false_type) 2925*4d6fc14bSjoerg{ 2926*4d6fc14bSjoerg if (__alloc() != __c.__alloc()) 2927*4d6fc14bSjoerg assign(__c.begin(), __c.end()); 2928*4d6fc14bSjoerg else 2929*4d6fc14bSjoerg __move_assign(__c, true_type()); 2930*4d6fc14bSjoerg} 2931*4d6fc14bSjoerg 2932*4d6fc14bSjoergtemplate <class _Allocator> 2933*4d6fc14bSjoergvoid 2934*4d6fc14bSjoergvector<bool, _Allocator>::__move_assign(vector& __c, true_type) 2935*4d6fc14bSjoerg _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 2936*4d6fc14bSjoerg{ 2937*4d6fc14bSjoerg __vdeallocate(); 2938*4d6fc14bSjoerg __move_assign_alloc(__c); 2939*4d6fc14bSjoerg this->__begin_ = __c.__begin_; 2940*4d6fc14bSjoerg this->__size_ = __c.__size_; 2941*4d6fc14bSjoerg this->__cap() = __c.__cap(); 2942*4d6fc14bSjoerg __c.__begin_ = nullptr; 2943*4d6fc14bSjoerg __c.__cap() = __c.__size_ = 0; 2944*4d6fc14bSjoerg} 2945*4d6fc14bSjoerg 2946*4d6fc14bSjoerg#endif // !_LIBCPP_CXX03_LANG 2947*4d6fc14bSjoerg 2948*4d6fc14bSjoergtemplate <class _Allocator> 2949*4d6fc14bSjoergvoid 2950*4d6fc14bSjoergvector<bool, _Allocator>::assign(size_type __n, const value_type& __x) 2951*4d6fc14bSjoerg{ 2952*4d6fc14bSjoerg __size_ = 0; 2953*4d6fc14bSjoerg if (__n > 0) 2954*4d6fc14bSjoerg { 2955*4d6fc14bSjoerg size_type __c = capacity(); 2956*4d6fc14bSjoerg if (__n <= __c) 2957*4d6fc14bSjoerg __size_ = __n; 2958*4d6fc14bSjoerg else 2959*4d6fc14bSjoerg { 2960*4d6fc14bSjoerg vector __v(__alloc()); 2961*4d6fc14bSjoerg __v.reserve(__recommend(__n)); 2962*4d6fc14bSjoerg __v.__size_ = __n; 2963*4d6fc14bSjoerg swap(__v); 2964*4d6fc14bSjoerg } 2965*4d6fc14bSjoerg _VSTD::fill_n(begin(), __n, __x); 2966*4d6fc14bSjoerg } 2967*4d6fc14bSjoerg __invalidate_all_iterators(); 2968*4d6fc14bSjoerg} 2969*4d6fc14bSjoerg 2970*4d6fc14bSjoergtemplate <class _Allocator> 2971*4d6fc14bSjoergtemplate <class _InputIterator> 2972*4d6fc14bSjoergtypename enable_if 2973*4d6fc14bSjoerg< 2974*4d6fc14bSjoerg __is_cpp17_input_iterator<_InputIterator>::value && 2975*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value, 2976*4d6fc14bSjoerg void 2977*4d6fc14bSjoerg>::type 2978*4d6fc14bSjoergvector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last) 2979*4d6fc14bSjoerg{ 2980*4d6fc14bSjoerg clear(); 2981*4d6fc14bSjoerg for (; __first != __last; ++__first) 2982*4d6fc14bSjoerg push_back(*__first); 2983*4d6fc14bSjoerg} 2984*4d6fc14bSjoerg 2985*4d6fc14bSjoergtemplate <class _Allocator> 2986*4d6fc14bSjoergtemplate <class _ForwardIterator> 2987*4d6fc14bSjoergtypename enable_if 2988*4d6fc14bSjoerg< 2989*4d6fc14bSjoerg __is_cpp17_forward_iterator<_ForwardIterator>::value, 2990*4d6fc14bSjoerg void 2991*4d6fc14bSjoerg>::type 2992*4d6fc14bSjoergvector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) 2993*4d6fc14bSjoerg{ 2994*4d6fc14bSjoerg clear(); 2995*4d6fc14bSjoerg difference_type __ns = _VSTD::distance(__first, __last); 2996*4d6fc14bSjoerg _LIBCPP_ASSERT(__ns >= 0, "invalid range specified"); 2997*4d6fc14bSjoerg const size_t __n = static_cast<size_type>(__ns); 2998*4d6fc14bSjoerg if (__n) 2999*4d6fc14bSjoerg { 3000*4d6fc14bSjoerg if (__n > capacity()) 3001*4d6fc14bSjoerg { 3002*4d6fc14bSjoerg __vdeallocate(); 3003*4d6fc14bSjoerg __vallocate(__n); 3004*4d6fc14bSjoerg } 3005*4d6fc14bSjoerg __construct_at_end(__first, __last); 3006*4d6fc14bSjoerg } 3007*4d6fc14bSjoerg} 3008*4d6fc14bSjoerg 3009*4d6fc14bSjoergtemplate <class _Allocator> 3010*4d6fc14bSjoergvoid 3011*4d6fc14bSjoergvector<bool, _Allocator>::reserve(size_type __n) 3012*4d6fc14bSjoerg{ 3013*4d6fc14bSjoerg if (__n > capacity()) 3014*4d6fc14bSjoerg { 3015*4d6fc14bSjoerg vector __v(this->__alloc()); 3016*4d6fc14bSjoerg __v.__vallocate(__n); 3017*4d6fc14bSjoerg __v.__construct_at_end(this->begin(), this->end()); 3018*4d6fc14bSjoerg swap(__v); 3019*4d6fc14bSjoerg __invalidate_all_iterators(); 3020*4d6fc14bSjoerg } 3021*4d6fc14bSjoerg} 3022*4d6fc14bSjoerg 3023*4d6fc14bSjoergtemplate <class _Allocator> 3024*4d6fc14bSjoergvoid 3025*4d6fc14bSjoergvector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT 3026*4d6fc14bSjoerg{ 3027*4d6fc14bSjoerg if (__external_cap_to_internal(size()) > __cap()) 3028*4d6fc14bSjoerg { 3029*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 3030*4d6fc14bSjoerg try 3031*4d6fc14bSjoerg { 3032*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 3033*4d6fc14bSjoerg vector(*this, allocator_type(__alloc())).swap(*this); 3034*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 3035*4d6fc14bSjoerg } 3036*4d6fc14bSjoerg catch (...) 3037*4d6fc14bSjoerg { 3038*4d6fc14bSjoerg } 3039*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 3040*4d6fc14bSjoerg } 3041*4d6fc14bSjoerg} 3042*4d6fc14bSjoerg 3043*4d6fc14bSjoergtemplate <class _Allocator> 3044*4d6fc14bSjoergtypename vector<bool, _Allocator>::reference 3045*4d6fc14bSjoergvector<bool, _Allocator>::at(size_type __n) 3046*4d6fc14bSjoerg{ 3047*4d6fc14bSjoerg if (__n >= size()) 3048*4d6fc14bSjoerg this->__throw_out_of_range(); 3049*4d6fc14bSjoerg return (*this)[__n]; 3050*4d6fc14bSjoerg} 3051*4d6fc14bSjoerg 3052*4d6fc14bSjoergtemplate <class _Allocator> 3053*4d6fc14bSjoergtypename vector<bool, _Allocator>::const_reference 3054*4d6fc14bSjoergvector<bool, _Allocator>::at(size_type __n) const 3055*4d6fc14bSjoerg{ 3056*4d6fc14bSjoerg if (__n >= size()) 3057*4d6fc14bSjoerg this->__throw_out_of_range(); 3058*4d6fc14bSjoerg return (*this)[__n]; 3059*4d6fc14bSjoerg} 3060*4d6fc14bSjoerg 3061*4d6fc14bSjoergtemplate <class _Allocator> 3062*4d6fc14bSjoergvoid 3063*4d6fc14bSjoergvector<bool, _Allocator>::push_back(const value_type& __x) 3064*4d6fc14bSjoerg{ 3065*4d6fc14bSjoerg if (this->__size_ == this->capacity()) 3066*4d6fc14bSjoerg reserve(__recommend(this->__size_ + 1)); 3067*4d6fc14bSjoerg ++this->__size_; 3068*4d6fc14bSjoerg back() = __x; 3069*4d6fc14bSjoerg} 3070*4d6fc14bSjoerg 3071*4d6fc14bSjoergtemplate <class _Allocator> 3072*4d6fc14bSjoergtypename vector<bool, _Allocator>::iterator 3073*4d6fc14bSjoergvector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x) 3074*4d6fc14bSjoerg{ 3075*4d6fc14bSjoerg iterator __r; 3076*4d6fc14bSjoerg if (size() < capacity()) 3077*4d6fc14bSjoerg { 3078*4d6fc14bSjoerg const_iterator __old_end = end(); 3079*4d6fc14bSjoerg ++__size_; 3080*4d6fc14bSjoerg _VSTD::copy_backward(__position, __old_end, end()); 3081*4d6fc14bSjoerg __r = __const_iterator_cast(__position); 3082*4d6fc14bSjoerg } 3083*4d6fc14bSjoerg else 3084*4d6fc14bSjoerg { 3085*4d6fc14bSjoerg vector __v(__alloc()); 3086*4d6fc14bSjoerg __v.reserve(__recommend(__size_ + 1)); 3087*4d6fc14bSjoerg __v.__size_ = __size_ + 1; 3088*4d6fc14bSjoerg __r = _VSTD::copy(cbegin(), __position, __v.begin()); 3089*4d6fc14bSjoerg _VSTD::copy_backward(__position, cend(), __v.end()); 3090*4d6fc14bSjoerg swap(__v); 3091*4d6fc14bSjoerg } 3092*4d6fc14bSjoerg *__r = __x; 3093*4d6fc14bSjoerg return __r; 3094*4d6fc14bSjoerg} 3095*4d6fc14bSjoerg 3096*4d6fc14bSjoergtemplate <class _Allocator> 3097*4d6fc14bSjoergtypename vector<bool, _Allocator>::iterator 3098*4d6fc14bSjoergvector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x) 3099*4d6fc14bSjoerg{ 3100*4d6fc14bSjoerg iterator __r; 3101*4d6fc14bSjoerg size_type __c = capacity(); 3102*4d6fc14bSjoerg if (__n <= __c && size() <= __c - __n) 3103*4d6fc14bSjoerg { 3104*4d6fc14bSjoerg const_iterator __old_end = end(); 3105*4d6fc14bSjoerg __size_ += __n; 3106*4d6fc14bSjoerg _VSTD::copy_backward(__position, __old_end, end()); 3107*4d6fc14bSjoerg __r = __const_iterator_cast(__position); 3108*4d6fc14bSjoerg } 3109*4d6fc14bSjoerg else 3110*4d6fc14bSjoerg { 3111*4d6fc14bSjoerg vector __v(__alloc()); 3112*4d6fc14bSjoerg __v.reserve(__recommend(__size_ + __n)); 3113*4d6fc14bSjoerg __v.__size_ = __size_ + __n; 3114*4d6fc14bSjoerg __r = _VSTD::copy(cbegin(), __position, __v.begin()); 3115*4d6fc14bSjoerg _VSTD::copy_backward(__position, cend(), __v.end()); 3116*4d6fc14bSjoerg swap(__v); 3117*4d6fc14bSjoerg } 3118*4d6fc14bSjoerg _VSTD::fill_n(__r, __n, __x); 3119*4d6fc14bSjoerg return __r; 3120*4d6fc14bSjoerg} 3121*4d6fc14bSjoerg 3122*4d6fc14bSjoergtemplate <class _Allocator> 3123*4d6fc14bSjoergtemplate <class _InputIterator> 3124*4d6fc14bSjoergtypename enable_if 3125*4d6fc14bSjoerg< 3126*4d6fc14bSjoerg __is_cpp17_input_iterator <_InputIterator>::value && 3127*4d6fc14bSjoerg !__is_cpp17_forward_iterator<_InputIterator>::value, 3128*4d6fc14bSjoerg typename vector<bool, _Allocator>::iterator 3129*4d6fc14bSjoerg>::type 3130*4d6fc14bSjoergvector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last) 3131*4d6fc14bSjoerg{ 3132*4d6fc14bSjoerg difference_type __off = __position - begin(); 3133*4d6fc14bSjoerg iterator __p = __const_iterator_cast(__position); 3134*4d6fc14bSjoerg iterator __old_end = end(); 3135*4d6fc14bSjoerg for (; size() != capacity() && __first != __last; ++__first) 3136*4d6fc14bSjoerg { 3137*4d6fc14bSjoerg ++this->__size_; 3138*4d6fc14bSjoerg back() = *__first; 3139*4d6fc14bSjoerg } 3140*4d6fc14bSjoerg vector __v(__alloc()); 3141*4d6fc14bSjoerg if (__first != __last) 3142*4d6fc14bSjoerg { 3143*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 3144*4d6fc14bSjoerg try 3145*4d6fc14bSjoerg { 3146*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 3147*4d6fc14bSjoerg __v.assign(__first, __last); 3148*4d6fc14bSjoerg difference_type __old_size = static_cast<difference_type>(__old_end - begin()); 3149*4d6fc14bSjoerg difference_type __old_p = __p - begin(); 3150*4d6fc14bSjoerg reserve(__recommend(size() + __v.size())); 3151*4d6fc14bSjoerg __p = begin() + __old_p; 3152*4d6fc14bSjoerg __old_end = begin() + __old_size; 3153*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 3154*4d6fc14bSjoerg } 3155*4d6fc14bSjoerg catch (...) 3156*4d6fc14bSjoerg { 3157*4d6fc14bSjoerg erase(__old_end, end()); 3158*4d6fc14bSjoerg throw; 3159*4d6fc14bSjoerg } 3160*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 3161*4d6fc14bSjoerg } 3162*4d6fc14bSjoerg __p = _VSTD::rotate(__p, __old_end, end()); 3163*4d6fc14bSjoerg insert(__p, __v.begin(), __v.end()); 3164*4d6fc14bSjoerg return begin() + __off; 3165*4d6fc14bSjoerg} 3166*4d6fc14bSjoerg 3167*4d6fc14bSjoergtemplate <class _Allocator> 3168*4d6fc14bSjoergtemplate <class _ForwardIterator> 3169*4d6fc14bSjoergtypename enable_if 3170*4d6fc14bSjoerg< 3171*4d6fc14bSjoerg __is_cpp17_forward_iterator<_ForwardIterator>::value, 3172*4d6fc14bSjoerg typename vector<bool, _Allocator>::iterator 3173*4d6fc14bSjoerg>::type 3174*4d6fc14bSjoergvector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last) 3175*4d6fc14bSjoerg{ 3176*4d6fc14bSjoerg const difference_type __n_signed = _VSTD::distance(__first, __last); 3177*4d6fc14bSjoerg _LIBCPP_ASSERT(__n_signed >= 0, "invalid range specified"); 3178*4d6fc14bSjoerg const size_type __n = static_cast<size_type>(__n_signed); 3179*4d6fc14bSjoerg iterator __r; 3180*4d6fc14bSjoerg size_type __c = capacity(); 3181*4d6fc14bSjoerg if (__n <= __c && size() <= __c - __n) 3182*4d6fc14bSjoerg { 3183*4d6fc14bSjoerg const_iterator __old_end = end(); 3184*4d6fc14bSjoerg __size_ += __n; 3185*4d6fc14bSjoerg _VSTD::copy_backward(__position, __old_end, end()); 3186*4d6fc14bSjoerg __r = __const_iterator_cast(__position); 3187*4d6fc14bSjoerg } 3188*4d6fc14bSjoerg else 3189*4d6fc14bSjoerg { 3190*4d6fc14bSjoerg vector __v(__alloc()); 3191*4d6fc14bSjoerg __v.reserve(__recommend(__size_ + __n)); 3192*4d6fc14bSjoerg __v.__size_ = __size_ + __n; 3193*4d6fc14bSjoerg __r = _VSTD::copy(cbegin(), __position, __v.begin()); 3194*4d6fc14bSjoerg _VSTD::copy_backward(__position, cend(), __v.end()); 3195*4d6fc14bSjoerg swap(__v); 3196*4d6fc14bSjoerg } 3197*4d6fc14bSjoerg _VSTD::copy(__first, __last, __r); 3198*4d6fc14bSjoerg return __r; 3199*4d6fc14bSjoerg} 3200*4d6fc14bSjoerg 3201*4d6fc14bSjoergtemplate <class _Allocator> 3202*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3203*4d6fc14bSjoergtypename vector<bool, _Allocator>::iterator 3204*4d6fc14bSjoergvector<bool, _Allocator>::erase(const_iterator __position) 3205*4d6fc14bSjoerg{ 3206*4d6fc14bSjoerg iterator __r = __const_iterator_cast(__position); 3207*4d6fc14bSjoerg _VSTD::copy(__position + 1, this->cend(), __r); 3208*4d6fc14bSjoerg --__size_; 3209*4d6fc14bSjoerg return __r; 3210*4d6fc14bSjoerg} 3211*4d6fc14bSjoerg 3212*4d6fc14bSjoergtemplate <class _Allocator> 3213*4d6fc14bSjoergtypename vector<bool, _Allocator>::iterator 3214*4d6fc14bSjoergvector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last) 3215*4d6fc14bSjoerg{ 3216*4d6fc14bSjoerg iterator __r = __const_iterator_cast(__first); 3217*4d6fc14bSjoerg difference_type __d = __last - __first; 3218*4d6fc14bSjoerg _VSTD::copy(__last, this->cend(), __r); 3219*4d6fc14bSjoerg __size_ -= __d; 3220*4d6fc14bSjoerg return __r; 3221*4d6fc14bSjoerg} 3222*4d6fc14bSjoerg 3223*4d6fc14bSjoergtemplate <class _Allocator> 3224*4d6fc14bSjoergvoid 3225*4d6fc14bSjoergvector<bool, _Allocator>::swap(vector& __x) 3226*4d6fc14bSjoerg#if _LIBCPP_STD_VER >= 14 3227*4d6fc14bSjoerg _NOEXCEPT 3228*4d6fc14bSjoerg#else 3229*4d6fc14bSjoerg _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 3230*4d6fc14bSjoerg __is_nothrow_swappable<allocator_type>::value) 3231*4d6fc14bSjoerg#endif 3232*4d6fc14bSjoerg{ 3233*4d6fc14bSjoerg _VSTD::swap(this->__begin_, __x.__begin_); 3234*4d6fc14bSjoerg _VSTD::swap(this->__size_, __x.__size_); 3235*4d6fc14bSjoerg _VSTD::swap(this->__cap(), __x.__cap()); 3236*4d6fc14bSjoerg _VSTD::__swap_allocator(this->__alloc(), __x.__alloc(), 3237*4d6fc14bSjoerg integral_constant<bool, __alloc_traits::propagate_on_container_swap::value>()); 3238*4d6fc14bSjoerg} 3239*4d6fc14bSjoerg 3240*4d6fc14bSjoergtemplate <class _Allocator> 3241*4d6fc14bSjoergvoid 3242*4d6fc14bSjoergvector<bool, _Allocator>::resize(size_type __sz, value_type __x) 3243*4d6fc14bSjoerg{ 3244*4d6fc14bSjoerg size_type __cs = size(); 3245*4d6fc14bSjoerg if (__cs < __sz) 3246*4d6fc14bSjoerg { 3247*4d6fc14bSjoerg iterator __r; 3248*4d6fc14bSjoerg size_type __c = capacity(); 3249*4d6fc14bSjoerg size_type __n = __sz - __cs; 3250*4d6fc14bSjoerg if (__n <= __c && __cs <= __c - __n) 3251*4d6fc14bSjoerg { 3252*4d6fc14bSjoerg __r = end(); 3253*4d6fc14bSjoerg __size_ += __n; 3254*4d6fc14bSjoerg } 3255*4d6fc14bSjoerg else 3256*4d6fc14bSjoerg { 3257*4d6fc14bSjoerg vector __v(__alloc()); 3258*4d6fc14bSjoerg __v.reserve(__recommend(__size_ + __n)); 3259*4d6fc14bSjoerg __v.__size_ = __size_ + __n; 3260*4d6fc14bSjoerg __r = _VSTD::copy(cbegin(), cend(), __v.begin()); 3261*4d6fc14bSjoerg swap(__v); 3262*4d6fc14bSjoerg } 3263*4d6fc14bSjoerg _VSTD::fill_n(__r, __n, __x); 3264*4d6fc14bSjoerg } 3265*4d6fc14bSjoerg else 3266*4d6fc14bSjoerg __size_ = __sz; 3267*4d6fc14bSjoerg} 3268*4d6fc14bSjoerg 3269*4d6fc14bSjoergtemplate <class _Allocator> 3270*4d6fc14bSjoergvoid 3271*4d6fc14bSjoergvector<bool, _Allocator>::flip() _NOEXCEPT 3272*4d6fc14bSjoerg{ 3273*4d6fc14bSjoerg // do middle whole words 3274*4d6fc14bSjoerg size_type __n = __size_; 3275*4d6fc14bSjoerg __storage_pointer __p = __begin_; 3276*4d6fc14bSjoerg for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) 3277*4d6fc14bSjoerg *__p = ~*__p; 3278*4d6fc14bSjoerg // do last partial word 3279*4d6fc14bSjoerg if (__n > 0) 3280*4d6fc14bSjoerg { 3281*4d6fc14bSjoerg __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 3282*4d6fc14bSjoerg __storage_type __b = *__p & __m; 3283*4d6fc14bSjoerg *__p &= ~__m; 3284*4d6fc14bSjoerg *__p |= ~__b & __m; 3285*4d6fc14bSjoerg } 3286*4d6fc14bSjoerg} 3287*4d6fc14bSjoerg 3288*4d6fc14bSjoergtemplate <class _Allocator> 3289*4d6fc14bSjoergbool 3290*4d6fc14bSjoergvector<bool, _Allocator>::__invariants() const 3291*4d6fc14bSjoerg{ 3292*4d6fc14bSjoerg if (this->__begin_ == nullptr) 3293*4d6fc14bSjoerg { 3294*4d6fc14bSjoerg if (this->__size_ != 0 || this->__cap() != 0) 3295*4d6fc14bSjoerg return false; 3296*4d6fc14bSjoerg } 3297*4d6fc14bSjoerg else 3298*4d6fc14bSjoerg { 3299*4d6fc14bSjoerg if (this->__cap() == 0) 3300*4d6fc14bSjoerg return false; 3301*4d6fc14bSjoerg if (this->__size_ > this->capacity()) 3302*4d6fc14bSjoerg return false; 3303*4d6fc14bSjoerg } 3304*4d6fc14bSjoerg return true; 3305*4d6fc14bSjoerg} 3306*4d6fc14bSjoerg 3307*4d6fc14bSjoergtemplate <class _Allocator> 3308*4d6fc14bSjoergsize_t 3309*4d6fc14bSjoergvector<bool, _Allocator>::__hash_code() const _NOEXCEPT 3310*4d6fc14bSjoerg{ 3311*4d6fc14bSjoerg size_t __h = 0; 3312*4d6fc14bSjoerg // do middle whole words 3313*4d6fc14bSjoerg size_type __n = __size_; 3314*4d6fc14bSjoerg __storage_pointer __p = __begin_; 3315*4d6fc14bSjoerg for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) 3316*4d6fc14bSjoerg __h ^= *__p; 3317*4d6fc14bSjoerg // do last partial word 3318*4d6fc14bSjoerg if (__n > 0) 3319*4d6fc14bSjoerg { 3320*4d6fc14bSjoerg const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 3321*4d6fc14bSjoerg __h ^= *__p & __m; 3322*4d6fc14bSjoerg } 3323*4d6fc14bSjoerg return __h; 3324*4d6fc14bSjoerg} 3325*4d6fc14bSjoerg 3326*4d6fc14bSjoergtemplate <class _Allocator> 3327*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS hash<vector<bool, _Allocator> > 3328*4d6fc14bSjoerg : public unary_function<vector<bool, _Allocator>, size_t> 3329*4d6fc14bSjoerg{ 3330*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 3331*4d6fc14bSjoerg size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT 3332*4d6fc14bSjoerg {return __vec.__hash_code();} 3333*4d6fc14bSjoerg}; 3334*4d6fc14bSjoerg 3335*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 3336*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3337*4d6fc14bSjoergbool 3338*4d6fc14bSjoergoperator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 3339*4d6fc14bSjoerg{ 3340*4d6fc14bSjoerg const typename vector<_Tp, _Allocator>::size_type __sz = __x.size(); 3341*4d6fc14bSjoerg return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 3342*4d6fc14bSjoerg} 3343*4d6fc14bSjoerg 3344*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 3345*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3346*4d6fc14bSjoergbool 3347*4d6fc14bSjoergoperator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 3348*4d6fc14bSjoerg{ 3349*4d6fc14bSjoerg return !(__x == __y); 3350*4d6fc14bSjoerg} 3351*4d6fc14bSjoerg 3352*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 3353*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3354*4d6fc14bSjoergbool 3355*4d6fc14bSjoergoperator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 3356*4d6fc14bSjoerg{ 3357*4d6fc14bSjoerg return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 3358*4d6fc14bSjoerg} 3359*4d6fc14bSjoerg 3360*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 3361*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3362*4d6fc14bSjoergbool 3363*4d6fc14bSjoergoperator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 3364*4d6fc14bSjoerg{ 3365*4d6fc14bSjoerg return __y < __x; 3366*4d6fc14bSjoerg} 3367*4d6fc14bSjoerg 3368*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 3369*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3370*4d6fc14bSjoergbool 3371*4d6fc14bSjoergoperator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 3372*4d6fc14bSjoerg{ 3373*4d6fc14bSjoerg return !(__x < __y); 3374*4d6fc14bSjoerg} 3375*4d6fc14bSjoerg 3376*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 3377*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3378*4d6fc14bSjoergbool 3379*4d6fc14bSjoergoperator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 3380*4d6fc14bSjoerg{ 3381*4d6fc14bSjoerg return !(__y < __x); 3382*4d6fc14bSjoerg} 3383*4d6fc14bSjoerg 3384*4d6fc14bSjoergtemplate <class _Tp, class _Allocator> 3385*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3386*4d6fc14bSjoergvoid 3387*4d6fc14bSjoergswap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y) 3388*4d6fc14bSjoerg _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 3389*4d6fc14bSjoerg{ 3390*4d6fc14bSjoerg __x.swap(__y); 3391*4d6fc14bSjoerg} 3392*4d6fc14bSjoerg 3393*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17 3394*4d6fc14bSjoergtemplate <class _Tp, class _Allocator, class _Up> 3395*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY typename vector<_Tp, _Allocator>::size_type 3396*4d6fc14bSjoergerase(vector<_Tp, _Allocator>& __c, const _Up& __v) { 3397*4d6fc14bSjoerg auto __old_size = __c.size(); 3398*4d6fc14bSjoerg __c.erase(_VSTD::remove(__c.begin(), __c.end(), __v), __c.end()); 3399*4d6fc14bSjoerg return __old_size - __c.size(); 3400*4d6fc14bSjoerg} 3401*4d6fc14bSjoerg 3402*4d6fc14bSjoergtemplate <class _Tp, class _Allocator, class _Predicate> 3403*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY typename vector<_Tp, _Allocator>::size_type 3404*4d6fc14bSjoergerase_if(vector<_Tp, _Allocator>& __c, _Predicate __pred) { 3405*4d6fc14bSjoerg auto __old_size = __c.size(); 3406*4d6fc14bSjoerg __c.erase(_VSTD::remove_if(__c.begin(), __c.end(), __pred), __c.end()); 3407*4d6fc14bSjoerg return __old_size - __c.size(); 3408*4d6fc14bSjoerg} 3409*4d6fc14bSjoerg#endif 3410*4d6fc14bSjoerg 3411*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD 3412*4d6fc14bSjoerg 3413*4d6fc14bSjoerg_LIBCPP_POP_MACROS 3414*4d6fc14bSjoerg 3415*4d6fc14bSjoerg#endif // _LIBCPP_VECTOR 3416