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