xref: /llvm-project/libcxx/include/__cxx03/vector (revision ce7771902dc50d900de639d499a60486b83f70e0)
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