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