| // -*- C++ -*- |
| //===----------------------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef _LIBCPP_VECTOR |
| #define _LIBCPP_VECTOR |
| |
| // clang-format off |
| |
| /* |
| vector synopsis |
| |
| namespace std |
| { |
| |
| template <class T, class Allocator = allocator<T> > |
| class vector |
| { |
| public: |
| typedef T value_type; |
| typedef Allocator allocator_type; |
| typedef typename allocator_type::reference reference; |
| typedef typename allocator_type::const_reference const_reference; |
| typedef implementation-defined iterator; |
| typedef implementation-defined const_iterator; |
| typedef typename allocator_type::size_type size_type; |
| typedef typename allocator_type::difference_type difference_type; |
| typedef typename allocator_type::pointer pointer; |
| typedef typename allocator_type::const_pointer const_pointer; |
| typedef std::reverse_iterator<iterator> reverse_iterator; |
| typedef std::reverse_iterator<const_iterator> const_reverse_iterator; |
| |
| vector() |
| noexcept(is_nothrow_default_constructible<allocator_type>::value); |
| explicit vector(const allocator_type&); |
| explicit vector(size_type n); |
| explicit vector(size_type n, const allocator_type&); // C++14 |
| vector(size_type n, const value_type& value, const allocator_type& = allocator_type()); |
| template <class InputIterator> |
| vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type()); |
| template<container-compatible-range<T> R> |
| constexpr vector(from_range_t, R&& rg, const Allocator& = Allocator()); // C++23 |
| vector(const vector& x); |
| vector(vector&& x) |
| noexcept(is_nothrow_move_constructible<allocator_type>::value); |
| vector(initializer_list<value_type> il); |
| vector(initializer_list<value_type> il, const allocator_type& a); |
| ~vector(); |
| vector& operator=(const vector& x); |
| vector& operator=(vector&& x) |
| noexcept( |
| allocator_type::propagate_on_container_move_assignment::value || |
| allocator_type::is_always_equal::value); // C++17 |
| vector& operator=(initializer_list<value_type> il); |
| template <class InputIterator> |
| void assign(InputIterator first, InputIterator last); |
| template<container-compatible-range<T> R> |
| constexpr void assign_range(R&& rg); // C++23 |
| void assign(size_type n, const value_type& u); |
| void assign(initializer_list<value_type> il); |
| |
| allocator_type get_allocator() const noexcept; |
| |
| iterator begin() noexcept; |
| const_iterator begin() const noexcept; |
| iterator end() noexcept; |
| const_iterator end() const noexcept; |
| |
| reverse_iterator rbegin() noexcept; |
| const_reverse_iterator rbegin() const noexcept; |
| reverse_iterator rend() noexcept; |
| const_reverse_iterator rend() const noexcept; |
| |
| const_iterator cbegin() const noexcept; |
| const_iterator cend() const noexcept; |
| const_reverse_iterator crbegin() const noexcept; |
| const_reverse_iterator crend() const noexcept; |
| |
| size_type size() const noexcept; |
| size_type max_size() const noexcept; |
| size_type capacity() const noexcept; |
| bool empty() const noexcept; |
| void reserve(size_type n); |
| void shrink_to_fit() noexcept; |
| |
| reference operator[](size_type n); |
| const_reference operator[](size_type n) const; |
| reference at(size_type n); |
| const_reference at(size_type n) const; |
| |
| reference front(); |
| const_reference front() const; |
| reference back(); |
| const_reference back() const; |
| |
| value_type* data() noexcept; |
| const value_type* data() const noexcept; |
| |
| void push_back(const value_type& x); |
| void push_back(value_type&& x); |
| template <class... Args> |
| reference emplace_back(Args&&... args); // reference in C++17 |
| template<container-compatible-range<T> R> |
| constexpr void append_range(R&& rg); // C++23 |
| void pop_back(); |
| |
| template <class... Args> iterator emplace(const_iterator position, Args&&... args); |
| iterator insert(const_iterator position, const value_type& x); |
| iterator insert(const_iterator position, value_type&& x); |
| iterator insert(const_iterator position, size_type n, const value_type& x); |
| template <class InputIterator> |
| iterator insert(const_iterator position, InputIterator first, InputIterator last); |
| template<container-compatible-range<T> R> |
| constexpr iterator insert_range(const_iterator position, R&& rg); // C++23 |
| iterator insert(const_iterator position, initializer_list<value_type> il); |
| |
| iterator erase(const_iterator position); |
| iterator erase(const_iterator first, const_iterator last); |
| |
| void clear() noexcept; |
| |
| void resize(size_type sz); |
| void resize(size_type sz, const value_type& c); |
| |
| void swap(vector&) |
| noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value || |
| allocator_traits<allocator_type>::is_always_equal::value); // C++17 |
| |
| bool __invariants() const; |
| }; |
| |
| template <class Allocator = allocator<T> > |
| class vector<bool, Allocator> |
| { |
| public: |
| typedef bool value_type; |
| typedef Allocator allocator_type; |
| typedef implementation-defined iterator; |
| typedef implementation-defined const_iterator; |
| typedef typename allocator_type::size_type size_type; |
| typedef typename allocator_type::difference_type difference_type; |
| typedef iterator pointer; |
| typedef const_iterator const_pointer; |
| typedef std::reverse_iterator<iterator> reverse_iterator; |
| typedef std::reverse_iterator<const_iterator> const_reverse_iterator; |
| |
| class reference |
| { |
| public: |
| reference(const reference&) noexcept; |
| operator bool() const noexcept; |
| reference& operator=(bool x) noexcept; |
| reference& operator=(const reference& x) noexcept; |
| iterator operator&() const noexcept; |
| void flip() noexcept; |
| }; |
| |
| class const_reference |
| { |
| public: |
| const_reference(const reference&) noexcept; |
| operator bool() const noexcept; |
| const_iterator operator&() const noexcept; |
| }; |
| |
| vector() |
| noexcept(is_nothrow_default_constructible<allocator_type>::value); |
| explicit vector(const allocator_type&) noexcept; |
| explicit vector(size_type n, const allocator_type& a = allocator_type()); // C++14 |
| vector(size_type n, const value_type& value, const allocator_type& = allocator_type()); |
| template <class InputIterator> |
| vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type()); |
| template<container-compatible-range<bool> R> |
| constexpr vector(from_range_t, R&& rg, const Allocator& = Allocator()); |
| vector(const vector& x); |
| vector(vector&& x) noexcept; |
| vector(initializer_list<value_type> il); |
| vector(initializer_list<value_type> il, const allocator_type& a); |
| ~vector(); |
| vector& operator=(const vector& x); |
| vector& operator=(vector&& x) |
| noexcept( |
| allocator_type::propagate_on_container_move_assignment::value || |
| allocator_type::is_always_equal::value); // C++17 |
| vector& operator=(initializer_list<value_type> il); |
| template <class InputIterator> |
| void assign(InputIterator first, InputIterator last); |
| template<container-compatible-range<T> R> |
| constexpr void assign_range(R&& rg); // C++23 |
| void assign(size_type n, const value_type& u); |
| void assign(initializer_list<value_type> il); |
| |
| allocator_type get_allocator() const noexcept; |
| |
| iterator begin() noexcept; |
| const_iterator begin() const noexcept; |
| iterator end() noexcept; |
| const_iterator end() const noexcept; |
| |
| reverse_iterator rbegin() noexcept; |
| const_reverse_iterator rbegin() const noexcept; |
| reverse_iterator rend() noexcept; |
| const_reverse_iterator rend() const noexcept; |
| |
| const_iterator cbegin() const noexcept; |
| const_iterator cend() const noexcept; |
| const_reverse_iterator crbegin() const noexcept; |
| const_reverse_iterator crend() const noexcept; |
| |
| size_type size() const noexcept; |
| size_type max_size() const noexcept; |
| size_type capacity() const noexcept; |
| bool empty() const noexcept; |
| void reserve(size_type n); |
| void shrink_to_fit() noexcept; |
| |
| reference operator[](size_type n); |
| const_reference operator[](size_type n) const; |
| reference at(size_type n); |
| const_reference at(size_type n) const; |
| |
| reference front(); |
| const_reference front() const; |
| reference back(); |
| const_reference back() const; |
| |
| void push_back(const value_type& x); |
| template <class... Args> reference emplace_back(Args&&... args); // C++14; reference in C++17 |
| template<container-compatible-range<T> R> |
| constexpr void append_range(R&& rg); // C++23 |
| void pop_back(); |
| |
| template <class... Args> iterator emplace(const_iterator position, Args&&... args); // C++14 |
| iterator insert(const_iterator position, const value_type& x); |
| iterator insert(const_iterator position, size_type n, const value_type& x); |
| template <class InputIterator> |
| iterator insert(const_iterator position, InputIterator first, InputIterator last); |
| template<container-compatible-range<T> R> |
| constexpr iterator insert_range(const_iterator position, R&& rg); // C++23 |
| iterator insert(const_iterator position, initializer_list<value_type> il); |
| |
| iterator erase(const_iterator position); |
| iterator erase(const_iterator first, const_iterator last); |
| |
| void clear() noexcept; |
| |
| void resize(size_type sz); |
| void resize(size_type sz, value_type x); |
| |
| void swap(vector&) |
| noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value || |
| allocator_traits<allocator_type>::is_always_equal::value); // C++17 |
| void flip() noexcept; |
| |
| bool __invariants() const; |
| }; |
| |
| template <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>> |
| vector(InputIterator, InputIterator, Allocator = Allocator()) |
| -> vector<typename iterator_traits<InputIterator>::value_type, Allocator>; // C++17 |
| |
| template<ranges::input_range R, class Allocator = allocator<ranges::range_value_t<R>>> |
| vector(from_range_t, R&&, Allocator = Allocator()) |
| -> vector<ranges::range_value_t<R>, Allocator>; // C++23 |
| |
| template <class Allocator> struct hash<std::vector<bool, Allocator>>; |
| |
| template <class T, class Allocator> bool operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y); // constexpr since C++20 |
| template <class T, class Allocator> bool operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); // removed in C++20 |
| template <class T, class Allocator> bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y); // removed in C++20 |
| template <class T, class Allocator> bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y); // removed in C++20 |
| template <class T, class Allocator> bool operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); // removed in C++20 |
| template <class T, class Allocator> bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); // removed in C++20 |
| template <class T, class Allocator> constexpr |
| constexpr synth-three-way-result<T> operator<=>(const vector<T, Allocator>& x, |
| const vector<T, Allocator>& y); // since C++20 |
| |
| template <class T, class Allocator> |
| void swap(vector<T,Allocator>& x, vector<T,Allocator>& y) |
| noexcept(noexcept(x.swap(y))); |
| |
| template <class T, class Allocator, class U> |
| typename vector<T, Allocator>::size_type |
| erase(vector<T, Allocator>& c, const U& value); // since C++20 |
| template <class T, class Allocator, class Predicate> |
| typename vector<T, Allocator>::size_type |
| erase_if(vector<T, Allocator>& c, Predicate pred); // since C++20 |
| |
| |
| template<class T> |
| inline constexpr bool is-vector-bool-reference = see below; // exposition only, since C++23 |
| |
| template<class T, class charT> requires is-vector-bool-reference<T> // Since C++23 |
| struct formatter<T, charT>; |
| |
| } // std |
| |
| */ |
| |
| // clang-format on |
| |
| #include <__config> |
| |
| #include <__vector/comparison.h> |
| #include <__vector/swap.h> |
| #include <__vector/vector.h> |
| #include <__vector/vector_bool.h> |
| |
| #if _LIBCPP_STD_VER >= 17 |
| # include <__vector/pmr.h> |
| #endif |
| |
| #if _LIBCPP_STD_VER >= 20 |
| # include <__vector/erase.h> |
| #endif |
| |
| #if _LIBCPP_STD_VER >= 23 |
| # include <__vector/vector_bool_formatter.h> |
| #endif |
| |
| #include <version> |
| |
| // standard-mandated includes |
| |
| // [iterator.range] |
| #include <__iterator/access.h> |
| #include <__iterator/data.h> |
| #include <__iterator/empty.h> |
| #include <__iterator/reverse_access.h> |
| #include <__iterator/size.h> |
| |
| // [vector.syn] |
| #include <compare> |
| #include <initializer_list> |
| |
| // [vector.syn], [unord.hash] |
| #include <__functional/hash.h> |
| |
| #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
| # pragma GCC system_header |
| #endif |
| |
| #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 |
| # include <algorithm> |
| # include <array> |
| # include <atomic> |
| # include <cctype> |
| # include <cerrno> |
| # include <clocale> |
| # include <concepts> |
| # include <cstdint> |
| # include <cstdlib> |
| # include <iosfwd> |
| # if _LIBCPP_HAS_LOCALIZATION |
| # include <locale> |
| # endif |
| # include <string> |
| # include <string_view> |
| # include <tuple> |
| # include <type_traits> |
| # include <typeinfo> |
| # include <utility> |
| #endif |
| |
| #endif // _LIBCPP_VECTOR |