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