1e78f53d1SNikolas Klauser// -*- C++ -*- 2e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 3e78f53d1SNikolas Klauser// 4e78f53d1SNikolas Klauser// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5e78f53d1SNikolas Klauser// See https://llvm.org/LICENSE.txt for license information. 6e78f53d1SNikolas Klauser// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7e78f53d1SNikolas Klauser// 8e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 9e78f53d1SNikolas Klauser 10*ce777190SNikolas Klauser#ifndef _LIBCPP___CXX03_VECTOR 11*ce777190SNikolas Klauser#define _LIBCPP___CXX03_VECTOR 12e78f53d1SNikolas Klauser 13e78f53d1SNikolas Klauser// clang-format off 14e78f53d1SNikolas Klauser 15e78f53d1SNikolas Klauser/* 16e78f53d1SNikolas Klauser vector synopsis 17e78f53d1SNikolas Klauser 18e78f53d1SNikolas Klausernamespace std 19e78f53d1SNikolas Klauser{ 20e78f53d1SNikolas Klauser 21e78f53d1SNikolas Klausertemplate <class T, class Allocator = allocator<T> > 22e78f53d1SNikolas Klauserclass vector 23e78f53d1SNikolas Klauser{ 24e78f53d1SNikolas Klauserpublic: 25e78f53d1SNikolas Klauser typedef T value_type; 26e78f53d1SNikolas Klauser typedef Allocator allocator_type; 27e78f53d1SNikolas Klauser typedef typename allocator_type::reference reference; 28e78f53d1SNikolas Klauser typedef typename allocator_type::const_reference const_reference; 29e78f53d1SNikolas Klauser typedef implementation-defined iterator; 30e78f53d1SNikolas Klauser typedef implementation-defined const_iterator; 31e78f53d1SNikolas Klauser typedef typename allocator_type::size_type size_type; 32e78f53d1SNikolas Klauser typedef typename allocator_type::difference_type difference_type; 33e78f53d1SNikolas Klauser typedef typename allocator_type::pointer pointer; 34e78f53d1SNikolas Klauser typedef typename allocator_type::const_pointer const_pointer; 35e78f53d1SNikolas Klauser typedef std::reverse_iterator<iterator> reverse_iterator; 36e78f53d1SNikolas Klauser typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 37e78f53d1SNikolas Klauser 38e78f53d1SNikolas Klauser vector() 39e78f53d1SNikolas Klauser noexcept(is_nothrow_default_constructible<allocator_type>::value); 40e78f53d1SNikolas Klauser explicit vector(const allocator_type&); 41e78f53d1SNikolas Klauser explicit vector(size_type n); 42e78f53d1SNikolas Klauser explicit vector(size_type n, const allocator_type&); // C++14 43e78f53d1SNikolas Klauser vector(size_type n, const value_type& value, const allocator_type& = allocator_type()); 44e78f53d1SNikolas Klauser template <class InputIterator> 45e78f53d1SNikolas Klauser vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type()); 46e78f53d1SNikolas Klauser template<container-compatible-range<T> R> 47e78f53d1SNikolas Klauser constexpr vector(from_range_t, R&& rg, const Allocator& = Allocator()); // C++23 48e78f53d1SNikolas Klauser vector(const vector& x); 49e78f53d1SNikolas Klauser vector(vector&& x) 50e78f53d1SNikolas Klauser noexcept(is_nothrow_move_constructible<allocator_type>::value); 51e78f53d1SNikolas Klauser vector(initializer_list<value_type> il); 52e78f53d1SNikolas Klauser vector(initializer_list<value_type> il, const allocator_type& a); 53e78f53d1SNikolas Klauser ~vector(); 54e78f53d1SNikolas Klauser vector& operator=(const vector& x); 55e78f53d1SNikolas Klauser vector& operator=(vector&& x) 56e78f53d1SNikolas Klauser noexcept( 57e78f53d1SNikolas Klauser allocator_type::propagate_on_container_move_assignment::value || 58e78f53d1SNikolas Klauser allocator_type::is_always_equal::value); // C++17 59e78f53d1SNikolas Klauser vector& operator=(initializer_list<value_type> il); 60e78f53d1SNikolas Klauser template <class InputIterator> 61e78f53d1SNikolas Klauser void assign(InputIterator first, InputIterator last); 62e78f53d1SNikolas Klauser template<container-compatible-range<T> R> 63e78f53d1SNikolas Klauser constexpr void assign_range(R&& rg); // C++23 64e78f53d1SNikolas Klauser void assign(size_type n, const value_type& u); 65e78f53d1SNikolas Klauser void assign(initializer_list<value_type> il); 66e78f53d1SNikolas Klauser 67e78f53d1SNikolas Klauser allocator_type get_allocator() const noexcept; 68e78f53d1SNikolas Klauser 69e78f53d1SNikolas Klauser iterator begin() noexcept; 70e78f53d1SNikolas Klauser const_iterator begin() const noexcept; 71e78f53d1SNikolas Klauser iterator end() noexcept; 72e78f53d1SNikolas Klauser const_iterator end() const noexcept; 73e78f53d1SNikolas Klauser 74e78f53d1SNikolas Klauser reverse_iterator rbegin() noexcept; 75e78f53d1SNikolas Klauser const_reverse_iterator rbegin() const noexcept; 76e78f53d1SNikolas Klauser reverse_iterator rend() noexcept; 77e78f53d1SNikolas Klauser const_reverse_iterator rend() const noexcept; 78e78f53d1SNikolas Klauser 79e78f53d1SNikolas Klauser const_iterator cbegin() const noexcept; 80e78f53d1SNikolas Klauser const_iterator cend() const noexcept; 81e78f53d1SNikolas Klauser const_reverse_iterator crbegin() const noexcept; 82e78f53d1SNikolas Klauser const_reverse_iterator crend() const noexcept; 83e78f53d1SNikolas Klauser 84e78f53d1SNikolas Klauser size_type size() const noexcept; 85e78f53d1SNikolas Klauser size_type max_size() const noexcept; 86e78f53d1SNikolas Klauser size_type capacity() const noexcept; 87e78f53d1SNikolas Klauser bool empty() const noexcept; 88e78f53d1SNikolas Klauser void reserve(size_type n); 89e78f53d1SNikolas Klauser void shrink_to_fit() noexcept; 90e78f53d1SNikolas Klauser 91e78f53d1SNikolas Klauser reference operator[](size_type n); 92e78f53d1SNikolas Klauser const_reference operator[](size_type n) const; 93e78f53d1SNikolas Klauser reference at(size_type n); 94e78f53d1SNikolas Klauser const_reference at(size_type n) const; 95e78f53d1SNikolas Klauser 96e78f53d1SNikolas Klauser reference front(); 97e78f53d1SNikolas Klauser const_reference front() const; 98e78f53d1SNikolas Klauser reference back(); 99e78f53d1SNikolas Klauser const_reference back() const; 100e78f53d1SNikolas Klauser 101e78f53d1SNikolas Klauser value_type* data() noexcept; 102e78f53d1SNikolas Klauser const value_type* data() const noexcept; 103e78f53d1SNikolas Klauser 104e78f53d1SNikolas Klauser void push_back(const value_type& x); 105e78f53d1SNikolas Klauser void push_back(value_type&& x); 106e78f53d1SNikolas Klauser template <class... Args> 107e78f53d1SNikolas Klauser reference emplace_back(Args&&... args); // reference in C++17 108e78f53d1SNikolas Klauser template<container-compatible-range<T> R> 109e78f53d1SNikolas Klauser constexpr void append_range(R&& rg); // C++23 110e78f53d1SNikolas Klauser void pop_back(); 111e78f53d1SNikolas Klauser 112e78f53d1SNikolas Klauser template <class... Args> iterator emplace(const_iterator position, Args&&... args); 113e78f53d1SNikolas Klauser iterator insert(const_iterator position, const value_type& x); 114e78f53d1SNikolas Klauser iterator insert(const_iterator position, value_type&& x); 115e78f53d1SNikolas Klauser iterator insert(const_iterator position, size_type n, const value_type& x); 116e78f53d1SNikolas Klauser template <class InputIterator> 117e78f53d1SNikolas Klauser iterator insert(const_iterator position, InputIterator first, InputIterator last); 118e78f53d1SNikolas Klauser template<container-compatible-range<T> R> 119e78f53d1SNikolas Klauser constexpr iterator insert_range(const_iterator position, R&& rg); // C++23 120e78f53d1SNikolas Klauser iterator insert(const_iterator position, initializer_list<value_type> il); 121e78f53d1SNikolas Klauser 122e78f53d1SNikolas Klauser iterator erase(const_iterator position); 123e78f53d1SNikolas Klauser iterator erase(const_iterator first, const_iterator last); 124e78f53d1SNikolas Klauser 125e78f53d1SNikolas Klauser void clear() noexcept; 126e78f53d1SNikolas Klauser 127e78f53d1SNikolas Klauser void resize(size_type sz); 128e78f53d1SNikolas Klauser void resize(size_type sz, const value_type& c); 129e78f53d1SNikolas Klauser 130e78f53d1SNikolas Klauser void swap(vector&) 131e78f53d1SNikolas Klauser noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value || 132e78f53d1SNikolas Klauser allocator_traits<allocator_type>::is_always_equal::value); // C++17 133e78f53d1SNikolas Klauser 134e78f53d1SNikolas Klauser bool __invariants() const; 135e78f53d1SNikolas Klauser}; 136e78f53d1SNikolas Klauser 137e78f53d1SNikolas Klausertemplate <class Allocator = allocator<T> > 138e78f53d1SNikolas Klauserclass vector<bool, Allocator> 139e78f53d1SNikolas Klauser{ 140e78f53d1SNikolas Klauserpublic: 141e78f53d1SNikolas Klauser typedef bool value_type; 142e78f53d1SNikolas Klauser typedef Allocator allocator_type; 143e78f53d1SNikolas Klauser typedef implementation-defined iterator; 144e78f53d1SNikolas Klauser typedef implementation-defined const_iterator; 145e78f53d1SNikolas Klauser typedef typename allocator_type::size_type size_type; 146e78f53d1SNikolas Klauser typedef typename allocator_type::difference_type difference_type; 147e78f53d1SNikolas Klauser typedef iterator pointer; 148e78f53d1SNikolas Klauser typedef const_iterator const_pointer; 149e78f53d1SNikolas Klauser typedef std::reverse_iterator<iterator> reverse_iterator; 150e78f53d1SNikolas Klauser typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 151e78f53d1SNikolas Klauser 152e78f53d1SNikolas Klauser class reference 153e78f53d1SNikolas Klauser { 154e78f53d1SNikolas Klauser public: 155e78f53d1SNikolas Klauser reference(const reference&) noexcept; 156e78f53d1SNikolas Klauser operator bool() const noexcept; 157e78f53d1SNikolas Klauser reference& operator=(bool x) noexcept; 158e78f53d1SNikolas Klauser reference& operator=(const reference& x) noexcept; 159e78f53d1SNikolas Klauser iterator operator&() const noexcept; 160e78f53d1SNikolas Klauser void flip() noexcept; 161e78f53d1SNikolas Klauser }; 162e78f53d1SNikolas Klauser 163e78f53d1SNikolas Klauser class const_reference 164e78f53d1SNikolas Klauser { 165e78f53d1SNikolas Klauser public: 166e78f53d1SNikolas Klauser const_reference(const reference&) noexcept; 167e78f53d1SNikolas Klauser operator bool() const noexcept; 168e78f53d1SNikolas Klauser const_iterator operator&() const noexcept; 169e78f53d1SNikolas Klauser }; 170e78f53d1SNikolas Klauser 171e78f53d1SNikolas Klauser vector() 172e78f53d1SNikolas Klauser noexcept(is_nothrow_default_constructible<allocator_type>::value); 173e78f53d1SNikolas Klauser explicit vector(const allocator_type&); 174e78f53d1SNikolas Klauser explicit vector(size_type n, const allocator_type& a = allocator_type()); // C++14 175e78f53d1SNikolas Klauser vector(size_type n, const value_type& value, const allocator_type& = allocator_type()); 176e78f53d1SNikolas Klauser template <class InputIterator> 177e78f53d1SNikolas Klauser vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type()); 178e78f53d1SNikolas Klauser template<container-compatible-range<bool> R> 179e78f53d1SNikolas Klauser constexpr vector(from_range_t, R&& rg, const Allocator& = Allocator()); 180e78f53d1SNikolas Klauser vector(const vector& x); 181e78f53d1SNikolas Klauser vector(vector&& x) 182e78f53d1SNikolas Klauser noexcept(is_nothrow_move_constructible<allocator_type>::value); 183e78f53d1SNikolas Klauser vector(initializer_list<value_type> il); 184e78f53d1SNikolas Klauser vector(initializer_list<value_type> il, const allocator_type& a); 185e78f53d1SNikolas Klauser ~vector(); 186e78f53d1SNikolas Klauser vector& operator=(const vector& x); 187e78f53d1SNikolas Klauser vector& operator=(vector&& x) 188e78f53d1SNikolas Klauser noexcept( 189e78f53d1SNikolas Klauser allocator_type::propagate_on_container_move_assignment::value || 190e78f53d1SNikolas Klauser allocator_type::is_always_equal::value); // C++17 191e78f53d1SNikolas Klauser vector& operator=(initializer_list<value_type> il); 192e78f53d1SNikolas Klauser template <class InputIterator> 193e78f53d1SNikolas Klauser void assign(InputIterator first, InputIterator last); 194e78f53d1SNikolas Klauser template<container-compatible-range<T> R> 195e78f53d1SNikolas Klauser constexpr void assign_range(R&& rg); // C++23 196e78f53d1SNikolas Klauser void assign(size_type n, const value_type& u); 197e78f53d1SNikolas Klauser void assign(initializer_list<value_type> il); 198e78f53d1SNikolas Klauser 199e78f53d1SNikolas Klauser allocator_type get_allocator() const noexcept; 200e78f53d1SNikolas Klauser 201e78f53d1SNikolas Klauser iterator begin() noexcept; 202e78f53d1SNikolas Klauser const_iterator begin() const noexcept; 203e78f53d1SNikolas Klauser iterator end() noexcept; 204e78f53d1SNikolas Klauser const_iterator end() const noexcept; 205e78f53d1SNikolas Klauser 206e78f53d1SNikolas Klauser reverse_iterator rbegin() noexcept; 207e78f53d1SNikolas Klauser const_reverse_iterator rbegin() const noexcept; 208e78f53d1SNikolas Klauser reverse_iterator rend() noexcept; 209e78f53d1SNikolas Klauser const_reverse_iterator rend() const noexcept; 210e78f53d1SNikolas Klauser 211e78f53d1SNikolas Klauser const_iterator cbegin() const noexcept; 212e78f53d1SNikolas Klauser const_iterator cend() const noexcept; 213e78f53d1SNikolas Klauser const_reverse_iterator crbegin() const noexcept; 214e78f53d1SNikolas Klauser const_reverse_iterator crend() const noexcept; 215e78f53d1SNikolas Klauser 216e78f53d1SNikolas Klauser size_type size() const noexcept; 217e78f53d1SNikolas Klauser size_type max_size() const noexcept; 218e78f53d1SNikolas Klauser size_type capacity() const noexcept; 219e78f53d1SNikolas Klauser bool empty() const noexcept; 220e78f53d1SNikolas Klauser void reserve(size_type n); 221e78f53d1SNikolas Klauser void shrink_to_fit() noexcept; 222e78f53d1SNikolas Klauser 223e78f53d1SNikolas Klauser reference operator[](size_type n); 224e78f53d1SNikolas Klauser const_reference operator[](size_type n) const; 225e78f53d1SNikolas Klauser reference at(size_type n); 226e78f53d1SNikolas Klauser const_reference at(size_type n) const; 227e78f53d1SNikolas Klauser 228e78f53d1SNikolas Klauser reference front(); 229e78f53d1SNikolas Klauser const_reference front() const; 230e78f53d1SNikolas Klauser reference back(); 231e78f53d1SNikolas Klauser const_reference back() const; 232e78f53d1SNikolas Klauser 233e78f53d1SNikolas Klauser void push_back(const value_type& x); 234e78f53d1SNikolas Klauser template <class... Args> reference emplace_back(Args&&... args); // C++14; reference in C++17 235e78f53d1SNikolas Klauser template<container-compatible-range<T> R> 236e78f53d1SNikolas Klauser constexpr void append_range(R&& rg); // C++23 237e78f53d1SNikolas Klauser void pop_back(); 238e78f53d1SNikolas Klauser 239e78f53d1SNikolas Klauser template <class... Args> iterator emplace(const_iterator position, Args&&... args); // C++14 240e78f53d1SNikolas Klauser iterator insert(const_iterator position, const value_type& x); 241e78f53d1SNikolas Klauser iterator insert(const_iterator position, size_type n, const value_type& x); 242e78f53d1SNikolas Klauser template <class InputIterator> 243e78f53d1SNikolas Klauser iterator insert(const_iterator position, InputIterator first, InputIterator last); 244e78f53d1SNikolas Klauser template<container-compatible-range<T> R> 245e78f53d1SNikolas Klauser constexpr iterator insert_range(const_iterator position, R&& rg); // C++23 246e78f53d1SNikolas Klauser iterator insert(const_iterator position, initializer_list<value_type> il); 247e78f53d1SNikolas Klauser 248e78f53d1SNikolas Klauser iterator erase(const_iterator position); 249e78f53d1SNikolas Klauser iterator erase(const_iterator first, const_iterator last); 250e78f53d1SNikolas Klauser 251e78f53d1SNikolas Klauser void clear() noexcept; 252e78f53d1SNikolas Klauser 253e78f53d1SNikolas Klauser void resize(size_type sz); 254e78f53d1SNikolas Klauser void resize(size_type sz, value_type x); 255e78f53d1SNikolas Klauser 256e78f53d1SNikolas Klauser void swap(vector&) 257e78f53d1SNikolas Klauser noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value || 258e78f53d1SNikolas Klauser allocator_traits<allocator_type>::is_always_equal::value); // C++17 259e78f53d1SNikolas Klauser void flip() noexcept; 260e78f53d1SNikolas Klauser 261e78f53d1SNikolas Klauser bool __invariants() const; 262e78f53d1SNikolas Klauser}; 263e78f53d1SNikolas Klauser 264e78f53d1SNikolas Klausertemplate <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>> 265e78f53d1SNikolas Klauser vector(InputIterator, InputIterator, Allocator = Allocator()) 266e78f53d1SNikolas Klauser -> vector<typename iterator_traits<InputIterator>::value_type, Allocator>; // C++17 267e78f53d1SNikolas Klauser 268e78f53d1SNikolas Klausertemplate<ranges::input_range R, class Allocator = allocator<ranges::range_value_t<R>>> 269e78f53d1SNikolas Klauser vector(from_range_t, R&&, Allocator = Allocator()) 270e78f53d1SNikolas Klauser -> vector<ranges::range_value_t<R>, Allocator>; // C++23 271e78f53d1SNikolas Klauser 272e78f53d1SNikolas Klausertemplate <class Allocator> struct hash<std::vector<bool, Allocator>>; 273e78f53d1SNikolas Klauser 274e78f53d1SNikolas Klausertemplate <class T, class Allocator> bool operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y); // constexpr since C++20 275e78f53d1SNikolas Klausertemplate <class T, class Allocator> bool operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); // removed in C++20 276e78f53d1SNikolas Klausertemplate <class T, class Allocator> bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y); // removed in C++20 277e78f53d1SNikolas Klausertemplate <class T, class Allocator> bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y); // removed in C++20 278e78f53d1SNikolas Klausertemplate <class T, class Allocator> bool operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); // removed in C++20 279e78f53d1SNikolas Klausertemplate <class T, class Allocator> bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); // removed in C++20 280e78f53d1SNikolas Klausertemplate <class T, class Allocator> constexpr 281e78f53d1SNikolas Klauser constexpr synth-three-way-result<T> operator<=>(const vector<T, Allocator>& x, 282e78f53d1SNikolas Klauser const vector<T, Allocator>& y); // since C++20 283e78f53d1SNikolas Klauser 284e78f53d1SNikolas Klausertemplate <class T, class Allocator> 285e78f53d1SNikolas Klauservoid swap(vector<T,Allocator>& x, vector<T,Allocator>& y) 286e78f53d1SNikolas Klauser noexcept(noexcept(x.swap(y))); 287e78f53d1SNikolas Klauser 288e78f53d1SNikolas Klausertemplate <class T, class Allocator, class U> 289e78f53d1SNikolas Klausertypename vector<T, Allocator>::size_type 290e78f53d1SNikolas Klausererase(vector<T, Allocator>& c, const U& value); // since C++20 291e78f53d1SNikolas Klausertemplate <class T, class Allocator, class Predicate> 292e78f53d1SNikolas Klausertypename vector<T, Allocator>::size_type 293e78f53d1SNikolas Klausererase_if(vector<T, Allocator>& c, Predicate pred); // since C++20 294e78f53d1SNikolas Klauser 295e78f53d1SNikolas Klauser 296e78f53d1SNikolas Klausertemplate<class T> 297e78f53d1SNikolas Klauser inline constexpr bool is-vector-bool-reference = see below; // exposition only, since C++23 298e78f53d1SNikolas Klauser 299e78f53d1SNikolas Klausertemplate<class T, class charT> requires is-vector-bool-reference<T> // Since C++23 300e78f53d1SNikolas Klauser struct formatter<T, charT>; 301e78f53d1SNikolas Klauser 302e78f53d1SNikolas Klauser} // std 303e78f53d1SNikolas Klauser 304e78f53d1SNikolas Klauser*/ 305e78f53d1SNikolas Klauser 306e78f53d1SNikolas Klauser// clang-format on 307e78f53d1SNikolas Klauser 30873fbae83SNikolas Klauser#include <__cxx03/__algorithm/copy.h> 30973fbae83SNikolas Klauser#include <__cxx03/__algorithm/equal.h> 31073fbae83SNikolas Klauser#include <__cxx03/__algorithm/fill_n.h> 31173fbae83SNikolas Klauser#include <__cxx03/__algorithm/iterator_operations.h> 31273fbae83SNikolas Klauser#include <__cxx03/__algorithm/lexicographical_compare.h> 31373fbae83SNikolas Klauser#include <__cxx03/__algorithm/lexicographical_compare_three_way.h> 31473fbae83SNikolas Klauser#include <__cxx03/__algorithm/remove.h> 31573fbae83SNikolas Klauser#include <__cxx03/__algorithm/remove_if.h> 31673fbae83SNikolas Klauser#include <__cxx03/__algorithm/rotate.h> 31773fbae83SNikolas Klauser#include <__cxx03/__algorithm/unwrap_iter.h> 31873fbae83SNikolas Klauser#include <__cxx03/__assert> 31973fbae83SNikolas Klauser#include <__cxx03/__bit_reference> 32073fbae83SNikolas Klauser#include <__cxx03/__concepts/same_as.h> 32173fbae83SNikolas Klauser#include <__cxx03/__config> 32273fbae83SNikolas Klauser#include <__cxx03/__debug_utils/sanitizers.h> 32373fbae83SNikolas Klauser#include <__cxx03/__format/enable_insertable.h> 32473fbae83SNikolas Klauser#include <__cxx03/__format/formatter.h> 32573fbae83SNikolas Klauser#include <__cxx03/__format/formatter_bool.h> 32673fbae83SNikolas Klauser#include <__cxx03/__functional/hash.h> 32773fbae83SNikolas Klauser#include <__cxx03/__functional/unary_function.h> 32873fbae83SNikolas Klauser#include <__cxx03/__fwd/vector.h> 32973fbae83SNikolas Klauser#include <__cxx03/__iterator/advance.h> 33073fbae83SNikolas Klauser#include <__cxx03/__iterator/bounded_iter.h> 33173fbae83SNikolas Klauser#include <__cxx03/__iterator/distance.h> 33273fbae83SNikolas Klauser#include <__cxx03/__iterator/iterator_traits.h> 33373fbae83SNikolas Klauser#include <__cxx03/__iterator/reverse_iterator.h> 33473fbae83SNikolas Klauser#include <__cxx03/__iterator/wrap_iter.h> 33573fbae83SNikolas Klauser#include <__cxx03/__memory/addressof.h> 33673fbae83SNikolas Klauser#include <__cxx03/__memory/allocate_at_least.h> 33773fbae83SNikolas Klauser#include <__cxx03/__memory/allocator_traits.h> 33873fbae83SNikolas Klauser#include <__cxx03/__memory/pointer_traits.h> 33973fbae83SNikolas Klauser#include <__cxx03/__memory/swap_allocator.h> 34073fbae83SNikolas Klauser#include <__cxx03/__memory/temp_value.h> 34173fbae83SNikolas Klauser#include <__cxx03/__memory/uninitialized_algorithms.h> 34273fbae83SNikolas Klauser#include <__cxx03/__memory_resource/polymorphic_allocator.h> 34373fbae83SNikolas Klauser#include <__cxx03/__ranges/access.h> 34473fbae83SNikolas Klauser#include <__cxx03/__ranges/concepts.h> 34573fbae83SNikolas Klauser#include <__cxx03/__ranges/container_compatible_range.h> 34673fbae83SNikolas Klauser#include <__cxx03/__ranges/from_range.h> 34773fbae83SNikolas Klauser#include <__cxx03/__ranges/size.h> 34873fbae83SNikolas Klauser#include <__cxx03/__split_buffer> 34973fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_allocator.h> 35073fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_constructible.h> 35173fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_nothrow_assignable.h> 35273fbae83SNikolas Klauser#include <__cxx03/__type_traits/noexcept_move_assign_container.h> 35373fbae83SNikolas Klauser#include <__cxx03/__type_traits/type_identity.h> 35473fbae83SNikolas Klauser#include <__cxx03/__utility/exception_guard.h> 35573fbae83SNikolas Klauser#include <__cxx03/__utility/forward.h> 35673fbae83SNikolas Klauser#include <__cxx03/__utility/is_pointer_in_range.h> 35773fbae83SNikolas Klauser#include <__cxx03/__utility/move.h> 35873fbae83SNikolas Klauser#include <__cxx03/__utility/pair.h> 35973fbae83SNikolas Klauser#include <__cxx03/__utility/swap.h> 36073fbae83SNikolas Klauser#include <__cxx03/climits> 36173fbae83SNikolas Klauser#include <__cxx03/cstring> 36273fbae83SNikolas Klauser#include <__cxx03/limits> 36373fbae83SNikolas Klauser#include <__cxx03/stdexcept> 36473fbae83SNikolas Klauser#include <__cxx03/version> 365e78f53d1SNikolas Klauser 366e78f53d1SNikolas Klauser// standard-mandated includes 367e78f53d1SNikolas Klauser 368e78f53d1SNikolas Klauser// [iterator.range] 36973fbae83SNikolas Klauser#include <__cxx03/__iterator/access.h> 37073fbae83SNikolas Klauser#include <__cxx03/__iterator/data.h> 37173fbae83SNikolas Klauser#include <__cxx03/__iterator/empty.h> 37273fbae83SNikolas Klauser#include <__cxx03/__iterator/reverse_access.h> 37373fbae83SNikolas Klauser#include <__cxx03/__iterator/size.h> 374e78f53d1SNikolas Klauser 375e78f53d1SNikolas Klauser// [vector.syn] 37673fbae83SNikolas Klauser#include <__cxx03/compare> 37773fbae83SNikolas Klauser#include <__cxx03/initializer_list> 378e78f53d1SNikolas Klauser 379e78f53d1SNikolas Klauser#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 380e78f53d1SNikolas Klauser# pragma GCC system_header 381e78f53d1SNikolas Klauser#endif 382e78f53d1SNikolas Klauser 383e78f53d1SNikolas Klauser_LIBCPP_PUSH_MACROS 38473fbae83SNikolas Klauser#include <__cxx03/__undef_macros> 385e78f53d1SNikolas Klauser 386e78f53d1SNikolas Klauser_LIBCPP_BEGIN_NAMESPACE_STD 387e78f53d1SNikolas Klauser 388e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator /* = allocator<_Tp> */> 389e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS vector { 390e78f53d1SNikolas Klauserprivate: 391e78f53d1SNikolas Klauser typedef allocator<_Tp> __default_allocator_type; 392e78f53d1SNikolas Klauser 393e78f53d1SNikolas Klauserpublic: 394e78f53d1SNikolas Klauser typedef vector __self; 395e78f53d1SNikolas Klauser typedef _Tp value_type; 396e78f53d1SNikolas Klauser typedef _Allocator allocator_type; 397e78f53d1SNikolas Klauser typedef allocator_traits<allocator_type> __alloc_traits; 398e78f53d1SNikolas Klauser typedef value_type& reference; 399e78f53d1SNikolas Klauser typedef const value_type& const_reference; 400e78f53d1SNikolas Klauser typedef typename __alloc_traits::size_type size_type; 401e78f53d1SNikolas Klauser typedef typename __alloc_traits::difference_type difference_type; 402e78f53d1SNikolas Klauser typedef typename __alloc_traits::pointer pointer; 403e78f53d1SNikolas Klauser typedef typename __alloc_traits::const_pointer const_pointer; 404e78f53d1SNikolas Klauser#ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR 405e78f53d1SNikolas Klauser // Users might provide custom allocators, and prior to C++20 we have no existing way to detect whether the allocator's 406e78f53d1SNikolas Klauser // pointer type is contiguous (though it has to be by the Standard). Using the wrapper type ensures the iterator is 407e78f53d1SNikolas Klauser // considered contiguous. 408e78f53d1SNikolas Klauser typedef __bounded_iter<__wrap_iter<pointer>> iterator; 409e78f53d1SNikolas Klauser typedef __bounded_iter<__wrap_iter<const_pointer>> const_iterator; 410e78f53d1SNikolas Klauser#else 411e78f53d1SNikolas Klauser typedef __wrap_iter<pointer> iterator; 412e78f53d1SNikolas Klauser typedef __wrap_iter<const_pointer> const_iterator; 413e78f53d1SNikolas Klauser#endif 414e78f53d1SNikolas Klauser typedef std::reverse_iterator<iterator> reverse_iterator; 415e78f53d1SNikolas Klauser typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 416e78f53d1SNikolas Klauser 417e78f53d1SNikolas Klauser // A vector containers the following members which may be trivially relocatable: 418e78f53d1SNikolas Klauser // - pointer: may be trivially relocatable, so it's checked 419e78f53d1SNikolas Klauser // - allocator_type: may be trivially relocatable, so it's checked 420e78f53d1SNikolas Klauser // vector doesn't contain any self-references, so it's trivially relocatable if its members are. 421e78f53d1SNikolas Klauser using __trivially_relocatable = __conditional_t< 422e78f53d1SNikolas Klauser __libcpp_is_trivially_relocatable<pointer>::value && __libcpp_is_trivially_relocatable<allocator_type>::value, 423e78f53d1SNikolas Klauser vector, 424e78f53d1SNikolas Klauser void>; 425e78f53d1SNikolas Klauser 426e78f53d1SNikolas Klauser static_assert(__check_valid_allocator<allocator_type>::value, ""); 427e78f53d1SNikolas Klauser static_assert(is_same<typename allocator_type::value_type, value_type>::value, 428e78f53d1SNikolas Klauser "Allocator::value_type must be same type as value_type"); 429e78f53d1SNikolas Klauser 430e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector() 431e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) {} 432e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit vector(const allocator_type& __a) 433e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER <= 14 434e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value) 435e78f53d1SNikolas Klauser#else 436e78f53d1SNikolas Klauser _NOEXCEPT 437e78f53d1SNikolas Klauser#endif 438e78f53d1SNikolas Klauser : __end_cap_(nullptr, __a) { 439e78f53d1SNikolas Klauser } 440e78f53d1SNikolas Klauser 441e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit vector(size_type __n) { 442e78f53d1SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 443e78f53d1SNikolas Klauser if (__n > 0) { 444e78f53d1SNikolas Klauser __vallocate(__n); 445e78f53d1SNikolas Klauser __construct_at_end(__n); 446e78f53d1SNikolas Klauser } 447e78f53d1SNikolas Klauser __guard.__complete(); 448e78f53d1SNikolas Klauser } 449e78f53d1SNikolas Klauser 450e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 451e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit vector(size_type __n, const allocator_type& __a) 452e78f53d1SNikolas Klauser : __end_cap_(nullptr, __a) { 453e78f53d1SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 454e78f53d1SNikolas Klauser if (__n > 0) { 455e78f53d1SNikolas Klauser __vallocate(__n); 456e78f53d1SNikolas Klauser __construct_at_end(__n); 457e78f53d1SNikolas Klauser } 458e78f53d1SNikolas Klauser __guard.__complete(); 459e78f53d1SNikolas Klauser } 460e78f53d1SNikolas Klauser#endif 461e78f53d1SNikolas Klauser 462e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(size_type __n, const value_type& __x) { 463e78f53d1SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 464e78f53d1SNikolas Klauser if (__n > 0) { 465e78f53d1SNikolas Klauser __vallocate(__n); 466e78f53d1SNikolas Klauser __construct_at_end(__n, __x); 467e78f53d1SNikolas Klauser } 468e78f53d1SNikolas Klauser __guard.__complete(); 469e78f53d1SNikolas Klauser } 470e78f53d1SNikolas Klauser 471e78f53d1SNikolas Klauser template <__enable_if_t<__is_allocator<_Allocator>::value, int> = 0> 472e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 473e78f53d1SNikolas Klauser vector(size_type __n, const value_type& __x, const allocator_type& __a) 474e78f53d1SNikolas Klauser : __end_cap_(nullptr, __a) { 475e78f53d1SNikolas Klauser if (__n > 0) { 476e78f53d1SNikolas Klauser __vallocate(__n); 477e78f53d1SNikolas Klauser __construct_at_end(__n, __x); 478e78f53d1SNikolas Klauser } 479e78f53d1SNikolas Klauser } 480e78f53d1SNikolas Klauser 481e78f53d1SNikolas Klauser template <class _InputIterator, 482e78f53d1SNikolas Klauser __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value && 483e78f53d1SNikolas Klauser is_constructible<value_type, typename iterator_traits<_InputIterator>::reference>::value, 484e78f53d1SNikolas Klauser int> = 0> 485e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(_InputIterator __first, _InputIterator __last); 486e78f53d1SNikolas Klauser template <class _InputIterator, 487e78f53d1SNikolas Klauser __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value && 488e78f53d1SNikolas Klauser is_constructible<value_type, typename iterator_traits<_InputIterator>::reference>::value, 489e78f53d1SNikolas Klauser int> = 0> 490e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 491e78f53d1SNikolas Klauser vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a); 492e78f53d1SNikolas Klauser 493e78f53d1SNikolas Klauser template < 494e78f53d1SNikolas Klauser class _ForwardIterator, 495e78f53d1SNikolas Klauser __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value && 496e78f53d1SNikolas Klauser is_constructible<value_type, typename iterator_traits<_ForwardIterator>::reference>::value, 497e78f53d1SNikolas Klauser int> = 0> 498e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(_ForwardIterator __first, _ForwardIterator __last); 499e78f53d1SNikolas Klauser 500e78f53d1SNikolas Klauser template < 501e78f53d1SNikolas Klauser class _ForwardIterator, 502e78f53d1SNikolas Klauser __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value && 503e78f53d1SNikolas Klauser is_constructible<value_type, typename iterator_traits<_ForwardIterator>::reference>::value, 504e78f53d1SNikolas Klauser int> = 0> 505e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 506e78f53d1SNikolas Klauser vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a); 507e78f53d1SNikolas Klauser 508e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 23 509e78f53d1SNikolas Klauser template <_ContainerCompatibleRange<_Tp> _Range> 510e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr vector( 511e78f53d1SNikolas Klauser from_range_t, _Range&& __range, const allocator_type& __alloc = allocator_type()) 512e78f53d1SNikolas Klauser : __end_cap_(nullptr, __alloc) { 513e78f53d1SNikolas Klauser if constexpr (ranges::forward_range<_Range> || ranges::sized_range<_Range>) { 514e78f53d1SNikolas Klauser auto __n = static_cast<size_type>(ranges::distance(__range)); 515e78f53d1SNikolas Klauser __init_with_size(ranges::begin(__range), ranges::end(__range), __n); 516e78f53d1SNikolas Klauser 517e78f53d1SNikolas Klauser } else { 518e78f53d1SNikolas Klauser __init_with_sentinel(ranges::begin(__range), ranges::end(__range)); 519e78f53d1SNikolas Klauser } 520e78f53d1SNikolas Klauser } 521e78f53d1SNikolas Klauser#endif 522e78f53d1SNikolas Klauser 523e78f53d1SNikolas Klauserprivate: 524e78f53d1SNikolas Klauser class __destroy_vector { 525e78f53d1SNikolas Klauser public: 526e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI __destroy_vector(vector& __vec) : __vec_(__vec) {} 527e78f53d1SNikolas Klauser 528e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void operator()() { 529e78f53d1SNikolas Klauser if (__vec_.__begin_ != nullptr) { 530e78f53d1SNikolas Klauser __vec_.__clear(); 531e78f53d1SNikolas Klauser __vec_.__annotate_delete(); 532e78f53d1SNikolas Klauser __alloc_traits::deallocate(__vec_.__alloc(), __vec_.__begin_, __vec_.capacity()); 533e78f53d1SNikolas Klauser } 534e78f53d1SNikolas Klauser } 535e78f53d1SNikolas Klauser 536e78f53d1SNikolas Klauser private: 537e78f53d1SNikolas Klauser vector& __vec_; 538e78f53d1SNikolas Klauser }; 539e78f53d1SNikolas Klauser 540e78f53d1SNikolas Klauserpublic: 541e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI ~vector() { __destroy_vector (*this)(); } 542e78f53d1SNikolas Klauser 543e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(const vector& __x); 544e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 545e78f53d1SNikolas Klauser vector(const vector& __x, const __type_identity_t<allocator_type>& __a); 546e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector& operator=(const vector& __x); 547e78f53d1SNikolas Klauser 548e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 549e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(initializer_list<value_type> __il); 550e78f53d1SNikolas Klauser 551e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 552e78f53d1SNikolas Klauser vector(initializer_list<value_type> __il, const allocator_type& __a); 553e78f53d1SNikolas Klauser 554e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector& operator=(initializer_list<value_type> __il) { 555e78f53d1SNikolas Klauser assign(__il.begin(), __il.end()); 556e78f53d1SNikolas Klauser return *this; 557e78f53d1SNikolas Klauser } 558e78f53d1SNikolas Klauser#endif // !_LIBCPP_CXX03_LANG 559e78f53d1SNikolas Klauser 560e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(vector&& __x) 561e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 562e78f53d1SNikolas Klauser noexcept; 563e78f53d1SNikolas Klauser#else 564e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); 565e78f53d1SNikolas Klauser#endif 566e78f53d1SNikolas Klauser 567e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 568e78f53d1SNikolas Klauser vector(vector&& __x, const __type_identity_t<allocator_type>& __a); 569e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector& operator=(vector&& __x) 570e78f53d1SNikolas Klauser _NOEXCEPT_(__noexcept_move_assign_container<_Allocator, __alloc_traits>::value); 571e78f53d1SNikolas Klauser 572e78f53d1SNikolas Klauser template <class _InputIterator, 573e78f53d1SNikolas Klauser __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value && 574e78f53d1SNikolas Klauser is_constructible<value_type, typename iterator_traits<_InputIterator>::reference>::value, 575e78f53d1SNikolas Klauser int> = 0> 576e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void assign(_InputIterator __first, _InputIterator __last); 577e78f53d1SNikolas Klauser template < 578e78f53d1SNikolas Klauser class _ForwardIterator, 579e78f53d1SNikolas Klauser __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value && 580e78f53d1SNikolas Klauser is_constructible<value_type, typename iterator_traits<_ForwardIterator>::reference>::value, 581e78f53d1SNikolas Klauser int> = 0> 582e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void assign(_ForwardIterator __first, _ForwardIterator __last); 583e78f53d1SNikolas Klauser 584e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 23 585e78f53d1SNikolas Klauser template <_ContainerCompatibleRange<_Tp> _Range> 586e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr void assign_range(_Range&& __range) { 587e78f53d1SNikolas Klauser if constexpr (ranges::forward_range<_Range> || ranges::sized_range<_Range>) { 588e78f53d1SNikolas Klauser auto __n = static_cast<size_type>(ranges::distance(__range)); 589e78f53d1SNikolas Klauser __assign_with_size(ranges::begin(__range), ranges::end(__range), __n); 590e78f53d1SNikolas Klauser 591e78f53d1SNikolas Klauser } else { 592e78f53d1SNikolas Klauser __assign_with_sentinel(ranges::begin(__range), ranges::end(__range)); 593e78f53d1SNikolas Klauser } 594e78f53d1SNikolas Klauser } 595e78f53d1SNikolas Klauser#endif 596e78f53d1SNikolas Klauser 597e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void assign(size_type __n, const_reference __u); 598e78f53d1SNikolas Klauser 599e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 600e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void assign(initializer_list<value_type> __il) { 601e78f53d1SNikolas Klauser assign(__il.begin(), __il.end()); 602e78f53d1SNikolas Klauser } 603e78f53d1SNikolas Klauser#endif 604e78f53d1SNikolas Klauser 605e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI allocator_type get_allocator() const _NOEXCEPT { 606e78f53d1SNikolas Klauser return this->__alloc(); 607e78f53d1SNikolas Klauser } 608e78f53d1SNikolas Klauser 609e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator begin() _NOEXCEPT; 610e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator begin() const _NOEXCEPT; 611e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator end() _NOEXCEPT; 612e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator end() const _NOEXCEPT; 613e78f53d1SNikolas Klauser 614e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reverse_iterator rbegin() _NOEXCEPT { 615e78f53d1SNikolas Klauser return reverse_iterator(end()); 616e78f53d1SNikolas Klauser } 617e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reverse_iterator rbegin() const _NOEXCEPT { 618e78f53d1SNikolas Klauser return const_reverse_iterator(end()); 619e78f53d1SNikolas Klauser } 620e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reverse_iterator rend() _NOEXCEPT { 621e78f53d1SNikolas Klauser return reverse_iterator(begin()); 622e78f53d1SNikolas Klauser } 623e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reverse_iterator rend() const _NOEXCEPT { 624e78f53d1SNikolas Klauser return const_reverse_iterator(begin()); 625e78f53d1SNikolas Klauser } 626e78f53d1SNikolas Klauser 627e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator cbegin() const _NOEXCEPT { return begin(); } 628e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator cend() const _NOEXCEPT { return end(); } 629e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reverse_iterator crbegin() const _NOEXCEPT { 630e78f53d1SNikolas Klauser return rbegin(); 631e78f53d1SNikolas Klauser } 632e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reverse_iterator crend() const _NOEXCEPT { return rend(); } 633e78f53d1SNikolas Klauser 634e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type size() const _NOEXCEPT { 635e78f53d1SNikolas Klauser return static_cast<size_type>(this->__end_ - this->__begin_); 636e78f53d1SNikolas Klauser } 637e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type capacity() const _NOEXCEPT { 638e78f53d1SNikolas Klauser return static_cast<size_type>(__end_cap() - this->__begin_); 639e78f53d1SNikolas Klauser } 640e78f53d1SNikolas Klauser _LIBCPP_NODISCARD _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool empty() const _NOEXCEPT { 641e78f53d1SNikolas Klauser return this->__begin_ == this->__end_; 642e78f53d1SNikolas Klauser } 643e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type max_size() const _NOEXCEPT; 644e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void reserve(size_type __n); 645e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void shrink_to_fit() _NOEXCEPT; 646e78f53d1SNikolas Klauser 647e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference operator[](size_type __n) _NOEXCEPT; 648e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference operator[](size_type __n) const _NOEXCEPT; 649e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference at(size_type __n); 650e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference at(size_type __n) const; 651e78f53d1SNikolas Klauser 652e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference front() _NOEXCEPT { 653e78f53d1SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "front() called on an empty vector"); 654e78f53d1SNikolas Klauser return *this->__begin_; 655e78f53d1SNikolas Klauser } 656e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference front() const _NOEXCEPT { 657e78f53d1SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "front() called on an empty vector"); 658e78f53d1SNikolas Klauser return *this->__begin_; 659e78f53d1SNikolas Klauser } 660e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference back() _NOEXCEPT { 661e78f53d1SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "back() called on an empty vector"); 662e78f53d1SNikolas Klauser return *(this->__end_ - 1); 663e78f53d1SNikolas Klauser } 664e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference back() const _NOEXCEPT { 665e78f53d1SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "back() called on an empty vector"); 666e78f53d1SNikolas Klauser return *(this->__end_ - 1); 667e78f53d1SNikolas Klauser } 668e78f53d1SNikolas Klauser 669e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI value_type* data() _NOEXCEPT { 670e78f53d1SNikolas Klauser return std::__to_address(this->__begin_); 671e78f53d1SNikolas Klauser } 672e78f53d1SNikolas Klauser 673e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const value_type* data() const _NOEXCEPT { 674e78f53d1SNikolas Klauser return std::__to_address(this->__begin_); 675e78f53d1SNikolas Klauser } 676e78f53d1SNikolas Klauser 677e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void push_back(const_reference __x); 678e78f53d1SNikolas Klauser 679e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void push_back(value_type&& __x); 680e78f53d1SNikolas Klauser 681e78f53d1SNikolas Klauser template <class... _Args> 682e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 683e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 684e78f53d1SNikolas Klauser reference 685e78f53d1SNikolas Klauser emplace_back(_Args&&... __args); 686e78f53d1SNikolas Klauser#else 687e78f53d1SNikolas Klauser void 688e78f53d1SNikolas Klauser emplace_back(_Args&&... __args); 689e78f53d1SNikolas Klauser#endif 690e78f53d1SNikolas Klauser 691e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 23 692e78f53d1SNikolas Klauser template <_ContainerCompatibleRange<_Tp> _Range> 693e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr void append_range(_Range&& __range) { 694e78f53d1SNikolas Klauser insert_range(end(), std::forward<_Range>(__range)); 695e78f53d1SNikolas Klauser } 696e78f53d1SNikolas Klauser#endif 697e78f53d1SNikolas Klauser 698e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void pop_back(); 699e78f53d1SNikolas Klauser 700e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __position, const_reference __x); 701e78f53d1SNikolas Klauser 702e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __position, value_type&& __x); 703e78f53d1SNikolas Klauser template <class... _Args> 704e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator emplace(const_iterator __position, _Args&&... __args); 705e78f53d1SNikolas Klauser 706e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 707e78f53d1SNikolas Klauser insert(const_iterator __position, size_type __n, const_reference __x); 708e78f53d1SNikolas Klauser 709e78f53d1SNikolas Klauser template <class _InputIterator, 710e78f53d1SNikolas Klauser __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value && 711e78f53d1SNikolas Klauser is_constructible< value_type, typename iterator_traits<_InputIterator>::reference>::value, 712e78f53d1SNikolas Klauser int> = 0> 713e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 714e78f53d1SNikolas Klauser insert(const_iterator __position, _InputIterator __first, _InputIterator __last); 715e78f53d1SNikolas Klauser 716e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 23 717e78f53d1SNikolas Klauser template <_ContainerCompatibleRange<_Tp> _Range> 718e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr iterator insert_range(const_iterator __position, _Range&& __range) { 719e78f53d1SNikolas Klauser if constexpr (ranges::forward_range<_Range> || ranges::sized_range<_Range>) { 720e78f53d1SNikolas Klauser auto __n = static_cast<size_type>(ranges::distance(__range)); 721e78f53d1SNikolas Klauser return __insert_with_size(__position, ranges::begin(__range), ranges::end(__range), __n); 722e78f53d1SNikolas Klauser 723e78f53d1SNikolas Klauser } else { 724e78f53d1SNikolas Klauser return __insert_with_sentinel(__position, ranges::begin(__range), ranges::end(__range)); 725e78f53d1SNikolas Klauser } 726e78f53d1SNikolas Klauser } 727e78f53d1SNikolas Klauser#endif 728e78f53d1SNikolas Klauser 729e78f53d1SNikolas Klauser template < 730e78f53d1SNikolas Klauser class _ForwardIterator, 731e78f53d1SNikolas Klauser __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value && 732e78f53d1SNikolas Klauser is_constructible< value_type, typename iterator_traits<_ForwardIterator>::reference>::value, 733e78f53d1SNikolas Klauser int> = 0> 734e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 735e78f53d1SNikolas Klauser insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last); 736e78f53d1SNikolas Klauser 737e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 738e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 739e78f53d1SNikolas Klauser insert(const_iterator __position, initializer_list<value_type> __il) { 740e78f53d1SNikolas Klauser return insert(__position, __il.begin(), __il.end()); 741e78f53d1SNikolas Klauser } 742e78f53d1SNikolas Klauser#endif 743e78f53d1SNikolas Klauser 744e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator erase(const_iterator __position); 745e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator erase(const_iterator __first, const_iterator __last); 746e78f53d1SNikolas Klauser 747e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void clear() _NOEXCEPT { 748e78f53d1SNikolas Klauser size_type __old_size = size(); 749e78f53d1SNikolas Klauser __clear(); 750e78f53d1SNikolas Klauser __annotate_shrink(__old_size); 751e78f53d1SNikolas Klauser } 752e78f53d1SNikolas Klauser 753e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void resize(size_type __sz); 754e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void resize(size_type __sz, const_reference __x); 755e78f53d1SNikolas Klauser 756e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void swap(vector&) 757e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 758e78f53d1SNikolas Klauser _NOEXCEPT; 759e78f53d1SNikolas Klauser#else 760e78f53d1SNikolas Klauser _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || __is_nothrow_swappable_v<allocator_type>); 761e78f53d1SNikolas Klauser#endif 762e78f53d1SNikolas Klauser 763e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool __invariants() const; 764e78f53d1SNikolas Klauser 765e78f53d1SNikolas Klauserprivate: 766e78f53d1SNikolas Klauser pointer __begin_ = nullptr; 767e78f53d1SNikolas Klauser pointer __end_ = nullptr; 768e78f53d1SNikolas Klauser __compressed_pair<pointer, allocator_type> __end_cap_ = 769e78f53d1SNikolas Klauser __compressed_pair<pointer, allocator_type>(nullptr, __default_init_tag()); 770e78f53d1SNikolas Klauser 771e78f53d1SNikolas Klauser // Allocate space for __n objects 772e78f53d1SNikolas Klauser // throws length_error if __n > max_size() 773e78f53d1SNikolas Klauser // throws (probably bad_alloc) if memory run out 774e78f53d1SNikolas Klauser // Precondition: __begin_ == __end_ == __end_cap() == 0 775e78f53d1SNikolas Klauser // Precondition: __n > 0 776e78f53d1SNikolas Klauser // Postcondition: capacity() >= __n 777e78f53d1SNikolas Klauser // Postcondition: size() == 0 778e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __vallocate(size_type __n) { 779e78f53d1SNikolas Klauser if (__n > max_size()) 780e78f53d1SNikolas Klauser __throw_length_error(); 781e78f53d1SNikolas Klauser auto __allocation = std::__allocate_at_least(__alloc(), __n); 782e78f53d1SNikolas Klauser __begin_ = __allocation.ptr; 783e78f53d1SNikolas Klauser __end_ = __allocation.ptr; 784e78f53d1SNikolas Klauser __end_cap() = __begin_ + __allocation.count; 785e78f53d1SNikolas Klauser __annotate_new(0); 786e78f53d1SNikolas Klauser } 787e78f53d1SNikolas Klauser 788e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __vdeallocate() _NOEXCEPT; 789e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type __recommend(size_type __new_size) const; 790e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __construct_at_end(size_type __n); 791e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __construct_at_end(size_type __n, const_reference __x); 792e78f53d1SNikolas Klauser 793e78f53d1SNikolas Klauser template <class _InputIterator, class _Sentinel> 794e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 795e78f53d1SNikolas Klauser __init_with_size(_InputIterator __first, _Sentinel __last, size_type __n) { 796e78f53d1SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 797e78f53d1SNikolas Klauser 798e78f53d1SNikolas Klauser if (__n > 0) { 799e78f53d1SNikolas Klauser __vallocate(__n); 800e78f53d1SNikolas Klauser __construct_at_end(__first, __last, __n); 801e78f53d1SNikolas Klauser } 802e78f53d1SNikolas Klauser 803e78f53d1SNikolas Klauser __guard.__complete(); 804e78f53d1SNikolas Klauser } 805e78f53d1SNikolas Klauser 806e78f53d1SNikolas Klauser template <class _InputIterator, class _Sentinel> 807e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 808e78f53d1SNikolas Klauser __init_with_sentinel(_InputIterator __first, _Sentinel __last) { 809e78f53d1SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 810e78f53d1SNikolas Klauser 811e78f53d1SNikolas Klauser for (; __first != __last; ++__first) 812e78f53d1SNikolas Klauser emplace_back(*__first); 813e78f53d1SNikolas Klauser 814e78f53d1SNikolas Klauser __guard.__complete(); 815e78f53d1SNikolas Klauser } 816e78f53d1SNikolas Klauser 817e78f53d1SNikolas Klauser template <class _Iterator, class _Sentinel> 818e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __assign_with_sentinel(_Iterator __first, _Sentinel __last); 819e78f53d1SNikolas Klauser 820e78f53d1SNikolas Klauser template <class _ForwardIterator, class _Sentinel> 821e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 822e78f53d1SNikolas Klauser __assign_with_size(_ForwardIterator __first, _Sentinel __last, difference_type __n); 823e78f53d1SNikolas Klauser 824e78f53d1SNikolas Klauser template <class _InputIterator, class _Sentinel> 825e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 826e78f53d1SNikolas Klauser __insert_with_sentinel(const_iterator __position, _InputIterator __first, _Sentinel __last); 827e78f53d1SNikolas Klauser 828e78f53d1SNikolas Klauser template <class _Iterator, class _Sentinel> 829e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 830e78f53d1SNikolas Klauser __insert_with_size(const_iterator __position, _Iterator __first, _Sentinel __last, difference_type __n); 831e78f53d1SNikolas Klauser 832e78f53d1SNikolas Klauser template <class _InputIterator, class _Sentinel> 833e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 834e78f53d1SNikolas Klauser __construct_at_end(_InputIterator __first, _Sentinel __last, size_type __n); 835e78f53d1SNikolas Klauser 836e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __append(size_type __n); 837e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __append(size_type __n, const_reference __x); 838e78f53d1SNikolas Klauser 839e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator __make_iter(pointer __p) _NOEXCEPT { 840e78f53d1SNikolas Klauser#ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR 841e78f53d1SNikolas Klauser // Bound the iterator according to the capacity, rather than the size. 842e78f53d1SNikolas Klauser // 843e78f53d1SNikolas Klauser // Vector guarantees that iterators stay valid as long as no reallocation occurs even if new elements are inserted 844e78f53d1SNikolas Klauser // into the container; for these cases, we need to make sure that the newly-inserted elements can be accessed 845e78f53d1SNikolas Klauser // through the bounded iterator without failing checks. The downside is that the bounded iterator won't catch 846e78f53d1SNikolas Klauser // access that is logically out-of-bounds, i.e., goes beyond the size, but is still within the capacity. With the 847e78f53d1SNikolas Klauser // current implementation, there is no connection between a bounded iterator and its associated container, so we 848e78f53d1SNikolas Klauser // don't have a way to update existing valid iterators when the container is resized and thus have to go with 849e78f53d1SNikolas Klauser // a laxer approach. 850e78f53d1SNikolas Klauser return std::__make_bounded_iter( 851e78f53d1SNikolas Klauser std::__wrap_iter<pointer>(__p), 852e78f53d1SNikolas Klauser std::__wrap_iter<pointer>(this->__begin_), 853e78f53d1SNikolas Klauser std::__wrap_iter<pointer>(this->__end_cap())); 854e78f53d1SNikolas Klauser#else 855e78f53d1SNikolas Klauser return iterator(__p); 856e78f53d1SNikolas Klauser#endif // _LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR 857e78f53d1SNikolas Klauser } 858e78f53d1SNikolas Klauser 859e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator __make_iter(const_pointer __p) const _NOEXCEPT { 860e78f53d1SNikolas Klauser#ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR 861e78f53d1SNikolas Klauser // Bound the iterator according to the capacity, rather than the size. 862e78f53d1SNikolas Klauser return std::__make_bounded_iter( 863e78f53d1SNikolas Klauser std::__wrap_iter<const_pointer>(__p), 864e78f53d1SNikolas Klauser std::__wrap_iter<const_pointer>(this->__begin_), 865e78f53d1SNikolas Klauser std::__wrap_iter<const_pointer>(this->__end_cap())); 866e78f53d1SNikolas Klauser#else 867e78f53d1SNikolas Klauser return const_iterator(__p); 868e78f53d1SNikolas Klauser#endif // _LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR 869e78f53d1SNikolas Klauser } 870e78f53d1SNikolas Klauser 871e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 872e78f53d1SNikolas Klauser __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v); 873e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer 874e78f53d1SNikolas Klauser __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p); 875e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 876e78f53d1SNikolas Klauser __move_range(pointer __from_s, pointer __from_e, pointer __to); 877e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign(vector& __c, true_type) 878e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); 879e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign(vector& __c, false_type) 880e78f53d1SNikolas Klauser _NOEXCEPT_(__alloc_traits::is_always_equal::value); 881e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __destruct_at_end(pointer __new_last) _NOEXCEPT { 882e78f53d1SNikolas Klauser size_type __old_size = size(); 883e78f53d1SNikolas Klauser __base_destruct_at_end(__new_last); 884e78f53d1SNikolas Klauser __annotate_shrink(__old_size); 885e78f53d1SNikolas Klauser } 886e78f53d1SNikolas Klauser 887e78f53d1SNikolas Klauser template <class _Up> 888e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI inline pointer __push_back_slow_path(_Up&& __x); 889e78f53d1SNikolas Klauser 890e78f53d1SNikolas Klauser template <class... _Args> 891e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI inline pointer __emplace_back_slow_path(_Args&&... __args); 892e78f53d1SNikolas Klauser 893e78f53d1SNikolas Klauser // The following functions are no-ops outside of AddressSanitizer mode. 894e78f53d1SNikolas Klauser // We call annotations for every allocator, unless explicitly disabled. 895e78f53d1SNikolas Klauser // 896e78f53d1SNikolas Klauser // To disable annotations for a particular allocator, change value of 897e78f53d1SNikolas Klauser // __asan_annotate_container_with_allocator to false. 898e78f53d1SNikolas Klauser // For more details, see the "Using libc++" documentation page or 899e78f53d1SNikolas Klauser // the documentation for __sanitizer_annotate_contiguous_container. 900e78f53d1SNikolas Klauser 901e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 902e78f53d1SNikolas Klauser __annotate_contiguous_container(const void* __old_mid, const void* __new_mid) const { 903e78f53d1SNikolas Klauser std::__annotate_contiguous_container<_Allocator>(data(), data() + capacity(), __old_mid, __new_mid); 904e78f53d1SNikolas Klauser } 905e78f53d1SNikolas Klauser 906e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __annotate_new(size_type __current_size) const _NOEXCEPT { 907e78f53d1SNikolas Klauser (void)__current_size; 908e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_ASAN 909e78f53d1SNikolas Klauser __annotate_contiguous_container(data() + capacity(), data() + __current_size); 910e78f53d1SNikolas Klauser#endif 911e78f53d1SNikolas Klauser } 912e78f53d1SNikolas Klauser 913e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __annotate_delete() const _NOEXCEPT { 914e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_ASAN 915e78f53d1SNikolas Klauser __annotate_contiguous_container(data() + size(), data() + capacity()); 916e78f53d1SNikolas Klauser#endif 917e78f53d1SNikolas Klauser } 918e78f53d1SNikolas Klauser 919e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __annotate_increase(size_type __n) const _NOEXCEPT { 920e78f53d1SNikolas Klauser (void)__n; 921e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_ASAN 922e78f53d1SNikolas Klauser __annotate_contiguous_container(data() + size(), data() + size() + __n); 923e78f53d1SNikolas Klauser#endif 924e78f53d1SNikolas Klauser } 925e78f53d1SNikolas Klauser 926e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __annotate_shrink(size_type __old_size) const _NOEXCEPT { 927e78f53d1SNikolas Klauser (void)__old_size; 928e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_ASAN 929e78f53d1SNikolas Klauser __annotate_contiguous_container(data() + __old_size, data() + size()); 930e78f53d1SNikolas Klauser#endif 931e78f53d1SNikolas Klauser } 932e78f53d1SNikolas Klauser 933e78f53d1SNikolas Klauser struct _ConstructTransaction { 934e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit _ConstructTransaction(vector& __v, size_type __n) 935e78f53d1SNikolas Klauser : __v_(__v), __pos_(__v.__end_), __new_end_(__v.__end_ + __n) { 936e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_ASAN 937e78f53d1SNikolas Klauser __v_.__annotate_increase(__n); 938e78f53d1SNikolas Klauser#endif 939e78f53d1SNikolas Klauser } 940e78f53d1SNikolas Klauser 941e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI ~_ConstructTransaction() { 942e78f53d1SNikolas Klauser __v_.__end_ = __pos_; 943e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_ASAN 944e78f53d1SNikolas Klauser if (__pos_ != __new_end_) { 945e78f53d1SNikolas Klauser __v_.__annotate_shrink(__new_end_ - __v_.__begin_); 946e78f53d1SNikolas Klauser } 947e78f53d1SNikolas Klauser#endif 948e78f53d1SNikolas Klauser } 949e78f53d1SNikolas Klauser 950e78f53d1SNikolas Klauser vector& __v_; 951e78f53d1SNikolas Klauser pointer __pos_; 952e78f53d1SNikolas Klauser const_pointer const __new_end_; 953e78f53d1SNikolas Klauser 954e78f53d1SNikolas Klauser _ConstructTransaction(_ConstructTransaction const&) = delete; 955e78f53d1SNikolas Klauser _ConstructTransaction& operator=(_ConstructTransaction const&) = delete; 956e78f53d1SNikolas Klauser }; 957e78f53d1SNikolas Klauser 958e78f53d1SNikolas Klauser template <class... _Args> 959e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __construct_one_at_end(_Args&&... __args) { 960e78f53d1SNikolas Klauser _ConstructTransaction __tx(*this, 1); 961e78f53d1SNikolas Klauser __alloc_traits::construct(this->__alloc(), std::__to_address(__tx.__pos_), std::forward<_Args>(__args)...); 962e78f53d1SNikolas Klauser ++__tx.__pos_; 963e78f53d1SNikolas Klauser } 964e78f53d1SNikolas Klauser 965e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI allocator_type& __alloc() _NOEXCEPT { 966e78f53d1SNikolas Klauser return this->__end_cap_.second(); 967e78f53d1SNikolas Klauser } 968e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const allocator_type& __alloc() const _NOEXCEPT { 969e78f53d1SNikolas Klauser return this->__end_cap_.second(); 970e78f53d1SNikolas Klauser } 971e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer& __end_cap() _NOEXCEPT { 972e78f53d1SNikolas Klauser return this->__end_cap_.first(); 973e78f53d1SNikolas Klauser } 974e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const pointer& __end_cap() const _NOEXCEPT { 975e78f53d1SNikolas Klauser return this->__end_cap_.first(); 976e78f53d1SNikolas Klauser } 977e78f53d1SNikolas Klauser 978e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __clear() _NOEXCEPT { 979e78f53d1SNikolas Klauser __base_destruct_at_end(this->__begin_); 980e78f53d1SNikolas Klauser } 981e78f53d1SNikolas Klauser 982e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __base_destruct_at_end(pointer __new_last) _NOEXCEPT { 983e78f53d1SNikolas Klauser pointer __soon_to_be_end = this->__end_; 984e78f53d1SNikolas Klauser while (__new_last != __soon_to_be_end) 985e78f53d1SNikolas Klauser __alloc_traits::destroy(__alloc(), std::__to_address(--__soon_to_be_end)); 986e78f53d1SNikolas Klauser this->__end_ = __new_last; 987e78f53d1SNikolas Klauser } 988e78f53d1SNikolas Klauser 989e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __copy_assign_alloc(const vector& __c) { 990e78f53d1SNikolas Klauser __copy_assign_alloc(__c, integral_constant<bool, __alloc_traits::propagate_on_container_copy_assignment::value>()); 991e78f53d1SNikolas Klauser } 992e78f53d1SNikolas Klauser 993e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc(vector& __c) 994e78f53d1SNikolas Klauser _NOEXCEPT_(!__alloc_traits::propagate_on_container_move_assignment::value || 995e78f53d1SNikolas Klauser is_nothrow_move_assignable<allocator_type>::value) { 996e78f53d1SNikolas Klauser __move_assign_alloc(__c, integral_constant<bool, __alloc_traits::propagate_on_container_move_assignment::value>()); 997e78f53d1SNikolas Klauser } 998e78f53d1SNikolas Klauser 999e78f53d1SNikolas Klauser _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI void __throw_length_error() const { std::__throw_length_error("vector"); } 1000e78f53d1SNikolas Klauser 1001e78f53d1SNikolas Klauser _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI void __throw_out_of_range() const { std::__throw_out_of_range("vector"); } 1002e78f53d1SNikolas Klauser 1003e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __copy_assign_alloc(const vector& __c, true_type) { 1004e78f53d1SNikolas Klauser if (__alloc() != __c.__alloc()) { 1005e78f53d1SNikolas Klauser __clear(); 1006e78f53d1SNikolas Klauser __annotate_delete(); 1007e78f53d1SNikolas Klauser __alloc_traits::deallocate(__alloc(), this->__begin_, capacity()); 1008e78f53d1SNikolas Klauser this->__begin_ = this->__end_ = __end_cap() = nullptr; 1009e78f53d1SNikolas Klauser } 1010e78f53d1SNikolas Klauser __alloc() = __c.__alloc(); 1011e78f53d1SNikolas Klauser } 1012e78f53d1SNikolas Klauser 1013e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __copy_assign_alloc(const vector&, false_type) {} 1014e78f53d1SNikolas Klauser 1015e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc(vector& __c, true_type) 1016e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) { 1017e78f53d1SNikolas Klauser __alloc() = std::move(__c.__alloc()); 1018e78f53d1SNikolas Klauser } 1019e78f53d1SNikolas Klauser 1020e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc(vector&, false_type) _NOEXCEPT {} 1021e78f53d1SNikolas Klauser}; 1022e78f53d1SNikolas Klauser 1023e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 1024e78f53d1SNikolas Klausertemplate <class _InputIterator, 1025e78f53d1SNikolas Klauser class _Alloc = allocator<__iter_value_type<_InputIterator>>, 1026e78f53d1SNikolas Klauser class = enable_if_t<__has_input_iterator_category<_InputIterator>::value>, 1027e78f53d1SNikolas Klauser class = enable_if_t<__is_allocator<_Alloc>::value> > 1028e78f53d1SNikolas Klauservector(_InputIterator, _InputIterator) -> vector<__iter_value_type<_InputIterator>, _Alloc>; 1029e78f53d1SNikolas Klauser 1030e78f53d1SNikolas Klausertemplate <class _InputIterator, 1031e78f53d1SNikolas Klauser class _Alloc, 1032e78f53d1SNikolas Klauser class = enable_if_t<__has_input_iterator_category<_InputIterator>::value>, 1033e78f53d1SNikolas Klauser class = enable_if_t<__is_allocator<_Alloc>::value> > 1034e78f53d1SNikolas Klauservector(_InputIterator, _InputIterator, _Alloc) -> vector<__iter_value_type<_InputIterator>, _Alloc>; 1035e78f53d1SNikolas Klauser#endif 1036e78f53d1SNikolas Klauser 1037e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 23 1038e78f53d1SNikolas Klausertemplate <ranges::input_range _Range, 1039e78f53d1SNikolas Klauser class _Alloc = allocator<ranges::range_value_t<_Range>>, 1040e78f53d1SNikolas Klauser class = enable_if_t<__is_allocator<_Alloc>::value> > 1041e78f53d1SNikolas Klauservector(from_range_t, _Range&&, _Alloc = _Alloc()) -> vector<ranges::range_value_t<_Range>, _Alloc>; 1042e78f53d1SNikolas Klauser#endif 1043e78f53d1SNikolas Klauser 1044e78f53d1SNikolas Klauser// __swap_out_circular_buffer relocates the objects in [__begin_, __end_) into the front of __v and swaps the buffers of 1045e78f53d1SNikolas Klauser// *this and __v. It is assumed that __v provides space for exactly (__end_ - __begin_) objects in the front. This 1046e78f53d1SNikolas Klauser// function has a strong exception guarantee. 1047e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1048e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void 1049e78f53d1SNikolas Klauservector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v) { 1050e78f53d1SNikolas Klauser __annotate_delete(); 1051e78f53d1SNikolas Klauser auto __new_begin = __v.__begin_ - (__end_ - __begin_); 1052e78f53d1SNikolas Klauser std::__uninitialized_allocator_relocate( 1053e78f53d1SNikolas Klauser __alloc(), std::__to_address(__begin_), std::__to_address(__end_), std::__to_address(__new_begin)); 1054e78f53d1SNikolas Klauser __v.__begin_ = __new_begin; 1055e78f53d1SNikolas Klauser __end_ = __begin_; // All the objects have been destroyed by relocating them. 1056e78f53d1SNikolas Klauser std::swap(this->__begin_, __v.__begin_); 1057e78f53d1SNikolas Klauser std::swap(this->__end_, __v.__end_); 1058e78f53d1SNikolas Klauser std::swap(this->__end_cap(), __v.__end_cap()); 1059e78f53d1SNikolas Klauser __v.__first_ = __v.__begin_; 1060e78f53d1SNikolas Klauser __annotate_new(size()); 1061e78f53d1SNikolas Klauser} 1062e78f53d1SNikolas Klauser 1063e78f53d1SNikolas Klauser// __swap_out_circular_buffer relocates the objects in [__begin_, __p) into the front of __v, the objects in 1064e78f53d1SNikolas Klauser// [__p, __end_) into the back of __v and swaps the buffers of *this and __v. It is assumed that __v provides space for 1065e78f53d1SNikolas Klauser// exactly (__p - __begin_) objects in the front and space for at least (__end_ - __p) objects in the back. This 1066e78f53d1SNikolas Klauser// function has a strong exception guarantee if __begin_ == __p || __end_ == __p. 1067e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1068e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::pointer 1069e78f53d1SNikolas Klauservector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p) { 1070e78f53d1SNikolas Klauser __annotate_delete(); 1071e78f53d1SNikolas Klauser pointer __ret = __v.__begin_; 1072e78f53d1SNikolas Klauser 1073e78f53d1SNikolas Klauser // Relocate [__p, __end_) first to avoid having a hole in [__begin_, __end_) 1074e78f53d1SNikolas Klauser // in case something in [__begin_, __p) throws. 1075e78f53d1SNikolas Klauser std::__uninitialized_allocator_relocate( 1076e78f53d1SNikolas Klauser __alloc(), std::__to_address(__p), std::__to_address(__end_), std::__to_address(__v.__end_)); 1077e78f53d1SNikolas Klauser __v.__end_ += (__end_ - __p); 1078e78f53d1SNikolas Klauser __end_ = __p; // The objects in [__p, __end_) have been destroyed by relocating them. 1079e78f53d1SNikolas Klauser auto __new_begin = __v.__begin_ - (__p - __begin_); 1080e78f53d1SNikolas Klauser 1081e78f53d1SNikolas Klauser std::__uninitialized_allocator_relocate( 1082e78f53d1SNikolas Klauser __alloc(), std::__to_address(__begin_), std::__to_address(__p), std::__to_address(__new_begin)); 1083e78f53d1SNikolas Klauser __v.__begin_ = __new_begin; 1084e78f53d1SNikolas Klauser __end_ = __begin_; // All the objects have been destroyed by relocating them. 1085e78f53d1SNikolas Klauser 1086e78f53d1SNikolas Klauser std::swap(this->__begin_, __v.__begin_); 1087e78f53d1SNikolas Klauser std::swap(this->__end_, __v.__end_); 1088e78f53d1SNikolas Klauser std::swap(this->__end_cap(), __v.__end_cap()); 1089e78f53d1SNikolas Klauser __v.__first_ = __v.__begin_; 1090e78f53d1SNikolas Klauser __annotate_new(size()); 1091e78f53d1SNikolas Klauser return __ret; 1092e78f53d1SNikolas Klauser} 1093e78f53d1SNikolas Klauser 1094e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1095e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::__vdeallocate() _NOEXCEPT { 1096e78f53d1SNikolas Klauser if (this->__begin_ != nullptr) { 1097e78f53d1SNikolas Klauser clear(); 1098e78f53d1SNikolas Klauser __annotate_delete(); 1099e78f53d1SNikolas Klauser __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity()); 1100e78f53d1SNikolas Klauser this->__begin_ = this->__end_ = this->__end_cap() = nullptr; 1101e78f53d1SNikolas Klauser } 1102e78f53d1SNikolas Klauser} 1103e78f53d1SNikolas Klauser 1104e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1105e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::size_type 1106e78f53d1SNikolas Klauservector<_Tp, _Allocator>::max_size() const _NOEXCEPT { 1107e78f53d1SNikolas Klauser return std::min<size_type>(__alloc_traits::max_size(this->__alloc()), numeric_limits<difference_type>::max()); 1108e78f53d1SNikolas Klauser} 1109e78f53d1SNikolas Klauser 1110e78f53d1SNikolas Klauser// Precondition: __new_size > capacity() 1111e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1112e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::size_type 1113e78f53d1SNikolas Klauservector<_Tp, _Allocator>::__recommend(size_type __new_size) const { 1114e78f53d1SNikolas Klauser const size_type __ms = max_size(); 1115e78f53d1SNikolas Klauser if (__new_size > __ms) 1116e78f53d1SNikolas Klauser this->__throw_length_error(); 1117e78f53d1SNikolas Klauser const size_type __cap = capacity(); 1118e78f53d1SNikolas Klauser if (__cap >= __ms / 2) 1119e78f53d1SNikolas Klauser return __ms; 1120e78f53d1SNikolas Klauser return std::max<size_type>(2 * __cap, __new_size); 1121e78f53d1SNikolas Klauser} 1122e78f53d1SNikolas Klauser 1123e78f53d1SNikolas Klauser// Default constructs __n objects starting at __end_ 1124e78f53d1SNikolas Klauser// throws if construction throws 1125e78f53d1SNikolas Klauser// Precondition: __n > 0 1126e78f53d1SNikolas Klauser// Precondition: size() + __n <= capacity() 1127e78f53d1SNikolas Klauser// Postcondition: size() == size() + __n 1128e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1129e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::__construct_at_end(size_type __n) { 1130e78f53d1SNikolas Klauser _ConstructTransaction __tx(*this, __n); 1131e78f53d1SNikolas Klauser const_pointer __new_end = __tx.__new_end_; 1132e78f53d1SNikolas Klauser for (pointer __pos = __tx.__pos_; __pos != __new_end; __tx.__pos_ = ++__pos) { 1133e78f53d1SNikolas Klauser __alloc_traits::construct(this->__alloc(), std::__to_address(__pos)); 1134e78f53d1SNikolas Klauser } 1135e78f53d1SNikolas Klauser} 1136e78f53d1SNikolas Klauser 1137e78f53d1SNikolas Klauser// Copy constructs __n objects starting at __end_ from __x 1138e78f53d1SNikolas Klauser// throws if construction throws 1139e78f53d1SNikolas Klauser// Precondition: __n > 0 1140e78f53d1SNikolas Klauser// Precondition: size() + __n <= capacity() 1141e78f53d1SNikolas Klauser// Postcondition: size() == old size() + __n 1142e78f53d1SNikolas Klauser// Postcondition: [i] == __x for all i in [size() - __n, __n) 1143e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1144e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline void 1145e78f53d1SNikolas Klauservector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x) { 1146e78f53d1SNikolas Klauser _ConstructTransaction __tx(*this, __n); 1147e78f53d1SNikolas Klauser const_pointer __new_end = __tx.__new_end_; 1148e78f53d1SNikolas Klauser for (pointer __pos = __tx.__pos_; __pos != __new_end; __tx.__pos_ = ++__pos) { 1149e78f53d1SNikolas Klauser __alloc_traits::construct(this->__alloc(), std::__to_address(__pos), __x); 1150e78f53d1SNikolas Klauser } 1151e78f53d1SNikolas Klauser} 1152e78f53d1SNikolas Klauser 1153e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1154e78f53d1SNikolas Klausertemplate <class _InputIterator, class _Sentinel> 1155e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void 1156e78f53d1SNikolas Klauservector<_Tp, _Allocator>::__construct_at_end(_InputIterator __first, _Sentinel __last, size_type __n) { 1157e78f53d1SNikolas Klauser _ConstructTransaction __tx(*this, __n); 1158e78f53d1SNikolas Klauser __tx.__pos_ = std::__uninitialized_allocator_copy(__alloc(), __first, __last, __tx.__pos_); 1159e78f53d1SNikolas Klauser} 1160e78f53d1SNikolas Klauser 1161e78f53d1SNikolas Klauser// Default constructs __n objects starting at __end_ 1162e78f53d1SNikolas Klauser// throws if construction throws 1163e78f53d1SNikolas Klauser// Postcondition: size() == size() + __n 1164e78f53d1SNikolas Klauser// Exception safety: strong. 1165e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1166e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::__append(size_type __n) { 1167e78f53d1SNikolas Klauser if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n) 1168e78f53d1SNikolas Klauser this->__construct_at_end(__n); 1169e78f53d1SNikolas Klauser else { 1170e78f53d1SNikolas Klauser allocator_type& __a = this->__alloc(); 1171e78f53d1SNikolas Klauser __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a); 1172e78f53d1SNikolas Klauser __v.__construct_at_end(__n); 1173e78f53d1SNikolas Klauser __swap_out_circular_buffer(__v); 1174e78f53d1SNikolas Klauser } 1175e78f53d1SNikolas Klauser} 1176e78f53d1SNikolas Klauser 1177e78f53d1SNikolas Klauser// Default constructs __n objects starting at __end_ 1178e78f53d1SNikolas Klauser// throws if construction throws 1179e78f53d1SNikolas Klauser// Postcondition: size() == size() + __n 1180e78f53d1SNikolas Klauser// Exception safety: strong. 1181e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1182e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::__append(size_type __n, const_reference __x) { 1183e78f53d1SNikolas Klauser if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n) 1184e78f53d1SNikolas Klauser this->__construct_at_end(__n, __x); 1185e78f53d1SNikolas Klauser else { 1186e78f53d1SNikolas Klauser allocator_type& __a = this->__alloc(); 1187e78f53d1SNikolas Klauser __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a); 1188e78f53d1SNikolas Klauser __v.__construct_at_end(__n, __x); 1189e78f53d1SNikolas Klauser __swap_out_circular_buffer(__v); 1190e78f53d1SNikolas Klauser } 1191e78f53d1SNikolas Klauser} 1192e78f53d1SNikolas Klauser 1193e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1194e78f53d1SNikolas Klausertemplate <class _InputIterator, 1195e78f53d1SNikolas Klauser __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value && 1196e78f53d1SNikolas Klauser is_constructible<_Tp, typename iterator_traits<_InputIterator>::reference>::value, 1197e78f53d1SNikolas Klauser int> > 1198e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last) { 1199e78f53d1SNikolas Klauser __init_with_sentinel(__first, __last); 1200e78f53d1SNikolas Klauser} 1201e78f53d1SNikolas Klauser 1202e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1203e78f53d1SNikolas Klausertemplate <class _InputIterator, 1204e78f53d1SNikolas Klauser __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value && 1205e78f53d1SNikolas Klauser is_constructible<_Tp, typename iterator_traits<_InputIterator>::reference>::value, 1206e78f53d1SNikolas Klauser int> > 1207e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 1208e78f53d1SNikolas Klauservector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a) 1209e78f53d1SNikolas Klauser : __end_cap_(nullptr, __a) { 1210e78f53d1SNikolas Klauser __init_with_sentinel(__first, __last); 1211e78f53d1SNikolas Klauser} 1212e78f53d1SNikolas Klauser 1213e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1214e78f53d1SNikolas Klausertemplate <class _ForwardIterator, 1215e78f53d1SNikolas Klauser __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value && 1216e78f53d1SNikolas Klauser is_constructible<_Tp, typename iterator_traits<_ForwardIterator>::reference>::value, 1217e78f53d1SNikolas Klauser int> > 1218e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last) { 1219e78f53d1SNikolas Klauser size_type __n = static_cast<size_type>(std::distance(__first, __last)); 1220e78f53d1SNikolas Klauser __init_with_size(__first, __last, __n); 1221e78f53d1SNikolas Klauser} 1222e78f53d1SNikolas Klauser 1223e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1224e78f53d1SNikolas Klausertemplate <class _ForwardIterator, 1225e78f53d1SNikolas Klauser __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value && 1226e78f53d1SNikolas Klauser is_constructible<_Tp, typename iterator_traits<_ForwardIterator>::reference>::value, 1227e78f53d1SNikolas Klauser int> > 1228e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 1229e78f53d1SNikolas Klauservector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a) 1230e78f53d1SNikolas Klauser : __end_cap_(nullptr, __a) { 1231e78f53d1SNikolas Klauser size_type __n = static_cast<size_type>(std::distance(__first, __last)); 1232e78f53d1SNikolas Klauser __init_with_size(__first, __last, __n); 1233e78f53d1SNikolas Klauser} 1234e78f53d1SNikolas Klauser 1235e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1236e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 vector<_Tp, _Allocator>::vector(const vector& __x) 1237e78f53d1SNikolas Klauser : __end_cap_(nullptr, __alloc_traits::select_on_container_copy_construction(__x.__alloc())) { 1238e78f53d1SNikolas Klauser __init_with_size(__x.__begin_, __x.__end_, __x.size()); 1239e78f53d1SNikolas Klauser} 1240e78f53d1SNikolas Klauser 1241e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1242e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 1243e78f53d1SNikolas Klauservector<_Tp, _Allocator>::vector(const vector& __x, const __type_identity_t<allocator_type>& __a) 1244e78f53d1SNikolas Klauser : __end_cap_(nullptr, __a) { 1245e78f53d1SNikolas Klauser __init_with_size(__x.__begin_, __x.__end_, __x.size()); 1246e78f53d1SNikolas Klauser} 1247e78f53d1SNikolas Klauser 1248e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1249e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI vector<_Tp, _Allocator>::vector(vector&& __x) 1250e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 1251e78f53d1SNikolas Klauser noexcept 1252e78f53d1SNikolas Klauser#else 1253e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) 1254e78f53d1SNikolas Klauser#endif 1255e78f53d1SNikolas Klauser : __end_cap_(nullptr, std::move(__x.__alloc())) { 1256e78f53d1SNikolas Klauser this->__begin_ = __x.__begin_; 1257e78f53d1SNikolas Klauser this->__end_ = __x.__end_; 1258e78f53d1SNikolas Klauser this->__end_cap() = __x.__end_cap(); 1259e78f53d1SNikolas Klauser __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr; 1260e78f53d1SNikolas Klauser} 1261e78f53d1SNikolas Klauser 1262e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1263e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI 1264e78f53d1SNikolas Klauservector<_Tp, _Allocator>::vector(vector&& __x, const __type_identity_t<allocator_type>& __a) 1265e78f53d1SNikolas Klauser : __end_cap_(nullptr, __a) { 1266e78f53d1SNikolas Klauser if (__a == __x.__alloc()) { 1267e78f53d1SNikolas Klauser this->__begin_ = __x.__begin_; 1268e78f53d1SNikolas Klauser this->__end_ = __x.__end_; 1269e78f53d1SNikolas Klauser this->__end_cap() = __x.__end_cap(); 1270e78f53d1SNikolas Klauser __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr; 1271e78f53d1SNikolas Klauser } else { 1272e78f53d1SNikolas Klauser typedef move_iterator<iterator> _Ip; 1273e78f53d1SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1274e78f53d1SNikolas Klauser assign(_Ip(__x.begin()), _Ip(__x.end())); 1275e78f53d1SNikolas Klauser __guard.__complete(); 1276e78f53d1SNikolas Klauser } 1277e78f53d1SNikolas Klauser} 1278e78f53d1SNikolas Klauser 1279e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 1280e78f53d1SNikolas Klauser 1281e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1282e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI 1283e78f53d1SNikolas Klauservector<_Tp, _Allocator>::vector(initializer_list<value_type> __il) { 1284e78f53d1SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1285e78f53d1SNikolas Klauser if (__il.size() > 0) { 1286e78f53d1SNikolas Klauser __vallocate(__il.size()); 1287e78f53d1SNikolas Klauser __construct_at_end(__il.begin(), __il.end(), __il.size()); 1288e78f53d1SNikolas Klauser } 1289e78f53d1SNikolas Klauser __guard.__complete(); 1290e78f53d1SNikolas Klauser} 1291e78f53d1SNikolas Klauser 1292e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1293e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI 1294e78f53d1SNikolas Klauservector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a) 1295e78f53d1SNikolas Klauser : __end_cap_(nullptr, __a) { 1296e78f53d1SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1297e78f53d1SNikolas Klauser if (__il.size() > 0) { 1298e78f53d1SNikolas Klauser __vallocate(__il.size()); 1299e78f53d1SNikolas Klauser __construct_at_end(__il.begin(), __il.end(), __il.size()); 1300e78f53d1SNikolas Klauser } 1301e78f53d1SNikolas Klauser __guard.__complete(); 1302e78f53d1SNikolas Klauser} 1303e78f53d1SNikolas Klauser 1304e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG 1305e78f53d1SNikolas Klauser 1306e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1307e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI vector<_Tp, _Allocator>& 1308e78f53d1SNikolas Klauservector<_Tp, _Allocator>::operator=(vector&& __x) 1309e78f53d1SNikolas Klauser _NOEXCEPT_(__noexcept_move_assign_container<_Allocator, __alloc_traits>::value) { 1310e78f53d1SNikolas Klauser __move_assign(__x, integral_constant<bool, __alloc_traits::propagate_on_container_move_assignment::value>()); 1311e78f53d1SNikolas Klauser return *this; 1312e78f53d1SNikolas Klauser} 1313e78f53d1SNikolas Klauser 1314e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1315e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::__move_assign(vector& __c, false_type) 1316e78f53d1SNikolas Klauser _NOEXCEPT_(__alloc_traits::is_always_equal::value) { 1317e78f53d1SNikolas Klauser if (__alloc() != __c.__alloc()) { 1318e78f53d1SNikolas Klauser typedef move_iterator<iterator> _Ip; 1319e78f53d1SNikolas Klauser assign(_Ip(__c.begin()), _Ip(__c.end())); 1320e78f53d1SNikolas Klauser } else 1321e78f53d1SNikolas Klauser __move_assign(__c, true_type()); 1322e78f53d1SNikolas Klauser} 1323e78f53d1SNikolas Klauser 1324e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1325e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type) 1326e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) { 1327e78f53d1SNikolas Klauser __vdeallocate(); 1328e78f53d1SNikolas Klauser __move_assign_alloc(__c); // this can throw 1329e78f53d1SNikolas Klauser this->__begin_ = __c.__begin_; 1330e78f53d1SNikolas Klauser this->__end_ = __c.__end_; 1331e78f53d1SNikolas Klauser this->__end_cap() = __c.__end_cap(); 1332e78f53d1SNikolas Klauser __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr; 1333e78f53d1SNikolas Klauser} 1334e78f53d1SNikolas Klauser 1335e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1336e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI vector<_Tp, _Allocator>& 1337e78f53d1SNikolas Klauservector<_Tp, _Allocator>::operator=(const vector& __x) { 1338e78f53d1SNikolas Klauser if (this != std::addressof(__x)) { 1339e78f53d1SNikolas Klauser __copy_assign_alloc(__x); 1340e78f53d1SNikolas Klauser assign(__x.__begin_, __x.__end_); 1341e78f53d1SNikolas Klauser } 1342e78f53d1SNikolas Klauser return *this; 1343e78f53d1SNikolas Klauser} 1344e78f53d1SNikolas Klauser 1345e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1346e78f53d1SNikolas Klausertemplate <class _InputIterator, 1347e78f53d1SNikolas Klauser __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value && 1348e78f53d1SNikolas Klauser is_constructible<_Tp, typename iterator_traits<_InputIterator>::reference>::value, 1349e78f53d1SNikolas Klauser int> > 1350e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last) { 1351e78f53d1SNikolas Klauser __assign_with_sentinel(__first, __last); 1352e78f53d1SNikolas Klauser} 1353e78f53d1SNikolas Klauser 1354e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1355e78f53d1SNikolas Klausertemplate <class _Iterator, class _Sentinel> 1356e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 1357e78f53d1SNikolas Klauservector<_Tp, _Allocator>::__assign_with_sentinel(_Iterator __first, _Sentinel __last) { 1358e78f53d1SNikolas Klauser clear(); 1359e78f53d1SNikolas Klauser for (; __first != __last; ++__first) 1360e78f53d1SNikolas Klauser emplace_back(*__first); 1361e78f53d1SNikolas Klauser} 1362e78f53d1SNikolas Klauser 1363e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1364e78f53d1SNikolas Klausertemplate <class _ForwardIterator, 1365e78f53d1SNikolas Klauser __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value && 1366e78f53d1SNikolas Klauser is_constructible<_Tp, typename iterator_traits<_ForwardIterator>::reference>::value, 1367e78f53d1SNikolas Klauser int> > 1368e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) { 1369e78f53d1SNikolas Klauser __assign_with_size(__first, __last, std::distance(__first, __last)); 1370e78f53d1SNikolas Klauser} 1371e78f53d1SNikolas Klauser 1372e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1373e78f53d1SNikolas Klausertemplate <class _ForwardIterator, class _Sentinel> 1374e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 1375e78f53d1SNikolas Klauservector<_Tp, _Allocator>::__assign_with_size(_ForwardIterator __first, _Sentinel __last, difference_type __n) { 1376e78f53d1SNikolas Klauser size_type __new_size = static_cast<size_type>(__n); 1377e78f53d1SNikolas Klauser if (__new_size <= capacity()) { 1378e78f53d1SNikolas Klauser if (__new_size > size()) { 1379e78f53d1SNikolas Klauser _ForwardIterator __mid = std::next(__first, size()); 1380e78f53d1SNikolas Klauser std::copy(__first, __mid, this->__begin_); 1381e78f53d1SNikolas Klauser __construct_at_end(__mid, __last, __new_size - size()); 1382e78f53d1SNikolas Klauser } else { 1383e78f53d1SNikolas Klauser pointer __m = std::__copy<_ClassicAlgPolicy>(__first, __last, this->__begin_).second; 1384e78f53d1SNikolas Klauser this->__destruct_at_end(__m); 1385e78f53d1SNikolas Klauser } 1386e78f53d1SNikolas Klauser } else { 1387e78f53d1SNikolas Klauser __vdeallocate(); 1388e78f53d1SNikolas Klauser __vallocate(__recommend(__new_size)); 1389e78f53d1SNikolas Klauser __construct_at_end(__first, __last, __new_size); 1390e78f53d1SNikolas Klauser } 1391e78f53d1SNikolas Klauser} 1392e78f53d1SNikolas Klauser 1393e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1394e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::assign(size_type __n, const_reference __u) { 1395e78f53d1SNikolas Klauser if (__n <= capacity()) { 1396e78f53d1SNikolas Klauser size_type __s = size(); 1397e78f53d1SNikolas Klauser std::fill_n(this->__begin_, std::min(__n, __s), __u); 1398e78f53d1SNikolas Klauser if (__n > __s) 1399e78f53d1SNikolas Klauser __construct_at_end(__n - __s, __u); 1400e78f53d1SNikolas Klauser else 1401e78f53d1SNikolas Klauser this->__destruct_at_end(this->__begin_ + __n); 1402e78f53d1SNikolas Klauser } else { 1403e78f53d1SNikolas Klauser __vdeallocate(); 1404e78f53d1SNikolas Klauser __vallocate(__recommend(static_cast<size_type>(__n))); 1405e78f53d1SNikolas Klauser __construct_at_end(__n, __u); 1406e78f53d1SNikolas Klauser } 1407e78f53d1SNikolas Klauser} 1408e78f53d1SNikolas Klauser 1409e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1410e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::iterator 1411e78f53d1SNikolas Klauservector<_Tp, _Allocator>::begin() _NOEXCEPT { 1412e78f53d1SNikolas Klauser return __make_iter(this->__begin_); 1413e78f53d1SNikolas Klauser} 1414e78f53d1SNikolas Klauser 1415e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1416e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::const_iterator 1417e78f53d1SNikolas Klauservector<_Tp, _Allocator>::begin() const _NOEXCEPT { 1418e78f53d1SNikolas Klauser return __make_iter(this->__begin_); 1419e78f53d1SNikolas Klauser} 1420e78f53d1SNikolas Klauser 1421e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1422e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::iterator 1423e78f53d1SNikolas Klauservector<_Tp, _Allocator>::end() _NOEXCEPT { 1424e78f53d1SNikolas Klauser return __make_iter(this->__end_); 1425e78f53d1SNikolas Klauser} 1426e78f53d1SNikolas Klauser 1427e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1428e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::const_iterator 1429e78f53d1SNikolas Klauservector<_Tp, _Allocator>::end() const _NOEXCEPT { 1430e78f53d1SNikolas Klauser return __make_iter(this->__end_); 1431e78f53d1SNikolas Klauser} 1432e78f53d1SNikolas Klauser 1433e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1434e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::reference 1435e78f53d1SNikolas Klauservector<_Tp, _Allocator>::operator[](size_type __n) _NOEXCEPT { 1436e78f53d1SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n < size(), "vector[] index out of bounds"); 1437e78f53d1SNikolas Klauser return this->__begin_[__n]; 1438e78f53d1SNikolas Klauser} 1439e78f53d1SNikolas Klauser 1440e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1441e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::const_reference 1442e78f53d1SNikolas Klauservector<_Tp, _Allocator>::operator[](size_type __n) const _NOEXCEPT { 1443e78f53d1SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n < size(), "vector[] index out of bounds"); 1444e78f53d1SNikolas Klauser return this->__begin_[__n]; 1445e78f53d1SNikolas Klauser} 1446e78f53d1SNikolas Klauser 1447e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1448e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::reference vector<_Tp, _Allocator>::at(size_type __n) { 1449e78f53d1SNikolas Klauser if (__n >= size()) 1450e78f53d1SNikolas Klauser this->__throw_out_of_range(); 1451e78f53d1SNikolas Klauser return this->__begin_[__n]; 1452e78f53d1SNikolas Klauser} 1453e78f53d1SNikolas Klauser 1454e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1455e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::const_reference 1456e78f53d1SNikolas Klauservector<_Tp, _Allocator>::at(size_type __n) const { 1457e78f53d1SNikolas Klauser if (__n >= size()) 1458e78f53d1SNikolas Klauser this->__throw_out_of_range(); 1459e78f53d1SNikolas Klauser return this->__begin_[__n]; 1460e78f53d1SNikolas Klauser} 1461e78f53d1SNikolas Klauser 1462e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1463e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::reserve(size_type __n) { 1464e78f53d1SNikolas Klauser if (__n > capacity()) { 1465e78f53d1SNikolas Klauser if (__n > max_size()) 1466e78f53d1SNikolas Klauser this->__throw_length_error(); 1467e78f53d1SNikolas Klauser allocator_type& __a = this->__alloc(); 1468e78f53d1SNikolas Klauser __split_buffer<value_type, allocator_type&> __v(__n, size(), __a); 1469e78f53d1SNikolas Klauser __swap_out_circular_buffer(__v); 1470e78f53d1SNikolas Klauser } 1471e78f53d1SNikolas Klauser} 1472e78f53d1SNikolas Klauser 1473e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1474e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT { 1475e78f53d1SNikolas Klauser if (capacity() > size()) { 1476e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1477e78f53d1SNikolas Klauser try { 1478e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1479e78f53d1SNikolas Klauser allocator_type& __a = this->__alloc(); 1480e78f53d1SNikolas Klauser __split_buffer<value_type, allocator_type&> __v(size(), size(), __a); 1481e78f53d1SNikolas Klauser // The Standard mandates shrink_to_fit() does not increase the capacity. 1482e78f53d1SNikolas Klauser // With equal capacity keep the existing buffer. This avoids extra work 1483e78f53d1SNikolas Klauser // due to swapping the elements. 1484e78f53d1SNikolas Klauser if (__v.capacity() < capacity()) 1485e78f53d1SNikolas Klauser __swap_out_circular_buffer(__v); 1486e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1487e78f53d1SNikolas Klauser } catch (...) { 1488e78f53d1SNikolas Klauser } 1489e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1490e78f53d1SNikolas Klauser } 1491e78f53d1SNikolas Klauser} 1492e78f53d1SNikolas Klauser 1493e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1494e78f53d1SNikolas Klausertemplate <class _Up> 1495e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::pointer 1496e78f53d1SNikolas Klauservector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x) { 1497e78f53d1SNikolas Klauser allocator_type& __a = this->__alloc(); 1498e78f53d1SNikolas Klauser __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a); 1499e78f53d1SNikolas Klauser // __v.push_back(std::forward<_Up>(__x)); 1500e78f53d1SNikolas Klauser __alloc_traits::construct(__a, std::__to_address(__v.__end_), std::forward<_Up>(__x)); 1501e78f53d1SNikolas Klauser __v.__end_++; 1502e78f53d1SNikolas Klauser __swap_out_circular_buffer(__v); 1503e78f53d1SNikolas Klauser return this->__end_; 1504e78f53d1SNikolas Klauser} 1505e78f53d1SNikolas Klauser 1506e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1507e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI void 1508e78f53d1SNikolas Klauservector<_Tp, _Allocator>::push_back(const_reference __x) { 1509e78f53d1SNikolas Klauser pointer __end = this->__end_; 1510e78f53d1SNikolas Klauser if (__end < this->__end_cap()) { 1511e78f53d1SNikolas Klauser __construct_one_at_end(__x); 1512e78f53d1SNikolas Klauser ++__end; 1513e78f53d1SNikolas Klauser } else { 1514e78f53d1SNikolas Klauser __end = __push_back_slow_path(__x); 1515e78f53d1SNikolas Klauser } 1516e78f53d1SNikolas Klauser this->__end_ = __end; 1517e78f53d1SNikolas Klauser} 1518e78f53d1SNikolas Klauser 1519e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1520e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI void vector<_Tp, _Allocator>::push_back(value_type&& __x) { 1521e78f53d1SNikolas Klauser pointer __end = this->__end_; 1522e78f53d1SNikolas Klauser if (__end < this->__end_cap()) { 1523e78f53d1SNikolas Klauser __construct_one_at_end(std::move(__x)); 1524e78f53d1SNikolas Klauser ++__end; 1525e78f53d1SNikolas Klauser } else { 1526e78f53d1SNikolas Klauser __end = __push_back_slow_path(std::move(__x)); 1527e78f53d1SNikolas Klauser } 1528e78f53d1SNikolas Klauser this->__end_ = __end; 1529e78f53d1SNikolas Klauser} 1530e78f53d1SNikolas Klauser 1531e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1532e78f53d1SNikolas Klausertemplate <class... _Args> 1533e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::pointer 1534e78f53d1SNikolas Klauservector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args) { 1535e78f53d1SNikolas Klauser allocator_type& __a = this->__alloc(); 1536e78f53d1SNikolas Klauser __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a); 1537e78f53d1SNikolas Klauser // __v.emplace_back(std::forward<_Args>(__args)...); 1538e78f53d1SNikolas Klauser __alloc_traits::construct(__a, std::__to_address(__v.__end_), std::forward<_Args>(__args)...); 1539e78f53d1SNikolas Klauser __v.__end_++; 1540e78f53d1SNikolas Klauser __swap_out_circular_buffer(__v); 1541e78f53d1SNikolas Klauser return this->__end_; 1542e78f53d1SNikolas Klauser} 1543e78f53d1SNikolas Klauser 1544e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1545e78f53d1SNikolas Klausertemplate <class... _Args> 1546e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline 1547e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 1548e78f53d1SNikolas Klauser typename vector<_Tp, _Allocator>::reference 1549e78f53d1SNikolas Klauser#else 1550e78f53d1SNikolas Klauser void 1551e78f53d1SNikolas Klauser#endif 1552e78f53d1SNikolas Klauser vector<_Tp, _Allocator>::emplace_back(_Args&&... __args) { 1553e78f53d1SNikolas Klauser pointer __end = this->__end_; 1554e78f53d1SNikolas Klauser if (__end < this->__end_cap()) { 1555e78f53d1SNikolas Klauser __construct_one_at_end(std::forward<_Args>(__args)...); 1556e78f53d1SNikolas Klauser ++__end; 1557e78f53d1SNikolas Klauser } else { 1558e78f53d1SNikolas Klauser __end = __emplace_back_slow_path(std::forward<_Args>(__args)...); 1559e78f53d1SNikolas Klauser } 1560e78f53d1SNikolas Klauser this->__end_ = __end; 1561e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 1562e78f53d1SNikolas Klauser return *(__end - 1); 1563e78f53d1SNikolas Klauser#endif 1564e78f53d1SNikolas Klauser} 1565e78f53d1SNikolas Klauser 1566e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1567e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline void vector<_Tp, _Allocator>::pop_back() { 1568e78f53d1SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "vector::pop_back called on an empty vector"); 1569e78f53d1SNikolas Klauser this->__destruct_at_end(this->__end_ - 1); 1570e78f53d1SNikolas Klauser} 1571e78f53d1SNikolas Klauser 1572e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1573e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::iterator 1574e78f53d1SNikolas Klauservector<_Tp, _Allocator>::erase(const_iterator __position) { 1575e78f53d1SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS( 1576e78f53d1SNikolas Klauser __position != end(), "vector::erase(iterator) called with a non-dereferenceable iterator"); 1577e78f53d1SNikolas Klauser difference_type __ps = __position - cbegin(); 1578e78f53d1SNikolas Klauser pointer __p = this->__begin_ + __ps; 1579e78f53d1SNikolas Klauser this->__destruct_at_end(std::move(__p + 1, this->__end_, __p)); 1580e78f53d1SNikolas Klauser return __make_iter(__p); 1581e78f53d1SNikolas Klauser} 1582e78f53d1SNikolas Klauser 1583e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1584e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 1585e78f53d1SNikolas Klauservector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last) { 1586e78f53d1SNikolas Klauser _LIBCPP_ASSERT_VALID_INPUT_RANGE(__first <= __last, "vector::erase(first, last) called with invalid range"); 1587e78f53d1SNikolas Klauser pointer __p = this->__begin_ + (__first - begin()); 1588e78f53d1SNikolas Klauser if (__first != __last) { 1589e78f53d1SNikolas Klauser this->__destruct_at_end(std::move(__p + (__last - __first), this->__end_, __p)); 1590e78f53d1SNikolas Klauser } 1591e78f53d1SNikolas Klauser return __make_iter(__p); 1592e78f53d1SNikolas Klauser} 1593e78f53d1SNikolas Klauser 1594e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1595e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void 1596e78f53d1SNikolas Klauservector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to) { 1597e78f53d1SNikolas Klauser pointer __old_last = this->__end_; 1598e78f53d1SNikolas Klauser difference_type __n = __old_last - __to; 1599e78f53d1SNikolas Klauser { 1600e78f53d1SNikolas Klauser pointer __i = __from_s + __n; 1601e78f53d1SNikolas Klauser _ConstructTransaction __tx(*this, __from_e - __i); 1602e78f53d1SNikolas Klauser for (pointer __pos = __tx.__pos_; __i < __from_e; ++__i, (void)++__pos, __tx.__pos_ = __pos) { 1603e78f53d1SNikolas Klauser __alloc_traits::construct(this->__alloc(), std::__to_address(__pos), std::move(*__i)); 1604e78f53d1SNikolas Klauser } 1605e78f53d1SNikolas Klauser } 1606e78f53d1SNikolas Klauser std::move_backward(__from_s, __from_s + __n, __old_last); 1607e78f53d1SNikolas Klauser} 1608e78f53d1SNikolas Klauser 1609e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1610e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 1611e78f53d1SNikolas Klauservector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x) { 1612e78f53d1SNikolas Klauser pointer __p = this->__begin_ + (__position - begin()); 1613e78f53d1SNikolas Klauser if (this->__end_ < this->__end_cap()) { 1614e78f53d1SNikolas Klauser if (__p == this->__end_) { 1615e78f53d1SNikolas Klauser __construct_one_at_end(__x); 1616e78f53d1SNikolas Klauser } else { 1617e78f53d1SNikolas Klauser __move_range(__p, this->__end_, __p + 1); 1618e78f53d1SNikolas Klauser const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x); 1619e78f53d1SNikolas Klauser if (std::__is_pointer_in_range(std::__to_address(__p), std::__to_address(__end_), std::addressof(__x))) 1620e78f53d1SNikolas Klauser ++__xr; 1621e78f53d1SNikolas Klauser *__p = *__xr; 1622e78f53d1SNikolas Klauser } 1623e78f53d1SNikolas Klauser } else { 1624e78f53d1SNikolas Klauser allocator_type& __a = this->__alloc(); 1625e78f53d1SNikolas Klauser __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); 1626e78f53d1SNikolas Klauser __v.push_back(__x); 1627e78f53d1SNikolas Klauser __p = __swap_out_circular_buffer(__v, __p); 1628e78f53d1SNikolas Klauser } 1629e78f53d1SNikolas Klauser return __make_iter(__p); 1630e78f53d1SNikolas Klauser} 1631e78f53d1SNikolas Klauser 1632e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1633e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 1634e78f53d1SNikolas Klauservector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x) { 1635e78f53d1SNikolas Klauser pointer __p = this->__begin_ + (__position - begin()); 1636e78f53d1SNikolas Klauser if (this->__end_ < this->__end_cap()) { 1637e78f53d1SNikolas Klauser if (__p == this->__end_) { 1638e78f53d1SNikolas Klauser __construct_one_at_end(std::move(__x)); 1639e78f53d1SNikolas Klauser } else { 1640e78f53d1SNikolas Klauser __move_range(__p, this->__end_, __p + 1); 1641e78f53d1SNikolas Klauser *__p = std::move(__x); 1642e78f53d1SNikolas Klauser } 1643e78f53d1SNikolas Klauser } else { 1644e78f53d1SNikolas Klauser allocator_type& __a = this->__alloc(); 1645e78f53d1SNikolas Klauser __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); 1646e78f53d1SNikolas Klauser __v.push_back(std::move(__x)); 1647e78f53d1SNikolas Klauser __p = __swap_out_circular_buffer(__v, __p); 1648e78f53d1SNikolas Klauser } 1649e78f53d1SNikolas Klauser return __make_iter(__p); 1650e78f53d1SNikolas Klauser} 1651e78f53d1SNikolas Klauser 1652e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1653e78f53d1SNikolas Klausertemplate <class... _Args> 1654e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 1655e78f53d1SNikolas Klauservector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args) { 1656e78f53d1SNikolas Klauser pointer __p = this->__begin_ + (__position - begin()); 1657e78f53d1SNikolas Klauser if (this->__end_ < this->__end_cap()) { 1658e78f53d1SNikolas Klauser if (__p == this->__end_) { 1659e78f53d1SNikolas Klauser __construct_one_at_end(std::forward<_Args>(__args)...); 1660e78f53d1SNikolas Klauser } else { 1661e78f53d1SNikolas Klauser __temp_value<value_type, _Allocator> __tmp(this->__alloc(), std::forward<_Args>(__args)...); 1662e78f53d1SNikolas Klauser __move_range(__p, this->__end_, __p + 1); 1663e78f53d1SNikolas Klauser *__p = std::move(__tmp.get()); 1664e78f53d1SNikolas Klauser } 1665e78f53d1SNikolas Klauser } else { 1666e78f53d1SNikolas Klauser allocator_type& __a = this->__alloc(); 1667e78f53d1SNikolas Klauser __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); 1668e78f53d1SNikolas Klauser __v.emplace_back(std::forward<_Args>(__args)...); 1669e78f53d1SNikolas Klauser __p = __swap_out_circular_buffer(__v, __p); 1670e78f53d1SNikolas Klauser } 1671e78f53d1SNikolas Klauser return __make_iter(__p); 1672e78f53d1SNikolas Klauser} 1673e78f53d1SNikolas Klauser 1674e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1675e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 1676e78f53d1SNikolas Klauservector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x) { 1677e78f53d1SNikolas Klauser pointer __p = this->__begin_ + (__position - begin()); 1678e78f53d1SNikolas Klauser if (__n > 0) { 1679e78f53d1SNikolas Klauser // We can't compare unrelated pointers inside constant expressions 1680e78f53d1SNikolas Klauser if (!__libcpp_is_constant_evaluated() && __n <= static_cast<size_type>(this->__end_cap() - this->__end_)) { 1681e78f53d1SNikolas Klauser size_type __old_n = __n; 1682e78f53d1SNikolas Klauser pointer __old_last = this->__end_; 1683e78f53d1SNikolas Klauser if (__n > static_cast<size_type>(this->__end_ - __p)) { 1684e78f53d1SNikolas Klauser size_type __cx = __n - (this->__end_ - __p); 1685e78f53d1SNikolas Klauser __construct_at_end(__cx, __x); 1686e78f53d1SNikolas Klauser __n -= __cx; 1687e78f53d1SNikolas Klauser } 1688e78f53d1SNikolas Klauser if (__n > 0) { 1689e78f53d1SNikolas Klauser __move_range(__p, __old_last, __p + __old_n); 1690e78f53d1SNikolas Klauser const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x); 1691e78f53d1SNikolas Klauser if (__p <= __xr && __xr < this->__end_) 1692e78f53d1SNikolas Klauser __xr += __old_n; 1693e78f53d1SNikolas Klauser std::fill_n(__p, __n, *__xr); 1694e78f53d1SNikolas Klauser } 1695e78f53d1SNikolas Klauser } else { 1696e78f53d1SNikolas Klauser allocator_type& __a = this->__alloc(); 1697e78f53d1SNikolas Klauser __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a); 1698e78f53d1SNikolas Klauser __v.__construct_at_end(__n, __x); 1699e78f53d1SNikolas Klauser __p = __swap_out_circular_buffer(__v, __p); 1700e78f53d1SNikolas Klauser } 1701e78f53d1SNikolas Klauser } 1702e78f53d1SNikolas Klauser return __make_iter(__p); 1703e78f53d1SNikolas Klauser} 1704e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1705e78f53d1SNikolas Klausertemplate <class _InputIterator, 1706e78f53d1SNikolas Klauser __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value && 1707e78f53d1SNikolas Klauser is_constructible<_Tp, typename iterator_traits<_InputIterator>::reference>::value, 1708e78f53d1SNikolas Klauser int> > 1709e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 1710e78f53d1SNikolas Klauservector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last) { 1711e78f53d1SNikolas Klauser return __insert_with_sentinel(__position, __first, __last); 1712e78f53d1SNikolas Klauser} 1713e78f53d1SNikolas Klauser 1714e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1715e78f53d1SNikolas Klausertemplate <class _InputIterator, class _Sentinel> 1716e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::iterator 1717e78f53d1SNikolas Klauservector<_Tp, _Allocator>::__insert_with_sentinel(const_iterator __position, _InputIterator __first, _Sentinel __last) { 1718e78f53d1SNikolas Klauser difference_type __off = __position - begin(); 1719e78f53d1SNikolas Klauser pointer __p = this->__begin_ + __off; 1720e78f53d1SNikolas Klauser allocator_type& __a = this->__alloc(); 1721e78f53d1SNikolas Klauser pointer __old_last = this->__end_; 1722e78f53d1SNikolas Klauser for (; this->__end_ != this->__end_cap() && __first != __last; ++__first) { 1723e78f53d1SNikolas Klauser __construct_one_at_end(*__first); 1724e78f53d1SNikolas Klauser } 1725e78f53d1SNikolas Klauser __split_buffer<value_type, allocator_type&> __v(__a); 1726e78f53d1SNikolas Klauser if (__first != __last) { 1727e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1728e78f53d1SNikolas Klauser try { 1729e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1730e78f53d1SNikolas Klauser __v.__construct_at_end_with_sentinel(std::move(__first), std::move(__last)); 1731e78f53d1SNikolas Klauser difference_type __old_size = __old_last - this->__begin_; 1732e78f53d1SNikolas Klauser difference_type __old_p = __p - this->__begin_; 1733e78f53d1SNikolas Klauser reserve(__recommend(size() + __v.size())); 1734e78f53d1SNikolas Klauser __p = this->__begin_ + __old_p; 1735e78f53d1SNikolas Klauser __old_last = this->__begin_ + __old_size; 1736e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1737e78f53d1SNikolas Klauser } catch (...) { 1738e78f53d1SNikolas Klauser erase(__make_iter(__old_last), end()); 1739e78f53d1SNikolas Klauser throw; 1740e78f53d1SNikolas Klauser } 1741e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1742e78f53d1SNikolas Klauser } 1743e78f53d1SNikolas Klauser __p = std::rotate(__p, __old_last, this->__end_); 1744e78f53d1SNikolas Klauser insert(__make_iter(__p), std::make_move_iterator(__v.begin()), std::make_move_iterator(__v.end())); 1745e78f53d1SNikolas Klauser return begin() + __off; 1746e78f53d1SNikolas Klauser} 1747e78f53d1SNikolas Klauser 1748e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1749e78f53d1SNikolas Klausertemplate <class _ForwardIterator, 1750e78f53d1SNikolas Klauser __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value && 1751e78f53d1SNikolas Klauser is_constructible<_Tp, typename iterator_traits<_ForwardIterator>::reference>::value, 1752e78f53d1SNikolas Klauser int> > 1753e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 1754e78f53d1SNikolas Klauservector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last) { 1755e78f53d1SNikolas Klauser return __insert_with_size(__position, __first, __last, std::distance(__first, __last)); 1756e78f53d1SNikolas Klauser} 1757e78f53d1SNikolas Klauser 1758e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1759e78f53d1SNikolas Klausertemplate <class _Iterator, class _Sentinel> 1760e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::iterator 1761e78f53d1SNikolas Klauservector<_Tp, _Allocator>::__insert_with_size( 1762e78f53d1SNikolas Klauser const_iterator __position, _Iterator __first, _Sentinel __last, difference_type __n) { 1763e78f53d1SNikolas Klauser auto __insertion_size = __n; 1764e78f53d1SNikolas Klauser pointer __p = this->__begin_ + (__position - begin()); 1765e78f53d1SNikolas Klauser if (__n > 0) { 1766e78f53d1SNikolas Klauser if (__n <= this->__end_cap() - this->__end_) { 1767e78f53d1SNikolas Klauser size_type __old_n = __n; 1768e78f53d1SNikolas Klauser pointer __old_last = this->__end_; 1769e78f53d1SNikolas Klauser _Iterator __m = std::next(__first, __n); 1770e78f53d1SNikolas Klauser difference_type __dx = this->__end_ - __p; 1771e78f53d1SNikolas Klauser if (__n > __dx) { 1772e78f53d1SNikolas Klauser __m = __first; 1773e78f53d1SNikolas Klauser difference_type __diff = this->__end_ - __p; 1774e78f53d1SNikolas Klauser std::advance(__m, __diff); 1775e78f53d1SNikolas Klauser __construct_at_end(__m, __last, __n - __diff); 1776e78f53d1SNikolas Klauser __n = __dx; 1777e78f53d1SNikolas Klauser } 1778e78f53d1SNikolas Klauser if (__n > 0) { 1779e78f53d1SNikolas Klauser __move_range(__p, __old_last, __p + __old_n); 1780e78f53d1SNikolas Klauser std::copy(__first, __m, __p); 1781e78f53d1SNikolas Klauser } 1782e78f53d1SNikolas Klauser } else { 1783e78f53d1SNikolas Klauser allocator_type& __a = this->__alloc(); 1784e78f53d1SNikolas Klauser __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a); 1785e78f53d1SNikolas Klauser __v.__construct_at_end_with_size(__first, __insertion_size); 1786e78f53d1SNikolas Klauser __p = __swap_out_circular_buffer(__v, __p); 1787e78f53d1SNikolas Klauser } 1788e78f53d1SNikolas Klauser } 1789e78f53d1SNikolas Klauser return __make_iter(__p); 1790e78f53d1SNikolas Klauser} 1791e78f53d1SNikolas Klauser 1792e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1793e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::resize(size_type __sz) { 1794e78f53d1SNikolas Klauser size_type __cs = size(); 1795e78f53d1SNikolas Klauser if (__cs < __sz) 1796e78f53d1SNikolas Klauser this->__append(__sz - __cs); 1797e78f53d1SNikolas Klauser else if (__cs > __sz) 1798e78f53d1SNikolas Klauser this->__destruct_at_end(this->__begin_ + __sz); 1799e78f53d1SNikolas Klauser} 1800e78f53d1SNikolas Klauser 1801e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1802e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x) { 1803e78f53d1SNikolas Klauser size_type __cs = size(); 1804e78f53d1SNikolas Klauser if (__cs < __sz) 1805e78f53d1SNikolas Klauser this->__append(__sz - __cs, __x); 1806e78f53d1SNikolas Klauser else if (__cs > __sz) 1807e78f53d1SNikolas Klauser this->__destruct_at_end(this->__begin_ + __sz); 1808e78f53d1SNikolas Klauser} 1809e78f53d1SNikolas Klauser 1810e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1811e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::swap(vector& __x) 1812e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 1813e78f53d1SNikolas Klauser _NOEXCEPT 1814e78f53d1SNikolas Klauser#else 1815e78f53d1SNikolas Klauser _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || __is_nothrow_swappable_v<allocator_type>) 1816e78f53d1SNikolas Klauser#endif 1817e78f53d1SNikolas Klauser{ 1818e78f53d1SNikolas Klauser _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR( 1819e78f53d1SNikolas Klauser __alloc_traits::propagate_on_container_swap::value || this->__alloc() == __x.__alloc(), 1820e78f53d1SNikolas Klauser "vector::swap: Either propagate_on_container_swap must be true" 1821e78f53d1SNikolas Klauser " or the allocators must compare equal"); 1822e78f53d1SNikolas Klauser std::swap(this->__begin_, __x.__begin_); 1823e78f53d1SNikolas Klauser std::swap(this->__end_, __x.__end_); 1824e78f53d1SNikolas Klauser std::swap(this->__end_cap(), __x.__end_cap()); 1825e78f53d1SNikolas Klauser std::__swap_allocator( 1826e78f53d1SNikolas Klauser this->__alloc(), __x.__alloc(), integral_constant<bool, __alloc_traits::propagate_on_container_swap::value>()); 1827e78f53d1SNikolas Klauser} 1828e78f53d1SNikolas Klauser 1829e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 1830e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 bool vector<_Tp, _Allocator>::__invariants() const { 1831e78f53d1SNikolas Klauser if (this->__begin_ == nullptr) { 1832e78f53d1SNikolas Klauser if (this->__end_ != nullptr || this->__end_cap() != nullptr) 1833e78f53d1SNikolas Klauser return false; 1834e78f53d1SNikolas Klauser } else { 1835e78f53d1SNikolas Klauser if (this->__begin_ > this->__end_) 1836e78f53d1SNikolas Klauser return false; 1837e78f53d1SNikolas Klauser if (this->__begin_ == this->__end_cap()) 1838e78f53d1SNikolas Klauser return false; 1839e78f53d1SNikolas Klauser if (this->__end_ > this->__end_cap()) 1840e78f53d1SNikolas Klauser return false; 1841e78f53d1SNikolas Klauser } 1842e78f53d1SNikolas Klauser return true; 1843e78f53d1SNikolas Klauser} 1844e78f53d1SNikolas Klauser 1845e78f53d1SNikolas Klauser// vector<bool> 1846e78f53d1SNikolas Klauser 1847e78f53d1SNikolas Klausertemplate <class _Allocator> 1848e78f53d1SNikolas Klauserclass vector<bool, _Allocator>; 1849e78f53d1SNikolas Klauser 1850e78f53d1SNikolas Klausertemplate <class _Allocator> 1851e78f53d1SNikolas Klauserstruct hash<vector<bool, _Allocator> >; 1852e78f53d1SNikolas Klauser 1853e78f53d1SNikolas Klausertemplate <class _Allocator> 1854e78f53d1SNikolas Klauserstruct __has_storage_type<vector<bool, _Allocator> > { 1855e78f53d1SNikolas Klauser static const bool value = true; 1856e78f53d1SNikolas Klauser}; 1857e78f53d1SNikolas Klauser 1858e78f53d1SNikolas Klausertemplate <class _Allocator> 1859e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS vector<bool, _Allocator> { 1860e78f53d1SNikolas Klauserpublic: 1861e78f53d1SNikolas Klauser typedef vector __self; 1862e78f53d1SNikolas Klauser typedef bool value_type; 1863e78f53d1SNikolas Klauser typedef _Allocator allocator_type; 1864e78f53d1SNikolas Klauser typedef allocator_traits<allocator_type> __alloc_traits; 1865e78f53d1SNikolas Klauser typedef typename __alloc_traits::size_type size_type; 1866e78f53d1SNikolas Klauser typedef typename __alloc_traits::difference_type difference_type; 1867e78f53d1SNikolas Klauser typedef size_type __storage_type; 1868e78f53d1SNikolas Klauser typedef __bit_iterator<vector, false> pointer; 1869e78f53d1SNikolas Klauser typedef __bit_iterator<vector, true> const_pointer; 1870e78f53d1SNikolas Klauser typedef pointer iterator; 1871e78f53d1SNikolas Klauser typedef const_pointer const_iterator; 1872e78f53d1SNikolas Klauser typedef std::reverse_iterator<iterator> reverse_iterator; 1873e78f53d1SNikolas Klauser typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 1874e78f53d1SNikolas Klauser 1875e78f53d1SNikolas Klauserprivate: 1876e78f53d1SNikolas Klauser typedef __rebind_alloc<__alloc_traits, __storage_type> __storage_allocator; 1877e78f53d1SNikolas Klauser typedef allocator_traits<__storage_allocator> __storage_traits; 1878e78f53d1SNikolas Klauser typedef typename __storage_traits::pointer __storage_pointer; 1879e78f53d1SNikolas Klauser typedef typename __storage_traits::const_pointer __const_storage_pointer; 1880e78f53d1SNikolas Klauser 1881e78f53d1SNikolas Klauser __storage_pointer __begin_; 1882e78f53d1SNikolas Klauser size_type __size_; 1883e78f53d1SNikolas Klauser __compressed_pair<size_type, __storage_allocator> __cap_alloc_; 1884e78f53d1SNikolas Klauser 1885e78f53d1SNikolas Klauserpublic: 1886e78f53d1SNikolas Klauser typedef __bit_reference<vector> reference; 1887e78f53d1SNikolas Klauser#ifdef _LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL 1888e78f53d1SNikolas Klauser using const_reference = bool; 1889e78f53d1SNikolas Klauser#else 1890e78f53d1SNikolas Klauser typedef __bit_const_reference<vector> const_reference; 1891e78f53d1SNikolas Klauser#endif 1892e78f53d1SNikolas Klauser 1893e78f53d1SNikolas Klauserprivate: 1894e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type& __cap() _NOEXCEPT { return __cap_alloc_.first(); } 1895e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const size_type& __cap() const _NOEXCEPT { 1896e78f53d1SNikolas Klauser return __cap_alloc_.first(); 1897e78f53d1SNikolas Klauser } 1898e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __storage_allocator& __alloc() _NOEXCEPT { 1899e78f53d1SNikolas Klauser return __cap_alloc_.second(); 1900e78f53d1SNikolas Klauser } 1901e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const __storage_allocator& __alloc() const _NOEXCEPT { 1902e78f53d1SNikolas Klauser return __cap_alloc_.second(); 1903e78f53d1SNikolas Klauser } 1904e78f53d1SNikolas Klauser 1905e78f53d1SNikolas Klauser static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT); 1906e78f53d1SNikolas Klauser 1907e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static size_type 1908e78f53d1SNikolas Klauser __internal_cap_to_external(size_type __n) _NOEXCEPT { 1909e78f53d1SNikolas Klauser return __n * __bits_per_word; 1910e78f53d1SNikolas Klauser } 1911e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static size_type 1912e78f53d1SNikolas Klauser __external_cap_to_internal(size_type __n) _NOEXCEPT { 1913e78f53d1SNikolas Klauser return (__n - 1) / __bits_per_word + 1; 1914e78f53d1SNikolas Klauser } 1915e78f53d1SNikolas Klauser 1916e78f53d1SNikolas Klauserpublic: 1917e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector() 1918e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); 1919e78f53d1SNikolas Klauser 1920e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit vector(const allocator_type& __a) 1921e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER <= 14 1922e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value); 1923e78f53d1SNikolas Klauser#else 1924e78f53d1SNikolas Klauser _NOEXCEPT; 1925e78f53d1SNikolas Klauser#endif 1926e78f53d1SNikolas Klauser 1927e78f53d1SNikolas Klauserprivate: 1928e78f53d1SNikolas Klauser class __destroy_vector { 1929e78f53d1SNikolas Klauser public: 1930e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI __destroy_vector(vector& __vec) : __vec_(__vec) {} 1931e78f53d1SNikolas Klauser 1932e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void operator()() { 1933e78f53d1SNikolas Klauser if (__vec_.__begin_ != nullptr) 1934e78f53d1SNikolas Klauser __storage_traits::deallocate(__vec_.__alloc(), __vec_.__begin_, __vec_.__cap()); 1935e78f53d1SNikolas Klauser } 1936e78f53d1SNikolas Klauser 1937e78f53d1SNikolas Klauser private: 1938e78f53d1SNikolas Klauser vector& __vec_; 1939e78f53d1SNikolas Klauser }; 1940e78f53d1SNikolas Klauser 1941e78f53d1SNikolas Klauserpublic: 1942e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 ~vector() { __destroy_vector (*this)(); } 1943e78f53d1SNikolas Klauser 1944e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit vector(size_type __n); 1945e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 1946e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit vector(size_type __n, const allocator_type& __a); 1947e78f53d1SNikolas Klauser#endif 1948e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(size_type __n, const value_type& __v); 1949e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 1950e78f53d1SNikolas Klauser vector(size_type __n, const value_type& __v, const allocator_type& __a); 1951e78f53d1SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> = 0> 1952e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(_InputIterator __first, _InputIterator __last); 1953e78f53d1SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> = 0> 1954e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 1955e78f53d1SNikolas Klauser vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a); 1956e78f53d1SNikolas Klauser template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0> 1957e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(_ForwardIterator __first, _ForwardIterator __last); 1958e78f53d1SNikolas Klauser template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0> 1959e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 1960e78f53d1SNikolas Klauser vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a); 1961e78f53d1SNikolas Klauser 1962e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 23 1963e78f53d1SNikolas Klauser template <_ContainerCompatibleRange<bool> _Range> 1964e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr vector(from_range_t, _Range&& __range, const allocator_type& __a = allocator_type()) 1965e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, static_cast<__storage_allocator>(__a)) { 1966e78f53d1SNikolas Klauser if constexpr (ranges::forward_range<_Range> || ranges::sized_range<_Range>) { 1967e78f53d1SNikolas Klauser auto __n = static_cast<size_type>(ranges::distance(__range)); 1968e78f53d1SNikolas Klauser __init_with_size(ranges::begin(__range), ranges::end(__range), __n); 1969e78f53d1SNikolas Klauser 1970e78f53d1SNikolas Klauser } else { 1971e78f53d1SNikolas Klauser __init_with_sentinel(ranges::begin(__range), ranges::end(__range)); 1972e78f53d1SNikolas Klauser } 1973e78f53d1SNikolas Klauser } 1974e78f53d1SNikolas Klauser#endif 1975e78f53d1SNikolas Klauser 1976e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(const vector& __v); 1977e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(const vector& __v, const allocator_type& __a); 1978e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector& operator=(const vector& __v); 1979e78f53d1SNikolas Klauser 1980e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 1981e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(initializer_list<value_type> __il); 1982e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 1983e78f53d1SNikolas Klauser vector(initializer_list<value_type> __il, const allocator_type& __a); 1984e78f53d1SNikolas Klauser 1985e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector& operator=(initializer_list<value_type> __il) { 1986e78f53d1SNikolas Klauser assign(__il.begin(), __il.end()); 1987e78f53d1SNikolas Klauser return *this; 1988e78f53d1SNikolas Klauser } 1989e78f53d1SNikolas Klauser 1990e78f53d1SNikolas Klauser#endif // !_LIBCPP_CXX03_LANG 1991e78f53d1SNikolas Klauser 1992e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(vector&& __v) 1993e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 1994e78f53d1SNikolas Klauser noexcept; 1995e78f53d1SNikolas Klauser#else 1996e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); 1997e78f53d1SNikolas Klauser#endif 1998e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 1999e78f53d1SNikolas Klauser vector(vector&& __v, const __type_identity_t<allocator_type>& __a); 2000e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector& operator=(vector&& __v) 2001e78f53d1SNikolas Klauser _NOEXCEPT_(__noexcept_move_assign_container<_Allocator, __alloc_traits>::value); 2002e78f53d1SNikolas Klauser 2003e78f53d1SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> = 0> 2004e78f53d1SNikolas Klauser void _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 assign(_InputIterator __first, _InputIterator __last); 2005e78f53d1SNikolas Klauser template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0> 2006e78f53d1SNikolas Klauser void _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 assign(_ForwardIterator __first, _ForwardIterator __last); 2007e78f53d1SNikolas Klauser 2008e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 23 2009e78f53d1SNikolas Klauser template <_ContainerCompatibleRange<bool> _Range> 2010e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr void assign_range(_Range&& __range) { 2011e78f53d1SNikolas Klauser if constexpr (ranges::forward_range<_Range> || ranges::sized_range<_Range>) { 2012e78f53d1SNikolas Klauser auto __n = static_cast<size_type>(ranges::distance(__range)); 2013e78f53d1SNikolas Klauser __assign_with_size(ranges::begin(__range), ranges::end(__range), __n); 2014e78f53d1SNikolas Klauser 2015e78f53d1SNikolas Klauser } else { 2016e78f53d1SNikolas Klauser __assign_with_sentinel(ranges::begin(__range), ranges::end(__range)); 2017e78f53d1SNikolas Klauser } 2018e78f53d1SNikolas Klauser } 2019e78f53d1SNikolas Klauser#endif 2020e78f53d1SNikolas Klauser 2021e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void assign(size_type __n, const value_type& __x); 2022e78f53d1SNikolas Klauser 2023e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 2024e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void assign(initializer_list<value_type> __il) { 2025e78f53d1SNikolas Klauser assign(__il.begin(), __il.end()); 2026e78f53d1SNikolas Klauser } 2027e78f53d1SNikolas Klauser#endif 2028e78f53d1SNikolas Klauser 2029e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 allocator_type get_allocator() const _NOEXCEPT { 2030e78f53d1SNikolas Klauser return allocator_type(this->__alloc()); 2031e78f53d1SNikolas Klauser } 2032e78f53d1SNikolas Klauser 2033e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type max_size() const _NOEXCEPT; 2034e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type capacity() const _NOEXCEPT { 2035e78f53d1SNikolas Klauser return __internal_cap_to_external(__cap()); 2036e78f53d1SNikolas Klauser } 2037e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type size() const _NOEXCEPT { return __size_; } 2038e78f53d1SNikolas Klauser _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool empty() const _NOEXCEPT { 2039e78f53d1SNikolas Klauser return __size_ == 0; 2040e78f53d1SNikolas Klauser } 2041e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void reserve(size_type __n); 2042e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void shrink_to_fit() _NOEXCEPT; 2043e78f53d1SNikolas Klauser 2044e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator begin() _NOEXCEPT { return __make_iter(0); } 2045e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_iterator begin() const _NOEXCEPT { return __make_iter(0); } 2046e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator end() _NOEXCEPT { return __make_iter(__size_); } 2047e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_iterator end() const _NOEXCEPT { 2048e78f53d1SNikolas Klauser return __make_iter(__size_); 2049e78f53d1SNikolas Klauser } 2050e78f53d1SNikolas Klauser 2051e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reverse_iterator rbegin() _NOEXCEPT { 2052e78f53d1SNikolas Klauser return reverse_iterator(end()); 2053e78f53d1SNikolas Klauser } 2054e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reverse_iterator rbegin() const _NOEXCEPT { 2055e78f53d1SNikolas Klauser return const_reverse_iterator(end()); 2056e78f53d1SNikolas Klauser } 2057e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reverse_iterator rend() _NOEXCEPT { 2058e78f53d1SNikolas Klauser return reverse_iterator(begin()); 2059e78f53d1SNikolas Klauser } 2060e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reverse_iterator rend() const _NOEXCEPT { 2061e78f53d1SNikolas Klauser return const_reverse_iterator(begin()); 2062e78f53d1SNikolas Klauser } 2063e78f53d1SNikolas Klauser 2064e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_iterator cbegin() const _NOEXCEPT { return __make_iter(0); } 2065e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_iterator cend() const _NOEXCEPT { 2066e78f53d1SNikolas Klauser return __make_iter(__size_); 2067e78f53d1SNikolas Klauser } 2068e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reverse_iterator crbegin() const _NOEXCEPT { 2069e78f53d1SNikolas Klauser return rbegin(); 2070e78f53d1SNikolas Klauser } 2071e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reverse_iterator crend() const _NOEXCEPT { return rend(); } 2072e78f53d1SNikolas Klauser 2073e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference operator[](size_type __n) { return __make_ref(__n); } 2074e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference operator[](size_type __n) const { 2075e78f53d1SNikolas Klauser return __make_ref(__n); 2076e78f53d1SNikolas Klauser } 2077e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI reference at(size_type __n); 2078e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI const_reference at(size_type __n) const; 2079e78f53d1SNikolas Klauser 2080e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference front() { return __make_ref(0); } 2081e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference front() const { return __make_ref(0); } 2082e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference back() { return __make_ref(__size_ - 1); } 2083e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference back() const { return __make_ref(__size_ - 1); } 2084e78f53d1SNikolas Klauser 2085e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void push_back(const value_type& __x); 2086e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 2087e78f53d1SNikolas Klauser template <class... _Args> 2088e78f53d1SNikolas Klauser# if _LIBCPP_STD_VER >= 17 2089e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference emplace_back(_Args&&... __args) 2090e78f53d1SNikolas Klauser# else 2091e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void emplace_back(_Args&&... __args) 2092e78f53d1SNikolas Klauser# endif 2093e78f53d1SNikolas Klauser { 2094e78f53d1SNikolas Klauser push_back(value_type(std::forward<_Args>(__args)...)); 2095e78f53d1SNikolas Klauser# if _LIBCPP_STD_VER >= 17 2096e78f53d1SNikolas Klauser return this->back(); 2097e78f53d1SNikolas Klauser# endif 2098e78f53d1SNikolas Klauser } 2099e78f53d1SNikolas Klauser#endif 2100e78f53d1SNikolas Klauser 2101e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 23 2102e78f53d1SNikolas Klauser template <_ContainerCompatibleRange<bool> _Range> 2103e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr void append_range(_Range&& __range) { 2104e78f53d1SNikolas Klauser insert_range(end(), std::forward<_Range>(__range)); 2105e78f53d1SNikolas Klauser } 2106e78f53d1SNikolas Klauser#endif 2107e78f53d1SNikolas Klauser 2108e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void pop_back() { --__size_; } 2109e78f53d1SNikolas Klauser 2110e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 2111e78f53d1SNikolas Klauser template <class... _Args> 2112e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator emplace(const_iterator __position, _Args&&... __args) { 2113e78f53d1SNikolas Klauser return insert(__position, value_type(std::forward<_Args>(__args)...)); 2114e78f53d1SNikolas Klauser } 2115e78f53d1SNikolas Klauser#endif 2116e78f53d1SNikolas Klauser 2117e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator insert(const_iterator __position, const value_type& __x); 2118e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator 2119e78f53d1SNikolas Klauser insert(const_iterator __position, size_type __n, const value_type& __x); 2120e78f53d1SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> = 0> 2121e78f53d1SNikolas Klauser iterator _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 2122e78f53d1SNikolas Klauser insert(const_iterator __position, _InputIterator __first, _InputIterator __last); 2123e78f53d1SNikolas Klauser template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0> 2124e78f53d1SNikolas Klauser iterator _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 2125e78f53d1SNikolas Klauser insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last); 2126e78f53d1SNikolas Klauser 2127e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 23 2128e78f53d1SNikolas Klauser template <_ContainerCompatibleRange<bool> _Range> 2129e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr iterator insert_range(const_iterator __position, _Range&& __range) { 2130e78f53d1SNikolas Klauser if constexpr (ranges::forward_range<_Range> || ranges::sized_range<_Range>) { 2131e78f53d1SNikolas Klauser auto __n = static_cast<size_type>(ranges::distance(__range)); 2132e78f53d1SNikolas Klauser return __insert_with_size(__position, ranges::begin(__range), ranges::end(__range), __n); 2133e78f53d1SNikolas Klauser 2134e78f53d1SNikolas Klauser } else { 2135e78f53d1SNikolas Klauser return __insert_with_sentinel(__position, ranges::begin(__range), ranges::end(__range)); 2136e78f53d1SNikolas Klauser } 2137e78f53d1SNikolas Klauser } 2138e78f53d1SNikolas Klauser#endif 2139e78f53d1SNikolas Klauser 2140e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 2141e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator 2142e78f53d1SNikolas Klauser insert(const_iterator __position, initializer_list<value_type> __il) { 2143e78f53d1SNikolas Klauser return insert(__position, __il.begin(), __il.end()); 2144e78f53d1SNikolas Klauser } 2145e78f53d1SNikolas Klauser#endif 2146e78f53d1SNikolas Klauser 2147e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator erase(const_iterator __position); 2148e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator erase(const_iterator __first, const_iterator __last); 2149e78f53d1SNikolas Klauser 2150e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void clear() _NOEXCEPT { __size_ = 0; } 2151e78f53d1SNikolas Klauser 2152e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void swap(vector&) 2153e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 2154e78f53d1SNikolas Klauser _NOEXCEPT; 2155e78f53d1SNikolas Klauser#else 2156e78f53d1SNikolas Klauser _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || __is_nothrow_swappable_v<allocator_type>); 2157e78f53d1SNikolas Klauser#endif 2158e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static void swap(reference __x, reference __y) _NOEXCEPT { 2159e78f53d1SNikolas Klauser std::swap(__x, __y); 2160e78f53d1SNikolas Klauser } 2161e78f53d1SNikolas Klauser 2162e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void resize(size_type __sz, value_type __x = false); 2163e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void flip() _NOEXCEPT; 2164e78f53d1SNikolas Klauser 2165e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool __invariants() const; 2166e78f53d1SNikolas Klauser 2167e78f53d1SNikolas Klauserprivate: 2168e78f53d1SNikolas Klauser _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI void __throw_length_error() const { std::__throw_length_error("vector"); } 2169e78f53d1SNikolas Klauser 2170e78f53d1SNikolas Klauser _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI void __throw_out_of_range() const { std::__throw_out_of_range("vector"); } 2171e78f53d1SNikolas Klauser 2172e78f53d1SNikolas Klauser template <class _InputIterator, class _Sentinel> 2173e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void 2174e78f53d1SNikolas Klauser __init_with_size(_InputIterator __first, _Sentinel __last, size_type __n) { 2175e78f53d1SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 2176e78f53d1SNikolas Klauser 2177e78f53d1SNikolas Klauser if (__n > 0) { 2178e78f53d1SNikolas Klauser __vallocate(__n); 2179e78f53d1SNikolas Klauser __construct_at_end(std::move(__first), std::move(__last), __n); 2180e78f53d1SNikolas Klauser } 2181e78f53d1SNikolas Klauser 2182e78f53d1SNikolas Klauser __guard.__complete(); 2183e78f53d1SNikolas Klauser } 2184e78f53d1SNikolas Klauser 2185e78f53d1SNikolas Klauser template <class _InputIterator, class _Sentinel> 2186e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void 2187e78f53d1SNikolas Klauser __init_with_sentinel(_InputIterator __first, _Sentinel __last) { 2188e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 2189e78f53d1SNikolas Klauser try { 2190e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS 2191e78f53d1SNikolas Klauser for (; __first != __last; ++__first) 2192e78f53d1SNikolas Klauser push_back(*__first); 2193e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 2194e78f53d1SNikolas Klauser } catch (...) { 2195e78f53d1SNikolas Klauser if (__begin_ != nullptr) 2196e78f53d1SNikolas Klauser __storage_traits::deallocate(__alloc(), __begin_, __cap()); 2197e78f53d1SNikolas Klauser throw; 2198e78f53d1SNikolas Klauser } 2199e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS 2200e78f53d1SNikolas Klauser } 2201e78f53d1SNikolas Klauser 2202e78f53d1SNikolas Klauser template <class _Iterator, class _Sentinel> 2203e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __assign_with_sentinel(_Iterator __first, _Sentinel __last); 2204e78f53d1SNikolas Klauser 2205e78f53d1SNikolas Klauser template <class _ForwardIterator, class _Sentinel> 2206e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 2207e78f53d1SNikolas Klauser __assign_with_size(_ForwardIterator __first, _Sentinel __last, difference_type __ns); 2208e78f53d1SNikolas Klauser 2209e78f53d1SNikolas Klauser template <class _InputIterator, class _Sentinel> 2210e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 2211e78f53d1SNikolas Klauser __insert_with_sentinel(const_iterator __position, _InputIterator __first, _Sentinel __last); 2212e78f53d1SNikolas Klauser 2213e78f53d1SNikolas Klauser template <class _Iterator, class _Sentinel> 2214e78f53d1SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 2215e78f53d1SNikolas Klauser __insert_with_size(const_iterator __position, _Iterator __first, _Sentinel __last, difference_type __n); 2216e78f53d1SNikolas Klauser 2217e78f53d1SNikolas Klauser // Allocate space for __n objects 2218e78f53d1SNikolas Klauser // throws length_error if __n > max_size() 2219e78f53d1SNikolas Klauser // throws (probably bad_alloc) if memory run out 2220e78f53d1SNikolas Klauser // Precondition: __begin_ == __end_ == __cap() == 0 2221e78f53d1SNikolas Klauser // Precondition: __n > 0 2222e78f53d1SNikolas Klauser // Postcondition: capacity() >= __n 2223e78f53d1SNikolas Klauser // Postcondition: size() == 0 2224e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __vallocate(size_type __n) { 2225e78f53d1SNikolas Klauser if (__n > max_size()) 2226e78f53d1SNikolas Klauser __throw_length_error(); 2227e78f53d1SNikolas Klauser auto __allocation = std::__allocate_at_least(__alloc(), __external_cap_to_internal(__n)); 2228e78f53d1SNikolas Klauser __begin_ = __allocation.ptr; 2229e78f53d1SNikolas Klauser __size_ = 0; 2230e78f53d1SNikolas Klauser __cap() = __allocation.count; 2231e78f53d1SNikolas Klauser if (__libcpp_is_constant_evaluated()) { 2232e78f53d1SNikolas Klauser for (size_type __i = 0; __i != __cap(); ++__i) 2233e78f53d1SNikolas Klauser std::__construct_at(std::__to_address(__begin_) + __i); 2234e78f53d1SNikolas Klauser } 2235e78f53d1SNikolas Klauser } 2236e78f53d1SNikolas Klauser 2237e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __vdeallocate() _NOEXCEPT; 2238e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static size_type __align_it(size_type __new_size) _NOEXCEPT { 2239e78f53d1SNikolas Klauser return (__new_size + (__bits_per_word - 1)) & ~((size_type)__bits_per_word - 1); 2240e78f53d1SNikolas Klauser } 2241e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type __recommend(size_type __new_size) const; 2242e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __construct_at_end(size_type __n, bool __x); 2243e78f53d1SNikolas Klauser template <class _InputIterator, class _Sentinel> 2244e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void 2245e78f53d1SNikolas Klauser __construct_at_end(_InputIterator __first, _Sentinel __last, size_type __n); 2246e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __append(size_type __n, const_reference __x); 2247e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference __make_ref(size_type __pos) _NOEXCEPT { 2248e78f53d1SNikolas Klauser return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word); 2249e78f53d1SNikolas Klauser } 2250e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference __make_ref(size_type __pos) const _NOEXCEPT { 2251e78f53d1SNikolas Klauser return __bit_const_reference<vector>( 2252e78f53d1SNikolas Klauser __begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word); 2253e78f53d1SNikolas Klauser } 2254e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator __make_iter(size_type __pos) _NOEXCEPT { 2255e78f53d1SNikolas Klauser return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)); 2256e78f53d1SNikolas Klauser } 2257e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_iterator __make_iter(size_type __pos) const _NOEXCEPT { 2258e78f53d1SNikolas Klauser return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)); 2259e78f53d1SNikolas Klauser } 2260e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT { 2261e78f53d1SNikolas Klauser return begin() + (__p - cbegin()); 2262e78f53d1SNikolas Klauser } 2263e78f53d1SNikolas Klauser 2264e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __copy_assign_alloc(const vector& __v) { 2265e78f53d1SNikolas Klauser __copy_assign_alloc( 2266e78f53d1SNikolas Klauser __v, integral_constant<bool, __storage_traits::propagate_on_container_copy_assignment::value>()); 2267e78f53d1SNikolas Klauser } 2268e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __copy_assign_alloc(const vector& __c, true_type) { 2269e78f53d1SNikolas Klauser if (__alloc() != __c.__alloc()) 2270e78f53d1SNikolas Klauser __vdeallocate(); 2271e78f53d1SNikolas Klauser __alloc() = __c.__alloc(); 2272e78f53d1SNikolas Klauser } 2273e78f53d1SNikolas Klauser 2274e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __copy_assign_alloc(const vector&, false_type) {} 2275e78f53d1SNikolas Klauser 2276e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __move_assign(vector& __c, false_type); 2277e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __move_assign(vector& __c, true_type) 2278e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); 2279e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __move_assign_alloc(vector& __c) 2280e78f53d1SNikolas Klauser _NOEXCEPT_(!__storage_traits::propagate_on_container_move_assignment::value || 2281e78f53d1SNikolas Klauser is_nothrow_move_assignable<allocator_type>::value) { 2282e78f53d1SNikolas Klauser __move_assign_alloc( 2283e78f53d1SNikolas Klauser __c, integral_constant<bool, __storage_traits::propagate_on_container_move_assignment::value>()); 2284e78f53d1SNikolas Klauser } 2285e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __move_assign_alloc(vector& __c, true_type) 2286e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) { 2287e78f53d1SNikolas Klauser __alloc() = std::move(__c.__alloc()); 2288e78f53d1SNikolas Klauser } 2289e78f53d1SNikolas Klauser 2290e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __move_assign_alloc(vector&, false_type) _NOEXCEPT {} 2291e78f53d1SNikolas Klauser 2292e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_t __hash_code() const _NOEXCEPT; 2293e78f53d1SNikolas Klauser 2294e78f53d1SNikolas Klauser friend class __bit_reference<vector>; 2295e78f53d1SNikolas Klauser friend class __bit_const_reference<vector>; 2296e78f53d1SNikolas Klauser friend class __bit_iterator<vector, false>; 2297e78f53d1SNikolas Klauser friend class __bit_iterator<vector, true>; 2298e78f53d1SNikolas Klauser friend struct __bit_array<vector>; 2299e78f53d1SNikolas Klauser friend struct _LIBCPP_TEMPLATE_VIS hash<vector>; 2300e78f53d1SNikolas Klauser}; 2301e78f53d1SNikolas Klauser 2302e78f53d1SNikolas Klausertemplate <class _Allocator> 2303e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::__vdeallocate() _NOEXCEPT { 2304e78f53d1SNikolas Klauser if (this->__begin_ != nullptr) { 2305e78f53d1SNikolas Klauser __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap()); 2306e78f53d1SNikolas Klauser this->__begin_ = nullptr; 2307e78f53d1SNikolas Klauser this->__size_ = this->__cap() = 0; 2308e78f53d1SNikolas Klauser } 2309e78f53d1SNikolas Klauser} 2310e78f53d1SNikolas Klauser 2311e78f53d1SNikolas Klausertemplate <class _Allocator> 2312e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::size_type 2313e78f53d1SNikolas Klauservector<bool, _Allocator>::max_size() const _NOEXCEPT { 2314e78f53d1SNikolas Klauser size_type __amax = __storage_traits::max_size(__alloc()); 2315e78f53d1SNikolas Klauser size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always 2316e78f53d1SNikolas Klauser if (__nmax / __bits_per_word <= __amax) 2317e78f53d1SNikolas Klauser return __nmax; 2318e78f53d1SNikolas Klauser return __internal_cap_to_external(__amax); 2319e78f53d1SNikolas Klauser} 2320e78f53d1SNikolas Klauser 2321e78f53d1SNikolas Klauser// Precondition: __new_size > capacity() 2322e78f53d1SNikolas Klausertemplate <class _Allocator> 2323e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::size_type 2324e78f53d1SNikolas Klauservector<bool, _Allocator>::__recommend(size_type __new_size) const { 2325e78f53d1SNikolas Klauser const size_type __ms = max_size(); 2326e78f53d1SNikolas Klauser if (__new_size > __ms) 2327e78f53d1SNikolas Klauser this->__throw_length_error(); 2328e78f53d1SNikolas Klauser const size_type __cap = capacity(); 2329e78f53d1SNikolas Klauser if (__cap >= __ms / 2) 2330e78f53d1SNikolas Klauser return __ms; 2331e78f53d1SNikolas Klauser return std::max(2 * __cap, __align_it(__new_size)); 2332e78f53d1SNikolas Klauser} 2333e78f53d1SNikolas Klauser 2334e78f53d1SNikolas Klauser// Default constructs __n objects starting at __end_ 2335e78f53d1SNikolas Klauser// Precondition: __n > 0 2336e78f53d1SNikolas Klauser// Precondition: size() + __n <= capacity() 2337e78f53d1SNikolas Klauser// Postcondition: size() == size() + __n 2338e78f53d1SNikolas Klausertemplate <class _Allocator> 2339e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void 2340e78f53d1SNikolas Klauservector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x) { 2341e78f53d1SNikolas Klauser size_type __old_size = this->__size_; 2342e78f53d1SNikolas Klauser this->__size_ += __n; 2343e78f53d1SNikolas Klauser if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word)) { 2344e78f53d1SNikolas Klauser if (this->__size_ <= __bits_per_word) 2345e78f53d1SNikolas Klauser this->__begin_[0] = __storage_type(0); 2346e78f53d1SNikolas Klauser else 2347e78f53d1SNikolas Klauser this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0); 2348e78f53d1SNikolas Klauser } 2349e78f53d1SNikolas Klauser std::fill_n(__make_iter(__old_size), __n, __x); 2350e78f53d1SNikolas Klauser} 2351e78f53d1SNikolas Klauser 2352e78f53d1SNikolas Klausertemplate <class _Allocator> 2353e78f53d1SNikolas Klausertemplate <class _InputIterator, class _Sentinel> 2354e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void 2355e78f53d1SNikolas Klauservector<bool, _Allocator>::__construct_at_end(_InputIterator __first, _Sentinel __last, size_type __n) { 2356e78f53d1SNikolas Klauser size_type __old_size = this->__size_; 2357e78f53d1SNikolas Klauser this->__size_ += __n; 2358e78f53d1SNikolas Klauser if (__old_size == 0 || ((__old_size - 1) / __bits_per_word) != ((this->__size_ - 1) / __bits_per_word)) { 2359e78f53d1SNikolas Klauser if (this->__size_ <= __bits_per_word) 2360e78f53d1SNikolas Klauser this->__begin_[0] = __storage_type(0); 2361e78f53d1SNikolas Klauser else 2362e78f53d1SNikolas Klauser this->__begin_[(this->__size_ - 1) / __bits_per_word] = __storage_type(0); 2363e78f53d1SNikolas Klauser } 2364e78f53d1SNikolas Klauser std::__copy<_ClassicAlgPolicy>(__first, __last, __make_iter(__old_size)); 2365e78f53d1SNikolas Klauser} 2366e78f53d1SNikolas Klauser 2367e78f53d1SNikolas Klausertemplate <class _Allocator> 2368e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector() 2369e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) 2370e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, __default_init_tag()) {} 2371e78f53d1SNikolas Klauser 2372e78f53d1SNikolas Klausertemplate <class _Allocator> 2373e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(const allocator_type& __a) 2374e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER <= 14 2375e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value) 2376e78f53d1SNikolas Klauser#else 2377e78f53d1SNikolas Klauser _NOEXCEPT 2378e78f53d1SNikolas Klauser#endif 2379e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, static_cast<__storage_allocator>(__a)) { 2380e78f53d1SNikolas Klauser} 2381e78f53d1SNikolas Klauser 2382e78f53d1SNikolas Klausertemplate <class _Allocator> 2383e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(size_type __n) 2384e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, __default_init_tag()) { 2385e78f53d1SNikolas Klauser if (__n > 0) { 2386e78f53d1SNikolas Klauser __vallocate(__n); 2387e78f53d1SNikolas Klauser __construct_at_end(__n, false); 2388e78f53d1SNikolas Klauser } 2389e78f53d1SNikolas Klauser} 2390e78f53d1SNikolas Klauser 2391e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 2392e78f53d1SNikolas Klausertemplate <class _Allocator> 2393e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(size_type __n, const allocator_type& __a) 2394e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, static_cast<__storage_allocator>(__a)) { 2395e78f53d1SNikolas Klauser if (__n > 0) { 2396e78f53d1SNikolas Klauser __vallocate(__n); 2397e78f53d1SNikolas Klauser __construct_at_end(__n, false); 2398e78f53d1SNikolas Klauser } 2399e78f53d1SNikolas Klauser} 2400e78f53d1SNikolas Klauser#endif 2401e78f53d1SNikolas Klauser 2402e78f53d1SNikolas Klausertemplate <class _Allocator> 2403e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(size_type __n, const value_type& __x) 2404e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, __default_init_tag()) { 2405e78f53d1SNikolas Klauser if (__n > 0) { 2406e78f53d1SNikolas Klauser __vallocate(__n); 2407e78f53d1SNikolas Klauser __construct_at_end(__n, __x); 2408e78f53d1SNikolas Klauser } 2409e78f53d1SNikolas Klauser} 2410e78f53d1SNikolas Klauser 2411e78f53d1SNikolas Klausertemplate <class _Allocator> 2412e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 2413e78f53d1SNikolas Klauservector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a) 2414e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, static_cast<__storage_allocator>(__a)) { 2415e78f53d1SNikolas Klauser if (__n > 0) { 2416e78f53d1SNikolas Klauser __vallocate(__n); 2417e78f53d1SNikolas Klauser __construct_at_end(__n, __x); 2418e78f53d1SNikolas Klauser } 2419e78f53d1SNikolas Klauser} 2420e78f53d1SNikolas Klauser 2421e78f53d1SNikolas Klausertemplate <class _Allocator> 2422e78f53d1SNikolas Klausertemplate <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> > 2423e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last) 2424e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, __default_init_tag()) { 2425e78f53d1SNikolas Klauser __init_with_sentinel(__first, __last); 2426e78f53d1SNikolas Klauser} 2427e78f53d1SNikolas Klauser 2428e78f53d1SNikolas Klausertemplate <class _Allocator> 2429e78f53d1SNikolas Klausertemplate <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> > 2430e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 2431e78f53d1SNikolas Klauservector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a) 2432e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, static_cast<__storage_allocator>(__a)) { 2433e78f53d1SNikolas Klauser __init_with_sentinel(__first, __last); 2434e78f53d1SNikolas Klauser} 2435e78f53d1SNikolas Klauser 2436e78f53d1SNikolas Klausertemplate <class _Allocator> 2437e78f53d1SNikolas Klausertemplate <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> > 2438e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last) 2439e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, __default_init_tag()) { 2440e78f53d1SNikolas Klauser auto __n = static_cast<size_type>(std::distance(__first, __last)); 2441e78f53d1SNikolas Klauser __init_with_size(__first, __last, __n); 2442e78f53d1SNikolas Klauser} 2443e78f53d1SNikolas Klauser 2444e78f53d1SNikolas Klausertemplate <class _Allocator> 2445e78f53d1SNikolas Klausertemplate <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> > 2446e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 2447e78f53d1SNikolas Klauservector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a) 2448e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, static_cast<__storage_allocator>(__a)) { 2449e78f53d1SNikolas Klauser auto __n = static_cast<size_type>(std::distance(__first, __last)); 2450e78f53d1SNikolas Klauser __init_with_size(__first, __last, __n); 2451e78f53d1SNikolas Klauser} 2452e78f53d1SNikolas Klauser 2453e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 2454e78f53d1SNikolas Klauser 2455e78f53d1SNikolas Klausertemplate <class _Allocator> 2456e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(initializer_list<value_type> __il) 2457e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, __default_init_tag()) { 2458e78f53d1SNikolas Klauser size_type __n = static_cast<size_type>(__il.size()); 2459e78f53d1SNikolas Klauser if (__n > 0) { 2460e78f53d1SNikolas Klauser __vallocate(__n); 2461e78f53d1SNikolas Klauser __construct_at_end(__il.begin(), __il.end(), __n); 2462e78f53d1SNikolas Klauser } 2463e78f53d1SNikolas Klauser} 2464e78f53d1SNikolas Klauser 2465e78f53d1SNikolas Klausertemplate <class _Allocator> 2466e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 2467e78f53d1SNikolas Klauservector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a) 2468e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, static_cast<__storage_allocator>(__a)) { 2469e78f53d1SNikolas Klauser size_type __n = static_cast<size_type>(__il.size()); 2470e78f53d1SNikolas Klauser if (__n > 0) { 2471e78f53d1SNikolas Klauser __vallocate(__n); 2472e78f53d1SNikolas Klauser __construct_at_end(__il.begin(), __il.end(), __n); 2473e78f53d1SNikolas Klauser } 2474e78f53d1SNikolas Klauser} 2475e78f53d1SNikolas Klauser 2476e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG 2477e78f53d1SNikolas Klauser 2478e78f53d1SNikolas Klausertemplate <class _Allocator> 2479e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(const vector& __v) 2480e78f53d1SNikolas Klauser : __begin_(nullptr), 2481e78f53d1SNikolas Klauser __size_(0), 2482e78f53d1SNikolas Klauser __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc())) { 2483e78f53d1SNikolas Klauser if (__v.size() > 0) { 2484e78f53d1SNikolas Klauser __vallocate(__v.size()); 2485e78f53d1SNikolas Klauser __construct_at_end(__v.begin(), __v.end(), __v.size()); 2486e78f53d1SNikolas Klauser } 2487e78f53d1SNikolas Klauser} 2488e78f53d1SNikolas Klauser 2489e78f53d1SNikolas Klausertemplate <class _Allocator> 2490e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a) 2491e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, __a) { 2492e78f53d1SNikolas Klauser if (__v.size() > 0) { 2493e78f53d1SNikolas Klauser __vallocate(__v.size()); 2494e78f53d1SNikolas Klauser __construct_at_end(__v.begin(), __v.end(), __v.size()); 2495e78f53d1SNikolas Klauser } 2496e78f53d1SNikolas Klauser} 2497e78f53d1SNikolas Klauser 2498e78f53d1SNikolas Klausertemplate <class _Allocator> 2499e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>& vector<bool, _Allocator>::operator=(const vector& __v) { 2500e78f53d1SNikolas Klauser if (this != std::addressof(__v)) { 2501e78f53d1SNikolas Klauser __copy_assign_alloc(__v); 2502e78f53d1SNikolas Klauser if (__v.__size_) { 2503e78f53d1SNikolas Klauser if (__v.__size_ > capacity()) { 2504e78f53d1SNikolas Klauser __vdeallocate(); 2505e78f53d1SNikolas Klauser __vallocate(__v.__size_); 2506e78f53d1SNikolas Klauser } 2507e78f53d1SNikolas Klauser std::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_); 2508e78f53d1SNikolas Klauser } 2509e78f53d1SNikolas Klauser __size_ = __v.__size_; 2510e78f53d1SNikolas Klauser } 2511e78f53d1SNikolas Klauser return *this; 2512e78f53d1SNikolas Klauser} 2513e78f53d1SNikolas Klauser 2514e78f53d1SNikolas Klausertemplate <class _Allocator> 2515e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(vector&& __v) 2516e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 2517e78f53d1SNikolas Klauser _NOEXCEPT 2518e78f53d1SNikolas Klauser#else 2519e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) 2520e78f53d1SNikolas Klauser#endif 2521e78f53d1SNikolas Klauser : __begin_(__v.__begin_), 2522e78f53d1SNikolas Klauser __size_(__v.__size_), 2523e78f53d1SNikolas Klauser __cap_alloc_(std::move(__v.__cap_alloc_)) { 2524e78f53d1SNikolas Klauser __v.__begin_ = nullptr; 2525e78f53d1SNikolas Klauser __v.__size_ = 0; 2526e78f53d1SNikolas Klauser __v.__cap() = 0; 2527e78f53d1SNikolas Klauser} 2528e78f53d1SNikolas Klauser 2529e78f53d1SNikolas Klausertemplate <class _Allocator> 2530e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 2531e78f53d1SNikolas Klauservector<bool, _Allocator>::vector(vector&& __v, const __type_identity_t<allocator_type>& __a) 2532e78f53d1SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_alloc_(0, __a) { 2533e78f53d1SNikolas Klauser if (__a == allocator_type(__v.__alloc())) { 2534e78f53d1SNikolas Klauser this->__begin_ = __v.__begin_; 2535e78f53d1SNikolas Klauser this->__size_ = __v.__size_; 2536e78f53d1SNikolas Klauser this->__cap() = __v.__cap(); 2537e78f53d1SNikolas Klauser __v.__begin_ = nullptr; 2538e78f53d1SNikolas Klauser __v.__cap() = __v.__size_ = 0; 2539e78f53d1SNikolas Klauser } else if (__v.size() > 0) { 2540e78f53d1SNikolas Klauser __vallocate(__v.size()); 2541e78f53d1SNikolas Klauser __construct_at_end(__v.begin(), __v.end(), __v.size()); 2542e78f53d1SNikolas Klauser } 2543e78f53d1SNikolas Klauser} 2544e78f53d1SNikolas Klauser 2545e78f53d1SNikolas Klausertemplate <class _Allocator> 2546e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>& 2547e78f53d1SNikolas Klauservector<bool, _Allocator>::operator=(vector&& __v) 2548e78f53d1SNikolas Klauser _NOEXCEPT_(__noexcept_move_assign_container<_Allocator, __alloc_traits>::value) { 2549e78f53d1SNikolas Klauser __move_assign(__v, integral_constant<bool, __storage_traits::propagate_on_container_move_assignment::value>()); 2550e78f53d1SNikolas Klauser return *this; 2551e78f53d1SNikolas Klauser} 2552e78f53d1SNikolas Klauser 2553e78f53d1SNikolas Klausertemplate <class _Allocator> 2554e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::__move_assign(vector& __c, false_type) { 2555e78f53d1SNikolas Klauser if (__alloc() != __c.__alloc()) 2556e78f53d1SNikolas Klauser assign(__c.begin(), __c.end()); 2557e78f53d1SNikolas Klauser else 2558e78f53d1SNikolas Klauser __move_assign(__c, true_type()); 2559e78f53d1SNikolas Klauser} 2560e78f53d1SNikolas Klauser 2561e78f53d1SNikolas Klausertemplate <class _Allocator> 2562e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::__move_assign(vector& __c, true_type) 2563e78f53d1SNikolas Klauser _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) { 2564e78f53d1SNikolas Klauser __vdeallocate(); 2565e78f53d1SNikolas Klauser __move_assign_alloc(__c); 2566e78f53d1SNikolas Klauser this->__begin_ = __c.__begin_; 2567e78f53d1SNikolas Klauser this->__size_ = __c.__size_; 2568e78f53d1SNikolas Klauser this->__cap() = __c.__cap(); 2569e78f53d1SNikolas Klauser __c.__begin_ = nullptr; 2570e78f53d1SNikolas Klauser __c.__cap() = __c.__size_ = 0; 2571e78f53d1SNikolas Klauser} 2572e78f53d1SNikolas Klauser 2573e78f53d1SNikolas Klausertemplate <class _Allocator> 2574e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::assign(size_type __n, const value_type& __x) { 2575e78f53d1SNikolas Klauser __size_ = 0; 2576e78f53d1SNikolas Klauser if (__n > 0) { 2577e78f53d1SNikolas Klauser size_type __c = capacity(); 2578e78f53d1SNikolas Klauser if (__n <= __c) 2579e78f53d1SNikolas Klauser __size_ = __n; 2580e78f53d1SNikolas Klauser else { 2581e78f53d1SNikolas Klauser vector __v(get_allocator()); 2582e78f53d1SNikolas Klauser __v.reserve(__recommend(__n)); 2583e78f53d1SNikolas Klauser __v.__size_ = __n; 2584e78f53d1SNikolas Klauser swap(__v); 2585e78f53d1SNikolas Klauser } 2586e78f53d1SNikolas Klauser std::fill_n(begin(), __n, __x); 2587e78f53d1SNikolas Klauser } 2588e78f53d1SNikolas Klauser} 2589e78f53d1SNikolas Klauser 2590e78f53d1SNikolas Klausertemplate <class _Allocator> 2591e78f53d1SNikolas Klausertemplate <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> > 2592e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last) { 2593e78f53d1SNikolas Klauser __assign_with_sentinel(__first, __last); 2594e78f53d1SNikolas Klauser} 2595e78f53d1SNikolas Klauser 2596e78f53d1SNikolas Klausertemplate <class _Allocator> 2597e78f53d1SNikolas Klausertemplate <class _Iterator, class _Sentinel> 2598e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 2599e78f53d1SNikolas Klauservector<bool, _Allocator>::__assign_with_sentinel(_Iterator __first, _Sentinel __last) { 2600e78f53d1SNikolas Klauser clear(); 2601e78f53d1SNikolas Klauser for (; __first != __last; ++__first) 2602e78f53d1SNikolas Klauser push_back(*__first); 2603e78f53d1SNikolas Klauser} 2604e78f53d1SNikolas Klauser 2605e78f53d1SNikolas Klausertemplate <class _Allocator> 2606e78f53d1SNikolas Klausertemplate <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> > 2607e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) { 2608e78f53d1SNikolas Klauser __assign_with_size(__first, __last, std::distance(__first, __last)); 2609e78f53d1SNikolas Klauser} 2610e78f53d1SNikolas Klauser 2611e78f53d1SNikolas Klausertemplate <class _Allocator> 2612e78f53d1SNikolas Klausertemplate <class _ForwardIterator, class _Sentinel> 2613e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 2614e78f53d1SNikolas Klauservector<bool, _Allocator>::__assign_with_size(_ForwardIterator __first, _Sentinel __last, difference_type __ns) { 2615e78f53d1SNikolas Klauser _LIBCPP_ASSERT_VALID_INPUT_RANGE(__ns >= 0, "invalid range specified"); 2616e78f53d1SNikolas Klauser 2617e78f53d1SNikolas Klauser clear(); 2618e78f53d1SNikolas Klauser 2619e78f53d1SNikolas Klauser const size_t __n = static_cast<size_type>(__ns); 2620e78f53d1SNikolas Klauser if (__n) { 2621e78f53d1SNikolas Klauser if (__n > capacity()) { 2622e78f53d1SNikolas Klauser __vdeallocate(); 2623e78f53d1SNikolas Klauser __vallocate(__n); 2624e78f53d1SNikolas Klauser } 2625e78f53d1SNikolas Klauser __construct_at_end(__first, __last, __n); 2626e78f53d1SNikolas Klauser } 2627e78f53d1SNikolas Klauser} 2628e78f53d1SNikolas Klauser 2629e78f53d1SNikolas Klausertemplate <class _Allocator> 2630e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::reserve(size_type __n) { 2631e78f53d1SNikolas Klauser if (__n > capacity()) { 2632e78f53d1SNikolas Klauser if (__n > max_size()) 2633e78f53d1SNikolas Klauser this->__throw_length_error(); 2634e78f53d1SNikolas Klauser vector __v(this->get_allocator()); 2635e78f53d1SNikolas Klauser __v.__vallocate(__n); 2636e78f53d1SNikolas Klauser __v.__construct_at_end(this->begin(), this->end(), this->size()); 2637e78f53d1SNikolas Klauser swap(__v); 2638e78f53d1SNikolas Klauser } 2639e78f53d1SNikolas Klauser} 2640e78f53d1SNikolas Klauser 2641e78f53d1SNikolas Klausertemplate <class _Allocator> 2642e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT { 2643e78f53d1SNikolas Klauser if (__external_cap_to_internal(size()) > __cap()) { 2644e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 2645e78f53d1SNikolas Klauser try { 2646e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS 2647e78f53d1SNikolas Klauser vector(*this, allocator_type(__alloc())).swap(*this); 2648e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 2649e78f53d1SNikolas Klauser } catch (...) { 2650e78f53d1SNikolas Klauser } 2651e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS 2652e78f53d1SNikolas Klauser } 2653e78f53d1SNikolas Klauser} 2654e78f53d1SNikolas Klauser 2655e78f53d1SNikolas Klausertemplate <class _Allocator> 2656e78f53d1SNikolas Klausertypename vector<bool, _Allocator>::reference vector<bool, _Allocator>::at(size_type __n) { 2657e78f53d1SNikolas Klauser if (__n >= size()) 2658e78f53d1SNikolas Klauser this->__throw_out_of_range(); 2659e78f53d1SNikolas Klauser return (*this)[__n]; 2660e78f53d1SNikolas Klauser} 2661e78f53d1SNikolas Klauser 2662e78f53d1SNikolas Klausertemplate <class _Allocator> 2663e78f53d1SNikolas Klausertypename vector<bool, _Allocator>::const_reference vector<bool, _Allocator>::at(size_type __n) const { 2664e78f53d1SNikolas Klauser if (__n >= size()) 2665e78f53d1SNikolas Klauser this->__throw_out_of_range(); 2666e78f53d1SNikolas Klauser return (*this)[__n]; 2667e78f53d1SNikolas Klauser} 2668e78f53d1SNikolas Klauser 2669e78f53d1SNikolas Klausertemplate <class _Allocator> 2670e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::push_back(const value_type& __x) { 2671e78f53d1SNikolas Klauser if (this->__size_ == this->capacity()) 2672e78f53d1SNikolas Klauser reserve(__recommend(this->__size_ + 1)); 2673e78f53d1SNikolas Klauser ++this->__size_; 2674e78f53d1SNikolas Klauser back() = __x; 2675e78f53d1SNikolas Klauser} 2676e78f53d1SNikolas Klauser 2677e78f53d1SNikolas Klausertemplate <class _Allocator> 2678e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 2679e78f53d1SNikolas Klauservector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x) { 2680e78f53d1SNikolas Klauser iterator __r; 2681e78f53d1SNikolas Klauser if (size() < capacity()) { 2682e78f53d1SNikolas Klauser const_iterator __old_end = end(); 2683e78f53d1SNikolas Klauser ++__size_; 2684e78f53d1SNikolas Klauser std::copy_backward(__position, __old_end, end()); 2685e78f53d1SNikolas Klauser __r = __const_iterator_cast(__position); 2686e78f53d1SNikolas Klauser } else { 2687e78f53d1SNikolas Klauser vector __v(get_allocator()); 2688e78f53d1SNikolas Klauser __v.reserve(__recommend(__size_ + 1)); 2689e78f53d1SNikolas Klauser __v.__size_ = __size_ + 1; 2690e78f53d1SNikolas Klauser __r = std::copy(cbegin(), __position, __v.begin()); 2691e78f53d1SNikolas Klauser std::copy_backward(__position, cend(), __v.end()); 2692e78f53d1SNikolas Klauser swap(__v); 2693e78f53d1SNikolas Klauser } 2694e78f53d1SNikolas Klauser *__r = __x; 2695e78f53d1SNikolas Klauser return __r; 2696e78f53d1SNikolas Klauser} 2697e78f53d1SNikolas Klauser 2698e78f53d1SNikolas Klausertemplate <class _Allocator> 2699e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 2700e78f53d1SNikolas Klauservector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x) { 2701e78f53d1SNikolas Klauser iterator __r; 2702e78f53d1SNikolas Klauser size_type __c = capacity(); 2703e78f53d1SNikolas Klauser if (__n <= __c && size() <= __c - __n) { 2704e78f53d1SNikolas Klauser const_iterator __old_end = end(); 2705e78f53d1SNikolas Klauser __size_ += __n; 2706e78f53d1SNikolas Klauser std::copy_backward(__position, __old_end, end()); 2707e78f53d1SNikolas Klauser __r = __const_iterator_cast(__position); 2708e78f53d1SNikolas Klauser } else { 2709e78f53d1SNikolas Klauser vector __v(get_allocator()); 2710e78f53d1SNikolas Klauser __v.reserve(__recommend(__size_ + __n)); 2711e78f53d1SNikolas Klauser __v.__size_ = __size_ + __n; 2712e78f53d1SNikolas Klauser __r = std::copy(cbegin(), __position, __v.begin()); 2713e78f53d1SNikolas Klauser std::copy_backward(__position, cend(), __v.end()); 2714e78f53d1SNikolas Klauser swap(__v); 2715e78f53d1SNikolas Klauser } 2716e78f53d1SNikolas Klauser std::fill_n(__r, __n, __x); 2717e78f53d1SNikolas Klauser return __r; 2718e78f53d1SNikolas Klauser} 2719e78f53d1SNikolas Klauser 2720e78f53d1SNikolas Klausertemplate <class _Allocator> 2721e78f53d1SNikolas Klausertemplate <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> > 2722e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 2723e78f53d1SNikolas Klauservector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last) { 2724e78f53d1SNikolas Klauser return __insert_with_sentinel(__position, __first, __last); 2725e78f53d1SNikolas Klauser} 2726e78f53d1SNikolas Klauser 2727e78f53d1SNikolas Klausertemplate <class _Allocator> 2728e78f53d1SNikolas Klausertemplate <class _InputIterator, class _Sentinel> 2729e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI typename vector<bool, _Allocator>::iterator 2730e78f53d1SNikolas Klauservector<bool, _Allocator>::__insert_with_sentinel(const_iterator __position, _InputIterator __first, _Sentinel __last) { 2731e78f53d1SNikolas Klauser difference_type __off = __position - begin(); 2732e78f53d1SNikolas Klauser iterator __p = __const_iterator_cast(__position); 2733e78f53d1SNikolas Klauser iterator __old_end = end(); 2734e78f53d1SNikolas Klauser for (; size() != capacity() && __first != __last; ++__first) { 2735e78f53d1SNikolas Klauser ++this->__size_; 2736e78f53d1SNikolas Klauser back() = *__first; 2737e78f53d1SNikolas Klauser } 2738e78f53d1SNikolas Klauser vector __v(get_allocator()); 2739e78f53d1SNikolas Klauser if (__first != __last) { 2740e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 2741e78f53d1SNikolas Klauser try { 2742e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS 2743e78f53d1SNikolas Klauser __v.__assign_with_sentinel(std::move(__first), std::move(__last)); 2744e78f53d1SNikolas Klauser difference_type __old_size = static_cast<difference_type>(__old_end - begin()); 2745e78f53d1SNikolas Klauser difference_type __old_p = __p - begin(); 2746e78f53d1SNikolas Klauser reserve(__recommend(size() + __v.size())); 2747e78f53d1SNikolas Klauser __p = begin() + __old_p; 2748e78f53d1SNikolas Klauser __old_end = begin() + __old_size; 2749e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 2750e78f53d1SNikolas Klauser } catch (...) { 2751e78f53d1SNikolas Klauser erase(__old_end, end()); 2752e78f53d1SNikolas Klauser throw; 2753e78f53d1SNikolas Klauser } 2754e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS 2755e78f53d1SNikolas Klauser } 2756e78f53d1SNikolas Klauser __p = std::rotate(__p, __old_end, end()); 2757e78f53d1SNikolas Klauser insert(__p, __v.begin(), __v.end()); 2758e78f53d1SNikolas Klauser return begin() + __off; 2759e78f53d1SNikolas Klauser} 2760e78f53d1SNikolas Klauser 2761e78f53d1SNikolas Klausertemplate <class _Allocator> 2762e78f53d1SNikolas Klausertemplate <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> > 2763e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 2764e78f53d1SNikolas Klauservector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last) { 2765e78f53d1SNikolas Klauser return __insert_with_size(__position, __first, __last, std::distance(__first, __last)); 2766e78f53d1SNikolas Klauser} 2767e78f53d1SNikolas Klauser 2768e78f53d1SNikolas Klausertemplate <class _Allocator> 2769e78f53d1SNikolas Klausertemplate <class _ForwardIterator, class _Sentinel> 2770e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI typename vector<bool, _Allocator>::iterator 2771e78f53d1SNikolas Klauservector<bool, _Allocator>::__insert_with_size( 2772e78f53d1SNikolas Klauser const_iterator __position, _ForwardIterator __first, _Sentinel __last, difference_type __n_signed) { 2773e78f53d1SNikolas Klauser _LIBCPP_ASSERT_VALID_INPUT_RANGE(__n_signed >= 0, "invalid range specified"); 2774e78f53d1SNikolas Klauser const size_type __n = static_cast<size_type>(__n_signed); 2775e78f53d1SNikolas Klauser iterator __r; 2776e78f53d1SNikolas Klauser size_type __c = capacity(); 2777e78f53d1SNikolas Klauser if (__n <= __c && size() <= __c - __n) { 2778e78f53d1SNikolas Klauser const_iterator __old_end = end(); 2779e78f53d1SNikolas Klauser __size_ += __n; 2780e78f53d1SNikolas Klauser std::copy_backward(__position, __old_end, end()); 2781e78f53d1SNikolas Klauser __r = __const_iterator_cast(__position); 2782e78f53d1SNikolas Klauser } else { 2783e78f53d1SNikolas Klauser vector __v(get_allocator()); 2784e78f53d1SNikolas Klauser __v.reserve(__recommend(__size_ + __n)); 2785e78f53d1SNikolas Klauser __v.__size_ = __size_ + __n; 2786e78f53d1SNikolas Klauser __r = std::copy(cbegin(), __position, __v.begin()); 2787e78f53d1SNikolas Klauser std::copy_backward(__position, cend(), __v.end()); 2788e78f53d1SNikolas Klauser swap(__v); 2789e78f53d1SNikolas Klauser } 2790e78f53d1SNikolas Klauser std::__copy<_ClassicAlgPolicy>(__first, __last, __r); 2791e78f53d1SNikolas Klauser return __r; 2792e78f53d1SNikolas Klauser} 2793e78f53d1SNikolas Klauser 2794e78f53d1SNikolas Klausertemplate <class _Allocator> 2795e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 2796e78f53d1SNikolas Klauservector<bool, _Allocator>::erase(const_iterator __position) { 2797e78f53d1SNikolas Klauser iterator __r = __const_iterator_cast(__position); 2798e78f53d1SNikolas Klauser std::copy(__position + 1, this->cend(), __r); 2799e78f53d1SNikolas Klauser --__size_; 2800e78f53d1SNikolas Klauser return __r; 2801e78f53d1SNikolas Klauser} 2802e78f53d1SNikolas Klauser 2803e78f53d1SNikolas Klausertemplate <class _Allocator> 2804e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 2805e78f53d1SNikolas Klauservector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last) { 2806e78f53d1SNikolas Klauser iterator __r = __const_iterator_cast(__first); 2807e78f53d1SNikolas Klauser difference_type __d = __last - __first; 2808e78f53d1SNikolas Klauser std::copy(__last, this->cend(), __r); 2809e78f53d1SNikolas Klauser __size_ -= __d; 2810e78f53d1SNikolas Klauser return __r; 2811e78f53d1SNikolas Klauser} 2812e78f53d1SNikolas Klauser 2813e78f53d1SNikolas Klausertemplate <class _Allocator> 2814e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::swap(vector& __x) 2815e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 2816e78f53d1SNikolas Klauser _NOEXCEPT 2817e78f53d1SNikolas Klauser#else 2818e78f53d1SNikolas Klauser _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || __is_nothrow_swappable_v<allocator_type>) 2819e78f53d1SNikolas Klauser#endif 2820e78f53d1SNikolas Klauser{ 2821e78f53d1SNikolas Klauser std::swap(this->__begin_, __x.__begin_); 2822e78f53d1SNikolas Klauser std::swap(this->__size_, __x.__size_); 2823e78f53d1SNikolas Klauser std::swap(this->__cap(), __x.__cap()); 2824e78f53d1SNikolas Klauser std::__swap_allocator( 2825e78f53d1SNikolas Klauser this->__alloc(), __x.__alloc(), integral_constant<bool, __alloc_traits::propagate_on_container_swap::value>()); 2826e78f53d1SNikolas Klauser} 2827e78f53d1SNikolas Klauser 2828e78f53d1SNikolas Klausertemplate <class _Allocator> 2829e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::resize(size_type __sz, value_type __x) { 2830e78f53d1SNikolas Klauser size_type __cs = size(); 2831e78f53d1SNikolas Klauser if (__cs < __sz) { 2832e78f53d1SNikolas Klauser iterator __r; 2833e78f53d1SNikolas Klauser size_type __c = capacity(); 2834e78f53d1SNikolas Klauser size_type __n = __sz - __cs; 2835e78f53d1SNikolas Klauser if (__n <= __c && __cs <= __c - __n) { 2836e78f53d1SNikolas Klauser __r = end(); 2837e78f53d1SNikolas Klauser __size_ += __n; 2838e78f53d1SNikolas Klauser } else { 2839e78f53d1SNikolas Klauser vector __v(get_allocator()); 2840e78f53d1SNikolas Klauser __v.reserve(__recommend(__size_ + __n)); 2841e78f53d1SNikolas Klauser __v.__size_ = __size_ + __n; 2842e78f53d1SNikolas Klauser __r = std::copy(cbegin(), cend(), __v.begin()); 2843e78f53d1SNikolas Klauser swap(__v); 2844e78f53d1SNikolas Klauser } 2845e78f53d1SNikolas Klauser std::fill_n(__r, __n, __x); 2846e78f53d1SNikolas Klauser } else 2847e78f53d1SNikolas Klauser __size_ = __sz; 2848e78f53d1SNikolas Klauser} 2849e78f53d1SNikolas Klauser 2850e78f53d1SNikolas Klausertemplate <class _Allocator> 2851e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::flip() _NOEXCEPT { 2852e78f53d1SNikolas Klauser // do middle whole words 2853e78f53d1SNikolas Klauser size_type __n = __size_; 2854e78f53d1SNikolas Klauser __storage_pointer __p = __begin_; 2855e78f53d1SNikolas Klauser for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) 2856e78f53d1SNikolas Klauser *__p = ~*__p; 2857e78f53d1SNikolas Klauser // do last partial word 2858e78f53d1SNikolas Klauser if (__n > 0) { 2859e78f53d1SNikolas Klauser __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 2860e78f53d1SNikolas Klauser __storage_type __b = *__p & __m; 2861e78f53d1SNikolas Klauser *__p &= ~__m; 2862e78f53d1SNikolas Klauser *__p |= ~__b & __m; 2863e78f53d1SNikolas Klauser } 2864e78f53d1SNikolas Klauser} 2865e78f53d1SNikolas Klauser 2866e78f53d1SNikolas Klausertemplate <class _Allocator> 2867e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 bool vector<bool, _Allocator>::__invariants() const { 2868e78f53d1SNikolas Klauser if (this->__begin_ == nullptr) { 2869e78f53d1SNikolas Klauser if (this->__size_ != 0 || this->__cap() != 0) 2870e78f53d1SNikolas Klauser return false; 2871e78f53d1SNikolas Klauser } else { 2872e78f53d1SNikolas Klauser if (this->__cap() == 0) 2873e78f53d1SNikolas Klauser return false; 2874e78f53d1SNikolas Klauser if (this->__size_ > this->capacity()) 2875e78f53d1SNikolas Klauser return false; 2876e78f53d1SNikolas Klauser } 2877e78f53d1SNikolas Klauser return true; 2878e78f53d1SNikolas Klauser} 2879e78f53d1SNikolas Klauser 2880e78f53d1SNikolas Klausertemplate <class _Allocator> 2881e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 size_t vector<bool, _Allocator>::__hash_code() const _NOEXCEPT { 2882e78f53d1SNikolas Klauser size_t __h = 0; 2883e78f53d1SNikolas Klauser // do middle whole words 2884e78f53d1SNikolas Klauser size_type __n = __size_; 2885e78f53d1SNikolas Klauser __storage_pointer __p = __begin_; 2886e78f53d1SNikolas Klauser for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) 2887e78f53d1SNikolas Klauser __h ^= *__p; 2888e78f53d1SNikolas Klauser // do last partial word 2889e78f53d1SNikolas Klauser if (__n > 0) { 2890e78f53d1SNikolas Klauser const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 2891e78f53d1SNikolas Klauser __h ^= *__p & __m; 2892e78f53d1SNikolas Klauser } 2893e78f53d1SNikolas Klauser return __h; 2894e78f53d1SNikolas Klauser} 2895e78f53d1SNikolas Klauser 2896e78f53d1SNikolas Klausertemplate <class _Allocator> 2897e78f53d1SNikolas Klauserstruct _LIBCPP_TEMPLATE_VIS hash<vector<bool, _Allocator> > 2898e78f53d1SNikolas Klauser : public __unary_function<vector<bool, _Allocator>, size_t> { 2899e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_t 2900e78f53d1SNikolas Klauser operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT { 2901e78f53d1SNikolas Klauser return __vec.__hash_code(); 2902e78f53d1SNikolas Klauser } 2903e78f53d1SNikolas Klauser}; 2904e78f53d1SNikolas Klauser 2905e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 2906e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI bool 2907e78f53d1SNikolas Klauseroperator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) { 2908e78f53d1SNikolas Klauser const typename vector<_Tp, _Allocator>::size_type __sz = __x.size(); 2909e78f53d1SNikolas Klauser return __sz == __y.size() && std::equal(__x.begin(), __x.end(), __y.begin()); 2910e78f53d1SNikolas Klauser} 2911e78f53d1SNikolas Klauser 2912e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER <= 17 2913e78f53d1SNikolas Klauser 2914e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 2915e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) { 2916e78f53d1SNikolas Klauser return !(__x == __y); 2917e78f53d1SNikolas Klauser} 2918e78f53d1SNikolas Klauser 2919e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 2920e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator<(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) { 2921e78f53d1SNikolas Klauser return std::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 2922e78f53d1SNikolas Klauser} 2923e78f53d1SNikolas Klauser 2924e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 2925e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator>(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) { 2926e78f53d1SNikolas Klauser return __y < __x; 2927e78f53d1SNikolas Klauser} 2928e78f53d1SNikolas Klauser 2929e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 2930e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) { 2931e78f53d1SNikolas Klauser return !(__x < __y); 2932e78f53d1SNikolas Klauser} 2933e78f53d1SNikolas Klauser 2934e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 2935e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) { 2936e78f53d1SNikolas Klauser return !(__y < __x); 2937e78f53d1SNikolas Klauser} 2938e78f53d1SNikolas Klauser 2939e78f53d1SNikolas Klauser#else // _LIBCPP_STD_VER <= 17 2940e78f53d1SNikolas Klauser 2941e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 2942e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI constexpr __synth_three_way_result<_Tp> 2943e78f53d1SNikolas Klauseroperator<=>(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) { 2944e78f53d1SNikolas Klauser return std::lexicographical_compare_three_way(__x.begin(), __x.end(), __y.begin(), __y.end(), std::__synth_three_way); 2945e78f53d1SNikolas Klauser} 2946e78f53d1SNikolas Klauser 2947e78f53d1SNikolas Klauser#endif // _LIBCPP_STD_VER <= 17 2948e78f53d1SNikolas Klauser 2949e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator> 2950e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI void 2951e78f53d1SNikolas Klauserswap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y) _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) { 2952e78f53d1SNikolas Klauser __x.swap(__y); 2953e78f53d1SNikolas Klauser} 2954e78f53d1SNikolas Klauser 2955e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20 2956e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator, class _Up> 2957e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::size_type 2958e78f53d1SNikolas Klausererase(vector<_Tp, _Allocator>& __c, const _Up& __v) { 2959e78f53d1SNikolas Klauser auto __old_size = __c.size(); 2960e78f53d1SNikolas Klauser __c.erase(std::remove(__c.begin(), __c.end(), __v), __c.end()); 2961e78f53d1SNikolas Klauser return __old_size - __c.size(); 2962e78f53d1SNikolas Klauser} 2963e78f53d1SNikolas Klauser 2964e78f53d1SNikolas Klausertemplate <class _Tp, class _Allocator, class _Predicate> 2965e78f53d1SNikolas Klauser_LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::size_type 2966e78f53d1SNikolas Klausererase_if(vector<_Tp, _Allocator>& __c, _Predicate __pred) { 2967e78f53d1SNikolas Klauser auto __old_size = __c.size(); 2968e78f53d1SNikolas Klauser __c.erase(std::remove_if(__c.begin(), __c.end(), __pred), __c.end()); 2969e78f53d1SNikolas Klauser return __old_size - __c.size(); 2970e78f53d1SNikolas Klauser} 2971e78f53d1SNikolas Klauser 2972e78f53d1SNikolas Klausertemplate <> 2973e78f53d1SNikolas Klauserinline constexpr bool __format::__enable_insertable<vector<char>> = true; 2974e78f53d1SNikolas Klauser# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 2975e78f53d1SNikolas Klausertemplate <> 2976e78f53d1SNikolas Klauserinline constexpr bool __format::__enable_insertable<vector<wchar_t>> = true; 2977e78f53d1SNikolas Klauser# endif 2978e78f53d1SNikolas Klauser 2979e78f53d1SNikolas Klauser#endif // _LIBCPP_STD_VER >= 20 2980e78f53d1SNikolas Klauser 2981e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 23 2982e78f53d1SNikolas Klausertemplate <class _Tp, class _CharT> 2983e78f53d1SNikolas Klauser// Since is-vector-bool-reference is only used once it's inlined here. 2984e78f53d1SNikolas Klauser requires same_as<typename _Tp::__container, vector<bool, typename _Tp::__container::allocator_type>> 2985e78f53d1SNikolas Klauserstruct _LIBCPP_TEMPLATE_VIS formatter<_Tp, _CharT> { 2986e78f53d1SNikolas Klauserprivate: 2987e78f53d1SNikolas Klauser formatter<bool, _CharT> __underlying_; 2988e78f53d1SNikolas Klauser 2989e78f53d1SNikolas Klauserpublic: 2990e78f53d1SNikolas Klauser template <class _ParseContext> 2991e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr typename _ParseContext::iterator parse(_ParseContext& __ctx) { 2992e78f53d1SNikolas Klauser return __underlying_.parse(__ctx); 2993e78f53d1SNikolas Klauser } 2994e78f53d1SNikolas Klauser 2995e78f53d1SNikolas Klauser template <class _FormatContext> 2996e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator format(const _Tp& __ref, _FormatContext& __ctx) const { 2997e78f53d1SNikolas Klauser return __underlying_.format(__ref, __ctx); 2998e78f53d1SNikolas Klauser } 2999e78f53d1SNikolas Klauser}; 3000e78f53d1SNikolas Klauser#endif // _LIBCPP_STD_VER >= 23 3001e78f53d1SNikolas Klauser 3002e78f53d1SNikolas Klauser_LIBCPP_END_NAMESPACE_STD 3003e78f53d1SNikolas Klauser 3004e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 3005e78f53d1SNikolas Klauser_LIBCPP_BEGIN_NAMESPACE_STD 3006e78f53d1SNikolas Klausernamespace pmr { 3007e78f53d1SNikolas Klausertemplate <class _ValueT> 3008e78f53d1SNikolas Klauserusing vector _LIBCPP_AVAILABILITY_PMR = std::vector<_ValueT, polymorphic_allocator<_ValueT>>; 3009e78f53d1SNikolas Klauser} // namespace pmr 3010e78f53d1SNikolas Klauser_LIBCPP_END_NAMESPACE_STD 3011e78f53d1SNikolas Klauser#endif 3012e78f53d1SNikolas Klauser 3013e78f53d1SNikolas Klauser_LIBCPP_POP_MACROS 3014e78f53d1SNikolas Klauser 3015e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 301673fbae83SNikolas Klauser# include <__cxx03/algorithm> 301773fbae83SNikolas Klauser# include <__cxx03/atomic> 301873fbae83SNikolas Klauser# include <__cxx03/concepts> 301973fbae83SNikolas Klauser# include <__cxx03/cstdlib> 302073fbae83SNikolas Klauser# include <__cxx03/iosfwd> 3021e78f53d1SNikolas Klauser# if !defined(_LIBCPP_HAS_NO_LOCALIZATION) 302273fbae83SNikolas Klauser# include <__cxx03/locale> 3023e78f53d1SNikolas Klauser# endif 302473fbae83SNikolas Klauser# include <__cxx03/tuple> 302573fbae83SNikolas Klauser# include <__cxx03/type_traits> 302673fbae83SNikolas Klauser# include <__cxx03/typeinfo> 302773fbae83SNikolas Klauser# include <__cxx03/utility> 3028e78f53d1SNikolas Klauser#endif 3029e78f53d1SNikolas Klauser 3030*ce777190SNikolas Klauser#endif // _LIBCPP___CXX03_VECTOR 3031