146035553Spatrick// -*- C++ -*- 2*4bdff4beSrobert//===----------------------------------------------------------------------===// 346035553Spatrick// 446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 546035553Spatrick// See https://llvm.org/LICENSE.txt for license information. 646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 746035553Spatrick// 846035553Spatrick//===----------------------------------------------------------------------===// 946035553Spatrick 1046035553Spatrick#ifndef _LIBCPP_VECTOR 1146035553Spatrick#define _LIBCPP_VECTOR 1246035553Spatrick 1346035553Spatrick/* 1446035553Spatrick vector synopsis 1546035553Spatrick 1646035553Spatricknamespace std 1746035553Spatrick{ 1846035553Spatrick 1946035553Spatricktemplate <class T, class Allocator = allocator<T> > 2046035553Spatrickclass vector 2146035553Spatrick{ 2246035553Spatrickpublic: 2346035553Spatrick typedef T value_type; 2446035553Spatrick typedef Allocator allocator_type; 2546035553Spatrick typedef typename allocator_type::reference reference; 2646035553Spatrick typedef typename allocator_type::const_reference const_reference; 2746035553Spatrick typedef implementation-defined iterator; 2846035553Spatrick typedef implementation-defined const_iterator; 2946035553Spatrick typedef typename allocator_type::size_type size_type; 3046035553Spatrick typedef typename allocator_type::difference_type difference_type; 3146035553Spatrick typedef typename allocator_type::pointer pointer; 3246035553Spatrick typedef typename allocator_type::const_pointer const_pointer; 3346035553Spatrick typedef std::reverse_iterator<iterator> reverse_iterator; 3446035553Spatrick typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 3546035553Spatrick 3646035553Spatrick vector() 3746035553Spatrick noexcept(is_nothrow_default_constructible<allocator_type>::value); 3846035553Spatrick explicit vector(const allocator_type&); 3946035553Spatrick explicit vector(size_type n); 4046035553Spatrick explicit vector(size_type n, const allocator_type&); // C++14 4146035553Spatrick vector(size_type n, const value_type& value, const allocator_type& = allocator_type()); 4246035553Spatrick template <class InputIterator> 4346035553Spatrick vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type()); 4446035553Spatrick vector(const vector& x); 4546035553Spatrick vector(vector&& x) 4646035553Spatrick noexcept(is_nothrow_move_constructible<allocator_type>::value); 4746035553Spatrick vector(initializer_list<value_type> il); 4846035553Spatrick vector(initializer_list<value_type> il, const allocator_type& a); 4946035553Spatrick ~vector(); 5046035553Spatrick vector& operator=(const vector& x); 5146035553Spatrick vector& operator=(vector&& x) 5246035553Spatrick noexcept( 5346035553Spatrick allocator_type::propagate_on_container_move_assignment::value || 5446035553Spatrick allocator_type::is_always_equal::value); // C++17 5546035553Spatrick vector& operator=(initializer_list<value_type> il); 5646035553Spatrick template <class InputIterator> 5746035553Spatrick void assign(InputIterator first, InputIterator last); 5846035553Spatrick void assign(size_type n, const value_type& u); 5946035553Spatrick void assign(initializer_list<value_type> il); 6046035553Spatrick 6146035553Spatrick allocator_type get_allocator() const noexcept; 6246035553Spatrick 6346035553Spatrick iterator begin() noexcept; 6446035553Spatrick const_iterator begin() const noexcept; 6546035553Spatrick iterator end() noexcept; 6646035553Spatrick const_iterator end() const noexcept; 6746035553Spatrick 6846035553Spatrick reverse_iterator rbegin() noexcept; 6946035553Spatrick const_reverse_iterator rbegin() const noexcept; 7046035553Spatrick reverse_iterator rend() noexcept; 7146035553Spatrick const_reverse_iterator rend() const noexcept; 7246035553Spatrick 7346035553Spatrick const_iterator cbegin() const noexcept; 7446035553Spatrick const_iterator cend() const noexcept; 7546035553Spatrick const_reverse_iterator crbegin() const noexcept; 7646035553Spatrick const_reverse_iterator crend() const noexcept; 7746035553Spatrick 7846035553Spatrick size_type size() const noexcept; 7946035553Spatrick size_type max_size() const noexcept; 8046035553Spatrick size_type capacity() const noexcept; 8146035553Spatrick bool empty() const noexcept; 8246035553Spatrick void reserve(size_type n); 8346035553Spatrick void shrink_to_fit() noexcept; 8446035553Spatrick 8546035553Spatrick reference operator[](size_type n); 8646035553Spatrick const_reference operator[](size_type n) const; 8746035553Spatrick reference at(size_type n); 8846035553Spatrick const_reference at(size_type n) const; 8946035553Spatrick 9046035553Spatrick reference front(); 9146035553Spatrick const_reference front() const; 9246035553Spatrick reference back(); 9346035553Spatrick const_reference back() const; 9446035553Spatrick 9546035553Spatrick value_type* data() noexcept; 9646035553Spatrick const value_type* data() const noexcept; 9746035553Spatrick 9846035553Spatrick void push_back(const value_type& x); 9946035553Spatrick void push_back(value_type&& x); 10046035553Spatrick template <class... Args> 10146035553Spatrick reference emplace_back(Args&&... args); // reference in C++17 10246035553Spatrick void pop_back(); 10346035553Spatrick 10446035553Spatrick template <class... Args> iterator emplace(const_iterator position, Args&&... args); 10546035553Spatrick iterator insert(const_iterator position, const value_type& x); 10646035553Spatrick iterator insert(const_iterator position, value_type&& x); 10746035553Spatrick iterator insert(const_iterator position, size_type n, const value_type& x); 10846035553Spatrick template <class InputIterator> 10946035553Spatrick iterator insert(const_iterator position, InputIterator first, InputIterator last); 11046035553Spatrick iterator insert(const_iterator position, initializer_list<value_type> il); 11146035553Spatrick 11246035553Spatrick iterator erase(const_iterator position); 11346035553Spatrick iterator erase(const_iterator first, const_iterator last); 11446035553Spatrick 11546035553Spatrick void clear() noexcept; 11646035553Spatrick 11746035553Spatrick void resize(size_type sz); 11846035553Spatrick void resize(size_type sz, const value_type& c); 11946035553Spatrick 12046035553Spatrick void swap(vector&) 12146035553Spatrick noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value || 12246035553Spatrick allocator_traits<allocator_type>::is_always_equal::value); // C++17 12346035553Spatrick 12446035553Spatrick bool __invariants() const; 12546035553Spatrick}; 12646035553Spatrick 12746035553Spatricktemplate <class Allocator = allocator<T> > 12846035553Spatrickclass vector<bool, Allocator> 12946035553Spatrick{ 13046035553Spatrickpublic: 13146035553Spatrick typedef bool value_type; 13246035553Spatrick typedef Allocator allocator_type; 13346035553Spatrick typedef implementation-defined iterator; 13446035553Spatrick typedef implementation-defined const_iterator; 13546035553Spatrick typedef typename allocator_type::size_type size_type; 13646035553Spatrick typedef typename allocator_type::difference_type difference_type; 13746035553Spatrick typedef iterator pointer; 13846035553Spatrick typedef const_iterator const_pointer; 13946035553Spatrick typedef std::reverse_iterator<iterator> reverse_iterator; 14046035553Spatrick typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 14146035553Spatrick 14246035553Spatrick class reference 14346035553Spatrick { 14446035553Spatrick public: 14546035553Spatrick reference(const reference&) noexcept; 14646035553Spatrick operator bool() const noexcept; 14776d0caaeSpatrick reference& operator=(bool x) noexcept; 14846035553Spatrick reference& operator=(const reference& x) noexcept; 14946035553Spatrick iterator operator&() const noexcept; 15046035553Spatrick void flip() noexcept; 15146035553Spatrick }; 15246035553Spatrick 15346035553Spatrick class const_reference 15446035553Spatrick { 15546035553Spatrick public: 15646035553Spatrick const_reference(const reference&) noexcept; 15746035553Spatrick operator bool() const noexcept; 15846035553Spatrick const_iterator operator&() const noexcept; 15946035553Spatrick }; 16046035553Spatrick 16146035553Spatrick vector() 16246035553Spatrick noexcept(is_nothrow_default_constructible<allocator_type>::value); 16346035553Spatrick explicit vector(const allocator_type&); 16446035553Spatrick explicit vector(size_type n, const allocator_type& a = allocator_type()); // C++14 16546035553Spatrick vector(size_type n, const value_type& value, const allocator_type& = allocator_type()); 16646035553Spatrick template <class InputIterator> 16746035553Spatrick vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type()); 16846035553Spatrick vector(const vector& x); 16946035553Spatrick vector(vector&& x) 17046035553Spatrick noexcept(is_nothrow_move_constructible<allocator_type>::value); 17146035553Spatrick vector(initializer_list<value_type> il); 17246035553Spatrick vector(initializer_list<value_type> il, const allocator_type& a); 17346035553Spatrick ~vector(); 17446035553Spatrick vector& operator=(const vector& x); 17546035553Spatrick vector& operator=(vector&& x) 17646035553Spatrick noexcept( 17746035553Spatrick allocator_type::propagate_on_container_move_assignment::value || 17846035553Spatrick allocator_type::is_always_equal::value); // C++17 17946035553Spatrick vector& operator=(initializer_list<value_type> il); 18046035553Spatrick template <class InputIterator> 18146035553Spatrick void assign(InputIterator first, InputIterator last); 18246035553Spatrick void assign(size_type n, const value_type& u); 18346035553Spatrick void assign(initializer_list<value_type> il); 18446035553Spatrick 18546035553Spatrick allocator_type get_allocator() const noexcept; 18646035553Spatrick 18746035553Spatrick iterator begin() noexcept; 18846035553Spatrick const_iterator begin() const noexcept; 18946035553Spatrick iterator end() noexcept; 19046035553Spatrick const_iterator end() const noexcept; 19146035553Spatrick 19246035553Spatrick reverse_iterator rbegin() noexcept; 19346035553Spatrick const_reverse_iterator rbegin() const noexcept; 19446035553Spatrick reverse_iterator rend() noexcept; 19546035553Spatrick const_reverse_iterator rend() const noexcept; 19646035553Spatrick 19746035553Spatrick const_iterator cbegin() const noexcept; 19846035553Spatrick const_iterator cend() const noexcept; 19946035553Spatrick const_reverse_iterator crbegin() const noexcept; 20046035553Spatrick const_reverse_iterator crend() const noexcept; 20146035553Spatrick 20246035553Spatrick size_type size() const noexcept; 20346035553Spatrick size_type max_size() const noexcept; 20446035553Spatrick size_type capacity() const noexcept; 20546035553Spatrick bool empty() const noexcept; 20646035553Spatrick void reserve(size_type n); 20746035553Spatrick void shrink_to_fit() noexcept; 20846035553Spatrick 20946035553Spatrick reference operator[](size_type n); 21046035553Spatrick const_reference operator[](size_type n) const; 21146035553Spatrick reference at(size_type n); 21246035553Spatrick const_reference at(size_type n) const; 21346035553Spatrick 21446035553Spatrick reference front(); 21546035553Spatrick const_reference front() const; 21646035553Spatrick reference back(); 21746035553Spatrick const_reference back() const; 21846035553Spatrick 21946035553Spatrick void push_back(const value_type& x); 22046035553Spatrick template <class... Args> reference emplace_back(Args&&... args); // C++14; reference in C++17 22146035553Spatrick void pop_back(); 22246035553Spatrick 22346035553Spatrick template <class... Args> iterator emplace(const_iterator position, Args&&... args); // C++14 22446035553Spatrick iterator insert(const_iterator position, const value_type& x); 22546035553Spatrick iterator insert(const_iterator position, size_type n, const value_type& x); 22646035553Spatrick template <class InputIterator> 22746035553Spatrick iterator insert(const_iterator position, InputIterator first, InputIterator last); 22846035553Spatrick iterator insert(const_iterator position, initializer_list<value_type> il); 22946035553Spatrick 23046035553Spatrick iterator erase(const_iterator position); 23146035553Spatrick iterator erase(const_iterator first, const_iterator last); 23246035553Spatrick 23346035553Spatrick void clear() noexcept; 23446035553Spatrick 23546035553Spatrick void resize(size_type sz); 23646035553Spatrick void resize(size_type sz, value_type x); 23746035553Spatrick 23846035553Spatrick void swap(vector&) 23946035553Spatrick noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value || 24046035553Spatrick allocator_traits<allocator_type>::is_always_equal::value); // C++17 24146035553Spatrick void flip() noexcept; 24246035553Spatrick 24346035553Spatrick bool __invariants() const; 24446035553Spatrick}; 24546035553Spatrick 24646035553Spatricktemplate <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>> 24746035553Spatrick vector(InputIterator, InputIterator, Allocator = Allocator()) 248*4bdff4beSrobert -> vector<typename iterator_traits<InputIterator>::value_type, Allocator>; // C++17 24946035553Spatrick 25046035553Spatricktemplate <class Allocator> struct hash<std::vector<bool, Allocator>>; 25146035553Spatrick 25246035553Spatricktemplate <class T, class Allocator> bool operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y); 25346035553Spatricktemplate <class T, class Allocator> bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y); 25446035553Spatricktemplate <class T, class Allocator> bool operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); 25546035553Spatricktemplate <class T, class Allocator> bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y); 25646035553Spatricktemplate <class T, class Allocator> bool operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); 25746035553Spatricktemplate <class T, class Allocator> bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); 25846035553Spatrick 25946035553Spatricktemplate <class T, class Allocator> 26046035553Spatrickvoid swap(vector<T,Allocator>& x, vector<T,Allocator>& y) 26146035553Spatrick noexcept(noexcept(x.swap(y))); 26246035553Spatrick 26346035553Spatricktemplate <class T, class Allocator, class U> 264037e7968Spatricktypename vector<T, Allocator>::size_type 265037e7968Spatrickerase(vector<T, Allocator>& c, const U& value); // C++20 26646035553Spatricktemplate <class T, class Allocator, class Predicate> 267037e7968Spatricktypename vector<T, Allocator>::size_type 268037e7968Spatrickerase_if(vector<T, Allocator>& c, Predicate pred); // C++20 26946035553Spatrick 270*4bdff4beSrobert 271*4bdff4beSroberttemplate<class T> 272*4bdff4beSrobert inline constexpr bool is-vector-bool-reference = see below; // exposition only, since C++23 273*4bdff4beSrobert 274*4bdff4beSroberttemplate<class T, class charT> requires is-vector-bool-reference<T> // Since C++23 275*4bdff4beSrobert struct formatter<T, charT>; 276*4bdff4beSrobert 27746035553Spatrick} // std 27846035553Spatrick 27946035553Spatrick*/ 28046035553Spatrick 281*4bdff4beSrobert#include <__algorithm/copy.h> 282*4bdff4beSrobert#include <__algorithm/equal.h> 283*4bdff4beSrobert#include <__algorithm/fill_n.h> 284*4bdff4beSrobert#include <__algorithm/lexicographical_compare.h> 285*4bdff4beSrobert#include <__algorithm/remove.h> 286*4bdff4beSrobert#include <__algorithm/remove_if.h> 287*4bdff4beSrobert#include <__algorithm/rotate.h> 288*4bdff4beSrobert#include <__algorithm/unwrap_iter.h> 289*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler 29046035553Spatrick#include <__bit_reference> 291*4bdff4beSrobert#include <__concepts/same_as.h> 292*4bdff4beSrobert#include <__config> 29376d0caaeSpatrick#include <__debug> 294*4bdff4beSrobert#include <__format/enable_insertable.h> 295*4bdff4beSrobert#include <__format/formatter.h> 296*4bdff4beSrobert#include <__functional/hash.h> 297*4bdff4beSrobert#include <__functional/unary_function.h> 298*4bdff4beSrobert#include <__iterator/advance.h> 299*4bdff4beSrobert#include <__iterator/iterator_traits.h> 300*4bdff4beSrobert#include <__iterator/reverse_iterator.h> 30176d0caaeSpatrick#include <__iterator/wrap_iter.h> 302*4bdff4beSrobert#include <__memory/allocate_at_least.h> 303*4bdff4beSrobert#include <__memory/pointer_traits.h> 304*4bdff4beSrobert#include <__memory/swap_allocator.h> 305*4bdff4beSrobert#include <__memory/temp_value.h> 306*4bdff4beSrobert#include <__memory/uninitialized_algorithms.h> 307*4bdff4beSrobert#include <__memory_resource/polymorphic_allocator.h> 30876d0caaeSpatrick#include <__split_buffer> 309*4bdff4beSrobert#include <__type_traits/is_allocator.h> 310*4bdff4beSrobert#include <__type_traits/noexcept_move_assign_container.h> 311*4bdff4beSrobert#include <__utility/exception_guard.h> 31276d0caaeSpatrick#include <__utility/forward.h> 313*4bdff4beSrobert#include <__utility/move.h> 314*4bdff4beSrobert#include <__utility/swap.h> 31546035553Spatrick#include <climits> 31676d0caaeSpatrick#include <cstdlib> 31776d0caaeSpatrick#include <cstring> 31876d0caaeSpatrick#include <iosfwd> // for forward declaration of vector 31976d0caaeSpatrick#include <limits> 32046035553Spatrick#include <stdexcept> 32176d0caaeSpatrick#include <type_traits> 32246035553Spatrick#include <version> 32346035553Spatrick 324*4bdff4beSrobert// standard-mandated includes 325*4bdff4beSrobert 326*4bdff4beSrobert// [iterator.range] 327*4bdff4beSrobert#include <__iterator/access.h> 328*4bdff4beSrobert#include <__iterator/data.h> 329*4bdff4beSrobert#include <__iterator/empty.h> 330*4bdff4beSrobert#include <__iterator/reverse_access.h> 331*4bdff4beSrobert#include <__iterator/size.h> 332*4bdff4beSrobert 333*4bdff4beSrobert// [vector.syn] 334*4bdff4beSrobert#include <compare> 335*4bdff4beSrobert#include <initializer_list> 336*4bdff4beSrobert 33746035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 33846035553Spatrick# pragma GCC system_header 33946035553Spatrick#endif 34046035553Spatrick 34146035553Spatrick_LIBCPP_PUSH_MACROS 34246035553Spatrick#include <__undef_macros> 34346035553Spatrick 34446035553Spatrick 34546035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD 34646035553Spatrick 34746035553Spatricktemplate <class _Tp, class _Allocator /* = allocator<_Tp> */> 34846035553Spatrickclass _LIBCPP_TEMPLATE_VIS vector 34946035553Spatrick{ 35046035553Spatrickprivate: 35146035553Spatrick typedef allocator<_Tp> __default_allocator_type; 35246035553Spatrickpublic: 35346035553Spatrick typedef vector __self; 35446035553Spatrick typedef _Tp value_type; 35546035553Spatrick typedef _Allocator allocator_type; 356*4bdff4beSrobert typedef allocator_traits<allocator_type> __alloc_traits; 357*4bdff4beSrobert typedef value_type& reference; 358*4bdff4beSrobert typedef const value_type& const_reference; 359*4bdff4beSrobert typedef typename __alloc_traits::size_type size_type; 360*4bdff4beSrobert typedef typename __alloc_traits::difference_type difference_type; 361*4bdff4beSrobert typedef typename __alloc_traits::pointer pointer; 362*4bdff4beSrobert typedef typename __alloc_traits::const_pointer const_pointer; 363*4bdff4beSrobert // TODO: Implement iterator bounds checking without requiring the global database. 36446035553Spatrick typedef __wrap_iter<pointer> iterator; 36546035553Spatrick typedef __wrap_iter<const_pointer> const_iterator; 366*4bdff4beSrobert typedef std::reverse_iterator<iterator> reverse_iterator; 367*4bdff4beSrobert typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 36846035553Spatrick 36946035553Spatrick static_assert((is_same<typename allocator_type::value_type, value_type>::value), 37046035553Spatrick "Allocator::value_type must be same type as value_type"); 37146035553Spatrick 372*4bdff4beSrobert static_assert(is_same<allocator_type, __rebind_alloc<__alloc_traits, value_type> >::value, 373*4bdff4beSrobert "[allocator.requirements] states that rebinding an allocator to the same type should result in the " 374*4bdff4beSrobert "original allocator"); 375*4bdff4beSrobert 376*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 37746035553Spatrick vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) 37846035553Spatrick { 379*4bdff4beSrobert std::__debug_db_insert_c(this); 38046035553Spatrick } 381*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit vector(const allocator_type& __a) 38246035553Spatrick#if _LIBCPP_STD_VER <= 14 38346035553Spatrick _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value) 38446035553Spatrick#else 38546035553Spatrick _NOEXCEPT 38646035553Spatrick#endif 387*4bdff4beSrobert : __end_cap_(nullptr, __a) 38846035553Spatrick { 389*4bdff4beSrobert std::__debug_db_insert_c(this); 39046035553Spatrick } 391*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit vector(size_type __n); 39246035553Spatrick#if _LIBCPP_STD_VER > 11 393*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit vector(size_type __n, const allocator_type& __a); 39446035553Spatrick#endif 395*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(size_type __n, const value_type& __x); 39646035553Spatrick 397*4bdff4beSrobert template <class = __enable_if_t<__is_allocator<_Allocator>::value> > 398*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 399*4bdff4beSrobert vector(size_type __n, const value_type& __x, const allocator_type& __a) 400*4bdff4beSrobert : __end_cap_(nullptr, __a) 40146035553Spatrick { 402*4bdff4beSrobert std::__debug_db_insert_c(this); 403*4bdff4beSrobert if (__n > 0) 404*4bdff4beSrobert { 405*4bdff4beSrobert __vallocate(__n); 406*4bdff4beSrobert __construct_at_end(__n, __x); 407*4bdff4beSrobert } 40846035553Spatrick } 40946035553Spatrick 410*4bdff4beSrobert template <class _InputIterator, 411*4bdff4beSrobert __enable_if_t<__is_exactly_cpp17_input_iterator<_InputIterator>::value && 412*4bdff4beSrobert is_constructible<value_type, typename iterator_traits<_InputIterator>::reference>::value, 413*4bdff4beSrobert int> = 0> 414*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(_InputIterator __first, _InputIterator __last); 415*4bdff4beSrobert template <class _InputIterator, 416*4bdff4beSrobert __enable_if_t<__is_exactly_cpp17_input_iterator<_InputIterator>::value && 417*4bdff4beSrobert is_constructible<value_type, typename iterator_traits<_InputIterator>::reference>::value, 418*4bdff4beSrobert int> = 0> 419*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 420*4bdff4beSrobert vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a); 421*4bdff4beSrobert 422*4bdff4beSrobert template < 423*4bdff4beSrobert class _ForwardIterator, 424*4bdff4beSrobert __enable_if_t<__is_cpp17_forward_iterator<_ForwardIterator>::value && 425*4bdff4beSrobert is_constructible<value_type, typename iterator_traits<_ForwardIterator>::reference>::value, 426*4bdff4beSrobert int> = 0> 427*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(_ForwardIterator __first, _ForwardIterator __last); 428*4bdff4beSrobert 429*4bdff4beSrobert template <class _ForwardIterator, 430*4bdff4beSrobert __enable_if_t<__is_cpp17_forward_iterator<_ForwardIterator>::value && 431*4bdff4beSrobert is_constructible<value_type, typename iterator_traits<_ForwardIterator>::reference>::value, 432*4bdff4beSrobert int> = 0> 433*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 434*4bdff4beSrobert vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a); 435*4bdff4beSrobert 436*4bdff4beSrobertprivate: 437*4bdff4beSrobert class __destroy_vector { 438*4bdff4beSrobert public: 439*4bdff4beSrobert _LIBCPP_CONSTEXPR __destroy_vector(vector& __vec) : __vec_(__vec) {} 440*4bdff4beSrobert 441*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void operator()() { 442*4bdff4beSrobert __vec_.__annotate_delete(); 443*4bdff4beSrobert std::__debug_db_erase_c(std::addressof(__vec_)); 444*4bdff4beSrobert 445*4bdff4beSrobert if (__vec_.__begin_ != nullptr) { 446*4bdff4beSrobert __vec_.__clear(); 447*4bdff4beSrobert __alloc_traits::deallocate(__vec_.__alloc(), __vec_.__begin_, __vec_.capacity()); 448*4bdff4beSrobert } 449*4bdff4beSrobert } 450*4bdff4beSrobert 451*4bdff4beSrobert private: 452*4bdff4beSrobert vector& __vec_; 453*4bdff4beSrobert }; 454*4bdff4beSrobert 455*4bdff4beSrobertpublic: 456*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI ~vector() { __destroy_vector(*this)(); } 457*4bdff4beSrobert 458*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(const vector& __x); 459*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(const vector& __x, const __type_identity_t<allocator_type>& __a); 460*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 46146035553Spatrick vector& operator=(const vector& __x); 46246035553Spatrick 46346035553Spatrick#ifndef _LIBCPP_CXX03_LANG 464*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 46546035553Spatrick vector(initializer_list<value_type> __il); 46646035553Spatrick 467*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 46846035553Spatrick vector(initializer_list<value_type> __il, const allocator_type& __a); 46946035553Spatrick 470*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 471*4bdff4beSrobert vector& operator=(initializer_list<value_type> __il) 472*4bdff4beSrobert {assign(__il.begin(), __il.end()); return *this;} 473*4bdff4beSrobert#endif // !_LIBCPP_CXX03_LANG 474*4bdff4beSrobert 475*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 47646035553Spatrick vector(vector&& __x) 47746035553Spatrick#if _LIBCPP_STD_VER > 14 478*4bdff4beSrobert noexcept; 47946035553Spatrick#else 48046035553Spatrick _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); 48146035553Spatrick#endif 48246035553Spatrick 483*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 484*4bdff4beSrobert vector(vector&& __x, const __type_identity_t<allocator_type>& __a); 485*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 48646035553Spatrick vector& operator=(vector&& __x) 48746035553Spatrick _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)); 48846035553Spatrick 489*4bdff4beSrobert template <class _InputIterator, 490*4bdff4beSrobert __enable_if_t<__is_exactly_cpp17_input_iterator<_InputIterator>::value && 491*4bdff4beSrobert is_constructible<value_type, typename iterator_traits<_InputIterator>::reference>::value, 492*4bdff4beSrobert int> = 0> 493*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void assign(_InputIterator __first, _InputIterator __last); 494*4bdff4beSrobert template < 495*4bdff4beSrobert class _ForwardIterator, 496*4bdff4beSrobert __enable_if_t<__is_cpp17_forward_iterator<_ForwardIterator>::value && 497*4bdff4beSrobert is_constructible<value_type, typename iterator_traits<_ForwardIterator>::reference>::value, 498*4bdff4beSrobert int> = 0> 499*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void assign(_ForwardIterator __first, _ForwardIterator __last); 50046035553Spatrick 501*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void assign(size_type __n, const_reference __u); 50246035553Spatrick 50346035553Spatrick#ifndef _LIBCPP_CXX03_LANG 504*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 50546035553Spatrick void assign(initializer_list<value_type> __il) 50646035553Spatrick {assign(__il.begin(), __il.end());} 50746035553Spatrick#endif 50846035553Spatrick 509*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 51046035553Spatrick allocator_type get_allocator() const _NOEXCEPT 51146035553Spatrick {return this->__alloc();} 51246035553Spatrick 513*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator begin() _NOEXCEPT; 514*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator begin() const _NOEXCEPT; 515*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator end() _NOEXCEPT; 516*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator end() const _NOEXCEPT; 51746035553Spatrick 518*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 51946035553Spatrick reverse_iterator rbegin() _NOEXCEPT 52046035553Spatrick {return reverse_iterator(end());} 521*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 52246035553Spatrick const_reverse_iterator rbegin() const _NOEXCEPT 52346035553Spatrick {return const_reverse_iterator(end());} 524*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 52546035553Spatrick reverse_iterator rend() _NOEXCEPT 52646035553Spatrick {return reverse_iterator(begin());} 527*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 52846035553Spatrick const_reverse_iterator rend() const _NOEXCEPT 52946035553Spatrick {return const_reverse_iterator(begin());} 53046035553Spatrick 531*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 53246035553Spatrick const_iterator cbegin() const _NOEXCEPT 53346035553Spatrick {return begin();} 534*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 53546035553Spatrick const_iterator cend() const _NOEXCEPT 53646035553Spatrick {return end();} 537*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 53846035553Spatrick const_reverse_iterator crbegin() const _NOEXCEPT 53946035553Spatrick {return rbegin();} 540*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 54146035553Spatrick const_reverse_iterator crend() const _NOEXCEPT 54246035553Spatrick {return rend();} 54346035553Spatrick 544*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 54546035553Spatrick size_type size() const _NOEXCEPT 54646035553Spatrick {return static_cast<size_type>(this->__end_ - this->__begin_);} 547*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 54846035553Spatrick size_type capacity() const _NOEXCEPT 549*4bdff4beSrobert {return static_cast<size_type>(__end_cap() - this->__begin_);} 550*4bdff4beSrobert _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 55146035553Spatrick bool empty() const _NOEXCEPT 55246035553Spatrick {return this->__begin_ == this->__end_;} 553*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type max_size() const _NOEXCEPT; 554*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void reserve(size_type __n); 555*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void shrink_to_fit() _NOEXCEPT; 55646035553Spatrick 557*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference operator[](size_type __n) _NOEXCEPT; 558*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference operator[](size_type __n) const _NOEXCEPT; 559*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference at(size_type __n); 560*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference at(size_type __n) const; 56146035553Spatrick 562*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference front() _NOEXCEPT 56346035553Spatrick { 56476d0caaeSpatrick _LIBCPP_ASSERT(!empty(), "front() called on an empty vector"); 56546035553Spatrick return *this->__begin_; 56646035553Spatrick } 567*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference front() const _NOEXCEPT 56846035553Spatrick { 56976d0caaeSpatrick _LIBCPP_ASSERT(!empty(), "front() called on an empty vector"); 57046035553Spatrick return *this->__begin_; 57146035553Spatrick } 572*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference back() _NOEXCEPT 57346035553Spatrick { 57476d0caaeSpatrick _LIBCPP_ASSERT(!empty(), "back() called on an empty vector"); 57546035553Spatrick return *(this->__end_ - 1); 57646035553Spatrick } 577*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference back() const _NOEXCEPT 57846035553Spatrick { 57976d0caaeSpatrick _LIBCPP_ASSERT(!empty(), "back() called on an empty vector"); 58046035553Spatrick return *(this->__end_ - 1); 58146035553Spatrick } 58246035553Spatrick 583*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 58446035553Spatrick value_type* data() _NOEXCEPT 585*4bdff4beSrobert {return std::__to_address(this->__begin_);} 586*4bdff4beSrobert 587*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 58846035553Spatrick const value_type* data() const _NOEXCEPT 589*4bdff4beSrobert {return std::__to_address(this->__begin_);} 59046035553Spatrick 591*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void push_back(const_reference __x); 59246035553Spatrick 593*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void push_back(value_type&& __x); 59446035553Spatrick 59546035553Spatrick template <class... _Args> 596*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 59746035553Spatrick#if _LIBCPP_STD_VER > 14 59846035553Spatrick reference emplace_back(_Args&&... __args); 59946035553Spatrick#else 60046035553Spatrick void emplace_back(_Args&&... __args); 60146035553Spatrick#endif 60246035553Spatrick 603*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 60446035553Spatrick void pop_back(); 60546035553Spatrick 606*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __position, const_reference __x); 60746035553Spatrick 608*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __position, value_type&& __x); 60946035553Spatrick template <class... _Args> 610*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator emplace(const_iterator __position, _Args&&... __args); 61146035553Spatrick 612*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 61346035553Spatrick iterator insert(const_iterator __position, size_type __n, const_reference __x); 614*4bdff4beSrobert 615*4bdff4beSrobert template <class _InputIterator, 616*4bdff4beSrobert __enable_if_t<__is_exactly_cpp17_input_iterator<_InputIterator>::value && 617*4bdff4beSrobert is_constructible< value_type, typename iterator_traits<_InputIterator>::reference>::value, 618*4bdff4beSrobert int> = 0> 619*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 62046035553Spatrick insert(const_iterator __position, _InputIterator __first, _InputIterator __last); 621*4bdff4beSrobert 622*4bdff4beSrobert template < 623*4bdff4beSrobert class _ForwardIterator, 624*4bdff4beSrobert __enable_if_t<__is_cpp17_forward_iterator<_ForwardIterator>::value && 625*4bdff4beSrobert is_constructible< value_type, typename iterator_traits<_ForwardIterator>::reference>::value, 626*4bdff4beSrobert int> = 0> 627*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 62846035553Spatrick insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last); 62946035553Spatrick 63046035553Spatrick#ifndef _LIBCPP_CXX03_LANG 631*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 63246035553Spatrick iterator insert(const_iterator __position, initializer_list<value_type> __il) 63346035553Spatrick {return insert(__position, __il.begin(), __il.end());} 63446035553Spatrick#endif 63546035553Spatrick 636*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator erase(const_iterator __position); 637*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator erase(const_iterator __first, const_iterator __last); 63846035553Spatrick 639*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 64046035553Spatrick void clear() _NOEXCEPT 64146035553Spatrick { 64246035553Spatrick size_type __old_size = size(); 643*4bdff4beSrobert __clear(); 64446035553Spatrick __annotate_shrink(__old_size); 645*4bdff4beSrobert std::__debug_db_invalidate_all(this); 64646035553Spatrick } 64746035553Spatrick 648*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void resize(size_type __sz); 649*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void resize(size_type __sz, const_reference __x); 65046035553Spatrick 651*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void swap(vector&) 65246035553Spatrick#if _LIBCPP_STD_VER >= 14 65346035553Spatrick _NOEXCEPT; 65446035553Spatrick#else 65546035553Spatrick _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 65646035553Spatrick __is_nothrow_swappable<allocator_type>::value); 65746035553Spatrick#endif 65846035553Spatrick 659*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool __invariants() const; 66046035553Spatrick 661*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 66246035553Spatrick 66346035553Spatrick bool __dereferenceable(const const_iterator* __i) const; 66446035553Spatrick bool __decrementable(const const_iterator* __i) const; 66546035553Spatrick bool __addable(const const_iterator* __i, ptrdiff_t __n) const; 66646035553Spatrick bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const; 66746035553Spatrick 668*4bdff4beSrobert#endif // _LIBCPP_ENABLE_DEBUG_MODE 66946035553Spatrick 67046035553Spatrickprivate: 671*4bdff4beSrobert pointer __begin_ = nullptr; 672*4bdff4beSrobert pointer __end_ = nullptr; 673*4bdff4beSrobert __compressed_pair<pointer, allocator_type> __end_cap_ = 674*4bdff4beSrobert __compressed_pair<pointer, allocator_type>(nullptr, __default_init_tag()); 675*4bdff4beSrobert 676*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void __invalidate_iterators_past(pointer __new_last); 677*4bdff4beSrobert 678*4bdff4beSrobert // Allocate space for __n objects 679*4bdff4beSrobert // throws length_error if __n > max_size() 680*4bdff4beSrobert // throws (probably bad_alloc) if memory run out 681*4bdff4beSrobert // Precondition: __begin_ == __end_ == __end_cap() == 0 682*4bdff4beSrobert // Precondition: __n > 0 683*4bdff4beSrobert // Postcondition: capacity() >= __n 684*4bdff4beSrobert // Postcondition: size() == 0 685*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __vallocate(size_type __n) { 686*4bdff4beSrobert if (__n > max_size()) 687*4bdff4beSrobert __throw_length_error(); 688*4bdff4beSrobert auto __allocation = std::__allocate_at_least(__alloc(), __n); 689*4bdff4beSrobert __begin_ = __allocation.ptr; 690*4bdff4beSrobert __end_ = __allocation.ptr; 691*4bdff4beSrobert __end_cap() = __begin_ + __allocation.count; 692*4bdff4beSrobert __annotate_new(0); 693*4bdff4beSrobert } 694*4bdff4beSrobert 695*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __vdeallocate() _NOEXCEPT; 696*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type __recommend(size_type __new_size) const; 697*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __construct_at_end(size_type __n); 698*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 69946035553Spatrick void __construct_at_end(size_type __n, const_reference __x); 700*4bdff4beSrobert 701*4bdff4beSrobert template <class _ForwardIterator, __enable_if_t<__is_cpp17_forward_iterator<_ForwardIterator>::value, int> = 0> 702*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 70346035553Spatrick __construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n); 704*4bdff4beSrobert 705*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __append(size_type __n); 706*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __append(size_type __n, const_reference __x); 707*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 708*4bdff4beSrobert iterator __make_iter(pointer __p) _NOEXCEPT { return iterator(this, __p); } 709*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 710*4bdff4beSrobert const_iterator __make_iter(const_pointer __p) const _NOEXCEPT { return const_iterator(this, __p); } 711*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v); 712*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p); 713*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_range(pointer __from_s, pointer __from_e, pointer __to); 714*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign(vector& __c, true_type) 71546035553Spatrick _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); 716*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign(vector& __c, false_type) 71746035553Spatrick _NOEXCEPT_(__alloc_traits::is_always_equal::value); 718*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 71946035553Spatrick void __destruct_at_end(pointer __new_last) _NOEXCEPT 72046035553Spatrick { 721*4bdff4beSrobert if (!__libcpp_is_constant_evaluated()) 72246035553Spatrick __invalidate_iterators_past(__new_last); 72346035553Spatrick size_type __old_size = size(); 724*4bdff4beSrobert __base_destruct_at_end(__new_last); 72546035553Spatrick __annotate_shrink(__old_size); 72646035553Spatrick } 72746035553Spatrick 72846035553Spatrick template <class _Up> 729*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 73046035553Spatrick inline void __push_back_slow_path(_Up&& __x); 73146035553Spatrick 73246035553Spatrick template <class... _Args> 733*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 73446035553Spatrick inline void __emplace_back_slow_path(_Args&&... __args); 73546035553Spatrick 73646035553Spatrick // The following functions are no-ops outside of AddressSanitizer mode. 73746035553Spatrick // We call annotatations only for the default Allocator because other allocators 73846035553Spatrick // may not meet the AddressSanitizer alignment constraints. 73946035553Spatrick // See the documentation for __sanitizer_annotate_contiguous_container for more details. 74046035553Spatrick#ifndef _LIBCPP_HAS_NO_ASAN 741*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 74246035553Spatrick void __annotate_contiguous_container(const void *__beg, const void *__end, 74346035553Spatrick const void *__old_mid, 74446035553Spatrick const void *__new_mid) const 74546035553Spatrick { 74646035553Spatrick 747*4bdff4beSrobert if (!__libcpp_is_constant_evaluated() && __beg && is_same<allocator_type, __default_allocator_type>::value) 74846035553Spatrick __sanitizer_annotate_contiguous_container(__beg, __end, __old_mid, __new_mid); 74946035553Spatrick } 75046035553Spatrick#else 751*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 75246035553Spatrick void __annotate_contiguous_container(const void*, const void*, const void*, 75346035553Spatrick const void*) const _NOEXCEPT {} 75446035553Spatrick#endif 755*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 75646035553Spatrick void __annotate_new(size_type __current_size) const _NOEXCEPT { 75746035553Spatrick __annotate_contiguous_container(data(), data() + capacity(), 75846035553Spatrick data() + capacity(), data() + __current_size); 75946035553Spatrick } 76046035553Spatrick 761*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 76246035553Spatrick void __annotate_delete() const _NOEXCEPT { 76346035553Spatrick __annotate_contiguous_container(data(), data() + capacity(), 76446035553Spatrick data() + size(), data() + capacity()); 76546035553Spatrick } 76646035553Spatrick 767*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 76846035553Spatrick void __annotate_increase(size_type __n) const _NOEXCEPT 76946035553Spatrick { 77046035553Spatrick __annotate_contiguous_container(data(), data() + capacity(), 77146035553Spatrick data() + size(), data() + size() + __n); 77246035553Spatrick } 77346035553Spatrick 774*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 77546035553Spatrick void __annotate_shrink(size_type __old_size) const _NOEXCEPT 77646035553Spatrick { 77746035553Spatrick __annotate_contiguous_container(data(), data() + capacity(), 77846035553Spatrick data() + __old_size, data() + size()); 77946035553Spatrick } 78046035553Spatrick 78146035553Spatrick struct _ConstructTransaction { 782*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 78346035553Spatrick explicit _ConstructTransaction(vector &__v, size_type __n) 78446035553Spatrick : __v_(__v), __pos_(__v.__end_), __new_end_(__v.__end_ + __n) { 78546035553Spatrick#ifndef _LIBCPP_HAS_NO_ASAN 78646035553Spatrick __v_.__annotate_increase(__n); 78746035553Spatrick#endif 78846035553Spatrick } 789*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI ~_ConstructTransaction() { 79046035553Spatrick __v_.__end_ = __pos_; 79146035553Spatrick#ifndef _LIBCPP_HAS_NO_ASAN 79246035553Spatrick if (__pos_ != __new_end_) { 79346035553Spatrick __v_.__annotate_shrink(__new_end_ - __v_.__begin_); 79446035553Spatrick } 79546035553Spatrick#endif 79646035553Spatrick } 79746035553Spatrick 79846035553Spatrick vector &__v_; 79946035553Spatrick pointer __pos_; 80046035553Spatrick const_pointer const __new_end_; 80146035553Spatrick 80246035553Spatrick private: 80346035553Spatrick _ConstructTransaction(_ConstructTransaction const&) = delete; 80446035553Spatrick _ConstructTransaction& operator=(_ConstructTransaction const&) = delete; 80546035553Spatrick }; 80646035553Spatrick 80746035553Spatrick template <class ..._Args> 808*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 80946035553Spatrick void __construct_one_at_end(_Args&& ...__args) { 81046035553Spatrick _ConstructTransaction __tx(*this, 1); 811*4bdff4beSrobert __alloc_traits::construct(this->__alloc(), std::__to_address(__tx.__pos_), 812*4bdff4beSrobert std::forward<_Args>(__args)...); 81346035553Spatrick ++__tx.__pos_; 81446035553Spatrick } 815*4bdff4beSrobert 816*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 817*4bdff4beSrobert allocator_type& __alloc() _NOEXCEPT 818*4bdff4beSrobert {return this->__end_cap_.second();} 819*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 820*4bdff4beSrobert const allocator_type& __alloc() const _NOEXCEPT 821*4bdff4beSrobert {return this->__end_cap_.second();} 822*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 823*4bdff4beSrobert pointer& __end_cap() _NOEXCEPT 824*4bdff4beSrobert {return this->__end_cap_.first();} 825*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 826*4bdff4beSrobert const pointer& __end_cap() const _NOEXCEPT 827*4bdff4beSrobert {return this->__end_cap_.first();} 828*4bdff4beSrobert 829*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 830*4bdff4beSrobert void __clear() _NOEXCEPT {__base_destruct_at_end(this->__begin_);} 831*4bdff4beSrobert 832*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 833*4bdff4beSrobert void __base_destruct_at_end(pointer __new_last) _NOEXCEPT { 834*4bdff4beSrobert pointer __soon_to_be_end = this->__end_; 835*4bdff4beSrobert while (__new_last != __soon_to_be_end) 836*4bdff4beSrobert __alloc_traits::destroy(__alloc(), std::__to_address(--__soon_to_be_end)); 837*4bdff4beSrobert this->__end_ = __new_last; 838*4bdff4beSrobert } 839*4bdff4beSrobert 840*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 841*4bdff4beSrobert void __copy_assign_alloc(const vector& __c) 842*4bdff4beSrobert {__copy_assign_alloc(__c, integral_constant<bool, 843*4bdff4beSrobert __alloc_traits::propagate_on_container_copy_assignment::value>());} 844*4bdff4beSrobert 845*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 846*4bdff4beSrobert void __move_assign_alloc(vector& __c) 847*4bdff4beSrobert _NOEXCEPT_( 848*4bdff4beSrobert !__alloc_traits::propagate_on_container_move_assignment::value || 849*4bdff4beSrobert is_nothrow_move_assignable<allocator_type>::value) 850*4bdff4beSrobert {__move_assign_alloc(__c, integral_constant<bool, 851*4bdff4beSrobert __alloc_traits::propagate_on_container_move_assignment::value>());} 852*4bdff4beSrobert 853*4bdff4beSrobert _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI 854*4bdff4beSrobert void __throw_length_error() const { 855*4bdff4beSrobert std::__throw_length_error("vector"); 856*4bdff4beSrobert } 857*4bdff4beSrobert 858*4bdff4beSrobert _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI 859*4bdff4beSrobert void __throw_out_of_range() const { 860*4bdff4beSrobert std::__throw_out_of_range("vector"); 861*4bdff4beSrobert } 862*4bdff4beSrobert 863*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 864*4bdff4beSrobert void __copy_assign_alloc(const vector& __c, true_type) 865*4bdff4beSrobert { 866*4bdff4beSrobert if (__alloc() != __c.__alloc()) 867*4bdff4beSrobert { 868*4bdff4beSrobert __clear(); 869*4bdff4beSrobert __alloc_traits::deallocate(__alloc(), this->__begin_, capacity()); 870*4bdff4beSrobert this->__begin_ = this->__end_ = __end_cap() = nullptr; 871*4bdff4beSrobert } 872*4bdff4beSrobert __alloc() = __c.__alloc(); 873*4bdff4beSrobert } 874*4bdff4beSrobert 875*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 876*4bdff4beSrobert void __copy_assign_alloc(const vector&, false_type) 877*4bdff4beSrobert {} 878*4bdff4beSrobert 879*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 880*4bdff4beSrobert void __move_assign_alloc(vector& __c, true_type) 881*4bdff4beSrobert _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 882*4bdff4beSrobert { 883*4bdff4beSrobert __alloc() = std::move(__c.__alloc()); 884*4bdff4beSrobert } 885*4bdff4beSrobert 886*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 887*4bdff4beSrobert void __move_assign_alloc(vector&, false_type) 888*4bdff4beSrobert _NOEXCEPT 889*4bdff4beSrobert {} 89046035553Spatrick}; 89146035553Spatrick 892*4bdff4beSrobert#if _LIBCPP_STD_VER >= 17 89346035553Spatricktemplate<class _InputIterator, 89476d0caaeSpatrick class _Alloc = allocator<__iter_value_type<_InputIterator>>, 895*4bdff4beSrobert class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 896*4bdff4beSrobert class = enable_if_t<__is_allocator<_Alloc>::value> 89746035553Spatrick > 89846035553Spatrickvector(_InputIterator, _InputIterator) 89976d0caaeSpatrick -> vector<__iter_value_type<_InputIterator>, _Alloc>; 90046035553Spatrick 90146035553Spatricktemplate<class _InputIterator, 90246035553Spatrick class _Alloc, 903*4bdff4beSrobert class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 904*4bdff4beSrobert class = enable_if_t<__is_allocator<_Alloc>::value> 90546035553Spatrick > 90646035553Spatrickvector(_InputIterator, _InputIterator, _Alloc) 90776d0caaeSpatrick -> vector<__iter_value_type<_InputIterator>, _Alloc>; 90846035553Spatrick#endif 90946035553Spatrick 91046035553Spatricktemplate <class _Tp, class _Allocator> 911*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 91246035553Spatrickvoid 91346035553Spatrickvector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v) 91446035553Spatrick{ 91546035553Spatrick __annotate_delete(); 916*4bdff4beSrobert using _RevIter = std::reverse_iterator<pointer>; 917*4bdff4beSrobert __v.__begin_ = std::__uninitialized_allocator_move_if_noexcept( 918*4bdff4beSrobert __alloc(), _RevIter(__end_), _RevIter(__begin_), _RevIter(__v.__begin_)) 919*4bdff4beSrobert .base(); 920*4bdff4beSrobert std::swap(this->__begin_, __v.__begin_); 921*4bdff4beSrobert std::swap(this->__end_, __v.__end_); 922*4bdff4beSrobert std::swap(this->__end_cap(), __v.__end_cap()); 92346035553Spatrick __v.__first_ = __v.__begin_; 92446035553Spatrick __annotate_new(size()); 925*4bdff4beSrobert std::__debug_db_invalidate_all(this); 92646035553Spatrick} 92746035553Spatrick 92846035553Spatricktemplate <class _Tp, class _Allocator> 929*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 93046035553Spatricktypename vector<_Tp, _Allocator>::pointer 93146035553Spatrickvector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p) 93246035553Spatrick{ 93346035553Spatrick __annotate_delete(); 93446035553Spatrick pointer __r = __v.__begin_; 935*4bdff4beSrobert using _RevIter = std::reverse_iterator<pointer>; 936*4bdff4beSrobert __v.__begin_ = std::__uninitialized_allocator_move_if_noexcept( 937*4bdff4beSrobert __alloc(), _RevIter(__p), _RevIter(__begin_), _RevIter(__v.__begin_)) 938*4bdff4beSrobert .base(); 939*4bdff4beSrobert __v.__end_ = std::__uninitialized_allocator_move_if_noexcept(__alloc(), __p, __end_, __v.__end_); 940*4bdff4beSrobert std::swap(this->__begin_, __v.__begin_); 941*4bdff4beSrobert std::swap(this->__end_, __v.__end_); 942*4bdff4beSrobert std::swap(this->__end_cap(), __v.__end_cap()); 94346035553Spatrick __v.__first_ = __v.__begin_; 94446035553Spatrick __annotate_new(size()); 945*4bdff4beSrobert std::__debug_db_invalidate_all(this); 94646035553Spatrick return __r; 94746035553Spatrick} 94846035553Spatrick 94946035553Spatricktemplate <class _Tp, class _Allocator> 950*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 95146035553Spatrickvoid 95246035553Spatrickvector<_Tp, _Allocator>::__vdeallocate() _NOEXCEPT 95346035553Spatrick{ 95446035553Spatrick if (this->__begin_ != nullptr) 95546035553Spatrick { 95646035553Spatrick clear(); 95746035553Spatrick __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity()); 95846035553Spatrick this->__begin_ = this->__end_ = this->__end_cap() = nullptr; 95946035553Spatrick } 96046035553Spatrick} 96146035553Spatrick 96246035553Spatricktemplate <class _Tp, class _Allocator> 963*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 96446035553Spatricktypename vector<_Tp, _Allocator>::size_type 96546035553Spatrickvector<_Tp, _Allocator>::max_size() const _NOEXCEPT 96646035553Spatrick{ 967*4bdff4beSrobert return std::min<size_type>(__alloc_traits::max_size(this->__alloc()), 96846035553Spatrick numeric_limits<difference_type>::max()); 96946035553Spatrick} 97046035553Spatrick 97146035553Spatrick// Precondition: __new_size > capacity() 97246035553Spatricktemplate <class _Tp, class _Allocator> 973*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 974*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 97546035553Spatricktypename vector<_Tp, _Allocator>::size_type 97646035553Spatrickvector<_Tp, _Allocator>::__recommend(size_type __new_size) const 97746035553Spatrick{ 97846035553Spatrick const size_type __ms = max_size(); 97946035553Spatrick if (__new_size > __ms) 98046035553Spatrick this->__throw_length_error(); 98146035553Spatrick const size_type __cap = capacity(); 98246035553Spatrick if (__cap >= __ms / 2) 98346035553Spatrick return __ms; 984*4bdff4beSrobert return std::max<size_type>(2 * __cap, __new_size); 98546035553Spatrick} 98646035553Spatrick 98746035553Spatrick// Default constructs __n objects starting at __end_ 98846035553Spatrick// throws if construction throws 98946035553Spatrick// Precondition: __n > 0 99046035553Spatrick// Precondition: size() + __n <= capacity() 99146035553Spatrick// Postcondition: size() == size() + __n 99246035553Spatricktemplate <class _Tp, class _Allocator> 993*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 99446035553Spatrickvoid 99546035553Spatrickvector<_Tp, _Allocator>::__construct_at_end(size_type __n) 99646035553Spatrick{ 99746035553Spatrick _ConstructTransaction __tx(*this, __n); 998037e7968Spatrick const_pointer __new_end = __tx.__new_end_; 999*4bdff4beSrobert for (pointer __pos = __tx.__pos_; __pos != __new_end; __tx.__pos_ = ++__pos) { 1000*4bdff4beSrobert __alloc_traits::construct(this->__alloc(), std::__to_address(__pos)); 100146035553Spatrick } 100246035553Spatrick} 100346035553Spatrick 100446035553Spatrick// Copy constructs __n objects starting at __end_ from __x 100546035553Spatrick// throws if construction throws 100646035553Spatrick// Precondition: __n > 0 100746035553Spatrick// Precondition: size() + __n <= capacity() 100846035553Spatrick// Postcondition: size() == old size() + __n 100946035553Spatrick// Postcondition: [i] == __x for all i in [size() - __n, __n) 101046035553Spatricktemplate <class _Tp, class _Allocator> 1011*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 101246035553Spatrickinline 101346035553Spatrickvoid 101446035553Spatrickvector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x) 101546035553Spatrick{ 101646035553Spatrick _ConstructTransaction __tx(*this, __n); 1017037e7968Spatrick const_pointer __new_end = __tx.__new_end_; 1018*4bdff4beSrobert for (pointer __pos = __tx.__pos_; __pos != __new_end; __tx.__pos_ = ++__pos) { 1019*4bdff4beSrobert __alloc_traits::construct(this->__alloc(), std::__to_address(__pos), __x); 102046035553Spatrick } 102146035553Spatrick} 102246035553Spatrick 102346035553Spatricktemplate <class _Tp, class _Allocator> 1024*4bdff4beSroberttemplate <class _ForwardIterator, __enable_if_t<__is_cpp17_forward_iterator<_ForwardIterator>::value, int> > 1025*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 void 102646035553Spatrickvector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last, size_type __n) 102746035553Spatrick{ 102846035553Spatrick _ConstructTransaction __tx(*this, __n); 1029*4bdff4beSrobert __tx.__pos_ = std::__uninitialized_allocator_copy(__alloc(), __first, __last, __tx.__pos_); 103046035553Spatrick} 103146035553Spatrick 103246035553Spatrick// Default constructs __n objects starting at __end_ 103346035553Spatrick// throws if construction throws 103446035553Spatrick// Postcondition: size() == size() + __n 103546035553Spatrick// Exception safety: strong. 103646035553Spatricktemplate <class _Tp, class _Allocator> 1037*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 103846035553Spatrickvoid 103946035553Spatrickvector<_Tp, _Allocator>::__append(size_type __n) 104046035553Spatrick{ 104146035553Spatrick if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n) 104246035553Spatrick this->__construct_at_end(__n); 104346035553Spatrick else 104446035553Spatrick { 104546035553Spatrick allocator_type& __a = this->__alloc(); 104646035553Spatrick __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a); 104746035553Spatrick __v.__construct_at_end(__n); 104846035553Spatrick __swap_out_circular_buffer(__v); 104946035553Spatrick } 105046035553Spatrick} 105146035553Spatrick 105246035553Spatrick// Default constructs __n objects starting at __end_ 105346035553Spatrick// throws if construction throws 105446035553Spatrick// Postcondition: size() == size() + __n 105546035553Spatrick// Exception safety: strong. 105646035553Spatricktemplate <class _Tp, class _Allocator> 1057*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 105846035553Spatrickvoid 105946035553Spatrickvector<_Tp, _Allocator>::__append(size_type __n, const_reference __x) 106046035553Spatrick{ 106146035553Spatrick if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n) 106246035553Spatrick this->__construct_at_end(__n, __x); 106346035553Spatrick else 106446035553Spatrick { 106546035553Spatrick allocator_type& __a = this->__alloc(); 106646035553Spatrick __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a); 106746035553Spatrick __v.__construct_at_end(__n, __x); 106846035553Spatrick __swap_out_circular_buffer(__v); 106946035553Spatrick } 107046035553Spatrick} 107146035553Spatrick 107246035553Spatricktemplate <class _Tp, class _Allocator> 1073*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 107446035553Spatrickvector<_Tp, _Allocator>::vector(size_type __n) 107546035553Spatrick{ 1076*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1077*4bdff4beSrobert std::__debug_db_insert_c(this); 107846035553Spatrick if (__n > 0) 107946035553Spatrick { 108046035553Spatrick __vallocate(__n); 108146035553Spatrick __construct_at_end(__n); 108246035553Spatrick } 1083*4bdff4beSrobert __guard.__complete(); 108446035553Spatrick} 108546035553Spatrick 108646035553Spatrick#if _LIBCPP_STD_VER > 11 108746035553Spatricktemplate <class _Tp, class _Allocator> 1088*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 108946035553Spatrickvector<_Tp, _Allocator>::vector(size_type __n, const allocator_type& __a) 1090*4bdff4beSrobert : __end_cap_(nullptr, __a) 109146035553Spatrick{ 1092*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1093*4bdff4beSrobert std::__debug_db_insert_c(this); 109446035553Spatrick if (__n > 0) 109546035553Spatrick { 109646035553Spatrick __vallocate(__n); 109746035553Spatrick __construct_at_end(__n); 109846035553Spatrick } 1099*4bdff4beSrobert __guard.__complete(); 110046035553Spatrick} 110146035553Spatrick#endif 110246035553Spatrick 110346035553Spatricktemplate <class _Tp, class _Allocator> 1104*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 110546035553Spatrickvector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x) 110646035553Spatrick{ 1107*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1108*4bdff4beSrobert std::__debug_db_insert_c(this); 110946035553Spatrick if (__n > 0) 111046035553Spatrick { 111146035553Spatrick __vallocate(__n); 111246035553Spatrick __construct_at_end(__n, __x); 111346035553Spatrick } 1114*4bdff4beSrobert __guard.__complete(); 111546035553Spatrick} 111646035553Spatrick 111746035553Spatricktemplate <class _Tp, class _Allocator> 1118*4bdff4beSroberttemplate <class _InputIterator, __enable_if_t<__is_exactly_cpp17_input_iterator<_InputIterator>::value && 1119*4bdff4beSrobert is_constructible<_Tp, typename iterator_traits<_InputIterator>::reference>::value, 1120*4bdff4beSrobert int> > 1121*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1122*4bdff4beSrobertvector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last) 112346035553Spatrick{ 1124*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1125*4bdff4beSrobert std::__debug_db_insert_c(this); 112646035553Spatrick for (; __first != __last; ++__first) 1127*4bdff4beSrobert emplace_back(*__first); 1128*4bdff4beSrobert __guard.__complete(); 112946035553Spatrick} 113046035553Spatrick 113146035553Spatricktemplate <class _Tp, class _Allocator> 1132*4bdff4beSroberttemplate <class _InputIterator, __enable_if_t<__is_exactly_cpp17_input_iterator<_InputIterator>::value && 1133*4bdff4beSrobert is_constructible<_Tp, typename iterator_traits<_InputIterator>::reference>::value, 1134*4bdff4beSrobert int> > 1135*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1136*4bdff4beSrobertvector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a) 1137*4bdff4beSrobert : __end_cap_(nullptr, __a) 113846035553Spatrick{ 1139*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1140*4bdff4beSrobert std::__debug_db_insert_c(this); 114146035553Spatrick for (; __first != __last; ++__first) 1142*4bdff4beSrobert emplace_back(*__first); 1143*4bdff4beSrobert __guard.__complete(); 114446035553Spatrick} 114546035553Spatrick 114646035553Spatricktemplate <class _Tp, class _Allocator> 1147*4bdff4beSroberttemplate <class _ForwardIterator, __enable_if_t<__is_cpp17_forward_iterator<_ForwardIterator>::value && 1148*4bdff4beSrobert is_constructible<_Tp, typename iterator_traits<_ForwardIterator>::reference>::value, 1149*4bdff4beSrobert int> > 1150*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1151*4bdff4beSrobertvector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last) 115246035553Spatrick{ 1153*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1154*4bdff4beSrobert std::__debug_db_insert_c(this); 1155*4bdff4beSrobert size_type __n = static_cast<size_type>(std::distance(__first, __last)); 115646035553Spatrick if (__n > 0) 115746035553Spatrick { 115846035553Spatrick __vallocate(__n); 115946035553Spatrick __construct_at_end(__first, __last, __n); 116046035553Spatrick } 1161*4bdff4beSrobert __guard.__complete(); 116246035553Spatrick} 116346035553Spatrick 116446035553Spatricktemplate <class _Tp, class _Allocator> 1165*4bdff4beSroberttemplate <class _ForwardIterator, __enable_if_t<__is_cpp17_forward_iterator<_ForwardIterator>::value && 1166*4bdff4beSrobert is_constructible<_Tp, typename iterator_traits<_ForwardIterator>::reference>::value, 1167*4bdff4beSrobert int> > 1168*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1169*4bdff4beSrobertvector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a) 1170*4bdff4beSrobert : __end_cap_(nullptr, __a) 117146035553Spatrick{ 1172*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1173*4bdff4beSrobert std::__debug_db_insert_c(this); 1174*4bdff4beSrobert size_type __n = static_cast<size_type>(std::distance(__first, __last)); 117546035553Spatrick if (__n > 0) 117646035553Spatrick { 117746035553Spatrick __vallocate(__n); 117846035553Spatrick __construct_at_end(__first, __last, __n); 117946035553Spatrick } 1180*4bdff4beSrobert __guard.__complete(); 118146035553Spatrick} 118246035553Spatrick 118346035553Spatricktemplate <class _Tp, class _Allocator> 1184*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 118546035553Spatrickvector<_Tp, _Allocator>::vector(const vector& __x) 1186*4bdff4beSrobert : __end_cap_(nullptr, __alloc_traits::select_on_container_copy_construction(__x.__alloc())) 118746035553Spatrick{ 1188*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1189*4bdff4beSrobert std::__debug_db_insert_c(this); 119046035553Spatrick size_type __n = __x.size(); 119146035553Spatrick if (__n > 0) 119246035553Spatrick { 119346035553Spatrick __vallocate(__n); 119446035553Spatrick __construct_at_end(__x.__begin_, __x.__end_, __n); 119546035553Spatrick } 1196*4bdff4beSrobert __guard.__complete(); 119746035553Spatrick} 119846035553Spatrick 119946035553Spatricktemplate <class _Tp, class _Allocator> 1200*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1201*4bdff4beSrobertvector<_Tp, _Allocator>::vector(const vector& __x, const __type_identity_t<allocator_type>& __a) 1202*4bdff4beSrobert : __end_cap_(nullptr, __a) 120346035553Spatrick{ 1204*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1205*4bdff4beSrobert std::__debug_db_insert_c(this); 120646035553Spatrick size_type __n = __x.size(); 120746035553Spatrick if (__n > 0) 120846035553Spatrick { 120946035553Spatrick __vallocate(__n); 121046035553Spatrick __construct_at_end(__x.__begin_, __x.__end_, __n); 121146035553Spatrick } 1212*4bdff4beSrobert __guard.__complete(); 121346035553Spatrick} 121446035553Spatrick 121546035553Spatricktemplate <class _Tp, class _Allocator> 1216*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1217*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 121846035553Spatrickvector<_Tp, _Allocator>::vector(vector&& __x) 121946035553Spatrick#if _LIBCPP_STD_VER > 14 1220*4bdff4beSrobert noexcept 122146035553Spatrick#else 122246035553Spatrick _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) 122346035553Spatrick#endif 1224*4bdff4beSrobert : __end_cap_(nullptr, std::move(__x.__alloc())) 122546035553Spatrick{ 1226*4bdff4beSrobert std::__debug_db_insert_c(this); 1227*4bdff4beSrobert std::__debug_db_swap(this, std::addressof(__x)); 122846035553Spatrick this->__begin_ = __x.__begin_; 122946035553Spatrick this->__end_ = __x.__end_; 123046035553Spatrick this->__end_cap() = __x.__end_cap(); 123146035553Spatrick __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr; 123246035553Spatrick} 123346035553Spatrick 123446035553Spatricktemplate <class _Tp, class _Allocator> 1235*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1236*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 1237*4bdff4beSrobertvector<_Tp, _Allocator>::vector(vector&& __x, const __type_identity_t<allocator_type>& __a) 1238*4bdff4beSrobert : __end_cap_(nullptr, __a) 123946035553Spatrick{ 1240*4bdff4beSrobert std::__debug_db_insert_c(this); 124146035553Spatrick if (__a == __x.__alloc()) 124246035553Spatrick { 124346035553Spatrick this->__begin_ = __x.__begin_; 124446035553Spatrick this->__end_ = __x.__end_; 124546035553Spatrick this->__end_cap() = __x.__end_cap(); 124646035553Spatrick __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr; 1247*4bdff4beSrobert std::__debug_db_swap(this, std::addressof(__x)); 124846035553Spatrick } 124946035553Spatrick else 125046035553Spatrick { 125146035553Spatrick typedef move_iterator<iterator> _Ip; 1252*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 125346035553Spatrick assign(_Ip(__x.begin()), _Ip(__x.end())); 1254*4bdff4beSrobert __guard.__complete(); 125546035553Spatrick } 125646035553Spatrick} 125746035553Spatrick 1258*4bdff4beSrobert#ifndef _LIBCPP_CXX03_LANG 1259*4bdff4beSrobert 126046035553Spatricktemplate <class _Tp, class _Allocator> 1261*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1262*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 126346035553Spatrickvector<_Tp, _Allocator>::vector(initializer_list<value_type> __il) 126446035553Spatrick{ 1265*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1266*4bdff4beSrobert std::__debug_db_insert_c(this); 126746035553Spatrick if (__il.size() > 0) 126846035553Spatrick { 126946035553Spatrick __vallocate(__il.size()); 127046035553Spatrick __construct_at_end(__il.begin(), __il.end(), __il.size()); 127146035553Spatrick } 1272*4bdff4beSrobert __guard.__complete(); 127346035553Spatrick} 127446035553Spatrick 127546035553Spatricktemplate <class _Tp, class _Allocator> 1276*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1277*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 127846035553Spatrickvector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a) 1279*4bdff4beSrobert : __end_cap_(nullptr, __a) 128046035553Spatrick{ 1281*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1282*4bdff4beSrobert std::__debug_db_insert_c(this); 128346035553Spatrick if (__il.size() > 0) 128446035553Spatrick { 128546035553Spatrick __vallocate(__il.size()); 128646035553Spatrick __construct_at_end(__il.begin(), __il.end(), __il.size()); 128746035553Spatrick } 1288*4bdff4beSrobert __guard.__complete(); 128946035553Spatrick} 129046035553Spatrick 1291*4bdff4beSrobert#endif // _LIBCPP_CXX03_LANG 1292*4bdff4beSrobert 129346035553Spatricktemplate <class _Tp, class _Allocator> 1294*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1295*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 129646035553Spatrickvector<_Tp, _Allocator>& 129746035553Spatrickvector<_Tp, _Allocator>::operator=(vector&& __x) 129846035553Spatrick _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)) 129946035553Spatrick{ 130046035553Spatrick __move_assign(__x, integral_constant<bool, 130146035553Spatrick __alloc_traits::propagate_on_container_move_assignment::value>()); 130246035553Spatrick return *this; 130346035553Spatrick} 130446035553Spatrick 130546035553Spatricktemplate <class _Tp, class _Allocator> 1306*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 130746035553Spatrickvoid 130846035553Spatrickvector<_Tp, _Allocator>::__move_assign(vector& __c, false_type) 130946035553Spatrick _NOEXCEPT_(__alloc_traits::is_always_equal::value) 131046035553Spatrick{ 1311*4bdff4beSrobert if (__alloc() != __c.__alloc()) 131246035553Spatrick { 131346035553Spatrick typedef move_iterator<iterator> _Ip; 131446035553Spatrick assign(_Ip(__c.begin()), _Ip(__c.end())); 131546035553Spatrick } 131646035553Spatrick else 131746035553Spatrick __move_assign(__c, true_type()); 131846035553Spatrick} 131946035553Spatrick 132046035553Spatricktemplate <class _Tp, class _Allocator> 1321*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 132246035553Spatrickvoid 132346035553Spatrickvector<_Tp, _Allocator>::__move_assign(vector& __c, true_type) 132446035553Spatrick _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 132546035553Spatrick{ 132646035553Spatrick __vdeallocate(); 1327*4bdff4beSrobert __move_assign_alloc(__c); // this can throw 132846035553Spatrick this->__begin_ = __c.__begin_; 132946035553Spatrick this->__end_ = __c.__end_; 133046035553Spatrick this->__end_cap() = __c.__end_cap(); 133146035553Spatrick __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr; 1332*4bdff4beSrobert std::__debug_db_swap(this, std::addressof(__c)); 133346035553Spatrick} 133446035553Spatrick 133546035553Spatricktemplate <class _Tp, class _Allocator> 1336*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1337*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 133846035553Spatrickvector<_Tp, _Allocator>& 133946035553Spatrickvector<_Tp, _Allocator>::operator=(const vector& __x) 134046035553Spatrick{ 1341*4bdff4beSrobert if (this != std::addressof(__x)) 134246035553Spatrick { 1343*4bdff4beSrobert __copy_assign_alloc(__x); 134446035553Spatrick assign(__x.__begin_, __x.__end_); 134546035553Spatrick } 134646035553Spatrick return *this; 134746035553Spatrick} 134846035553Spatrick 134946035553Spatricktemplate <class _Tp, class _Allocator> 1350*4bdff4beSroberttemplate <class _InputIterator, __enable_if_t<__is_exactly_cpp17_input_iterator<_InputIterator>::value && 1351*4bdff4beSrobert is_constructible<_Tp, typename iterator_traits<_InputIterator>::reference>::value, 1352*4bdff4beSrobert int> > 1353*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 void 135446035553Spatrickvector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last) 135546035553Spatrick{ 135646035553Spatrick clear(); 135746035553Spatrick for (; __first != __last; ++__first) 1358*4bdff4beSrobert emplace_back(*__first); 135946035553Spatrick} 136046035553Spatrick 136146035553Spatricktemplate <class _Tp, class _Allocator> 1362*4bdff4beSroberttemplate <class _ForwardIterator, __enable_if_t<__is_cpp17_forward_iterator<_ForwardIterator>::value && 1363*4bdff4beSrobert is_constructible<_Tp, typename iterator_traits<_ForwardIterator>::reference>::value, 1364*4bdff4beSrobert int> > 1365*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 void 136646035553Spatrickvector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) 136746035553Spatrick{ 1368*4bdff4beSrobert size_type __new_size = static_cast<size_type>(std::distance(__first, __last)); 136946035553Spatrick if (__new_size <= capacity()) 137046035553Spatrick { 137146035553Spatrick _ForwardIterator __mid = __last; 137246035553Spatrick bool __growing = false; 137346035553Spatrick if (__new_size > size()) 137446035553Spatrick { 137546035553Spatrick __growing = true; 137646035553Spatrick __mid = __first; 1377*4bdff4beSrobert std::advance(__mid, size()); 137846035553Spatrick } 1379*4bdff4beSrobert pointer __m = std::copy(__first, __mid, this->__begin_); 138046035553Spatrick if (__growing) 138146035553Spatrick __construct_at_end(__mid, __last, __new_size - size()); 138246035553Spatrick else 138346035553Spatrick this->__destruct_at_end(__m); 138446035553Spatrick } 138546035553Spatrick else 138646035553Spatrick { 138746035553Spatrick __vdeallocate(); 138846035553Spatrick __vallocate(__recommend(__new_size)); 138946035553Spatrick __construct_at_end(__first, __last, __new_size); 139046035553Spatrick } 1391*4bdff4beSrobert std::__debug_db_invalidate_all(this); 139246035553Spatrick} 139346035553Spatrick 139446035553Spatricktemplate <class _Tp, class _Allocator> 1395*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 139646035553Spatrickvoid 139746035553Spatrickvector<_Tp, _Allocator>::assign(size_type __n, const_reference __u) 139846035553Spatrick{ 139946035553Spatrick if (__n <= capacity()) 140046035553Spatrick { 140146035553Spatrick size_type __s = size(); 1402*4bdff4beSrobert std::fill_n(this->__begin_, std::min(__n, __s), __u); 140346035553Spatrick if (__n > __s) 140446035553Spatrick __construct_at_end(__n - __s, __u); 140546035553Spatrick else 140646035553Spatrick this->__destruct_at_end(this->__begin_ + __n); 140746035553Spatrick } 140846035553Spatrick else 140946035553Spatrick { 141046035553Spatrick __vdeallocate(); 141146035553Spatrick __vallocate(__recommend(static_cast<size_type>(__n))); 141246035553Spatrick __construct_at_end(__n, __u); 141346035553Spatrick } 1414*4bdff4beSrobert std::__debug_db_invalidate_all(this); 141546035553Spatrick} 141646035553Spatrick 141746035553Spatricktemplate <class _Tp, class _Allocator> 1418*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1419*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 142046035553Spatricktypename vector<_Tp, _Allocator>::iterator 142146035553Spatrickvector<_Tp, _Allocator>::begin() _NOEXCEPT 142246035553Spatrick{ 142346035553Spatrick return __make_iter(this->__begin_); 142446035553Spatrick} 142546035553Spatrick 142646035553Spatricktemplate <class _Tp, class _Allocator> 1427*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1428*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 142946035553Spatricktypename vector<_Tp, _Allocator>::const_iterator 143046035553Spatrickvector<_Tp, _Allocator>::begin() const _NOEXCEPT 143146035553Spatrick{ 143246035553Spatrick return __make_iter(this->__begin_); 143346035553Spatrick} 143446035553Spatrick 143546035553Spatricktemplate <class _Tp, class _Allocator> 1436*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1437*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 143846035553Spatricktypename vector<_Tp, _Allocator>::iterator 143946035553Spatrickvector<_Tp, _Allocator>::end() _NOEXCEPT 144046035553Spatrick{ 144146035553Spatrick return __make_iter(this->__end_); 144246035553Spatrick} 144346035553Spatrick 144446035553Spatricktemplate <class _Tp, class _Allocator> 1445*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1446*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 144746035553Spatricktypename vector<_Tp, _Allocator>::const_iterator 144846035553Spatrickvector<_Tp, _Allocator>::end() const _NOEXCEPT 144946035553Spatrick{ 145046035553Spatrick return __make_iter(this->__end_); 145146035553Spatrick} 145246035553Spatrick 145346035553Spatricktemplate <class _Tp, class _Allocator> 1454*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1455*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 145646035553Spatricktypename vector<_Tp, _Allocator>::reference 145746035553Spatrickvector<_Tp, _Allocator>::operator[](size_type __n) _NOEXCEPT 145846035553Spatrick{ 145946035553Spatrick _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds"); 146046035553Spatrick return this->__begin_[__n]; 146146035553Spatrick} 146246035553Spatrick 146346035553Spatricktemplate <class _Tp, class _Allocator> 1464*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1465*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 146646035553Spatricktypename vector<_Tp, _Allocator>::const_reference 146746035553Spatrickvector<_Tp, _Allocator>::operator[](size_type __n) const _NOEXCEPT 146846035553Spatrick{ 146946035553Spatrick _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds"); 147046035553Spatrick return this->__begin_[__n]; 147146035553Spatrick} 147246035553Spatrick 147346035553Spatricktemplate <class _Tp, class _Allocator> 1474*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 147546035553Spatricktypename vector<_Tp, _Allocator>::reference 147646035553Spatrickvector<_Tp, _Allocator>::at(size_type __n) 147746035553Spatrick{ 147846035553Spatrick if (__n >= size()) 147946035553Spatrick this->__throw_out_of_range(); 148046035553Spatrick return this->__begin_[__n]; 148146035553Spatrick} 148246035553Spatrick 148346035553Spatricktemplate <class _Tp, class _Allocator> 1484*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 148546035553Spatricktypename vector<_Tp, _Allocator>::const_reference 148646035553Spatrickvector<_Tp, _Allocator>::at(size_type __n) const 148746035553Spatrick{ 148846035553Spatrick if (__n >= size()) 148946035553Spatrick this->__throw_out_of_range(); 149046035553Spatrick return this->__begin_[__n]; 149146035553Spatrick} 149246035553Spatrick 149346035553Spatricktemplate <class _Tp, class _Allocator> 1494*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 149546035553Spatrickvoid 149646035553Spatrickvector<_Tp, _Allocator>::reserve(size_type __n) 149746035553Spatrick{ 149846035553Spatrick if (__n > capacity()) 149946035553Spatrick { 1500*4bdff4beSrobert if (__n > max_size()) 1501*4bdff4beSrobert this->__throw_length_error(); 150246035553Spatrick allocator_type& __a = this->__alloc(); 150346035553Spatrick __split_buffer<value_type, allocator_type&> __v(__n, size(), __a); 150446035553Spatrick __swap_out_circular_buffer(__v); 150546035553Spatrick } 150646035553Spatrick} 150746035553Spatrick 150846035553Spatricktemplate <class _Tp, class _Allocator> 1509*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 151046035553Spatrickvoid 151146035553Spatrickvector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT 151246035553Spatrick{ 151346035553Spatrick if (capacity() > size()) 151446035553Spatrick { 151546035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 151646035553Spatrick try 151746035553Spatrick { 151846035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 151946035553Spatrick allocator_type& __a = this->__alloc(); 152046035553Spatrick __split_buffer<value_type, allocator_type&> __v(size(), size(), __a); 152146035553Spatrick __swap_out_circular_buffer(__v); 152246035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 152346035553Spatrick } 152446035553Spatrick catch (...) 152546035553Spatrick { 152646035553Spatrick } 152746035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 152846035553Spatrick } 152946035553Spatrick} 153046035553Spatrick 153146035553Spatricktemplate <class _Tp, class _Allocator> 153246035553Spatricktemplate <class _Up> 1533*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 153446035553Spatrickvoid 153546035553Spatrickvector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x) 153646035553Spatrick{ 153746035553Spatrick allocator_type& __a = this->__alloc(); 153846035553Spatrick __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a); 1539*4bdff4beSrobert // __v.push_back(std::forward<_Up>(__x)); 1540*4bdff4beSrobert __alloc_traits::construct(__a, std::__to_address(__v.__end_), std::forward<_Up>(__x)); 154146035553Spatrick __v.__end_++; 154246035553Spatrick __swap_out_circular_buffer(__v); 154346035553Spatrick} 154446035553Spatrick 154546035553Spatricktemplate <class _Tp, class _Allocator> 1546*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1547*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 154846035553Spatrickvoid 154946035553Spatrickvector<_Tp, _Allocator>::push_back(const_reference __x) 155046035553Spatrick{ 155146035553Spatrick if (this->__end_ != this->__end_cap()) 155246035553Spatrick { 155346035553Spatrick __construct_one_at_end(__x); 155446035553Spatrick } 155546035553Spatrick else 155646035553Spatrick __push_back_slow_path(__x); 155746035553Spatrick} 155846035553Spatrick 155946035553Spatricktemplate <class _Tp, class _Allocator> 1560*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1561*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 156246035553Spatrickvoid 156346035553Spatrickvector<_Tp, _Allocator>::push_back(value_type&& __x) 156446035553Spatrick{ 156546035553Spatrick if (this->__end_ < this->__end_cap()) 156646035553Spatrick { 1567*4bdff4beSrobert __construct_one_at_end(std::move(__x)); 156846035553Spatrick } 156946035553Spatrick else 1570*4bdff4beSrobert __push_back_slow_path(std::move(__x)); 157146035553Spatrick} 157246035553Spatrick 157346035553Spatricktemplate <class _Tp, class _Allocator> 157446035553Spatricktemplate <class... _Args> 1575*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 157646035553Spatrickvoid 157746035553Spatrickvector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args) 157846035553Spatrick{ 157946035553Spatrick allocator_type& __a = this->__alloc(); 158046035553Spatrick __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a); 1581*4bdff4beSrobert// __v.emplace_back(std::forward<_Args>(__args)...); 1582*4bdff4beSrobert __alloc_traits::construct(__a, std::__to_address(__v.__end_), std::forward<_Args>(__args)...); 158346035553Spatrick __v.__end_++; 158446035553Spatrick __swap_out_circular_buffer(__v); 158546035553Spatrick} 158646035553Spatrick 158746035553Spatricktemplate <class _Tp, class _Allocator> 158846035553Spatricktemplate <class... _Args> 1589*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 159046035553Spatrickinline 159146035553Spatrick#if _LIBCPP_STD_VER > 14 159246035553Spatricktypename vector<_Tp, _Allocator>::reference 159346035553Spatrick#else 159446035553Spatrickvoid 159546035553Spatrick#endif 159646035553Spatrickvector<_Tp, _Allocator>::emplace_back(_Args&&... __args) 159746035553Spatrick{ 159846035553Spatrick if (this->__end_ < this->__end_cap()) 159946035553Spatrick { 1600*4bdff4beSrobert __construct_one_at_end(std::forward<_Args>(__args)...); 160146035553Spatrick } 160246035553Spatrick else 1603*4bdff4beSrobert __emplace_back_slow_path(std::forward<_Args>(__args)...); 160446035553Spatrick#if _LIBCPP_STD_VER > 14 160546035553Spatrick return this->back(); 160646035553Spatrick#endif 160746035553Spatrick} 160846035553Spatrick 160946035553Spatricktemplate <class _Tp, class _Allocator> 1610*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 161146035553Spatrickinline 161246035553Spatrickvoid 161346035553Spatrickvector<_Tp, _Allocator>::pop_back() 161446035553Spatrick{ 161576d0caaeSpatrick _LIBCPP_ASSERT(!empty(), "vector::pop_back called on an empty vector"); 161646035553Spatrick this->__destruct_at_end(this->__end_ - 1); 161746035553Spatrick} 161846035553Spatrick 161946035553Spatricktemplate <class _Tp, class _Allocator> 1620*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 1621*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 162246035553Spatricktypename vector<_Tp, _Allocator>::iterator 162346035553Spatrickvector<_Tp, _Allocator>::erase(const_iterator __position) 162446035553Spatrick{ 1625*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(std::addressof(__position)) == this, 1626*4bdff4beSrobert "vector::erase(iterator) called with an iterator not referring to this vector"); 162746035553Spatrick _LIBCPP_ASSERT(__position != end(), 162846035553Spatrick "vector::erase(iterator) called with a non-dereferenceable iterator"); 162946035553Spatrick difference_type __ps = __position - cbegin(); 163046035553Spatrick pointer __p = this->__begin_ + __ps; 1631*4bdff4beSrobert this->__destruct_at_end(std::move(__p + 1, this->__end_, __p)); 1632*4bdff4beSrobert if (!__libcpp_is_constant_evaluated()) 163346035553Spatrick this->__invalidate_iterators_past(__p - 1); 1634*4bdff4beSrobert return __make_iter(__p); 163546035553Spatrick} 163646035553Spatrick 163746035553Spatricktemplate <class _Tp, class _Allocator> 1638*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 163946035553Spatricktypename vector<_Tp, _Allocator>::iterator 164046035553Spatrickvector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last) 164146035553Spatrick{ 1642*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(std::addressof(__first)) == this, 1643*4bdff4beSrobert "vector::erase(iterator, iterator) called with an iterator not referring to this vector"); 1644*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(std::addressof(__last)) == this, 1645*4bdff4beSrobert "vector::erase(iterator, iterator) called with an iterator not referring to this vector"); 1646*4bdff4beSrobert 164746035553Spatrick _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range"); 164846035553Spatrick pointer __p = this->__begin_ + (__first - begin()); 164946035553Spatrick if (__first != __last) { 1650*4bdff4beSrobert this->__destruct_at_end(std::move(__p + (__last - __first), this->__end_, __p)); 1651*4bdff4beSrobert if (!__libcpp_is_constant_evaluated()) 165246035553Spatrick this->__invalidate_iterators_past(__p - 1); 165346035553Spatrick } 1654*4bdff4beSrobert return __make_iter(__p); 165546035553Spatrick} 165646035553Spatrick 165746035553Spatricktemplate <class _Tp, class _Allocator> 1658*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 165946035553Spatrickvoid 166046035553Spatrickvector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to) 166146035553Spatrick{ 166246035553Spatrick pointer __old_last = this->__end_; 166346035553Spatrick difference_type __n = __old_last - __to; 166446035553Spatrick { 166546035553Spatrick pointer __i = __from_s + __n; 166646035553Spatrick _ConstructTransaction __tx(*this, __from_e - __i); 1667037e7968Spatrick for (pointer __pos = __tx.__pos_; __i < __from_e; 1668*4bdff4beSrobert ++__i, (void) ++__pos, __tx.__pos_ = __pos) { 166946035553Spatrick __alloc_traits::construct(this->__alloc(), 1670*4bdff4beSrobert std::__to_address(__pos), 1671*4bdff4beSrobert std::move(*__i)); 167246035553Spatrick } 167346035553Spatrick } 1674*4bdff4beSrobert std::move_backward(__from_s, __from_s + __n, __old_last); 167546035553Spatrick} 167646035553Spatrick 167746035553Spatricktemplate <class _Tp, class _Allocator> 1678*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 167946035553Spatricktypename vector<_Tp, _Allocator>::iterator 168046035553Spatrickvector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x) 168146035553Spatrick{ 1682*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(std::addressof(__position)) == this, 1683*4bdff4beSrobert "vector::insert(iterator, x) called with an iterator not referring to this vector"); 168446035553Spatrick pointer __p = this->__begin_ + (__position - begin()); 1685*4bdff4beSrobert // We can't compare unrelated pointers inside constant expressions 1686*4bdff4beSrobert if (!__libcpp_is_constant_evaluated() && this->__end_ < this->__end_cap()) 168746035553Spatrick { 168846035553Spatrick if (__p == this->__end_) 168946035553Spatrick { 169046035553Spatrick __construct_one_at_end(__x); 169146035553Spatrick } 169246035553Spatrick else 169346035553Spatrick { 169446035553Spatrick __move_range(__p, this->__end_, __p + 1); 169546035553Spatrick const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x); 169646035553Spatrick if (__p <= __xr && __xr < this->__end_) 169746035553Spatrick ++__xr; 169846035553Spatrick *__p = *__xr; 169946035553Spatrick } 170046035553Spatrick } 170146035553Spatrick else 170246035553Spatrick { 170346035553Spatrick allocator_type& __a = this->__alloc(); 170446035553Spatrick __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); 170546035553Spatrick __v.push_back(__x); 170646035553Spatrick __p = __swap_out_circular_buffer(__v, __p); 170746035553Spatrick } 170846035553Spatrick return __make_iter(__p); 170946035553Spatrick} 171046035553Spatrick 171146035553Spatricktemplate <class _Tp, class _Allocator> 1712*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 171346035553Spatricktypename vector<_Tp, _Allocator>::iterator 171446035553Spatrickvector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x) 171546035553Spatrick{ 1716*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(std::addressof(__position)) == this, 1717*4bdff4beSrobert "vector::insert(iterator, x) called with an iterator not referring to this vector"); 171846035553Spatrick pointer __p = this->__begin_ + (__position - begin()); 171946035553Spatrick if (this->__end_ < this->__end_cap()) 172046035553Spatrick { 172146035553Spatrick if (__p == this->__end_) 172246035553Spatrick { 1723*4bdff4beSrobert __construct_one_at_end(std::move(__x)); 172446035553Spatrick } 172546035553Spatrick else 172646035553Spatrick { 172746035553Spatrick __move_range(__p, this->__end_, __p + 1); 1728*4bdff4beSrobert *__p = std::move(__x); 172946035553Spatrick } 173046035553Spatrick } 173146035553Spatrick else 173246035553Spatrick { 173346035553Spatrick allocator_type& __a = this->__alloc(); 173446035553Spatrick __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); 1735*4bdff4beSrobert __v.push_back(std::move(__x)); 173646035553Spatrick __p = __swap_out_circular_buffer(__v, __p); 173746035553Spatrick } 173846035553Spatrick return __make_iter(__p); 173946035553Spatrick} 174046035553Spatrick 174146035553Spatricktemplate <class _Tp, class _Allocator> 174246035553Spatricktemplate <class... _Args> 1743*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 174446035553Spatricktypename vector<_Tp, _Allocator>::iterator 174546035553Spatrickvector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args) 174646035553Spatrick{ 1747*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(std::addressof(__position)) == this, 1748*4bdff4beSrobert "vector::emplace(iterator, x) called with an iterator not referring to this vector"); 174946035553Spatrick pointer __p = this->__begin_ + (__position - begin()); 175046035553Spatrick if (this->__end_ < this->__end_cap()) 175146035553Spatrick { 175246035553Spatrick if (__p == this->__end_) 175346035553Spatrick { 1754*4bdff4beSrobert __construct_one_at_end(std::forward<_Args>(__args)...); 175546035553Spatrick } 175646035553Spatrick else 175746035553Spatrick { 1758*4bdff4beSrobert __temp_value<value_type, _Allocator> __tmp(this->__alloc(), std::forward<_Args>(__args)...); 175946035553Spatrick __move_range(__p, this->__end_, __p + 1); 1760*4bdff4beSrobert *__p = std::move(__tmp.get()); 176146035553Spatrick } 176246035553Spatrick } 176346035553Spatrick else 176446035553Spatrick { 176546035553Spatrick allocator_type& __a = this->__alloc(); 176646035553Spatrick __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); 1767*4bdff4beSrobert __v.emplace_back(std::forward<_Args>(__args)...); 176846035553Spatrick __p = __swap_out_circular_buffer(__v, __p); 176946035553Spatrick } 177046035553Spatrick return __make_iter(__p); 177146035553Spatrick} 177246035553Spatrick 177346035553Spatricktemplate <class _Tp, class _Allocator> 1774*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 177546035553Spatricktypename vector<_Tp, _Allocator>::iterator 177646035553Spatrickvector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x) 177746035553Spatrick{ 1778*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(std::addressof(__position)) == this, 1779*4bdff4beSrobert "vector::insert(iterator, n, x) called with an iterator not referring to this vector"); 178046035553Spatrick pointer __p = this->__begin_ + (__position - begin()); 178146035553Spatrick if (__n > 0) 178246035553Spatrick { 1783*4bdff4beSrobert // We can't compare unrelated pointers inside constant expressions 1784*4bdff4beSrobert if (!__libcpp_is_constant_evaluated() && __n <= static_cast<size_type>(this->__end_cap() - this->__end_)) 178546035553Spatrick { 178646035553Spatrick size_type __old_n = __n; 178746035553Spatrick pointer __old_last = this->__end_; 178846035553Spatrick if (__n > static_cast<size_type>(this->__end_ - __p)) 178946035553Spatrick { 179046035553Spatrick size_type __cx = __n - (this->__end_ - __p); 179146035553Spatrick __construct_at_end(__cx, __x); 179246035553Spatrick __n -= __cx; 179346035553Spatrick } 179446035553Spatrick if (__n > 0) 179546035553Spatrick { 179646035553Spatrick __move_range(__p, __old_last, __p + __old_n); 179746035553Spatrick const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x); 179846035553Spatrick if (__p <= __xr && __xr < this->__end_) 179946035553Spatrick __xr += __old_n; 1800*4bdff4beSrobert std::fill_n(__p, __n, *__xr); 180146035553Spatrick } 180246035553Spatrick } 180346035553Spatrick else 180446035553Spatrick { 180546035553Spatrick allocator_type& __a = this->__alloc(); 180646035553Spatrick __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a); 180746035553Spatrick __v.__construct_at_end(__n, __x); 180846035553Spatrick __p = __swap_out_circular_buffer(__v, __p); 180946035553Spatrick } 181046035553Spatrick } 181146035553Spatrick return __make_iter(__p); 181246035553Spatrick} 181346035553Spatrick 181446035553Spatricktemplate <class _Tp, class _Allocator> 1815*4bdff4beSroberttemplate <class _InputIterator, __enable_if_t<__is_exactly_cpp17_input_iterator<_InputIterator>::value && 1816*4bdff4beSrobert is_constructible<_Tp, typename iterator_traits<_InputIterator>::reference>::value, 1817*4bdff4beSrobert int> > 1818*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 181946035553Spatrickvector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last) 182046035553Spatrick{ 1821*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(std::addressof(__position)) == this, 1822*4bdff4beSrobert "vector::insert(iterator, range) called with an iterator not referring to this vector"); 182346035553Spatrick difference_type __off = __position - begin(); 182446035553Spatrick pointer __p = this->__begin_ + __off; 182546035553Spatrick allocator_type& __a = this->__alloc(); 182646035553Spatrick pointer __old_last = this->__end_; 182746035553Spatrick for (; this->__end_ != this->__end_cap() && __first != __last; ++__first) 182846035553Spatrick { 182946035553Spatrick __construct_one_at_end(*__first); 183046035553Spatrick } 183146035553Spatrick __split_buffer<value_type, allocator_type&> __v(__a); 183246035553Spatrick if (__first != __last) 183346035553Spatrick { 183446035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 183546035553Spatrick try 183646035553Spatrick { 183746035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 183846035553Spatrick __v.__construct_at_end(__first, __last); 183946035553Spatrick difference_type __old_size = __old_last - this->__begin_; 184046035553Spatrick difference_type __old_p = __p - this->__begin_; 184146035553Spatrick reserve(__recommend(size() + __v.size())); 184246035553Spatrick __p = this->__begin_ + __old_p; 184346035553Spatrick __old_last = this->__begin_ + __old_size; 184446035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 184546035553Spatrick } 184646035553Spatrick catch (...) 184746035553Spatrick { 184846035553Spatrick erase(__make_iter(__old_last), end()); 184946035553Spatrick throw; 185046035553Spatrick } 185146035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 185246035553Spatrick } 1853*4bdff4beSrobert __p = std::rotate(__p, __old_last, this->__end_); 1854*4bdff4beSrobert insert(__make_iter(__p), std::make_move_iterator(__v.begin()), 1855*4bdff4beSrobert std::make_move_iterator(__v.end())); 185646035553Spatrick return begin() + __off; 185746035553Spatrick} 185846035553Spatrick 185946035553Spatricktemplate <class _Tp, class _Allocator> 1860*4bdff4beSroberttemplate <class _ForwardIterator, __enable_if_t<__is_cpp17_forward_iterator<_ForwardIterator>::value && 1861*4bdff4beSrobert is_constructible<_Tp, typename iterator_traits<_ForwardIterator>::reference>::value, 1862*4bdff4beSrobert int> > 1863*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 186446035553Spatrickvector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last) 186546035553Spatrick{ 1866*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(std::addressof(__position)) == this, 1867*4bdff4beSrobert "vector::insert(iterator, range) called with an iterator not referring to this vector"); 186846035553Spatrick pointer __p = this->__begin_ + (__position - begin()); 1869*4bdff4beSrobert difference_type __n = std::distance(__first, __last); 187046035553Spatrick if (__n > 0) 187146035553Spatrick { 187246035553Spatrick if (__n <= this->__end_cap() - this->__end_) 187346035553Spatrick { 187446035553Spatrick size_type __old_n = __n; 187546035553Spatrick pointer __old_last = this->__end_; 187646035553Spatrick _ForwardIterator __m = __last; 187746035553Spatrick difference_type __dx = this->__end_ - __p; 187846035553Spatrick if (__n > __dx) 187946035553Spatrick { 188046035553Spatrick __m = __first; 188146035553Spatrick difference_type __diff = this->__end_ - __p; 1882*4bdff4beSrobert std::advance(__m, __diff); 188346035553Spatrick __construct_at_end(__m, __last, __n - __diff); 188446035553Spatrick __n = __dx; 188546035553Spatrick } 188646035553Spatrick if (__n > 0) 188746035553Spatrick { 188846035553Spatrick __move_range(__p, __old_last, __p + __old_n); 1889*4bdff4beSrobert std::copy(__first, __m, __p); 189046035553Spatrick } 189146035553Spatrick } 189246035553Spatrick else 189346035553Spatrick { 189446035553Spatrick allocator_type& __a = this->__alloc(); 189546035553Spatrick __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a); 189646035553Spatrick __v.__construct_at_end(__first, __last); 189746035553Spatrick __p = __swap_out_circular_buffer(__v, __p); 189846035553Spatrick } 189946035553Spatrick } 190046035553Spatrick return __make_iter(__p); 190146035553Spatrick} 190246035553Spatrick 190346035553Spatricktemplate <class _Tp, class _Allocator> 1904*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 190546035553Spatrickvoid 190646035553Spatrickvector<_Tp, _Allocator>::resize(size_type __sz) 190746035553Spatrick{ 190846035553Spatrick size_type __cs = size(); 190946035553Spatrick if (__cs < __sz) 191046035553Spatrick this->__append(__sz - __cs); 191146035553Spatrick else if (__cs > __sz) 191246035553Spatrick this->__destruct_at_end(this->__begin_ + __sz); 191346035553Spatrick} 191446035553Spatrick 191546035553Spatricktemplate <class _Tp, class _Allocator> 1916*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 191746035553Spatrickvoid 191846035553Spatrickvector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x) 191946035553Spatrick{ 192046035553Spatrick size_type __cs = size(); 192146035553Spatrick if (__cs < __sz) 192246035553Spatrick this->__append(__sz - __cs, __x); 192346035553Spatrick else if (__cs > __sz) 192446035553Spatrick this->__destruct_at_end(this->__begin_ + __sz); 192546035553Spatrick} 192646035553Spatrick 192746035553Spatricktemplate <class _Tp, class _Allocator> 1928*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 192946035553Spatrickvoid 193046035553Spatrickvector<_Tp, _Allocator>::swap(vector& __x) 193146035553Spatrick#if _LIBCPP_STD_VER >= 14 193246035553Spatrick _NOEXCEPT 193346035553Spatrick#else 193446035553Spatrick _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 193546035553Spatrick __is_nothrow_swappable<allocator_type>::value) 193646035553Spatrick#endif 193746035553Spatrick{ 193846035553Spatrick _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value || 193946035553Spatrick this->__alloc() == __x.__alloc(), 194046035553Spatrick "vector::swap: Either propagate_on_container_swap must be true" 194146035553Spatrick " or the allocators must compare equal"); 1942*4bdff4beSrobert std::swap(this->__begin_, __x.__begin_); 1943*4bdff4beSrobert std::swap(this->__end_, __x.__end_); 1944*4bdff4beSrobert std::swap(this->__end_cap(), __x.__end_cap()); 1945*4bdff4beSrobert std::__swap_allocator(this->__alloc(), __x.__alloc(), 194646035553Spatrick integral_constant<bool,__alloc_traits::propagate_on_container_swap::value>()); 1947*4bdff4beSrobert std::__debug_db_swap(this, std::addressof(__x)); 194846035553Spatrick} 194946035553Spatrick 195046035553Spatricktemplate <class _Tp, class _Allocator> 1951*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 195246035553Spatrickbool 195346035553Spatrickvector<_Tp, _Allocator>::__invariants() const 195446035553Spatrick{ 195546035553Spatrick if (this->__begin_ == nullptr) 195646035553Spatrick { 195746035553Spatrick if (this->__end_ != nullptr || this->__end_cap() != nullptr) 195846035553Spatrick return false; 195946035553Spatrick } 196046035553Spatrick else 196146035553Spatrick { 196246035553Spatrick if (this->__begin_ > this->__end_) 196346035553Spatrick return false; 196446035553Spatrick if (this->__begin_ == this->__end_cap()) 196546035553Spatrick return false; 196646035553Spatrick if (this->__end_ > this->__end_cap()) 196746035553Spatrick return false; 196846035553Spatrick } 196946035553Spatrick return true; 197046035553Spatrick} 197146035553Spatrick 1972*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 197346035553Spatrick 197446035553Spatricktemplate <class _Tp, class _Allocator> 197546035553Spatrickbool 197646035553Spatrickvector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const 197746035553Spatrick{ 197846035553Spatrick return this->__begin_ <= __i->base() && __i->base() < this->__end_; 197946035553Spatrick} 198046035553Spatrick 198146035553Spatricktemplate <class _Tp, class _Allocator> 198246035553Spatrickbool 198346035553Spatrickvector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const 198446035553Spatrick{ 198546035553Spatrick return this->__begin_ < __i->base() && __i->base() <= this->__end_; 198646035553Spatrick} 198746035553Spatrick 198846035553Spatricktemplate <class _Tp, class _Allocator> 198946035553Spatrickbool 199046035553Spatrickvector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const 199146035553Spatrick{ 199246035553Spatrick const_pointer __p = __i->base() + __n; 199346035553Spatrick return this->__begin_ <= __p && __p <= this->__end_; 199446035553Spatrick} 199546035553Spatrick 199646035553Spatricktemplate <class _Tp, class _Allocator> 199746035553Spatrickbool 199846035553Spatrickvector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const 199946035553Spatrick{ 200046035553Spatrick const_pointer __p = __i->base() + __n; 200146035553Spatrick return this->__begin_ <= __p && __p < this->__end_; 200246035553Spatrick} 200346035553Spatrick 2004*4bdff4beSrobert#endif // _LIBCPP_ENABLE_DEBUG_MODE 200546035553Spatrick 200646035553Spatricktemplate <class _Tp, class _Allocator> 2007*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 200846035553Spatrickvoid 200946035553Spatrickvector<_Tp, _Allocator>::__invalidate_iterators_past(pointer __new_last) { 2010*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 201146035553Spatrick __c_node* __c = __get_db()->__find_c_and_lock(this); 201246035553Spatrick for (__i_node** __p = __c->end_; __p != __c->beg_; ) { 201346035553Spatrick --__p; 201446035553Spatrick const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_); 201546035553Spatrick if (__i->base() > __new_last) { 201646035553Spatrick (*__p)->__c_ = nullptr; 201746035553Spatrick if (--__c->end_ != __p) 2018*4bdff4beSrobert std::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*)); 201946035553Spatrick } 202046035553Spatrick } 202146035553Spatrick __get_db()->unlock(); 202246035553Spatrick#else 202346035553Spatrick ((void)__new_last); 202446035553Spatrick#endif 202546035553Spatrick} 202646035553Spatrick 202746035553Spatrick// vector<bool> 202846035553Spatrick 202946035553Spatricktemplate <class _Allocator> class vector<bool, _Allocator>; 203046035553Spatrick 203146035553Spatricktemplate <class _Allocator> struct hash<vector<bool, _Allocator> >; 203246035553Spatrick 203346035553Spatricktemplate <class _Allocator> 203446035553Spatrickstruct __has_storage_type<vector<bool, _Allocator> > 203546035553Spatrick{ 203646035553Spatrick static const bool value = true; 203746035553Spatrick}; 203846035553Spatrick 203946035553Spatricktemplate <class _Allocator> 204046035553Spatrickclass _LIBCPP_TEMPLATE_VIS vector<bool, _Allocator> 204146035553Spatrick{ 204246035553Spatrickpublic: 204346035553Spatrick typedef vector __self; 204446035553Spatrick typedef bool value_type; 204546035553Spatrick typedef _Allocator allocator_type; 204646035553Spatrick typedef allocator_traits<allocator_type> __alloc_traits; 204746035553Spatrick typedef typename __alloc_traits::size_type size_type; 204846035553Spatrick typedef typename __alloc_traits::difference_type difference_type; 204946035553Spatrick typedef size_type __storage_type; 205046035553Spatrick typedef __bit_iterator<vector, false> pointer; 205146035553Spatrick typedef __bit_iterator<vector, true> const_pointer; 205246035553Spatrick typedef pointer iterator; 205346035553Spatrick typedef const_pointer const_iterator; 2054*4bdff4beSrobert typedef std::reverse_iterator<iterator> reverse_iterator; 2055*4bdff4beSrobert typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 205646035553Spatrick 205746035553Spatrickprivate: 2058*4bdff4beSrobert typedef __rebind_alloc<__alloc_traits, __storage_type> __storage_allocator; 205946035553Spatrick typedef allocator_traits<__storage_allocator> __storage_traits; 206046035553Spatrick typedef typename __storage_traits::pointer __storage_pointer; 206146035553Spatrick typedef typename __storage_traits::const_pointer __const_storage_pointer; 206246035553Spatrick 206346035553Spatrick __storage_pointer __begin_; 206446035553Spatrick size_type __size_; 206546035553Spatrick __compressed_pair<size_type, __storage_allocator> __cap_alloc_; 206646035553Spatrickpublic: 206746035553Spatrick typedef __bit_reference<vector> reference; 2068*4bdff4beSrobert#ifdef _LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL 2069*4bdff4beSrobert using const_reference = bool; 2070*4bdff4beSrobert#else 207146035553Spatrick typedef __bit_const_reference<vector> const_reference; 2072*4bdff4beSrobert#endif 207346035553Spatrickprivate: 2074*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 207546035553Spatrick size_type& __cap() _NOEXCEPT 207646035553Spatrick {return __cap_alloc_.first();} 2077*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 207846035553Spatrick const size_type& __cap() const _NOEXCEPT 207946035553Spatrick {return __cap_alloc_.first();} 2080*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 208146035553Spatrick __storage_allocator& __alloc() _NOEXCEPT 208246035553Spatrick {return __cap_alloc_.second();} 2083*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 208446035553Spatrick const __storage_allocator& __alloc() const _NOEXCEPT 208546035553Spatrick {return __cap_alloc_.second();} 208646035553Spatrick 208746035553Spatrick static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT); 208846035553Spatrick 2089*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 209046035553Spatrick static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT 209146035553Spatrick {return __n * __bits_per_word;} 2092*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 209346035553Spatrick static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT 209446035553Spatrick {return (__n - 1) / __bits_per_word + 1;} 209546035553Spatrick 209646035553Spatrickpublic: 2097*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 209846035553Spatrick vector() _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); 209946035553Spatrick 2100*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit vector(const allocator_type& __a) 210146035553Spatrick#if _LIBCPP_STD_VER <= 14 210246035553Spatrick _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value); 210346035553Spatrick#else 210446035553Spatrick _NOEXCEPT; 210546035553Spatrick#endif 2106*4bdff4beSrobert 2107*4bdff4beSrobertprivate: 2108*4bdff4beSrobert class __destroy_vector { 2109*4bdff4beSrobert public: 2110*4bdff4beSrobert _LIBCPP_CONSTEXPR __destroy_vector(vector& __vec) : __vec_(__vec) {} 2111*4bdff4beSrobert 2112*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void operator()() { 2113*4bdff4beSrobert if (__vec_.__begin_ != nullptr) 2114*4bdff4beSrobert __storage_traits::deallocate(__vec_.__alloc(), __vec_.__begin_, __vec_.__cap()); 2115*4bdff4beSrobert std::__debug_db_invalidate_all(this); 2116*4bdff4beSrobert } 2117*4bdff4beSrobert 2118*4bdff4beSrobert private: 2119*4bdff4beSrobert vector& __vec_; 2120*4bdff4beSrobert }; 2121*4bdff4beSrobert 2122*4bdff4beSrobertpublic: 2123*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 ~vector() { __destroy_vector(*this)(); } 2124*4bdff4beSrobert 2125*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit vector(size_type __n); 212646035553Spatrick#if _LIBCPP_STD_VER > 11 2127*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit vector(size_type __n, const allocator_type& __a); 212846035553Spatrick#endif 2129*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(size_type __n, const value_type& __v); 2130*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(size_type __n, const value_type& __v, const allocator_type& __a); 213146035553Spatrick template <class _InputIterator> 2132*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(_InputIterator __first, _InputIterator __last, 2133*4bdff4beSrobert typename enable_if<__is_exactly_cpp17_input_iterator<_InputIterator>::value>::type* = 0); 213446035553Spatrick template <class _InputIterator> 2135*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, 2136*4bdff4beSrobert typename enable_if<__is_exactly_cpp17_input_iterator<_InputIterator>::value>::type* = 0); 213746035553Spatrick template <class _ForwardIterator> 2138*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(_ForwardIterator __first, _ForwardIterator __last, 213946035553Spatrick typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value>::type* = 0); 214046035553Spatrick template <class _ForwardIterator> 2141*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, 214246035553Spatrick typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value>::type* = 0); 214346035553Spatrick 2144*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(const vector& __v); 2145*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(const vector& __v, const allocator_type& __a); 2146*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector& operator=(const vector& __v); 214746035553Spatrick 214846035553Spatrick#ifndef _LIBCPP_CXX03_LANG 2149*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(initializer_list<value_type> __il); 2150*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(initializer_list<value_type> __il, const allocator_type& __a); 215146035553Spatrick 2152*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 215346035553Spatrick vector& operator=(initializer_list<value_type> __il) 215446035553Spatrick {assign(__il.begin(), __il.end()); return *this;} 215546035553Spatrick 215646035553Spatrick#endif // !_LIBCPP_CXX03_LANG 215746035553Spatrick 2158*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 2159*4bdff4beSrobert vector(vector&& __v) 2160*4bdff4beSrobert#if _LIBCPP_STD_VER > 14 2161*4bdff4beSrobert noexcept; 2162*4bdff4beSrobert#else 2163*4bdff4beSrobert _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); 2164*4bdff4beSrobert#endif 2165*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(vector&& __v, const __type_identity_t<allocator_type>& __a); 2166*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 2167*4bdff4beSrobert vector& operator=(vector&& __v) 2168*4bdff4beSrobert _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)); 2169*4bdff4beSrobert 217046035553Spatrick template <class _InputIterator> 2171*4bdff4beSrobert typename enable_if <__is_exactly_cpp17_input_iterator<_InputIterator>::value, 217246035553Spatrick void 217346035553Spatrick >::type 2174*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 assign(_InputIterator __first, _InputIterator __last); 217546035553Spatrick template <class _ForwardIterator> 217646035553Spatrick typename enable_if 217746035553Spatrick < 217846035553Spatrick __is_cpp17_forward_iterator<_ForwardIterator>::value, 217946035553Spatrick void 218046035553Spatrick >::type 2181*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 assign(_ForwardIterator __first, _ForwardIterator __last); 218246035553Spatrick 2183*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void assign(size_type __n, const value_type& __x); 218446035553Spatrick 218546035553Spatrick#ifndef _LIBCPP_CXX03_LANG 2186*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 218746035553Spatrick void assign(initializer_list<value_type> __il) 218846035553Spatrick {assign(__il.begin(), __il.end());} 218946035553Spatrick#endif 219046035553Spatrick 2191*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 allocator_type get_allocator() const _NOEXCEPT 219246035553Spatrick {return allocator_type(this->__alloc());} 219346035553Spatrick 2194*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type max_size() const _NOEXCEPT; 2195*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 219646035553Spatrick size_type capacity() const _NOEXCEPT 219746035553Spatrick {return __internal_cap_to_external(__cap());} 2198*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 219946035553Spatrick size_type size() const _NOEXCEPT 220046035553Spatrick {return __size_;} 2201*4bdff4beSrobert _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 220246035553Spatrick bool empty() const _NOEXCEPT 220346035553Spatrick {return __size_ == 0;} 2204*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void reserve(size_type __n); 2205*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void shrink_to_fit() _NOEXCEPT; 220646035553Spatrick 2207*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 220846035553Spatrick iterator begin() _NOEXCEPT 220946035553Spatrick {return __make_iter(0);} 2210*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 221146035553Spatrick const_iterator begin() const _NOEXCEPT 221246035553Spatrick {return __make_iter(0);} 2213*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 221446035553Spatrick iterator end() _NOEXCEPT 221546035553Spatrick {return __make_iter(__size_);} 2216*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 221746035553Spatrick const_iterator end() const _NOEXCEPT 221846035553Spatrick {return __make_iter(__size_);} 221946035553Spatrick 2220*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 222146035553Spatrick reverse_iterator rbegin() _NOEXCEPT 222246035553Spatrick {return reverse_iterator(end());} 2223*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 222446035553Spatrick const_reverse_iterator rbegin() const _NOEXCEPT 222546035553Spatrick {return const_reverse_iterator(end());} 2226*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 222746035553Spatrick reverse_iterator rend() _NOEXCEPT 222846035553Spatrick {return reverse_iterator(begin());} 2229*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 223046035553Spatrick const_reverse_iterator rend() const _NOEXCEPT 223146035553Spatrick {return const_reverse_iterator(begin());} 223246035553Spatrick 2233*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 223446035553Spatrick const_iterator cbegin() const _NOEXCEPT 223546035553Spatrick {return __make_iter(0);} 2236*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 223746035553Spatrick const_iterator cend() const _NOEXCEPT 223846035553Spatrick {return __make_iter(__size_);} 2239*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 224046035553Spatrick const_reverse_iterator crbegin() const _NOEXCEPT 224146035553Spatrick {return rbegin();} 2242*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 224346035553Spatrick const_reverse_iterator crend() const _NOEXCEPT 224446035553Spatrick {return rend();} 224546035553Spatrick 2246*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference operator[](size_type __n) {return __make_ref(__n);} 2247*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference operator[](size_type __n) const {return __make_ref(__n);} 2248*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI reference at(size_type __n); 2249*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI const_reference at(size_type __n) const; 225046035553Spatrick 2251*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference front() {return __make_ref(0);} 2252*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference front() const {return __make_ref(0);} 2253*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference back() {return __make_ref(__size_ - 1);} 2254*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference back() const {return __make_ref(__size_ - 1);} 225546035553Spatrick 2256*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void push_back(const value_type& __x); 225746035553Spatrick#if _LIBCPP_STD_VER > 11 225846035553Spatrick template <class... _Args> 225946035553Spatrick#if _LIBCPP_STD_VER > 14 2260*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference emplace_back(_Args&&... __args) 226146035553Spatrick#else 2262*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI void emplace_back(_Args&&... __args) 226346035553Spatrick#endif 226446035553Spatrick { 2265*4bdff4beSrobert push_back ( value_type ( std::forward<_Args>(__args)... )); 226646035553Spatrick#if _LIBCPP_STD_VER > 14 226746035553Spatrick return this->back(); 226846035553Spatrick#endif 226946035553Spatrick } 227046035553Spatrick#endif 227146035553Spatrick 2272*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void pop_back() {--__size_;} 227346035553Spatrick 227446035553Spatrick#if _LIBCPP_STD_VER > 11 227546035553Spatrick template <class... _Args> 2276*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator emplace(const_iterator __position, _Args&&... __args) 2277*4bdff4beSrobert { return insert ( __position, value_type ( std::forward<_Args>(__args)... )); } 227846035553Spatrick#endif 227946035553Spatrick 2280*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator insert(const_iterator __position, const value_type& __x); 2281*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator insert(const_iterator __position, size_type __n, const value_type& __x); 228246035553Spatrick template <class _InputIterator> 2283*4bdff4beSrobert typename enable_if <__is_exactly_cpp17_input_iterator<_InputIterator>::value, 228446035553Spatrick iterator 228546035553Spatrick >::type 2286*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert(const_iterator __position, _InputIterator __first, _InputIterator __last); 228746035553Spatrick template <class _ForwardIterator> 228846035553Spatrick typename enable_if 228946035553Spatrick < 229046035553Spatrick __is_cpp17_forward_iterator<_ForwardIterator>::value, 229146035553Spatrick iterator 229246035553Spatrick >::type 2293*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last); 229446035553Spatrick 229546035553Spatrick#ifndef _LIBCPP_CXX03_LANG 2296*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 229746035553Spatrick iterator insert(const_iterator __position, initializer_list<value_type> __il) 229846035553Spatrick {return insert(__position, __il.begin(), __il.end());} 229946035553Spatrick#endif 230046035553Spatrick 2301*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator erase(const_iterator __position); 2302*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator erase(const_iterator __first, const_iterator __last); 230346035553Spatrick 2304*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 230546035553Spatrick void clear() _NOEXCEPT {__size_ = 0;} 230646035553Spatrick 2307*4bdff4beSrobert _LIBCPP_CONSTEXPR_SINCE_CXX20 void swap(vector&) 230846035553Spatrick#if _LIBCPP_STD_VER >= 14 230946035553Spatrick _NOEXCEPT; 231046035553Spatrick#else 231146035553Spatrick _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 231246035553Spatrick __is_nothrow_swappable<allocator_type>::value); 231346035553Spatrick#endif 2314*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static void swap(reference __x, reference __y) _NOEXCEPT { std::swap(__x, __y); } 231546035553Spatrick 2316*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void resize(size_type __sz, value_type __x = false); 2317*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void flip() _NOEXCEPT; 231846035553Spatrick 2319*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool __invariants() const; 232046035553Spatrick 232146035553Spatrickprivate: 2322*4bdff4beSrobert _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI 2323*4bdff4beSrobert void __throw_length_error() const { 2324*4bdff4beSrobert std::__throw_length_error("vector"); 2325*4bdff4beSrobert } 2326*4bdff4beSrobert 2327*4bdff4beSrobert _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI 2328*4bdff4beSrobert void __throw_out_of_range() const { 2329*4bdff4beSrobert std::__throw_out_of_range("vector"); 2330*4bdff4beSrobert } 2331*4bdff4beSrobert 2332*4bdff4beSrobert // Allocate space for __n objects 2333*4bdff4beSrobert // throws length_error if __n > max_size() 2334*4bdff4beSrobert // throws (probably bad_alloc) if memory run out 2335*4bdff4beSrobert // Precondition: __begin_ == __end_ == __cap() == 0 2336*4bdff4beSrobert // Precondition: __n > 0 2337*4bdff4beSrobert // Postcondition: capacity() >= __n 2338*4bdff4beSrobert // Postcondition: size() == 0 2339*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __vallocate(size_type __n) { 2340*4bdff4beSrobert if (__n > max_size()) 2341*4bdff4beSrobert __throw_length_error(); 2342*4bdff4beSrobert auto __allocation = std::__allocate_at_least(__alloc(), __external_cap_to_internal(__n)); 2343*4bdff4beSrobert __begin_ = __allocation.ptr; 2344*4bdff4beSrobert __size_ = 0; 2345*4bdff4beSrobert __cap() = __allocation.count; 2346*4bdff4beSrobert if (__libcpp_is_constant_evaluated()) { 2347*4bdff4beSrobert for (size_type __i = 0; __i != __cap(); ++__i) 2348*4bdff4beSrobert std::__construct_at(std::__to_address(__begin_) + __i); 2349*4bdff4beSrobert } 2350*4bdff4beSrobert } 2351*4bdff4beSrobert 2352*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __vdeallocate() _NOEXCEPT; 2353*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 235446035553Spatrick static size_type __align_it(size_type __new_size) _NOEXCEPT 2355*4bdff4beSrobert {return (__new_size + (__bits_per_word-1)) & ~((size_type)__bits_per_word-1);} 2356*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type __recommend(size_type __new_size) const; 2357*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __construct_at_end(size_type __n, bool __x); 235846035553Spatrick template <class _ForwardIterator> 235946035553Spatrick typename enable_if 236046035553Spatrick < 236146035553Spatrick __is_cpp17_forward_iterator<_ForwardIterator>::value, 236246035553Spatrick void 236346035553Spatrick >::type 2364*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last); 2365*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __append(size_type __n, const_reference __x); 2366*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 236746035553Spatrick reference __make_ref(size_type __pos) _NOEXCEPT 236846035553Spatrick {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);} 2369*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 2370*4bdff4beSrobert const_reference __make_ref(size_type __pos) const _NOEXCEPT { 2371*4bdff4beSrobert return __bit_const_reference<vector>(__begin_ + __pos / __bits_per_word, 2372*4bdff4beSrobert __storage_type(1) << __pos % __bits_per_word); 2373*4bdff4beSrobert } 2374*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 237546035553Spatrick iterator __make_iter(size_type __pos) _NOEXCEPT 237646035553Spatrick {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));} 2377*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 237846035553Spatrick const_iterator __make_iter(size_type __pos) const _NOEXCEPT 237946035553Spatrick {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));} 2380*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 238146035553Spatrick iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT 238246035553Spatrick {return begin() + (__p - cbegin());} 238346035553Spatrick 2384*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 238546035553Spatrick void __copy_assign_alloc(const vector& __v) 238646035553Spatrick {__copy_assign_alloc(__v, integral_constant<bool, 238746035553Spatrick __storage_traits::propagate_on_container_copy_assignment::value>());} 2388*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 238946035553Spatrick void __copy_assign_alloc(const vector& __c, true_type) 239046035553Spatrick { 239146035553Spatrick if (__alloc() != __c.__alloc()) 239246035553Spatrick __vdeallocate(); 239346035553Spatrick __alloc() = __c.__alloc(); 239446035553Spatrick } 239546035553Spatrick 2396*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 239746035553Spatrick void __copy_assign_alloc(const vector&, false_type) 239846035553Spatrick {} 239946035553Spatrick 2400*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __move_assign(vector& __c, false_type); 2401*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __move_assign(vector& __c, true_type) 240246035553Spatrick _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); 2403*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 240446035553Spatrick void __move_assign_alloc(vector& __c) 240546035553Spatrick _NOEXCEPT_( 240646035553Spatrick !__storage_traits::propagate_on_container_move_assignment::value || 240746035553Spatrick is_nothrow_move_assignable<allocator_type>::value) 240846035553Spatrick {__move_assign_alloc(__c, integral_constant<bool, 240946035553Spatrick __storage_traits::propagate_on_container_move_assignment::value>());} 2410*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 241146035553Spatrick void __move_assign_alloc(vector& __c, true_type) 241246035553Spatrick _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 241346035553Spatrick { 2414*4bdff4beSrobert __alloc() = std::move(__c.__alloc()); 241546035553Spatrick } 241646035553Spatrick 2417*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 241846035553Spatrick void __move_assign_alloc(vector&, false_type) 241946035553Spatrick _NOEXCEPT 242046035553Spatrick {} 242146035553Spatrick 2422*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_t __hash_code() const _NOEXCEPT; 242346035553Spatrick 242446035553Spatrick friend class __bit_reference<vector>; 242546035553Spatrick friend class __bit_const_reference<vector>; 242646035553Spatrick friend class __bit_iterator<vector, false>; 242746035553Spatrick friend class __bit_iterator<vector, true>; 242846035553Spatrick friend struct __bit_array<vector>; 242946035553Spatrick friend struct _LIBCPP_TEMPLATE_VIS hash<vector>; 243046035553Spatrick}; 243146035553Spatrick 243246035553Spatricktemplate <class _Allocator> 2433*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 void 243446035553Spatrickvector<bool, _Allocator>::__vdeallocate() _NOEXCEPT 243546035553Spatrick{ 243646035553Spatrick if (this->__begin_ != nullptr) 243746035553Spatrick { 243846035553Spatrick __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap()); 2439*4bdff4beSrobert std::__debug_db_invalidate_all(this); 244046035553Spatrick this->__begin_ = nullptr; 244146035553Spatrick this->__size_ = this->__cap() = 0; 244246035553Spatrick } 244346035553Spatrick} 244446035553Spatrick 244546035553Spatricktemplate <class _Allocator> 2446*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 244746035553Spatricktypename vector<bool, _Allocator>::size_type 244846035553Spatrickvector<bool, _Allocator>::max_size() const _NOEXCEPT 244946035553Spatrick{ 245046035553Spatrick size_type __amax = __storage_traits::max_size(__alloc()); 245146035553Spatrick size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always 245246035553Spatrick if (__nmax / __bits_per_word <= __amax) 245346035553Spatrick return __nmax; 245446035553Spatrick return __internal_cap_to_external(__amax); 245546035553Spatrick} 245646035553Spatrick 245746035553Spatrick// Precondition: __new_size > capacity() 245846035553Spatricktemplate <class _Allocator> 2459*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 246046035553Spatricktypename vector<bool, _Allocator>::size_type 246146035553Spatrickvector<bool, _Allocator>::__recommend(size_type __new_size) const 246246035553Spatrick{ 246346035553Spatrick const size_type __ms = max_size(); 246446035553Spatrick if (__new_size > __ms) 246546035553Spatrick this->__throw_length_error(); 246646035553Spatrick const size_type __cap = capacity(); 246746035553Spatrick if (__cap >= __ms / 2) 246846035553Spatrick return __ms; 2469*4bdff4beSrobert return std::max(2 * __cap, __align_it(__new_size)); 247046035553Spatrick} 247146035553Spatrick 247246035553Spatrick// Default constructs __n objects starting at __end_ 247346035553Spatrick// Precondition: __n > 0 247446035553Spatrick// Precondition: size() + __n <= capacity() 247546035553Spatrick// Postcondition: size() == size() + __n 247646035553Spatricktemplate <class _Allocator> 2477*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 247846035553Spatrickvoid 247946035553Spatrickvector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x) 248046035553Spatrick{ 248146035553Spatrick size_type __old_size = this->__size_; 248246035553Spatrick this->__size_ += __n; 248346035553Spatrick if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word)) 248446035553Spatrick { 248546035553Spatrick if (this->__size_ <= __bits_per_word) 248646035553Spatrick this->__begin_[0] = __storage_type(0); 248746035553Spatrick else 248846035553Spatrick this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0); 248946035553Spatrick } 2490*4bdff4beSrobert std::fill_n(__make_iter(__old_size), __n, __x); 249146035553Spatrick} 249246035553Spatrick 249346035553Spatricktemplate <class _Allocator> 249446035553Spatricktemplate <class _ForwardIterator> 2495*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 249646035553Spatricktypename enable_if 249746035553Spatrick< 249846035553Spatrick __is_cpp17_forward_iterator<_ForwardIterator>::value, 249946035553Spatrick void 250046035553Spatrick>::type 250146035553Spatrickvector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last) 250246035553Spatrick{ 250346035553Spatrick size_type __old_size = this->__size_; 2504*4bdff4beSrobert this->__size_ += std::distance(__first, __last); 250546035553Spatrick if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word)) 250646035553Spatrick { 250746035553Spatrick if (this->__size_ <= __bits_per_word) 250846035553Spatrick this->__begin_[0] = __storage_type(0); 250946035553Spatrick else 251046035553Spatrick this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0); 251146035553Spatrick } 2512*4bdff4beSrobert std::copy(__first, __last, __make_iter(__old_size)); 251346035553Spatrick} 251446035553Spatrick 251546035553Spatricktemplate <class _Allocator> 2516*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 251746035553Spatrickvector<bool, _Allocator>::vector() 251846035553Spatrick _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) 251946035553Spatrick : __begin_(nullptr), 252046035553Spatrick __size_(0), 252146035553Spatrick __cap_alloc_(0, __default_init_tag()) 252246035553Spatrick{ 252346035553Spatrick} 252446035553Spatrick 252546035553Spatricktemplate <class _Allocator> 2526*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 252746035553Spatrickvector<bool, _Allocator>::vector(const allocator_type& __a) 252846035553Spatrick#if _LIBCPP_STD_VER <= 14 252946035553Spatrick _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value) 253046035553Spatrick#else 253146035553Spatrick _NOEXCEPT 253246035553Spatrick#endif 253346035553Spatrick : __begin_(nullptr), 253446035553Spatrick __size_(0), 253546035553Spatrick __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 253646035553Spatrick{ 253746035553Spatrick} 253846035553Spatrick 253946035553Spatricktemplate <class _Allocator> 2540*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 254146035553Spatrickvector<bool, _Allocator>::vector(size_type __n) 254246035553Spatrick : __begin_(nullptr), 254346035553Spatrick __size_(0), 254446035553Spatrick __cap_alloc_(0, __default_init_tag()) 254546035553Spatrick{ 254646035553Spatrick if (__n > 0) 254746035553Spatrick { 254846035553Spatrick __vallocate(__n); 254946035553Spatrick __construct_at_end(__n, false); 255046035553Spatrick } 255146035553Spatrick} 255246035553Spatrick 255346035553Spatrick#if _LIBCPP_STD_VER > 11 255446035553Spatricktemplate <class _Allocator> 2555*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 255646035553Spatrickvector<bool, _Allocator>::vector(size_type __n, const allocator_type& __a) 255746035553Spatrick : __begin_(nullptr), 255846035553Spatrick __size_(0), 255946035553Spatrick __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 256046035553Spatrick{ 256146035553Spatrick if (__n > 0) 256246035553Spatrick { 256346035553Spatrick __vallocate(__n); 256446035553Spatrick __construct_at_end(__n, false); 256546035553Spatrick } 256646035553Spatrick} 256746035553Spatrick#endif 256846035553Spatrick 256946035553Spatricktemplate <class _Allocator> 2570*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 257146035553Spatrickvector<bool, _Allocator>::vector(size_type __n, const value_type& __x) 257246035553Spatrick : __begin_(nullptr), 257346035553Spatrick __size_(0), 257446035553Spatrick __cap_alloc_(0, __default_init_tag()) 257546035553Spatrick{ 257646035553Spatrick if (__n > 0) 257746035553Spatrick { 257846035553Spatrick __vallocate(__n); 257946035553Spatrick __construct_at_end(__n, __x); 258046035553Spatrick } 258146035553Spatrick} 258246035553Spatrick 258346035553Spatricktemplate <class _Allocator> 2584*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 258546035553Spatrickvector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a) 258646035553Spatrick : __begin_(nullptr), 258746035553Spatrick __size_(0), 258846035553Spatrick __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 258946035553Spatrick{ 259046035553Spatrick if (__n > 0) 259146035553Spatrick { 259246035553Spatrick __vallocate(__n); 259346035553Spatrick __construct_at_end(__n, __x); 259446035553Spatrick } 259546035553Spatrick} 259646035553Spatrick 259746035553Spatricktemplate <class _Allocator> 259846035553Spatricktemplate <class _InputIterator> 2599*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 260046035553Spatrickvector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, 2601*4bdff4beSrobert typename enable_if<__is_exactly_cpp17_input_iterator<_InputIterator>::value>::type*) 260246035553Spatrick : __begin_(nullptr), 260346035553Spatrick __size_(0), 260446035553Spatrick __cap_alloc_(0, __default_init_tag()) 260546035553Spatrick{ 260646035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 260746035553Spatrick try 260846035553Spatrick { 260946035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 261046035553Spatrick for (; __first != __last; ++__first) 261146035553Spatrick push_back(*__first); 261246035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 261346035553Spatrick } 261446035553Spatrick catch (...) 261546035553Spatrick { 261646035553Spatrick if (__begin_ != nullptr) 261746035553Spatrick __storage_traits::deallocate(__alloc(), __begin_, __cap()); 2618*4bdff4beSrobert std::__debug_db_invalidate_all(this); 261946035553Spatrick throw; 262046035553Spatrick } 262146035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 262246035553Spatrick} 262346035553Spatrick 262446035553Spatricktemplate <class _Allocator> 262546035553Spatricktemplate <class _InputIterator> 2626*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 262746035553Spatrickvector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, 2628*4bdff4beSrobert typename enable_if<__is_exactly_cpp17_input_iterator<_InputIterator>::value>::type*) 262946035553Spatrick : __begin_(nullptr), 263046035553Spatrick __size_(0), 263146035553Spatrick __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 263246035553Spatrick{ 263346035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 263446035553Spatrick try 263546035553Spatrick { 263646035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 263746035553Spatrick for (; __first != __last; ++__first) 263846035553Spatrick push_back(*__first); 263946035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 264046035553Spatrick } 264146035553Spatrick catch (...) 264246035553Spatrick { 264346035553Spatrick if (__begin_ != nullptr) 264446035553Spatrick __storage_traits::deallocate(__alloc(), __begin_, __cap()); 2645*4bdff4beSrobert std::__debug_db_invalidate_all(this); 264646035553Spatrick throw; 264746035553Spatrick } 264846035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 264946035553Spatrick} 265046035553Spatrick 265146035553Spatricktemplate <class _Allocator> 265246035553Spatricktemplate <class _ForwardIterator> 2653*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 265446035553Spatrickvector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, 265546035553Spatrick typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value>::type*) 265646035553Spatrick : __begin_(nullptr), 265746035553Spatrick __size_(0), 265846035553Spatrick __cap_alloc_(0, __default_init_tag()) 265946035553Spatrick{ 2660*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 2661*4bdff4beSrobert size_type __n = static_cast<size_type>(std::distance(__first, __last)); 266246035553Spatrick if (__n > 0) 266346035553Spatrick { 266446035553Spatrick __vallocate(__n); 266546035553Spatrick __construct_at_end(__first, __last); 266646035553Spatrick } 2667*4bdff4beSrobert __guard.__complete(); 266846035553Spatrick} 266946035553Spatrick 267046035553Spatricktemplate <class _Allocator> 267146035553Spatricktemplate <class _ForwardIterator> 2672*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 267346035553Spatrickvector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, 267446035553Spatrick typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value>::type*) 267546035553Spatrick : __begin_(nullptr), 267646035553Spatrick __size_(0), 267746035553Spatrick __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 267846035553Spatrick{ 2679*4bdff4beSrobert auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 2680*4bdff4beSrobert size_type __n = static_cast<size_type>(std::distance(__first, __last)); 268146035553Spatrick if (__n > 0) 268246035553Spatrick { 268346035553Spatrick __vallocate(__n); 268446035553Spatrick __construct_at_end(__first, __last); 268546035553Spatrick } 2686*4bdff4beSrobert __guard.__complete(); 268746035553Spatrick} 268846035553Spatrick 268946035553Spatrick#ifndef _LIBCPP_CXX03_LANG 269046035553Spatrick 269146035553Spatricktemplate <class _Allocator> 2692*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 269346035553Spatrickvector<bool, _Allocator>::vector(initializer_list<value_type> __il) 269446035553Spatrick : __begin_(nullptr), 269546035553Spatrick __size_(0), 269646035553Spatrick __cap_alloc_(0, __default_init_tag()) 269746035553Spatrick{ 269846035553Spatrick size_type __n = static_cast<size_type>(__il.size()); 269946035553Spatrick if (__n > 0) 270046035553Spatrick { 270146035553Spatrick __vallocate(__n); 270246035553Spatrick __construct_at_end(__il.begin(), __il.end()); 270346035553Spatrick } 270446035553Spatrick} 270546035553Spatrick 270646035553Spatricktemplate <class _Allocator> 2707*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 270846035553Spatrickvector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a) 270946035553Spatrick : __begin_(nullptr), 271046035553Spatrick __size_(0), 271146035553Spatrick __cap_alloc_(0, static_cast<__storage_allocator>(__a)) 271246035553Spatrick{ 271346035553Spatrick size_type __n = static_cast<size_type>(__il.size()); 271446035553Spatrick if (__n > 0) 271546035553Spatrick { 271646035553Spatrick __vallocate(__n); 271746035553Spatrick __construct_at_end(__il.begin(), __il.end()); 271846035553Spatrick } 271946035553Spatrick} 272046035553Spatrick 272146035553Spatrick#endif // _LIBCPP_CXX03_LANG 272246035553Spatrick 272346035553Spatricktemplate <class _Allocator> 2724*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 272546035553Spatrickvector<bool, _Allocator>::vector(const vector& __v) 272646035553Spatrick : __begin_(nullptr), 272746035553Spatrick __size_(0), 272846035553Spatrick __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc())) 272946035553Spatrick{ 273046035553Spatrick if (__v.size() > 0) 273146035553Spatrick { 273246035553Spatrick __vallocate(__v.size()); 273346035553Spatrick __construct_at_end(__v.begin(), __v.end()); 273446035553Spatrick } 273546035553Spatrick} 273646035553Spatrick 273746035553Spatricktemplate <class _Allocator> 2738*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 273946035553Spatrickvector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a) 274046035553Spatrick : __begin_(nullptr), 274146035553Spatrick __size_(0), 274246035553Spatrick __cap_alloc_(0, __a) 274346035553Spatrick{ 274446035553Spatrick if (__v.size() > 0) 274546035553Spatrick { 274646035553Spatrick __vallocate(__v.size()); 274746035553Spatrick __construct_at_end(__v.begin(), __v.end()); 274846035553Spatrick } 274946035553Spatrick} 275046035553Spatrick 275146035553Spatricktemplate <class _Allocator> 2752*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 275346035553Spatrickvector<bool, _Allocator>& 275446035553Spatrickvector<bool, _Allocator>::operator=(const vector& __v) 275546035553Spatrick{ 2756*4bdff4beSrobert if (this != std::addressof(__v)) 275746035553Spatrick { 275846035553Spatrick __copy_assign_alloc(__v); 275946035553Spatrick if (__v.__size_) 276046035553Spatrick { 276146035553Spatrick if (__v.__size_ > capacity()) 276246035553Spatrick { 276346035553Spatrick __vdeallocate(); 276446035553Spatrick __vallocate(__v.__size_); 276546035553Spatrick } 2766*4bdff4beSrobert std::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_); 276746035553Spatrick } 276846035553Spatrick __size_ = __v.__size_; 276946035553Spatrick } 277046035553Spatrick return *this; 277146035553Spatrick} 277246035553Spatrick 277346035553Spatricktemplate <class _Allocator> 2774*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(vector&& __v) 277546035553Spatrick#if _LIBCPP_STD_VER > 14 277646035553Spatrick _NOEXCEPT 277746035553Spatrick#else 277846035553Spatrick _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) 277946035553Spatrick#endif 278046035553Spatrick : __begin_(__v.__begin_), 278146035553Spatrick __size_(__v.__size_), 2782*4bdff4beSrobert __cap_alloc_(std::move(__v.__cap_alloc_)) { 278346035553Spatrick __v.__begin_ = nullptr; 278446035553Spatrick __v.__size_ = 0; 278546035553Spatrick __v.__cap() = 0; 278646035553Spatrick} 278746035553Spatrick 278846035553Spatricktemplate <class _Allocator> 2789*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 2790*4bdff4beSrobertvector<bool, _Allocator>::vector(vector&& __v, const __type_identity_t<allocator_type>& __a) 279146035553Spatrick : __begin_(nullptr), 279246035553Spatrick __size_(0), 279346035553Spatrick __cap_alloc_(0, __a) 279446035553Spatrick{ 279546035553Spatrick if (__a == allocator_type(__v.__alloc())) 279646035553Spatrick { 279746035553Spatrick this->__begin_ = __v.__begin_; 279846035553Spatrick this->__size_ = __v.__size_; 279946035553Spatrick this->__cap() = __v.__cap(); 280046035553Spatrick __v.__begin_ = nullptr; 280146035553Spatrick __v.__cap() = __v.__size_ = 0; 280246035553Spatrick } 280346035553Spatrick else if (__v.size() > 0) 280446035553Spatrick { 280546035553Spatrick __vallocate(__v.size()); 280646035553Spatrick __construct_at_end(__v.begin(), __v.end()); 280746035553Spatrick } 280846035553Spatrick} 280946035553Spatrick 281046035553Spatricktemplate <class _Allocator> 2811*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 281246035553Spatrickvector<bool, _Allocator>& 281346035553Spatrickvector<bool, _Allocator>::operator=(vector&& __v) 281446035553Spatrick _NOEXCEPT_((__noexcept_move_assign_container<_Allocator, __alloc_traits>::value)) 281546035553Spatrick{ 281646035553Spatrick __move_assign(__v, integral_constant<bool, 281746035553Spatrick __storage_traits::propagate_on_container_move_assignment::value>()); 281846035553Spatrick return *this; 281946035553Spatrick} 282046035553Spatrick 282146035553Spatricktemplate <class _Allocator> 2822*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 void 282346035553Spatrickvector<bool, _Allocator>::__move_assign(vector& __c, false_type) 282446035553Spatrick{ 282546035553Spatrick if (__alloc() != __c.__alloc()) 282646035553Spatrick assign(__c.begin(), __c.end()); 282746035553Spatrick else 282846035553Spatrick __move_assign(__c, true_type()); 282946035553Spatrick} 283046035553Spatrick 283146035553Spatricktemplate <class _Allocator> 2832*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 void 283346035553Spatrickvector<bool, _Allocator>::__move_assign(vector& __c, true_type) 283446035553Spatrick _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 283546035553Spatrick{ 283646035553Spatrick __vdeallocate(); 283746035553Spatrick __move_assign_alloc(__c); 283846035553Spatrick this->__begin_ = __c.__begin_; 283946035553Spatrick this->__size_ = __c.__size_; 284046035553Spatrick this->__cap() = __c.__cap(); 284146035553Spatrick __c.__begin_ = nullptr; 284246035553Spatrick __c.__cap() = __c.__size_ = 0; 284346035553Spatrick} 284446035553Spatrick 284546035553Spatricktemplate <class _Allocator> 2846*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 void 284746035553Spatrickvector<bool, _Allocator>::assign(size_type __n, const value_type& __x) 284846035553Spatrick{ 284946035553Spatrick __size_ = 0; 285046035553Spatrick if (__n > 0) 285146035553Spatrick { 285246035553Spatrick size_type __c = capacity(); 285346035553Spatrick if (__n <= __c) 285446035553Spatrick __size_ = __n; 285546035553Spatrick else 285646035553Spatrick { 2857*4bdff4beSrobert vector __v(get_allocator()); 285846035553Spatrick __v.reserve(__recommend(__n)); 285946035553Spatrick __v.__size_ = __n; 286046035553Spatrick swap(__v); 286146035553Spatrick } 2862*4bdff4beSrobert std::fill_n(begin(), __n, __x); 286346035553Spatrick } 2864*4bdff4beSrobert std::__debug_db_invalidate_all(this); 286546035553Spatrick} 286646035553Spatrick 286746035553Spatricktemplate <class _Allocator> 286846035553Spatricktemplate <class _InputIterator> 2869*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 typename enable_if <__is_exactly_cpp17_input_iterator<_InputIterator>::value, 287046035553Spatrick void 287146035553Spatrick>::type 287246035553Spatrickvector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last) 287346035553Spatrick{ 287446035553Spatrick clear(); 287546035553Spatrick for (; __first != __last; ++__first) 287646035553Spatrick push_back(*__first); 287746035553Spatrick} 287846035553Spatrick 287946035553Spatricktemplate <class _Allocator> 288046035553Spatricktemplate <class _ForwardIterator> 2881*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 288246035553Spatricktypename enable_if 288346035553Spatrick< 288446035553Spatrick __is_cpp17_forward_iterator<_ForwardIterator>::value, 288546035553Spatrick void 288646035553Spatrick>::type 288746035553Spatrickvector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) 288846035553Spatrick{ 288946035553Spatrick clear(); 2890*4bdff4beSrobert difference_type __ns = std::distance(__first, __last); 289146035553Spatrick _LIBCPP_ASSERT(__ns >= 0, "invalid range specified"); 289246035553Spatrick const size_t __n = static_cast<size_type>(__ns); 289346035553Spatrick if (__n) 289446035553Spatrick { 289546035553Spatrick if (__n > capacity()) 289646035553Spatrick { 289746035553Spatrick __vdeallocate(); 289846035553Spatrick __vallocate(__n); 289946035553Spatrick } 290046035553Spatrick __construct_at_end(__first, __last); 290146035553Spatrick } 290246035553Spatrick} 290346035553Spatrick 290446035553Spatricktemplate <class _Allocator> 2905*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 void 290646035553Spatrickvector<bool, _Allocator>::reserve(size_type __n) 290746035553Spatrick{ 290846035553Spatrick if (__n > capacity()) 290946035553Spatrick { 2910*4bdff4beSrobert if (__n > max_size()) 2911*4bdff4beSrobert this->__throw_length_error(); 2912*4bdff4beSrobert vector __v(this->get_allocator()); 291346035553Spatrick __v.__vallocate(__n); 291446035553Spatrick __v.__construct_at_end(this->begin(), this->end()); 291546035553Spatrick swap(__v); 2916*4bdff4beSrobert std::__debug_db_invalidate_all(this); 291746035553Spatrick } 291846035553Spatrick} 291946035553Spatrick 292046035553Spatricktemplate <class _Allocator> 2921*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 void 292246035553Spatrickvector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT 292346035553Spatrick{ 292446035553Spatrick if (__external_cap_to_internal(size()) > __cap()) 292546035553Spatrick { 292646035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 292746035553Spatrick try 292846035553Spatrick { 292946035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 293046035553Spatrick vector(*this, allocator_type(__alloc())).swap(*this); 293146035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 293246035553Spatrick } 293346035553Spatrick catch (...) 293446035553Spatrick { 293546035553Spatrick } 293646035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 293746035553Spatrick } 293846035553Spatrick} 293946035553Spatrick 294046035553Spatricktemplate <class _Allocator> 294146035553Spatricktypename vector<bool, _Allocator>::reference 294246035553Spatrickvector<bool, _Allocator>::at(size_type __n) 294346035553Spatrick{ 294446035553Spatrick if (__n >= size()) 294546035553Spatrick this->__throw_out_of_range(); 294646035553Spatrick return (*this)[__n]; 294746035553Spatrick} 294846035553Spatrick 294946035553Spatricktemplate <class _Allocator> 295046035553Spatricktypename vector<bool, _Allocator>::const_reference 295146035553Spatrickvector<bool, _Allocator>::at(size_type __n) const 295246035553Spatrick{ 295346035553Spatrick if (__n >= size()) 295446035553Spatrick this->__throw_out_of_range(); 295546035553Spatrick return (*this)[__n]; 295646035553Spatrick} 295746035553Spatrick 295846035553Spatricktemplate <class _Allocator> 2959*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 void 296046035553Spatrickvector<bool, _Allocator>::push_back(const value_type& __x) 296146035553Spatrick{ 296246035553Spatrick if (this->__size_ == this->capacity()) 296346035553Spatrick reserve(__recommend(this->__size_ + 1)); 296446035553Spatrick ++this->__size_; 296546035553Spatrick back() = __x; 296646035553Spatrick} 296746035553Spatrick 296846035553Spatricktemplate <class _Allocator> 2969*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 297046035553Spatrickvector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x) 297146035553Spatrick{ 297246035553Spatrick iterator __r; 297346035553Spatrick if (size() < capacity()) 297446035553Spatrick { 297546035553Spatrick const_iterator __old_end = end(); 297646035553Spatrick ++__size_; 2977*4bdff4beSrobert std::copy_backward(__position, __old_end, end()); 297846035553Spatrick __r = __const_iterator_cast(__position); 297946035553Spatrick } 298046035553Spatrick else 298146035553Spatrick { 2982*4bdff4beSrobert vector __v(get_allocator()); 298346035553Spatrick __v.reserve(__recommend(__size_ + 1)); 298446035553Spatrick __v.__size_ = __size_ + 1; 2985*4bdff4beSrobert __r = std::copy(cbegin(), __position, __v.begin()); 2986*4bdff4beSrobert std::copy_backward(__position, cend(), __v.end()); 298746035553Spatrick swap(__v); 298846035553Spatrick } 298946035553Spatrick *__r = __x; 299046035553Spatrick return __r; 299146035553Spatrick} 299246035553Spatrick 299346035553Spatricktemplate <class _Allocator> 2994*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 299546035553Spatrickvector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x) 299646035553Spatrick{ 299746035553Spatrick iterator __r; 299846035553Spatrick size_type __c = capacity(); 299946035553Spatrick if (__n <= __c && size() <= __c - __n) 300046035553Spatrick { 300146035553Spatrick const_iterator __old_end = end(); 300246035553Spatrick __size_ += __n; 3003*4bdff4beSrobert std::copy_backward(__position, __old_end, end()); 300446035553Spatrick __r = __const_iterator_cast(__position); 300546035553Spatrick } 300646035553Spatrick else 300746035553Spatrick { 3008*4bdff4beSrobert vector __v(get_allocator()); 300946035553Spatrick __v.reserve(__recommend(__size_ + __n)); 301046035553Spatrick __v.__size_ = __size_ + __n; 3011*4bdff4beSrobert __r = std::copy(cbegin(), __position, __v.begin()); 3012*4bdff4beSrobert std::copy_backward(__position, cend(), __v.end()); 301346035553Spatrick swap(__v); 301446035553Spatrick } 3015*4bdff4beSrobert std::fill_n(__r, __n, __x); 301646035553Spatrick return __r; 301746035553Spatrick} 301846035553Spatrick 301946035553Spatricktemplate <class _Allocator> 302046035553Spatricktemplate <class _InputIterator> 3021*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 typename enable_if <__is_exactly_cpp17_input_iterator<_InputIterator>::value, 302246035553Spatrick typename vector<bool, _Allocator>::iterator 302346035553Spatrick>::type 302446035553Spatrickvector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last) 302546035553Spatrick{ 302646035553Spatrick difference_type __off = __position - begin(); 302746035553Spatrick iterator __p = __const_iterator_cast(__position); 302846035553Spatrick iterator __old_end = end(); 302946035553Spatrick for (; size() != capacity() && __first != __last; ++__first) 303046035553Spatrick { 303146035553Spatrick ++this->__size_; 303246035553Spatrick back() = *__first; 303346035553Spatrick } 3034*4bdff4beSrobert vector __v(get_allocator()); 303546035553Spatrick if (__first != __last) 303646035553Spatrick { 303746035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 303846035553Spatrick try 303946035553Spatrick { 304046035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 304146035553Spatrick __v.assign(__first, __last); 304246035553Spatrick difference_type __old_size = static_cast<difference_type>(__old_end - begin()); 304346035553Spatrick difference_type __old_p = __p - begin(); 304446035553Spatrick reserve(__recommend(size() + __v.size())); 304546035553Spatrick __p = begin() + __old_p; 304646035553Spatrick __old_end = begin() + __old_size; 304746035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 304846035553Spatrick } 304946035553Spatrick catch (...) 305046035553Spatrick { 305146035553Spatrick erase(__old_end, end()); 305246035553Spatrick throw; 305346035553Spatrick } 305446035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 305546035553Spatrick } 3056*4bdff4beSrobert __p = std::rotate(__p, __old_end, end()); 305746035553Spatrick insert(__p, __v.begin(), __v.end()); 305846035553Spatrick return begin() + __off; 305946035553Spatrick} 306046035553Spatrick 306146035553Spatricktemplate <class _Allocator> 306246035553Spatricktemplate <class _ForwardIterator> 3063*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 306446035553Spatricktypename enable_if 306546035553Spatrick< 306646035553Spatrick __is_cpp17_forward_iterator<_ForwardIterator>::value, 306746035553Spatrick typename vector<bool, _Allocator>::iterator 306846035553Spatrick>::type 306946035553Spatrickvector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last) 307046035553Spatrick{ 3071*4bdff4beSrobert const difference_type __n_signed = std::distance(__first, __last); 307246035553Spatrick _LIBCPP_ASSERT(__n_signed >= 0, "invalid range specified"); 307346035553Spatrick const size_type __n = static_cast<size_type>(__n_signed); 307446035553Spatrick iterator __r; 307546035553Spatrick size_type __c = capacity(); 307646035553Spatrick if (__n <= __c && size() <= __c - __n) 307746035553Spatrick { 307846035553Spatrick const_iterator __old_end = end(); 307946035553Spatrick __size_ += __n; 3080*4bdff4beSrobert std::copy_backward(__position, __old_end, end()); 308146035553Spatrick __r = __const_iterator_cast(__position); 308246035553Spatrick } 308346035553Spatrick else 308446035553Spatrick { 3085*4bdff4beSrobert vector __v(get_allocator()); 308646035553Spatrick __v.reserve(__recommend(__size_ + __n)); 308746035553Spatrick __v.__size_ = __size_ + __n; 3088*4bdff4beSrobert __r = std::copy(cbegin(), __position, __v.begin()); 3089*4bdff4beSrobert std::copy_backward(__position, cend(), __v.end()); 309046035553Spatrick swap(__v); 309146035553Spatrick } 3092*4bdff4beSrobert std::copy(__first, __last, __r); 309346035553Spatrick return __r; 309446035553Spatrick} 309546035553Spatrick 309646035553Spatricktemplate <class _Allocator> 3097*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 309846035553Spatricktypename vector<bool, _Allocator>::iterator 309946035553Spatrickvector<bool, _Allocator>::erase(const_iterator __position) 310046035553Spatrick{ 310146035553Spatrick iterator __r = __const_iterator_cast(__position); 3102*4bdff4beSrobert std::copy(__position + 1, this->cend(), __r); 310346035553Spatrick --__size_; 310446035553Spatrick return __r; 310546035553Spatrick} 310646035553Spatrick 310746035553Spatricktemplate <class _Allocator> 3108*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 310946035553Spatricktypename vector<bool, _Allocator>::iterator 311046035553Spatrickvector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last) 311146035553Spatrick{ 311246035553Spatrick iterator __r = __const_iterator_cast(__first); 311346035553Spatrick difference_type __d = __last - __first; 3114*4bdff4beSrobert std::copy(__last, this->cend(), __r); 311546035553Spatrick __size_ -= __d; 311646035553Spatrick return __r; 311746035553Spatrick} 311846035553Spatrick 311946035553Spatricktemplate <class _Allocator> 3120*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 void 312146035553Spatrickvector<bool, _Allocator>::swap(vector& __x) 312246035553Spatrick#if _LIBCPP_STD_VER >= 14 312346035553Spatrick _NOEXCEPT 312446035553Spatrick#else 312546035553Spatrick _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 312646035553Spatrick __is_nothrow_swappable<allocator_type>::value) 312746035553Spatrick#endif 312846035553Spatrick{ 3129*4bdff4beSrobert std::swap(this->__begin_, __x.__begin_); 3130*4bdff4beSrobert std::swap(this->__size_, __x.__size_); 3131*4bdff4beSrobert std::swap(this->__cap(), __x.__cap()); 3132*4bdff4beSrobert std::__swap_allocator(this->__alloc(), __x.__alloc(), 313346035553Spatrick integral_constant<bool, __alloc_traits::propagate_on_container_swap::value>()); 313446035553Spatrick} 313546035553Spatrick 313646035553Spatricktemplate <class _Allocator> 3137*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 void 313846035553Spatrickvector<bool, _Allocator>::resize(size_type __sz, value_type __x) 313946035553Spatrick{ 314046035553Spatrick size_type __cs = size(); 314146035553Spatrick if (__cs < __sz) 314246035553Spatrick { 314346035553Spatrick iterator __r; 314446035553Spatrick size_type __c = capacity(); 314546035553Spatrick size_type __n = __sz - __cs; 314646035553Spatrick if (__n <= __c && __cs <= __c - __n) 314746035553Spatrick { 314846035553Spatrick __r = end(); 314946035553Spatrick __size_ += __n; 315046035553Spatrick } 315146035553Spatrick else 315246035553Spatrick { 3153*4bdff4beSrobert vector __v(get_allocator()); 315446035553Spatrick __v.reserve(__recommend(__size_ + __n)); 315546035553Spatrick __v.__size_ = __size_ + __n; 3156*4bdff4beSrobert __r = std::copy(cbegin(), cend(), __v.begin()); 315746035553Spatrick swap(__v); 315846035553Spatrick } 3159*4bdff4beSrobert std::fill_n(__r, __n, __x); 316046035553Spatrick } 316146035553Spatrick else 316246035553Spatrick __size_ = __sz; 316346035553Spatrick} 316446035553Spatrick 316546035553Spatricktemplate <class _Allocator> 3166*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 void 316746035553Spatrickvector<bool, _Allocator>::flip() _NOEXCEPT 316846035553Spatrick{ 316946035553Spatrick // do middle whole words 317046035553Spatrick size_type __n = __size_; 317146035553Spatrick __storage_pointer __p = __begin_; 317246035553Spatrick for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) 317346035553Spatrick *__p = ~*__p; 317446035553Spatrick // do last partial word 317546035553Spatrick if (__n > 0) 317646035553Spatrick { 317746035553Spatrick __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 317846035553Spatrick __storage_type __b = *__p & __m; 317946035553Spatrick *__p &= ~__m; 318046035553Spatrick *__p |= ~__b & __m; 318146035553Spatrick } 318246035553Spatrick} 318346035553Spatrick 318446035553Spatricktemplate <class _Allocator> 3185*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 bool 318646035553Spatrickvector<bool, _Allocator>::__invariants() const 318746035553Spatrick{ 318846035553Spatrick if (this->__begin_ == nullptr) 318946035553Spatrick { 319046035553Spatrick if (this->__size_ != 0 || this->__cap() != 0) 319146035553Spatrick return false; 319246035553Spatrick } 319346035553Spatrick else 319446035553Spatrick { 319546035553Spatrick if (this->__cap() == 0) 319646035553Spatrick return false; 319746035553Spatrick if (this->__size_ > this->capacity()) 319846035553Spatrick return false; 319946035553Spatrick } 320046035553Spatrick return true; 320146035553Spatrick} 320246035553Spatrick 320346035553Spatricktemplate <class _Allocator> 3204*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 size_t 320546035553Spatrickvector<bool, _Allocator>::__hash_code() const _NOEXCEPT 320646035553Spatrick{ 320746035553Spatrick size_t __h = 0; 320846035553Spatrick // do middle whole words 320946035553Spatrick size_type __n = __size_; 321046035553Spatrick __storage_pointer __p = __begin_; 321146035553Spatrick for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) 321246035553Spatrick __h ^= *__p; 321346035553Spatrick // do last partial word 321446035553Spatrick if (__n > 0) 321546035553Spatrick { 321646035553Spatrick const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 321746035553Spatrick __h ^= *__p & __m; 321846035553Spatrick } 321946035553Spatrick return __h; 322046035553Spatrick} 322146035553Spatrick 322246035553Spatricktemplate <class _Allocator> 322346035553Spatrickstruct _LIBCPP_TEMPLATE_VIS hash<vector<bool, _Allocator> > 3224*4bdff4beSrobert : public __unary_function<vector<bool, _Allocator>, size_t> 322546035553Spatrick{ 3226*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 322746035553Spatrick size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT 322846035553Spatrick {return __vec.__hash_code();} 322946035553Spatrick}; 323046035553Spatrick 323146035553Spatricktemplate <class _Tp, class _Allocator> 3232*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 3233*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 323446035553Spatrickbool 323546035553Spatrickoperator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 323646035553Spatrick{ 323746035553Spatrick const typename vector<_Tp, _Allocator>::size_type __sz = __x.size(); 3238*4bdff4beSrobert return __sz == __y.size() && std::equal(__x.begin(), __x.end(), __y.begin()); 323946035553Spatrick} 324046035553Spatrick 324146035553Spatricktemplate <class _Tp, class _Allocator> 3242*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 3243*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 324446035553Spatrickbool 324546035553Spatrickoperator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 324646035553Spatrick{ 324746035553Spatrick return !(__x == __y); 324846035553Spatrick} 324946035553Spatrick 325046035553Spatricktemplate <class _Tp, class _Allocator> 3251*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 3252*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 325346035553Spatrickbool 325446035553Spatrickoperator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 325546035553Spatrick{ 3256*4bdff4beSrobert return std::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 325746035553Spatrick} 325846035553Spatrick 325946035553Spatricktemplate <class _Tp, class _Allocator> 3260*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 3261*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 326246035553Spatrickbool 326346035553Spatrickoperator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 326446035553Spatrick{ 326546035553Spatrick return __y < __x; 326646035553Spatrick} 326746035553Spatrick 326846035553Spatricktemplate <class _Tp, class _Allocator> 3269*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 3270*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 327146035553Spatrickbool 327246035553Spatrickoperator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 327346035553Spatrick{ 327446035553Spatrick return !(__x < __y); 327546035553Spatrick} 327646035553Spatrick 327746035553Spatricktemplate <class _Tp, class _Allocator> 3278*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 3279*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 328046035553Spatrickbool 328146035553Spatrickoperator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) 328246035553Spatrick{ 328346035553Spatrick return !(__y < __x); 328446035553Spatrick} 328546035553Spatrick 328646035553Spatricktemplate <class _Tp, class _Allocator> 3287*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 3288*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI 328946035553Spatrickvoid 329046035553Spatrickswap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y) 329146035553Spatrick _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 329246035553Spatrick{ 329346035553Spatrick __x.swap(__y); 329446035553Spatrick} 329546035553Spatrick 329646035553Spatrick#if _LIBCPP_STD_VER > 17 329746035553Spatricktemplate <class _Tp, class _Allocator, class _Up> 3298*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 3299*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::size_type 3300037e7968Spatrickerase(vector<_Tp, _Allocator>& __c, const _Up& __v) { 3301037e7968Spatrick auto __old_size = __c.size(); 3302*4bdff4beSrobert __c.erase(std::remove(__c.begin(), __c.end(), __v), __c.end()); 3303037e7968Spatrick return __old_size - __c.size(); 3304037e7968Spatrick} 330546035553Spatrick 330646035553Spatricktemplate <class _Tp, class _Allocator, class _Predicate> 3307*4bdff4beSrobert_LIBCPP_CONSTEXPR_SINCE_CXX20 3308*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::size_type 3309037e7968Spatrickerase_if(vector<_Tp, _Allocator>& __c, _Predicate __pred) { 3310037e7968Spatrick auto __old_size = __c.size(); 3311*4bdff4beSrobert __c.erase(std::remove_if(__c.begin(), __c.end(), __pred), __c.end()); 3312037e7968Spatrick return __old_size - __c.size(); 3313037e7968Spatrick} 3314*4bdff4beSrobert 3315*4bdff4beSroberttemplate <> 3316*4bdff4beSrobertinline constexpr bool __format::__enable_insertable<vector<char>> = true; 3317*4bdff4beSrobert#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 3318*4bdff4beSroberttemplate <> 3319*4bdff4beSrobertinline constexpr bool __format::__enable_insertable<vector<wchar_t>> = true; 332046035553Spatrick#endif 332146035553Spatrick 3322*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 17 3323*4bdff4beSrobert 3324*4bdff4beSrobert#if _LIBCPP_STD_VER > 20 3325*4bdff4beSroberttemplate <class _Tp, class CharT> 3326*4bdff4beSrobert// Since is-vector-bool-reference is only used once it's inlined here. 3327*4bdff4beSrobert requires same_as<typename _Tp::__container, vector<bool, typename _Tp::__container::allocator_type>> 3328*4bdff4beSrobertstruct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter<_Tp, CharT> { 3329*4bdff4beSrobertprivate: 3330*4bdff4beSrobert formatter<bool, CharT> __underlying_; 3331*4bdff4beSrobert 3332*4bdff4beSrobertpublic: 3333*4bdff4beSrobert template <class _ParseContext> 3334*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI constexpr typename _ParseContext::iterator parse(_ParseContext& __ctx) { 3335*4bdff4beSrobert return __underlying_.parse(__ctx); 3336*4bdff4beSrobert } 3337*4bdff4beSrobert 3338*4bdff4beSrobert template <class _FormatContext> 3339*4bdff4beSrobert _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator format(const _Tp& __ref, _FormatContext& __ctx) const { 3340*4bdff4beSrobert return __underlying_.format(__ref, __ctx); 3341*4bdff4beSrobert } 3342*4bdff4beSrobert}; 3343*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 20 3344*4bdff4beSrobert 334546035553Spatrick_LIBCPP_END_NAMESPACE_STD 334646035553Spatrick 3347*4bdff4beSrobert#if _LIBCPP_STD_VER > 14 3348*4bdff4beSrobert_LIBCPP_BEGIN_NAMESPACE_STD 3349*4bdff4beSrobertnamespace pmr { 3350*4bdff4beSroberttemplate <class _ValueT> 3351*4bdff4beSrobertusing vector = std::vector<_ValueT, polymorphic_allocator<_ValueT>>; 3352*4bdff4beSrobert} // namespace pmr 3353*4bdff4beSrobert_LIBCPP_END_NAMESPACE_STD 3354*4bdff4beSrobert#endif 3355*4bdff4beSrobert 335646035553Spatrick_LIBCPP_POP_MACROS 335746035553Spatrick 3358*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 3359*4bdff4beSrobert# include <algorithm> 3360*4bdff4beSrobert# include <atomic> 3361*4bdff4beSrobert# include <concepts> 3362*4bdff4beSrobert# include <typeinfo> 3363*4bdff4beSrobert# include <utility> 3364*4bdff4beSrobert#endif 3365*4bdff4beSrobert 336646035553Spatrick#endif // _LIBCPP_VECTOR 3367