Guest User

Untitled

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