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