vector revision 242945
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 17namespace std 18{ 19 20template <class T, class Allocator = allocator<T> > 21class vector 22{ 23public: 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 127template <class Allocator = allocator<T> > 128class vector<bool, Allocator> 129{ 130public: 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 243template <class Allocator> struct hash<std::vector<bool, Allocator>>; 244 245template <class T, class Allocator> bool operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y); 246template <class T, class Allocator> bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y); 247template <class T, class Allocator> bool operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); 248template <class T, class Allocator> bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y); 249template <class T, class Allocator> bool operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); 250template <class T, class Allocator> bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); 251 252template <class T, class Allocator> 253void 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 281template <bool> 282class __vector_base_common 283{ 284protected: 285 _LIBCPP_ALWAYS_INLINE __vector_base_common() {} 286 void __throw_length_error() const; 287 void __throw_out_of_range() const; 288}; 289 290template <bool __b> 291void 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 301template <bool __b> 302void 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 321template <class _Tp, class _Allocator> 322class __vector_base 323 : protected __vector_base_common<true> 324{ 325protected: 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>());} 395private: 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 437template <class _Tp, class _Allocator> 438_LIBCPP_INLINE_VISIBILITY inline 439void 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 446template <class _Tp, class _Allocator> 447_LIBCPP_INLINE_VISIBILITY inline 448void 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 454template <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 464template <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 473template <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 483template <class _Tp, class _Allocator = allocator<_Tp> > 484class _LIBCPP_VISIBLE vector 485 : private __vector_base<_Tp, _Allocator> 486{ 487private: 488 typedef __vector_base<_Tp, _Allocator> __base; 489public: 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 745private: 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 806template <class _Tp, class _Allocator> 807void 808vector<_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 818template <class _Tp, class _Allocator> 819typename vector<_Tp, _Allocator>::pointer 820vector<_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 840template <class _Tp, class _Allocator> 841void 842vector<_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 850template <class _Tp, class _Allocator> 851void 852vector<_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 862template <class _Tp, class _Allocator> 863typename vector<_Tp, _Allocator>::size_type 864vector<_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() 870template <class _Tp, class _Allocator> 871_LIBCPP_INLINE_VISIBILITY inline 872typename vector<_Tp, _Allocator>::size_type 873vector<_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 889template <class _Tp, class _Allocator> 890void 891vector<_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) 908template <class _Tp, class _Allocator> 909_LIBCPP_INLINE_VISIBILITY inline 910void 911vector<_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 922template <class _Tp, class _Allocator> 923template <class _ForwardIterator> 924typename enable_if 925< 926 __is_forward_iterator<_ForwardIterator>::value, 927 void 928>::type 929vector<_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 939template <class _Tp, class _Allocator> 940void 941vector<_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. 956template <class _Tp, class _Allocator> 957void 958vector<_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. 975template <class _Tp, class _Allocator> 976void 977vector<_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 990template <class _Tp, class _Allocator> 991vector<_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 1003template <class _Tp, class _Allocator> 1004vector<_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 1016template <class _Tp, class _Allocator> 1017vector<_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 1030template <class _Tp, class _Allocator> 1031template <class _InputIterator> 1032vector<_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 1043template <class _Tp, class _Allocator> 1044template <class _InputIterator> 1045vector<_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 1057template <class _Tp, class _Allocator> 1058template <class _ForwardIterator> 1059vector<_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 1073template <class _Tp, class _Allocator> 1074template <class _ForwardIterator> 1075vector<_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 1090template <class _Tp, class _Allocator> 1091vector<_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 1105template <class _Tp, class _Allocator> 1106vector<_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 1122template <class _Tp, class _Allocator> 1123_LIBCPP_INLINE_VISIBILITY inline 1124vector<_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 1138template <class _Tp, class _Allocator> 1139_LIBCPP_INLINE_VISIBILITY inline 1140vector<_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 1165template <class _Tp, class _Allocator> 1166_LIBCPP_INLINE_VISIBILITY inline 1167vector<_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 1179template <class _Tp, class _Allocator> 1180_LIBCPP_INLINE_VISIBILITY inline 1181vector<_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 1196template <class _Tp, class _Allocator> 1197_LIBCPP_INLINE_VISIBILITY inline 1198vector<_Tp, _Allocator>& 1199vector<_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 1209template <class _Tp, class _Allocator> 1210void 1211vector<_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 1222template <class _Tp, class _Allocator> 1223void 1224vector<_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 1240template <class _Tp, class _Allocator> 1241_LIBCPP_INLINE_VISIBILITY inline 1242vector<_Tp, _Allocator>& 1243vector<_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 1253template <class _Tp, class _Allocator> 1254template <class _InputIterator> 1255typename enable_if 1256< 1257 __is_input_iterator <_InputIterator>::value && 1258 !__is_forward_iterator<_InputIterator>::value, 1259 void 1260>::type 1261vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last) 1262{ 1263 clear(); 1264 for (; __first != __last; ++__first) 1265 push_back(*__first); 1266} 1267 1268template <class _Tp, class _Allocator> 1269template <class _ForwardIterator> 1270typename enable_if 1271< 1272 __is_forward_iterator<_ForwardIterator>::value, 1273 void 1274>::type 1275vector<_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 1302template <class _Tp, class _Allocator> 1303void 1304vector<_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 1323template <class _Tp, class _Allocator> 1324_LIBCPP_INLINE_VISIBILITY inline 1325typename vector<_Tp, _Allocator>::iterator 1326vector<_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 1335template <class _Tp, class _Allocator> 1336_LIBCPP_INLINE_VISIBILITY inline 1337typename vector<_Tp, _Allocator>::const_iterator 1338vector<_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 1347template <class _Tp, class _Allocator> 1348_LIBCPP_INLINE_VISIBILITY inline 1349typename vector<_Tp, _Allocator>::iterator 1350vector<_Tp, _Allocator>::begin() _NOEXCEPT 1351{ 1352 return __make_iter(this->__begin_); 1353} 1354 1355template <class _Tp, class _Allocator> 1356_LIBCPP_INLINE_VISIBILITY inline 1357typename vector<_Tp, _Allocator>::const_iterator 1358vector<_Tp, _Allocator>::begin() const _NOEXCEPT 1359{ 1360 return __make_iter(this->__begin_); 1361} 1362 1363template <class _Tp, class _Allocator> 1364_LIBCPP_INLINE_VISIBILITY inline 1365typename vector<_Tp, _Allocator>::iterator 1366vector<_Tp, _Allocator>::end() _NOEXCEPT 1367{ 1368 return __make_iter(this->__end_); 1369} 1370 1371template <class _Tp, class _Allocator> 1372_LIBCPP_INLINE_VISIBILITY inline 1373typename vector<_Tp, _Allocator>::const_iterator 1374vector<_Tp, _Allocator>::end() const _NOEXCEPT 1375{ 1376 return __make_iter(this->__end_); 1377} 1378 1379template <class _Tp, class _Allocator> 1380_LIBCPP_INLINE_VISIBILITY inline 1381typename vector<_Tp, _Allocator>::reference 1382vector<_Tp, _Allocator>::operator[](size_type __n) 1383{ 1384 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds"); 1385 return this->__begin_[__n]; 1386} 1387 1388template <class _Tp, class _Allocator> 1389_LIBCPP_INLINE_VISIBILITY inline 1390typename vector<_Tp, _Allocator>::const_reference 1391vector<_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 1397template <class _Tp, class _Allocator> 1398typename vector<_Tp, _Allocator>::reference 1399vector<_Tp, _Allocator>::at(size_type __n) 1400{ 1401 if (__n >= size()) 1402 this->__throw_out_of_range(); 1403 return this->__begin_[__n]; 1404} 1405 1406template <class _Tp, class _Allocator> 1407typename vector<_Tp, _Allocator>::const_reference 1408vector<_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 1415template <class _Tp, class _Allocator> 1416void 1417vector<_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 1427template <class _Tp, class _Allocator> 1428void 1429vector<_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 1449template <class _Tp, class _Allocator> 1450template <class _Up> 1451void 1452#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1453vector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x) 1454#else 1455vector<_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 __swap_out_circular_buffer(__v); 1463} 1464 1465template <class _Tp, class _Allocator> 1466_LIBCPP_INLINE_VISIBILITY inline 1467void 1468vector<_Tp, _Allocator>::push_back(const_reference __x) 1469{ 1470 if (this->__end_ != this->__end_cap()) 1471 { 1472 __alloc_traits::construct(this->__alloc(), 1473 _VSTD::__to_raw_pointer(this->__end_), __x); 1474 ++this->__end_; 1475 } 1476 else 1477 __push_back_slow_path(__x); 1478} 1479 1480#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1481 1482template <class _Tp, class _Allocator> 1483_LIBCPP_INLINE_VISIBILITY inline 1484void 1485vector<_Tp, _Allocator>::push_back(value_type&& __x) 1486{ 1487 if (this->__end_ < this->__end_cap()) 1488 { 1489 __alloc_traits::construct(this->__alloc(), 1490 _VSTD::__to_raw_pointer(this->__end_), 1491 _VSTD::move(__x)); 1492 ++this->__end_; 1493 } 1494 else 1495 __push_back_slow_path(_VSTD::move(__x)); 1496} 1497 1498#ifndef _LIBCPP_HAS_NO_VARIADICS 1499 1500template <class _Tp, class _Allocator> 1501template <class... _Args> 1502void 1503vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args) 1504{ 1505 allocator_type& __a = this->__alloc(); 1506 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a); 1507// __v.emplace_back(_VSTD::forward<_Args>(__args)...); 1508 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_++), _VSTD::forward<_Args>(__args)...); 1509 __swap_out_circular_buffer(__v); 1510} 1511 1512template <class _Tp, class _Allocator> 1513template <class... _Args> 1514_LIBCPP_INLINE_VISIBILITY inline 1515void 1516vector<_Tp, _Allocator>::emplace_back(_Args&&... __args) 1517{ 1518 if (this->__end_ < this->__end_cap()) 1519 { 1520 __alloc_traits::construct(this->__alloc(), 1521 _VSTD::__to_raw_pointer(this->__end_), 1522 _VSTD::forward<_Args>(__args)...); 1523 ++this->__end_; 1524 } 1525 else 1526 __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...); 1527} 1528 1529#endif // _LIBCPP_HAS_NO_VARIADICS 1530#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1531 1532template <class _Tp, class _Allocator> 1533_LIBCPP_INLINE_VISIBILITY inline 1534void 1535vector<_Tp, _Allocator>::pop_back() 1536{ 1537 _LIBCPP_ASSERT(!empty(), "vector::pop_back called for empty vector"); 1538 this->__destruct_at_end(this->__end_ - 1); 1539} 1540 1541template <class _Tp, class _Allocator> 1542_LIBCPP_INLINE_VISIBILITY inline 1543typename vector<_Tp, _Allocator>::iterator 1544vector<_Tp, _Allocator>::erase(const_iterator __position) 1545{ 1546#if _LIBCPP_DEBUG_LEVEL >= 2 1547 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1548 "vector::erase(iterator) called with an iterator not" 1549 " referring to this vector"); 1550#endif 1551 pointer __p = const_cast<pointer>(&*__position); 1552 iterator __r = __make_iter(__p); 1553 this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p)); 1554 return __r; 1555} 1556 1557template <class _Tp, class _Allocator> 1558typename vector<_Tp, _Allocator>::iterator 1559vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last) 1560{ 1561#if _LIBCPP_DEBUG_LEVEL >= 2 1562 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this, 1563 "vector::erase(iterator, iterator) called with an iterator not" 1564 " referring to this vector"); 1565#endif 1566 _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range"); 1567 pointer __p = this->__begin_ + (__first - begin()); 1568 iterator __r = __make_iter(__p); 1569 this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p)); 1570 return __r; 1571} 1572 1573template <class _Tp, class _Allocator> 1574void 1575vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to) 1576{ 1577 pointer __old_last = this->__end_; 1578 difference_type __n = __old_last - __to; 1579 for (pointer __i = __from_s + __n; __i < __from_e; ++__i, ++this->__end_) 1580 __alloc_traits::construct(this->__alloc(), 1581 _VSTD::__to_raw_pointer(this->__end_), 1582 _VSTD::move(*__i)); 1583 _VSTD::move_backward(__from_s, __from_s + __n, __old_last); 1584} 1585 1586template <class _Tp, class _Allocator> 1587typename vector<_Tp, _Allocator>::iterator 1588vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x) 1589{ 1590#if _LIBCPP_DEBUG_LEVEL >= 2 1591 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1592 "vector::insert(iterator, x) called with an iterator not" 1593 " referring to this vector"); 1594#endif 1595 pointer __p = this->__begin_ + (__position - begin()); 1596 if (this->__end_ < this->__end_cap()) 1597 { 1598 if (__p == this->__end_) 1599 { 1600 __alloc_traits::construct(this->__alloc(), 1601 _VSTD::__to_raw_pointer(this->__end_), __x); 1602 ++this->__end_; 1603 } 1604 else 1605 { 1606 __move_range(__p, this->__end_, __p + 1); 1607 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x); 1608 if (__p <= __xr && __xr < this->__end_) 1609 ++__xr; 1610 *__p = *__xr; 1611 } 1612 } 1613 else 1614 { 1615 allocator_type& __a = this->__alloc(); 1616 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); 1617 __v.push_back(__x); 1618 __p = __swap_out_circular_buffer(__v, __p); 1619 } 1620 return __make_iter(__p); 1621} 1622 1623#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1624 1625template <class _Tp, class _Allocator> 1626typename vector<_Tp, _Allocator>::iterator 1627vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x) 1628{ 1629#if _LIBCPP_DEBUG_LEVEL >= 2 1630 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1631 "vector::insert(iterator, x) called with an iterator not" 1632 " referring to this vector"); 1633#endif 1634 pointer __p = this->__begin_ + (__position - begin()); 1635 if (this->__end_ < this->__end_cap()) 1636 { 1637 if (__p == this->__end_) 1638 { 1639 __alloc_traits::construct(this->__alloc(), 1640 _VSTD::__to_raw_pointer(this->__end_), 1641 _VSTD::move(__x)); 1642 ++this->__end_; 1643 } 1644 else 1645 { 1646 __move_range(__p, this->__end_, __p + 1); 1647 *__p = _VSTD::move(__x); 1648 } 1649 } 1650 else 1651 { 1652 allocator_type& __a = this->__alloc(); 1653 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); 1654 __v.push_back(_VSTD::move(__x)); 1655 __p = __swap_out_circular_buffer(__v, __p); 1656 } 1657 return __make_iter(__p); 1658} 1659 1660#ifndef _LIBCPP_HAS_NO_VARIADICS 1661 1662template <class _Tp, class _Allocator> 1663template <class... _Args> 1664typename vector<_Tp, _Allocator>::iterator 1665vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args) 1666{ 1667#if _LIBCPP_DEBUG_LEVEL >= 2 1668 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1669 "vector::emplace(iterator, x) called with an iterator not" 1670 " referring to this vector"); 1671#endif 1672 pointer __p = this->__begin_ + (__position - begin()); 1673 if (this->__end_ < this->__end_cap()) 1674 { 1675 if (__p == this->__end_) 1676 { 1677 __alloc_traits::construct(this->__alloc(), 1678 _VSTD::__to_raw_pointer(this->__end_), 1679 _VSTD::forward<_Args>(__args)...); 1680 ++this->__end_; 1681 } 1682 else 1683 { 1684 value_type __tmp(_VSTD::forward<_Args>(__args)...); 1685 __move_range(__p, this->__end_, __p + 1); 1686 *__p = _VSTD::move(__tmp); 1687 } 1688 } 1689 else 1690 { 1691 allocator_type& __a = this->__alloc(); 1692 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); 1693 __v.emplace_back(_VSTD::forward<_Args>(__args)...); 1694 __p = __swap_out_circular_buffer(__v, __p); 1695 } 1696 return __make_iter(__p); 1697} 1698 1699#endif // _LIBCPP_HAS_NO_VARIADICS 1700#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1701 1702template <class _Tp, class _Allocator> 1703typename vector<_Tp, _Allocator>::iterator 1704vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x) 1705{ 1706#if _LIBCPP_DEBUG_LEVEL >= 2 1707 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1708 "vector::insert(iterator, n, x) called with an iterator not" 1709 " referring to this vector"); 1710#endif 1711 pointer __p = this->__begin_ + (__position - begin()); 1712 if (__n > 0) 1713 { 1714 if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_)) 1715 { 1716 size_type __old_n = __n; 1717 pointer __old_last = this->__end_; 1718 if (__n > static_cast<size_type>(this->__end_ - __p)) 1719 { 1720 size_type __cx = __n - (this->__end_ - __p); 1721 __construct_at_end(__cx, __x); 1722 __n -= __cx; 1723 } 1724 if (__n > 0) 1725 { 1726 __move_range(__p, __old_last, __p + __old_n); 1727 const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x); 1728 if (__p <= __xr && __xr < this->__end_) 1729 __xr += __old_n; 1730 _VSTD::fill_n(__p, __n, *__xr); 1731 } 1732 } 1733 else 1734 { 1735 allocator_type& __a = this->__alloc(); 1736 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a); 1737 __v.__construct_at_end(__n, __x); 1738 __p = __swap_out_circular_buffer(__v, __p); 1739 } 1740 } 1741 return __make_iter(__p); 1742} 1743 1744template <class _Tp, class _Allocator> 1745template <class _InputIterator> 1746typename enable_if 1747< 1748 __is_input_iterator <_InputIterator>::value && 1749 !__is_forward_iterator<_InputIterator>::value, 1750 typename vector<_Tp, _Allocator>::iterator 1751>::type 1752vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last) 1753{ 1754#if _LIBCPP_DEBUG_LEVEL >= 2 1755 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1756 "vector::insert(iterator, range) called with an iterator not" 1757 " referring to this vector"); 1758#endif 1759 difference_type __off = __position - begin(); 1760 pointer __p = this->__begin_ + __off; 1761 allocator_type& __a = this->__alloc(); 1762 pointer __old_last = this->__end_; 1763 for (; this->__end_ != this->__end_cap() && __first != __last; ++__first) 1764 { 1765 __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), 1766 *__first); 1767 ++this->__end_; 1768 } 1769 __split_buffer<value_type, allocator_type&> __v(__a); 1770 if (__first != __last) 1771 { 1772#ifndef _LIBCPP_NO_EXCEPTIONS 1773 try 1774 { 1775#endif // _LIBCPP_NO_EXCEPTIONS 1776 __v.__construct_at_end(__first, __last); 1777 difference_type __old_size = __old_last - this->__begin_; 1778 difference_type __old_p = __p - this->__begin_; 1779 reserve(__recommend(size() + __v.size())); 1780 __p = this->__begin_ + __old_p; 1781 __old_last = this->__begin_ + __old_size; 1782#ifndef _LIBCPP_NO_EXCEPTIONS 1783 } 1784 catch (...) 1785 { 1786 erase(__make_iter(__old_last), end()); 1787 throw; 1788 } 1789#endif // _LIBCPP_NO_EXCEPTIONS 1790 } 1791 __p = _VSTD::rotate(__p, __old_last, this->__end_); 1792 insert(__make_iter(__p), make_move_iterator(__v.begin()), 1793 make_move_iterator(__v.end())); 1794 return begin() + __off; 1795} 1796 1797template <class _Tp, class _Allocator> 1798template <class _ForwardIterator> 1799typename enable_if 1800< 1801 __is_forward_iterator<_ForwardIterator>::value, 1802 typename vector<_Tp, _Allocator>::iterator 1803>::type 1804vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last) 1805{ 1806#if _LIBCPP_DEBUG_LEVEL >= 2 1807 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, 1808 "vector::insert(iterator, range) called with an iterator not" 1809 " referring to this vector"); 1810#endif 1811 pointer __p = this->__begin_ + (__position - begin()); 1812 difference_type __n = _VSTD::distance(__first, __last); 1813 if (__n > 0) 1814 { 1815 if (__n <= this->__end_cap() - this->__end_) 1816 { 1817 size_type __old_n = __n; 1818 pointer __old_last = this->__end_; 1819 _ForwardIterator __m = __last; 1820 difference_type __dx = this->__end_ - __p; 1821 if (__n > __dx) 1822 { 1823 __m = __first; 1824 _VSTD::advance(__m, this->__end_ - __p); 1825 __construct_at_end(__m, __last); 1826 __n = __dx; 1827 } 1828 if (__n > 0) 1829 { 1830 __move_range(__p, __old_last, __p + __old_n); 1831 _VSTD::copy(__first, __m, __p); 1832 } 1833 } 1834 else 1835 { 1836 allocator_type& __a = this->__alloc(); 1837 __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a); 1838 __v.__construct_at_end(__first, __last); 1839 __p = __swap_out_circular_buffer(__v, __p); 1840 } 1841 } 1842 return __make_iter(__p); 1843} 1844 1845template <class _Tp, class _Allocator> 1846void 1847vector<_Tp, _Allocator>::resize(size_type __sz) 1848{ 1849 size_type __cs = size(); 1850 if (__cs < __sz) 1851 this->__append(__sz - __cs); 1852 else if (__cs > __sz) 1853 this->__destruct_at_end(this->__begin_ + __sz); 1854} 1855 1856template <class _Tp, class _Allocator> 1857void 1858vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x) 1859{ 1860 size_type __cs = size(); 1861 if (__cs < __sz) 1862 this->__append(__sz - __cs, __x); 1863 else if (__cs > __sz) 1864 this->__destruct_at_end(this->__begin_ + __sz); 1865} 1866 1867template <class _Tp, class _Allocator> 1868void 1869vector<_Tp, _Allocator>::swap(vector& __x) 1870 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 1871 __is_nothrow_swappable<allocator_type>::value) 1872{ 1873 _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value || 1874 this->__alloc() == __x.__alloc(), 1875 "vector::swap: Either propagate_on_container_swap must be true" 1876 " or the allocators must compare equal"); 1877 _VSTD::swap(this->__begin_, __x.__begin_); 1878 _VSTD::swap(this->__end_, __x.__end_); 1879 _VSTD::swap(this->__end_cap(), __x.__end_cap()); 1880 __base::__swap_alloc(this->__alloc(), __x.__alloc()); 1881#if _LIBCPP_DEBUG_LEVEL >= 2 1882 __get_db()->swap(this, &__x); 1883#endif // _LIBCPP_DEBUG_LEVEL >= 2 1884} 1885 1886template <class _Tp, class _Allocator> 1887bool 1888vector<_Tp, _Allocator>::__invariants() const 1889{ 1890 if (this->__begin_ == 0) 1891 { 1892 if (this->__end_ != 0 || this->__end_cap() != 0) 1893 return false; 1894 } 1895 else 1896 { 1897 if (this->__begin_ > this->__end_) 1898 return false; 1899 if (this->__begin_ == this->__end_cap()) 1900 return false; 1901 if (this->__end_ > this->__end_cap()) 1902 return false; 1903 } 1904 return true; 1905} 1906 1907#if _LIBCPP_DEBUG_LEVEL >= 2 1908 1909template <class _Tp, class _Allocator> 1910bool 1911vector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const 1912{ 1913 return this->__begin_ <= __i->base() && __i->base() < this->__end_; 1914} 1915 1916template <class _Tp, class _Allocator> 1917bool 1918vector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const 1919{ 1920 return this->__begin_ < __i->base() && __i->base() <= this->__end_; 1921} 1922 1923template <class _Tp, class _Allocator> 1924bool 1925vector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const 1926{ 1927 const_pointer __p = __i->base() + __n; 1928 return this->__begin_ <= __p && __p <= this->__end_; 1929} 1930 1931template <class _Tp, class _Allocator> 1932bool 1933vector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const 1934{ 1935 const_pointer __p = __i->base() + __n; 1936 return this->__begin_ <= __p && __p < this->__end_; 1937} 1938 1939#endif // _LIBCPP_DEBUG_LEVEL >= 2 1940 1941template <class _Tp, class _Allocator> 1942_LIBCPP_INLINE_VISIBILITY inline 1943void 1944vector<_Tp, _Allocator>::__invalidate_all_iterators() 1945{ 1946#if _LIBCPP_DEBUG_LEVEL >= 2 1947 __get_db()->__invalidate_all(this); 1948#endif // _LIBCPP_DEBUG_LEVEL >= 2 1949} 1950 1951// vector<bool> 1952 1953template <class _Allocator> class vector<bool, _Allocator>; 1954 1955template <class _Allocator> struct hash<vector<bool, _Allocator> >; 1956 1957template <class _Allocator> 1958struct __has_storage_type<vector<bool, _Allocator> > 1959{ 1960 static const bool value = true; 1961}; 1962 1963template <class _Allocator> 1964class _LIBCPP_VISIBLE vector<bool, _Allocator> 1965 : private __vector_base_common<true> 1966{ 1967public: 1968 typedef vector __self; 1969 typedef bool value_type; 1970 typedef _Allocator allocator_type; 1971 typedef allocator_traits<allocator_type> __alloc_traits; 1972 typedef typename __alloc_traits::size_type size_type; 1973 typedef typename __alloc_traits::difference_type difference_type; 1974 typedef size_type __storage_type; 1975 typedef __bit_iterator<vector, false> pointer; 1976 typedef __bit_iterator<vector, true> const_pointer; 1977#ifdef _LIBCPP_DEBUG 1978 typedef __debug_iter<vector, pointer> iterator; 1979 typedef __debug_iter<vector, const_pointer> const_iterator; 1980 1981 friend class __debug_iter<vector, pointer>; 1982 friend class __debug_iter<vector, const_pointer>; 1983 1984 pair<iterator*, const_iterator*> __iterator_list_; 1985 1986 _LIBCPP_INLINE_VISIBILITY iterator*& __get_iterator_list(iterator*) {return __iterator_list_.first;} 1987 _LIBCPP_INLINE_VISIBILITY const_iterator*& __get_iterator_list(const_iterator*) {return __iterator_list_.second;} 1988#else // _LIBCPP_DEBUG 1989 typedef pointer iterator; 1990 typedef const_pointer const_iterator; 1991#endif // _LIBCPP_DEBUG 1992 typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 1993 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 1994 1995private: 1996 typedef typename __alloc_traits::template 1997#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 1998 rebind_alloc<__storage_type> 1999#else 2000 rebind_alloc<__storage_type>::other 2001#endif 2002 __storage_allocator; 2003 typedef allocator_traits<__storage_allocator> __storage_traits; 2004 typedef typename __storage_traits::pointer __storage_pointer; 2005 typedef typename __storage_traits::const_pointer __const_storage_pointer; 2006 2007 __storage_pointer __begin_; 2008 size_type __size_; 2009 __compressed_pair<size_type, __storage_allocator> __cap_alloc_; 2010public: 2011 typedef __bit_reference<vector> reference; 2012 typedef __bit_const_reference<vector> const_reference; 2013private: 2014 _LIBCPP_INLINE_VISIBILITY 2015 size_type& __cap() _NOEXCEPT 2016 {return __cap_alloc_.first();} 2017 _LIBCPP_INLINE_VISIBILITY 2018 const size_type& __cap() const _NOEXCEPT 2019 {return __cap_alloc_.first();} 2020 _LIBCPP_INLINE_VISIBILITY 2021 __storage_allocator& __alloc() _NOEXCEPT 2022 {return __cap_alloc_.second();} 2023 _LIBCPP_INLINE_VISIBILITY 2024 const __storage_allocator& __alloc() const _NOEXCEPT 2025 {return __cap_alloc_.second();} 2026 2027 static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT); 2028 2029 _LIBCPP_INLINE_VISIBILITY 2030 static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT 2031 {return __n * __bits_per_word;} 2032 _LIBCPP_INLINE_VISIBILITY 2033 static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT 2034 {return (__n - 1) / __bits_per_word + 1;} 2035 2036public: 2037 _LIBCPP_INLINE_VISIBILITY 2038 vector() 2039 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); 2040 _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a); 2041 ~vector(); 2042 explicit vector(size_type __n); 2043 vector(size_type __n, const value_type& __v); 2044 vector(size_type __n, const value_type& __v, const allocator_type& __a); 2045 template <class _InputIterator> 2046 vector(_InputIterator __first, _InputIterator __last, 2047 typename enable_if<__is_input_iterator <_InputIterator>::value && 2048 !__is_forward_iterator<_InputIterator>::value>::type* = 0); 2049 template <class _InputIterator> 2050 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, 2051 typename enable_if<__is_input_iterator <_InputIterator>::value && 2052 !__is_forward_iterator<_InputIterator>::value>::type* = 0); 2053 template <class _ForwardIterator> 2054 vector(_ForwardIterator __first, _ForwardIterator __last, 2055 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0); 2056 template <class _ForwardIterator> 2057 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, 2058 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0); 2059 2060 vector(const vector& __v); 2061 vector(const vector& __v, const allocator_type& __a); 2062 vector& operator=(const vector& __v); 2063#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2064 vector(initializer_list<value_type> __il); 2065 vector(initializer_list<value_type> __il, const allocator_type& __a); 2066#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2067 2068#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2069 _LIBCPP_INLINE_VISIBILITY 2070 vector(vector&& __v) 2071 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); 2072 vector(vector&& __v, const allocator_type& __a); 2073 _LIBCPP_INLINE_VISIBILITY 2074 vector& operator=(vector&& __v) 2075 _NOEXCEPT_( 2076 __alloc_traits::propagate_on_container_move_assignment::value && 2077 is_nothrow_move_assignable<allocator_type>::value); 2078#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 2079#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2080 _LIBCPP_INLINE_VISIBILITY 2081 vector& operator=(initializer_list<value_type> __il) 2082 {assign(__il.begin(), __il.end()); return *this;} 2083#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2084 2085 template <class _InputIterator> 2086 typename enable_if 2087 < 2088 __is_input_iterator<_InputIterator>::value && 2089 !__is_forward_iterator<_InputIterator>::value, 2090 void 2091 >::type 2092 assign(_InputIterator __first, _InputIterator __last); 2093 template <class _ForwardIterator> 2094 typename enable_if 2095 < 2096 __is_forward_iterator<_ForwardIterator>::value, 2097 void 2098 >::type 2099 assign(_ForwardIterator __first, _ForwardIterator __last); 2100 2101 void assign(size_type __n, const value_type& __x); 2102#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2103 _LIBCPP_INLINE_VISIBILITY 2104 void assign(initializer_list<value_type> __il) 2105 {assign(__il.begin(), __il.end());} 2106#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2107 2108 _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT 2109 {return allocator_type(this->__alloc());} 2110 2111 size_type max_size() const _NOEXCEPT; 2112 _LIBCPP_INLINE_VISIBILITY 2113 size_type capacity() const _NOEXCEPT 2114 {return __internal_cap_to_external(__cap());} 2115 _LIBCPP_INLINE_VISIBILITY 2116 size_type size() const _NOEXCEPT 2117 {return __size_;} 2118 _LIBCPP_INLINE_VISIBILITY 2119 bool empty() const _NOEXCEPT 2120 {return __size_ == 0;} 2121 void reserve(size_type __n); 2122 void shrink_to_fit() _NOEXCEPT; 2123 2124 _LIBCPP_INLINE_VISIBILITY 2125 iterator begin() _NOEXCEPT 2126 {return __make_iter(0);} 2127 _LIBCPP_INLINE_VISIBILITY 2128 const_iterator begin() const _NOEXCEPT 2129 {return __make_iter(0);} 2130 _LIBCPP_INLINE_VISIBILITY 2131 iterator end() _NOEXCEPT 2132 {return __make_iter(__size_);} 2133 _LIBCPP_INLINE_VISIBILITY 2134 const_iterator end() const _NOEXCEPT 2135 {return __make_iter(__size_);} 2136 2137 _LIBCPP_INLINE_VISIBILITY 2138 reverse_iterator rbegin() _NOEXCEPT 2139 {return reverse_iterator(end());} 2140 _LIBCPP_INLINE_VISIBILITY 2141 const_reverse_iterator rbegin() const _NOEXCEPT 2142 {return const_reverse_iterator(end());} 2143 _LIBCPP_INLINE_VISIBILITY 2144 reverse_iterator rend() _NOEXCEPT 2145 {return reverse_iterator(begin());} 2146 _LIBCPP_INLINE_VISIBILITY 2147 const_reverse_iterator rend() const _NOEXCEPT 2148 {return const_reverse_iterator(begin());} 2149 2150 _LIBCPP_INLINE_VISIBILITY 2151 const_iterator cbegin() const _NOEXCEPT 2152 {return __make_iter(0);} 2153 _LIBCPP_INLINE_VISIBILITY 2154 const_iterator cend() const _NOEXCEPT 2155 {return __make_iter(__size_);} 2156 _LIBCPP_INLINE_VISIBILITY 2157 const_reverse_iterator crbegin() const _NOEXCEPT 2158 {return rbegin();} 2159 _LIBCPP_INLINE_VISIBILITY 2160 const_reverse_iterator crend() const _NOEXCEPT 2161 {return rend();} 2162 2163 _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __make_ref(__n);} 2164 _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);} 2165 reference at(size_type __n); 2166 const_reference at(size_type __n) const; 2167 2168 _LIBCPP_INLINE_VISIBILITY reference front() {return __make_ref(0);} 2169 _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);} 2170 _LIBCPP_INLINE_VISIBILITY reference back() {return __make_ref(__size_ - 1);} 2171 _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __make_ref(__size_ - 1);} 2172 2173 void push_back(const value_type& __x); 2174 _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;} 2175 2176 iterator insert(const_iterator __position, const value_type& __x); 2177 iterator insert(const_iterator __position, size_type __n, const value_type& __x); 2178 iterator insert(const_iterator __position, size_type __n, const_reference __x); 2179 template <class _InputIterator> 2180 typename enable_if 2181 < 2182 __is_input_iterator <_InputIterator>::value && 2183 !__is_forward_iterator<_InputIterator>::value, 2184 iterator 2185 >::type 2186 insert(const_iterator __position, _InputIterator __first, _InputIterator __last); 2187 template <class _ForwardIterator> 2188 typename enable_if 2189 < 2190 __is_forward_iterator<_ForwardIterator>::value, 2191 iterator 2192 >::type 2193 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last); 2194#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2195 _LIBCPP_INLINE_VISIBILITY 2196 iterator insert(const_iterator __position, initializer_list<value_type> __il) 2197 {return insert(__position, __il.begin(), __il.end());} 2198#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2199 2200 _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position); 2201 iterator erase(const_iterator __first, const_iterator __last); 2202 2203 _LIBCPP_INLINE_VISIBILITY 2204 void clear() _NOEXCEPT {__size_ = 0;} 2205 2206 void swap(vector&) 2207 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 2208 __is_nothrow_swappable<allocator_type>::value); 2209 2210 void resize(size_type __sz, value_type __x = false); 2211 void flip() _NOEXCEPT; 2212 2213 bool __invariants() const; 2214 2215private: 2216 _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators(); 2217 void allocate(size_type __n); 2218 void deallocate() _NOEXCEPT; 2219 _LIBCPP_INLINE_VISIBILITY 2220 static size_type __align(size_type __new_size) _NOEXCEPT 2221 {return __new_size + (__bits_per_word-1) & ~(__bits_per_word-1);}; 2222 _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const; 2223 _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x); 2224 template <class _ForwardIterator> 2225 typename enable_if 2226 < 2227 __is_forward_iterator<_ForwardIterator>::value, 2228 void 2229 >::type 2230 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last); 2231 void __append(size_type __n, const_reference __x); 2232 _LIBCPP_INLINE_VISIBILITY 2233 reference __make_ref(size_type __pos) _NOEXCEPT 2234 {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);} 2235 _LIBCPP_INLINE_VISIBILITY 2236 const_reference __make_ref(size_type __pos) const _NOEXCEPT 2237 {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);} 2238#ifdef _LIBCPP_DEBUG 2239 _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_type __pos) 2240 {return iterator(this, pointer(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)));} 2241 _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_type __pos) const 2242 {return const_iterator(this, const_pointer(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)));} 2243 _LIBCPP_INLINE_VISIBILITY iterator __const_iterator_cast(const_iterator __p) 2244 {return iterator(this, pointer(const_cast<__storage_pointer>(__p.base().__seg_), __p.base().__ctz_));} 2245#else // _LIBCPP_DEBUG 2246 _LIBCPP_INLINE_VISIBILITY 2247 iterator __make_iter(size_type __pos) _NOEXCEPT 2248 {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));} 2249 _LIBCPP_INLINE_VISIBILITY 2250 const_iterator __make_iter(size_type __pos) const _NOEXCEPT 2251 {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));} 2252 _LIBCPP_INLINE_VISIBILITY 2253 iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT 2254 {return iterator(const_cast<__storage_pointer>(__p.__seg_), __p.__ctz_);} 2255#endif // _LIBCPP_DEBUG 2256 2257 _LIBCPP_INLINE_VISIBILITY 2258 void __copy_assign_alloc(const vector& __v) 2259 {__copy_assign_alloc(__v, integral_constant<bool, 2260 __storage_traits::propagate_on_container_copy_assignment::value>());} 2261 _LIBCPP_INLINE_VISIBILITY 2262 void __copy_assign_alloc(const vector& __c, true_type) 2263 { 2264 if (__alloc() != __c.__alloc()) 2265 deallocate(); 2266 __alloc() = __c.__alloc(); 2267 } 2268 2269 _LIBCPP_INLINE_VISIBILITY 2270 void __copy_assign_alloc(const vector&, false_type) 2271 {} 2272 2273 void __move_assign(vector& __c, false_type); 2274 void __move_assign(vector& __c, true_type) 2275 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); 2276 _LIBCPP_INLINE_VISIBILITY 2277 void __move_assign_alloc(vector& __c) 2278 _NOEXCEPT_( 2279 !__storage_traits::propagate_on_container_move_assignment::value || 2280 is_nothrow_move_assignable<allocator_type>::value) 2281 {__move_assign_alloc(__c, integral_constant<bool, 2282 __storage_traits::propagate_on_container_move_assignment::value>());} 2283 _LIBCPP_INLINE_VISIBILITY 2284 void __move_assign_alloc(vector& __c, true_type) 2285 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 2286 { 2287 __alloc() = _VSTD::move(__c.__alloc()); 2288 } 2289 2290 _LIBCPP_INLINE_VISIBILITY 2291 void __move_assign_alloc(vector&, false_type) 2292 _NOEXCEPT 2293 {} 2294 2295 _LIBCPP_INLINE_VISIBILITY 2296 static void __swap_alloc(__storage_allocator& __x, __storage_allocator& __y) 2297 _NOEXCEPT_( 2298 !__storage_traits::propagate_on_container_swap::value || 2299 __is_nothrow_swappable<allocator_type>::value) 2300 {__swap_alloc(__x, __y, integral_constant<bool, 2301 __storage_traits::propagate_on_container_swap::value>());} 2302 2303 _LIBCPP_INLINE_VISIBILITY 2304 static void __swap_alloc(__storage_allocator& __x, __storage_allocator& __y, true_type) 2305 _NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value) 2306 { 2307 using _VSTD::swap; 2308 swap(__x, __y); 2309 } 2310 _LIBCPP_INLINE_VISIBILITY 2311 static void __swap_alloc(__storage_allocator&, __storage_allocator&, false_type) 2312 _NOEXCEPT 2313 {} 2314 2315 size_t __hash_code() const _NOEXCEPT; 2316 2317 friend class __bit_reference<vector>; 2318 friend class __bit_const_reference<vector>; 2319 friend class __bit_iterator<vector, false>; 2320 friend class __bit_iterator<vector, true>; 2321 friend struct __bit_array<vector>; 2322 friend struct _LIBCPP_VISIBLE hash<vector>; 2323}; 2324 2325template <class _Allocator> 2326#ifndef _LIBCPP_DEBUG 2327_LIBCPP_INLINE_VISIBILITY inline 2328#endif 2329void 2330vector<bool, _Allocator>::__invalidate_all_iterators() 2331{ 2332#ifdef _LIBCPP_DEBUG 2333 iterator::__remove_all(this); 2334 const_iterator::__remove_all(this); 2335#endif // _LIBCPP_DEBUG 2336} 2337 2338// Allocate space for __n objects 2339// throws length_error if __n > max_size() 2340// throws (probably bad_alloc) if memory run out 2341// Precondition: __begin_ == __end_ == __cap() == 0 2342// Precondition: __n > 0 2343// Postcondition: capacity() == __n 2344// Postcondition: size() == 0 2345template <class _Allocator> 2346void 2347vector<bool, _Allocator>::allocate(size_type __n) 2348{ 2349 if (__n > max_size()) 2350 this->__throw_length_error(); 2351 __n = __external_cap_to_internal(__n); 2352 this->__begin_ = __storage_traits::allocate(this->__alloc(), __n); 2353 this->__size_ = 0; 2354 this->__cap() = __n; 2355} 2356 2357template <class _Allocator> 2358void 2359vector<bool, _Allocator>::deallocate() _NOEXCEPT 2360{ 2361 if (this->__begin_ != 0) 2362 { 2363 __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap()); 2364 __invalidate_all_iterators(); 2365 this->__begin_ = 0; 2366 this->__size_ = this->__cap() = 0; 2367 } 2368} 2369 2370template <class _Allocator> 2371typename vector<bool, _Allocator>::size_type 2372vector<bool, _Allocator>::max_size() const _NOEXCEPT 2373{ 2374 size_type __amax = __storage_traits::max_size(__alloc()); 2375 size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always 2376 if (__nmax / __bits_per_word <= __amax) 2377 return __nmax; 2378 return __internal_cap_to_external(__amax); 2379} 2380 2381// Precondition: __new_size > capacity() 2382template <class _Allocator> 2383_LIBCPP_INLINE_VISIBILITY inline 2384typename vector<bool, _Allocator>::size_type 2385vector<bool, _Allocator>::__recommend(size_type __new_size) const 2386{ 2387 const size_type __ms = max_size(); 2388 if (__new_size > __ms) 2389 this->__throw_length_error(); 2390 const size_type __cap = capacity(); 2391 if (__cap >= __ms / 2) 2392 return __ms; 2393 return _VSTD::max(2*__cap, __align(__new_size)); 2394} 2395 2396// Default constructs __n objects starting at __end_ 2397// Precondition: __n > 0 2398// Precondition: size() + __n <= capacity() 2399// Postcondition: size() == size() + __n 2400template <class _Allocator> 2401_LIBCPP_INLINE_VISIBILITY inline 2402void 2403vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x) 2404{ 2405 size_type __old_size = this->__size_; 2406 this->__size_ += __n; 2407 _VSTD::fill_n(__make_iter(__old_size), __n, __x); 2408} 2409 2410template <class _Allocator> 2411template <class _ForwardIterator> 2412typename enable_if 2413< 2414 __is_forward_iterator<_ForwardIterator>::value, 2415 void 2416>::type 2417vector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last) 2418{ 2419 size_type __old_size = this->__size_; 2420 this->__size_ += _VSTD::distance(__first, __last); 2421 _VSTD::copy(__first, __last, __make_iter(__old_size)); 2422} 2423 2424template <class _Allocator> 2425_LIBCPP_INLINE_VISIBILITY inline 2426vector<bool, _Allocator>::vector() 2427 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) 2428 : __begin_(0), 2429 __size_(0), 2430 __cap_alloc_(0) 2431{ 2432} 2433 2434template <class _Allocator> 2435_LIBCPP_INLINE_VISIBILITY inline 2436vector<bool, _Allocator>::vector(const allocator_type& __a) 2437 : __begin_(0), 2438 __size_(0), 2439 __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 2440{ 2441} 2442 2443template <class _Allocator> 2444vector<bool, _Allocator>::vector(size_type __n) 2445 : __begin_(0), 2446 __size_(0), 2447 __cap_alloc_(0) 2448{ 2449 if (__n > 0) 2450 { 2451 allocate(__n); 2452 __construct_at_end(__n, false); 2453 } 2454} 2455 2456template <class _Allocator> 2457vector<bool, _Allocator>::vector(size_type __n, const value_type& __x) 2458 : __begin_(0), 2459 __size_(0), 2460 __cap_alloc_(0) 2461{ 2462 if (__n > 0) 2463 { 2464 allocate(__n); 2465 __construct_at_end(__n, __x); 2466 } 2467} 2468 2469template <class _Allocator> 2470vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a) 2471 : __begin_(0), 2472 __size_(0), 2473 __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 2474{ 2475 if (__n > 0) 2476 { 2477 allocate(__n); 2478 __construct_at_end(__n, __x); 2479 } 2480} 2481 2482template <class _Allocator> 2483template <class _InputIterator> 2484vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, 2485 typename enable_if<__is_input_iterator <_InputIterator>::value && 2486 !__is_forward_iterator<_InputIterator>::value>::type*) 2487 : __begin_(0), 2488 __size_(0), 2489 __cap_alloc_(0) 2490{ 2491#ifndef _LIBCPP_NO_EXCEPTIONS 2492 try 2493 { 2494#endif // _LIBCPP_NO_EXCEPTIONS 2495 for (; __first != __last; ++__first) 2496 push_back(*__first); 2497#ifndef _LIBCPP_NO_EXCEPTIONS 2498 } 2499 catch (...) 2500 { 2501 if (__begin_ != 0) 2502 __storage_traits::deallocate(__alloc(), __begin_, __cap()); 2503 __invalidate_all_iterators(); 2504 throw; 2505 } 2506#endif // _LIBCPP_NO_EXCEPTIONS 2507} 2508 2509template <class _Allocator> 2510template <class _InputIterator> 2511vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, 2512 typename enable_if<__is_input_iterator <_InputIterator>::value && 2513 !__is_forward_iterator<_InputIterator>::value>::type*) 2514 : __begin_(0), 2515 __size_(0), 2516 __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 2517{ 2518#ifndef _LIBCPP_NO_EXCEPTIONS 2519 try 2520 { 2521#endif // _LIBCPP_NO_EXCEPTIONS 2522 for (; __first != __last; ++__first) 2523 push_back(*__first); 2524#ifndef _LIBCPP_NO_EXCEPTIONS 2525 } 2526 catch (...) 2527 { 2528 if (__begin_ != 0) 2529 __storage_traits::deallocate(__alloc(), __begin_, __cap()); 2530 __invalidate_all_iterators(); 2531 throw; 2532 } 2533#endif // _LIBCPP_NO_EXCEPTIONS 2534} 2535 2536template <class _Allocator> 2537template <class _ForwardIterator> 2538vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, 2539 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*) 2540 : __begin_(0), 2541 __size_(0), 2542 __cap_alloc_(0) 2543{ 2544 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); 2545 if (__n > 0) 2546 { 2547 allocate(__n); 2548 __construct_at_end(__first, __last); 2549 } 2550} 2551 2552template <class _Allocator> 2553template <class _ForwardIterator> 2554vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, 2555 typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*) 2556 : __begin_(0), 2557 __size_(0), 2558 __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 2559{ 2560 size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); 2561 if (__n > 0) 2562 { 2563 allocate(__n); 2564 __construct_at_end(__first, __last); 2565 } 2566} 2567 2568#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2569 2570template <class _Allocator> 2571vector<bool, _Allocator>::vector(initializer_list<value_type> __il) 2572 : __begin_(0), 2573 __size_(0), 2574 __cap_alloc_(0) 2575{ 2576 size_type __n = static_cast<size_type>(__il.size()); 2577 if (__n > 0) 2578 { 2579 allocate(__n); 2580 __construct_at_end(__il.begin(), __il.end()); 2581 } 2582} 2583 2584template <class _Allocator> 2585vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a) 2586 : __begin_(0), 2587 __size_(0), 2588 __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 2589{ 2590 size_type __n = static_cast<size_type>(__il.size()); 2591 if (__n > 0) 2592 { 2593 allocate(__n); 2594 __construct_at_end(__il.begin(), __il.end()); 2595 } 2596} 2597 2598#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 2599 2600template <class _Allocator> 2601vector<bool, _Allocator>::~vector() 2602{ 2603 if (__begin_ != 0) 2604 __storage_traits::deallocate(__alloc(), __begin_, __cap()); 2605#ifdef _LIBCPP_DEBUG 2606 __invalidate_all_iterators(); 2607#endif 2608} 2609 2610template <class _Allocator> 2611vector<bool, _Allocator>::vector(const vector& __v) 2612 : __begin_(0), 2613 __size_(0), 2614 __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc())) 2615{ 2616 if (__v.size() > 0) 2617 { 2618 allocate(__v.size()); 2619 __construct_at_end(__v.begin(), __v.end()); 2620 } 2621} 2622 2623template <class _Allocator> 2624vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a) 2625 : __begin_(0), 2626 __size_(0), 2627 __cap_alloc_(0, __a) 2628{ 2629 if (__v.size() > 0) 2630 { 2631 allocate(__v.size()); 2632 __construct_at_end(__v.begin(), __v.end()); 2633 } 2634} 2635 2636template <class _Allocator> 2637vector<bool, _Allocator>& 2638vector<bool, _Allocator>::operator=(const vector& __v) 2639{ 2640 if (this != &__v) 2641 { 2642 __copy_assign_alloc(__v); 2643 if (__v.__size_) 2644 { 2645 if (__v.__size_ > capacity()) 2646 { 2647 deallocate(); 2648 allocate(__v.__size_); 2649 } 2650 _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_); 2651 } 2652 __size_ = __v.__size_; 2653 } 2654 return *this; 2655} 2656 2657#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 2658 2659template <class _Allocator> 2660_LIBCPP_INLINE_VISIBILITY inline 2661vector<bool, _Allocator>::vector(vector&& __v) 2662 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) 2663 : __begin_(__v.__begin_), 2664 __size_(__v.__size_), 2665 __cap_alloc_(__v.__cap_alloc_) 2666{ 2667 __v.__begin_ = 0; 2668 __v.__size_ = 0; 2669 __v.__cap() = 0; 2670} 2671 2672template <class _Allocator> 2673vector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a) 2674 : __begin_(0), 2675 __size_(0), 2676 __cap_alloc_(0, __a) 2677{ 2678 if (__a == allocator_type(__v.__alloc())) 2679 { 2680 this->__begin_ = __v.__begin_; 2681 this->__size_ = __v.__size_; 2682 this->__cap() = __v.__cap(); 2683 __v.__begin_ = nullptr; 2684 __v.__cap() = __v.__size_ = 0; 2685 } 2686 else if (__v.size() > 0) 2687 { 2688 allocate(__v.size()); 2689 __construct_at_end(__v.begin(), __v.end()); 2690 } 2691} 2692 2693template <class _Allocator> 2694_LIBCPP_INLINE_VISIBILITY inline 2695vector<bool, _Allocator>& 2696vector<bool, _Allocator>::operator=(vector&& __v) 2697 _NOEXCEPT_( 2698 __alloc_traits::propagate_on_container_move_assignment::value && 2699 is_nothrow_move_assignable<allocator_type>::value) 2700{ 2701 __move_assign(__v, integral_constant<bool, 2702 __storage_traits::propagate_on_container_move_assignment::value>()); 2703 return *this; 2704} 2705 2706template <class _Allocator> 2707void 2708vector<bool, _Allocator>::__move_assign(vector& __c, false_type) 2709{ 2710 if (__alloc() != __c.__alloc()) 2711 assign(__c.begin(), __c.end()); 2712 else 2713 __move_assign(__c, true_type()); 2714} 2715 2716template <class _Allocator> 2717void 2718vector<bool, _Allocator>::__move_assign(vector& __c, true_type) 2719 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 2720{ 2721 deallocate(); 2722 this->__begin_ = __c.__begin_; 2723 this->__size_ = __c.__size_; 2724 this->__cap() = __c.__cap(); 2725 __move_assign_alloc(__c); 2726 __c.__begin_ = nullptr; 2727 __c.__cap() = __c.__size_ = 0; 2728} 2729 2730#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 2731 2732template <class _Allocator> 2733void 2734vector<bool, _Allocator>::assign(size_type __n, const value_type& __x) 2735{ 2736 __size_ = 0; 2737 if (__n > 0) 2738 { 2739 size_type __c = capacity(); 2740 if (__n <= __c) 2741 __size_ = __n; 2742 else 2743 { 2744 vector __v(__alloc()); 2745 __v.reserve(__recommend(__n)); 2746 __v.__size_ = __n; 2747 swap(__v); 2748 } 2749 _VSTD::fill_n(begin(), __n, __x); 2750 } 2751} 2752 2753template <class _Allocator> 2754template <class _InputIterator> 2755typename enable_if 2756< 2757 __is_input_iterator<_InputIterator>::value && 2758 !__is_forward_iterator<_InputIterator>::value, 2759 void 2760>::type 2761vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last) 2762{ 2763 clear(); 2764 for (; __first != __last; ++__first) 2765 push_back(*__first); 2766} 2767 2768template <class _Allocator> 2769template <class _ForwardIterator> 2770typename enable_if 2771< 2772 __is_forward_iterator<_ForwardIterator>::value, 2773 void 2774>::type 2775vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) 2776{ 2777 clear(); 2778 difference_type __n = _VSTD::distance(__first, __last); 2779 if (__n) 2780 { 2781 if (__n > capacity()) 2782 { 2783 deallocate(); 2784 allocate(__n); 2785 } 2786 __construct_at_end(__first, __last); 2787 } 2788} 2789 2790template <class _Allocator> 2791void 2792vector<bool, _Allocator>::reserve(size_type __n) 2793{ 2794 if (__n > capacity()) 2795 { 2796 vector __v(this->__alloc()); 2797 __v.allocate(__n); 2798 __v.__construct_at_end(this->begin(), this->end()); 2799 swap(__v); 2800 __invalidate_all_iterators(); 2801 } 2802} 2803 2804template <class _Allocator> 2805void 2806vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT 2807{ 2808 if (__external_cap_to_internal(size()) > __cap()) 2809 { 2810#ifndef _LIBCPP_NO_EXCEPTIONS 2811 try 2812 { 2813#endif // _LIBCPP_NO_EXCEPTIONS 2814 vector(*this, allocator_type(__alloc())).swap(*this); 2815#ifndef _LIBCPP_NO_EXCEPTIONS 2816 } 2817 catch (...) 2818 { 2819 } 2820#endif // _LIBCPP_NO_EXCEPTIONS 2821 } 2822} 2823 2824template <class _Allocator> 2825typename vector<bool, _Allocator>::reference 2826vector<bool, _Allocator>::at(size_type __n) 2827{ 2828 if (__n >= size()) 2829 this->__throw_out_of_range(); 2830 return (*this)[__n]; 2831} 2832 2833template <class _Allocator> 2834typename vector<bool, _Allocator>::const_reference 2835vector<bool, _Allocator>::at(size_type __n) const 2836{ 2837 if (__n >= size()) 2838 this->__throw_out_of_range(); 2839 return (*this)[__n]; 2840} 2841 2842template <class _Allocator> 2843void 2844vector<bool, _Allocator>::push_back(const value_type& __x) 2845{ 2846 if (this->__size_ == this->capacity()) 2847 reserve(__recommend(this->__size_ + 1)); 2848 ++this->__size_; 2849 back() = __x; 2850} 2851 2852template <class _Allocator> 2853typename vector<bool, _Allocator>::iterator 2854vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x) 2855{ 2856 iterator __r; 2857 if (size() < capacity()) 2858 { 2859 const_iterator __old_end = end(); 2860 ++__size_; 2861 _VSTD::copy_backward(__position, __old_end, end()); 2862 __r = __const_iterator_cast(__position); 2863 } 2864 else 2865 { 2866 vector __v(__alloc()); 2867 __v.reserve(__recommend(__size_ + 1)); 2868 __v.__size_ = __size_ + 1; 2869 __r = _VSTD::copy(cbegin(), __position, __v.begin()); 2870 _VSTD::copy_backward(__position, cend(), __v.end()); 2871 swap(__v); 2872 } 2873 *__r = __x; 2874 return __r; 2875} 2876 2877template <class _Allocator> 2878typename vector<bool, _Allocator>::iterator 2879vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x) 2880{ 2881 iterator __r; 2882 size_type __c = capacity(); 2883 if (__n <= __c && size() <= __c - __n) 2884 { 2885 const_iterator __old_end = end(); 2886 __size_ += __n; 2887 _VSTD::copy_backward(__position, __old_end, end()); 2888 __r = __const_iterator_cast(__position); 2889 } 2890 else 2891 { 2892 vector __v(__alloc()); 2893 __v.reserve(__recommend(__size_ + __n)); 2894 __v.__size_ = __size_ + __n; 2895 __r = _VSTD::copy(cbegin(), __position, __v.begin()); 2896 _VSTD::copy_backward(__position, cend(), __v.end()); 2897 swap(__v); 2898 } 2899 _VSTD::fill_n(__r, __n, __x); 2900 return __r; 2901} 2902 2903template <class _Allocator> 2904template <class _InputIterator> 2905typename enable_if 2906< 2907 __is_input_iterator <_InputIterator>::value && 2908 !__is_forward_iterator<_InputIterator>::value, 2909 typename vector<bool, _Allocator>::iterator 2910>::type 2911vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last) 2912{ 2913 difference_type __off = __position - begin(); 2914 iterator __p = __const_iterator_cast(__position); 2915 iterator __old_end = end(); 2916 for (; size() != capacity() && __first != __last; ++__first) 2917 { 2918 ++this->__size_; 2919 back() = *__first; 2920 } 2921 vector __v(__alloc()); 2922 if (__first != __last) 2923 { 2924#ifndef _LIBCPP_NO_EXCEPTIONS 2925 try 2926 { 2927#endif // _LIBCPP_NO_EXCEPTIONS 2928 __v.assign(__first, __last); 2929 difference_type __old_size = static_cast<difference_type>(__old_end - begin()); 2930 difference_type __old_p = __p - begin(); 2931 reserve(__recommend(size() + __v.size())); 2932 __p = begin() + __old_p; 2933 __old_end = begin() + __old_size; 2934#ifndef _LIBCPP_NO_EXCEPTIONS 2935 } 2936 catch (...) 2937 { 2938 erase(__old_end, end()); 2939 throw; 2940 } 2941#endif // _LIBCPP_NO_EXCEPTIONS 2942 } 2943 __p = _VSTD::rotate(__p, __old_end, end()); 2944 insert(__p, __v.begin(), __v.end()); 2945 return begin() + __off; 2946} 2947 2948template <class _Allocator> 2949template <class _ForwardIterator> 2950typename enable_if 2951< 2952 __is_forward_iterator<_ForwardIterator>::value, 2953 typename vector<bool, _Allocator>::iterator 2954>::type 2955vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last) 2956{ 2957 difference_type __n = _VSTD::distance(__first, __last); 2958 iterator __r; 2959 size_type __c = capacity(); 2960 if (__n <= __c && size() <= __c - __n) 2961 { 2962 const_iterator __old_end = end(); 2963 __size_ += __n; 2964 _VSTD::copy_backward(__position, __old_end, end()); 2965 __r = __const_iterator_cast(__position); 2966 } 2967 else 2968 { 2969 vector __v(__alloc()); 2970 __v.reserve(__recommend(__size_ + __n)); 2971 __v.__size_ = __size_ + __n; 2972 __r = _VSTD::copy(cbegin(), __position, __v.begin()); 2973 _VSTD::copy_backward(__position, cend(), __v.end()); 2974 swap(__v); 2975 } 2976 _VSTD::copy(__first, __last, __r); 2977 return __r; 2978} 2979 2980template <class _Allocator> 2981_LIBCPP_INLINE_VISIBILITY inline 2982typename vector<bool, _Allocator>::iterator 2983vector<bool, _Allocator>::erase(const_iterator __position) 2984{ 2985 iterator __r = __const_iterator_cast(__position); 2986 _VSTD::copy(__position + 1, this->cend(), __r); 2987 --__size_; 2988 return __r; 2989} 2990 2991template <class _Allocator> 2992typename vector<bool, _Allocator>::iterator 2993vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last) 2994{ 2995 iterator __r = __const_iterator_cast(__first); 2996 difference_type __d = __last - __first; 2997 _VSTD::copy(__last, this->cend(), __r); 2998 __size_ -= __d; 2999 return __r; 3000} 3001 3002template <class _Allocator> 3003void 3004vector<bool, _Allocator>::swap(vector& __x) 3005 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 3006 __is_nothrow_swappable<allocator_type>::value) 3007{ 3008 _VSTD::swap(this->__begin_, __x.__begin_); 3009 _VSTD::swap(this->__size_, __x.__size_); 3010 _VSTD::swap(this->__cap(), __x.__cap()); 3011 __swap_alloc(this->__alloc(), __x.__alloc()); 3012#ifdef _LIBCPP_DEBUG 3013 iterator::swap(this, &__x); 3014 const_iterator::swap(this, &__x); 3015#endif // _LIBCPP_DEBUG 3016} 3017 3018template <class _Allocator> 3019void 3020vector<bool, _Allocator>::resize(size_type __sz, value_type __x) 3021{ 3022 size_type __cs = size(); 3023 if (__cs < __sz) 3024 { 3025 iterator __r; 3026 size_type __c = capacity(); 3027 size_type __n = __sz - __cs; 3028 if (__n <= __c && __cs <= __c - __n) 3029 { 3030 __r = end(); 3031 __size_ += __n; 3032 } 3033 else 3034 { 3035 vector __v(__alloc()); 3036 __v.reserve(__recommend(__size_ + __n)); 3037 __v.__size_ = __size_ + __n; 3038 __r = _VSTD::copy(cbegin(), cend(), __v.begin()); 3039 swap(__v); 3040 } 3041 _VSTD::fill_n(__r, __n, __x); 3042 } 3043 else 3044 __size_ = __sz; 3045} 3046 3047template <class _Allocator> 3048void 3049vector<bool, _Allocator>::flip() _NOEXCEPT 3050{ 3051 // do middle whole words 3052 size_type __n = __size_; 3053 __storage_pointer __p = __begin_; 3054 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) 3055 *__p = ~*__p; 3056 // do last partial word 3057 if (__n > 0) 3058 { 3059 __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 3060 __storage_type __b = *__p & __m; 3061 *__p &= ~__m; 3062 *__p |= ~__b & __m; 3063 } 3064} 3065 3066template <class _Allocator> 3067bool 3068vector<bool, _Allocator>::__invariants() const 3069{ 3070 if (this->__begin_ == 0) 3071 { 3072 if (this->__size_ != 0 || this->__cap() != 0) 3073 return false; 3074 } 3075 else 3076 { 3077 if (this->__cap() == 0) 3078 return false; 3079 if (this->__size_ > this->capacity()) 3080 return false; 3081 } 3082 return true; 3083} 3084 3085template <class _Allocator> 3086size_t 3087vector<bool, _Allocator>::__hash_code() const _NOEXCEPT 3088{ 3089 size_t __h = 0; 3090 // do middle whole words 3091 size_type __n = __size_; 3092 __storage_pointer __p = __begin_; 3093 for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) 3094 __h ^= *__p; 3095 // do last partial word 3096 if (__n > 0) 3097 { 3098 const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 3099 __h ^= *__p & __m; 3100 } 3101 return __h; 3102} 3103 3104template <class _Allocator> 3105struct _LIBCPP_VISIBLE hash<vector<bool, _Allocator> > 3106 : public unary_function<vector<bool, _Allocator>, size_t> 3107{ 3108 _LIBCPP_INLINE_VISIBILITY 3109 size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT 3110 {return __vec.__hash_code();} 3111}; 3112 3113template <class _Tp, class _Allocator> 3114_LIBCPP_INLINE_VISIBILITY inline 3115bool 3116operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 3117{ 3118 const typename vector<_Tp, _Allocator>::size_type __sz = __x.size(); 3119 return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 3120} 3121 3122template <class _Tp, class _Allocator> 3123_LIBCPP_INLINE_VISIBILITY inline 3124bool 3125operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 3126{ 3127 return !(__x == __y); 3128} 3129 3130template <class _Tp, class _Allocator> 3131_LIBCPP_INLINE_VISIBILITY inline 3132bool 3133operator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 3134{ 3135 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 3136} 3137 3138template <class _Tp, class _Allocator> 3139_LIBCPP_INLINE_VISIBILITY inline 3140bool 3141operator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 3142{ 3143 return __y < __x; 3144} 3145 3146template <class _Tp, class _Allocator> 3147_LIBCPP_INLINE_VISIBILITY inline 3148bool 3149operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 3150{ 3151 return !(__x < __y); 3152} 3153 3154template <class _Tp, class _Allocator> 3155_LIBCPP_INLINE_VISIBILITY inline 3156bool 3157operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 3158{ 3159 return !(__y < __x); 3160} 3161 3162template <class _Tp, class _Allocator> 3163_LIBCPP_INLINE_VISIBILITY inline 3164void 3165swap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y) 3166 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 3167{ 3168 __x.swap(__y); 3169} 3170 3171_LIBCPP_END_NAMESPACE_STD 3172 3173#endif // _LIBCPP_VECTOR 3174