xref: /llvm-project/libcxx/include/__cxx03/array (revision ce7771902dc50d900de639d499a60486b83f70e0)
1e78f53d1SNikolas Klauser// -*- C++ -*-
2e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===//
3e78f53d1SNikolas Klauser//
4e78f53d1SNikolas Klauser// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5e78f53d1SNikolas Klauser// See https://llvm.org/LICENSE.txt for license information.
6e78f53d1SNikolas Klauser// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7e78f53d1SNikolas Klauser//
8e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===//
9e78f53d1SNikolas Klauser
10*ce777190SNikolas Klauser#ifndef _LIBCPP___CXX03_ARRAY
11*ce777190SNikolas Klauser#define _LIBCPP___CXX03_ARRAY
12e78f53d1SNikolas Klauser
13e78f53d1SNikolas Klauser/*
14e78f53d1SNikolas Klauser    array synopsis
15e78f53d1SNikolas Klauser
16e78f53d1SNikolas Klausernamespace std
17e78f53d1SNikolas Klauser{
18e78f53d1SNikolas Klausertemplate <class T, size_t N >
19e78f53d1SNikolas Klauserstruct array
20e78f53d1SNikolas Klauser{
21e78f53d1SNikolas Klauser    // types:
22e78f53d1SNikolas Klauser    typedef T & reference;
23e78f53d1SNikolas Klauser    typedef const T & const_reference;
24e78f53d1SNikolas Klauser    typedef implementation defined iterator;
25e78f53d1SNikolas Klauser    typedef implementation defined const_iterator;
26e78f53d1SNikolas Klauser    typedef size_t size_type;
27e78f53d1SNikolas Klauser    typedef ptrdiff_t difference_type;
28e78f53d1SNikolas Klauser    typedef T value_type;
29e78f53d1SNikolas Klauser    typedef T* pointer;
30e78f53d1SNikolas Klauser    typedef const T* const_pointer;
31e78f53d1SNikolas Klauser    typedef std::reverse_iterator<iterator> reverse_iterator;
32e78f53d1SNikolas Klauser    typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
33e78f53d1SNikolas Klauser
34e78f53d1SNikolas Klauser    // No explicit construct/copy/destroy for aggregate type
35e78f53d1SNikolas Klauser    void fill(const T& u);                                      // constexpr in C++20
36e78f53d1SNikolas Klauser    void swap(array& a) noexcept(is_nothrow_swappable_v<T>);    // constexpr in C++20
37e78f53d1SNikolas Klauser
38e78f53d1SNikolas Klauser    // iterators:
39e78f53d1SNikolas Klauser    iterator begin() noexcept;                                  // constexpr in C++17
40e78f53d1SNikolas Klauser    const_iterator begin() const noexcept;                      // constexpr in C++17
41e78f53d1SNikolas Klauser    iterator end() noexcept;                                    // constexpr in C++17
42e78f53d1SNikolas Klauser    const_iterator end() const noexcept;                        // constexpr in C++17
43e78f53d1SNikolas Klauser
44e78f53d1SNikolas Klauser    reverse_iterator rbegin() noexcept;                         // constexpr in C++17
45e78f53d1SNikolas Klauser    const_reverse_iterator rbegin() const noexcept;             // constexpr in C++17
46e78f53d1SNikolas Klauser    reverse_iterator rend() noexcept;                           // constexpr in C++17
47e78f53d1SNikolas Klauser    const_reverse_iterator rend() const noexcept;               // constexpr in C++17
48e78f53d1SNikolas Klauser
49e78f53d1SNikolas Klauser    const_iterator cbegin() const noexcept;                     // constexpr in C++17
50e78f53d1SNikolas Klauser    const_iterator cend() const noexcept;                       // constexpr in C++17
51e78f53d1SNikolas Klauser    const_reverse_iterator crbegin() const noexcept;            // constexpr in C++17
52e78f53d1SNikolas Klauser    const_reverse_iterator crend() const noexcept;              // constexpr in C++17
53e78f53d1SNikolas Klauser
54e78f53d1SNikolas Klauser    // capacity:
55e78f53d1SNikolas Klauser    constexpr size_type size() const noexcept;
56e78f53d1SNikolas Klauser    constexpr size_type max_size() const noexcept;
57e78f53d1SNikolas Klauser    constexpr bool empty() const noexcept;
58e78f53d1SNikolas Klauser
59e78f53d1SNikolas Klauser    // element access:
60e78f53d1SNikolas Klauser    reference operator[](size_type n);                          // constexpr in C++17
61e78f53d1SNikolas Klauser    const_reference operator[](size_type n) const;              // constexpr in C++14
62e78f53d1SNikolas Klauser    reference at(size_type n);                                  // constexpr in C++17
63e78f53d1SNikolas Klauser    const_reference at(size_type n) const;                      // constexpr in C++14
64e78f53d1SNikolas Klauser
65e78f53d1SNikolas Klauser    reference front();                                          // constexpr in C++17
66e78f53d1SNikolas Klauser    const_reference front() const;                              // constexpr in C++14
67e78f53d1SNikolas Klauser    reference back();                                           // constexpr in C++17
68e78f53d1SNikolas Klauser    const_reference back() const;                               // constexpr in C++14
69e78f53d1SNikolas Klauser
70e78f53d1SNikolas Klauser    T* data() noexcept;                                         // constexpr in C++17
71e78f53d1SNikolas Klauser    const T* data() const noexcept;                             // constexpr in C++17
72e78f53d1SNikolas Klauser};
73e78f53d1SNikolas Klauser
74e78f53d1SNikolas Klausertemplate <class T, class... U>
75e78f53d1SNikolas Klauser  array(T, U...) -> array<T, 1 + sizeof...(U)>;                 // C++17
76e78f53d1SNikolas Klauser
77e78f53d1SNikolas Klausertemplate <class T, size_t N>
78e78f53d1SNikolas Klauser  bool operator==(const array<T,N>& x, const array<T,N>& y);    // constexpr in C++20
79e78f53d1SNikolas Klausertemplate <class T, size_t N>
80e78f53d1SNikolas Klauser  bool operator!=(const array<T,N>& x, const array<T,N>& y);    // removed in C++20
81e78f53d1SNikolas Klausertemplate <class T, size_t N>
82e78f53d1SNikolas Klauser  bool operator<(const array<T,N>& x, const array<T,N>& y);     // removed in C++20
83e78f53d1SNikolas Klausertemplate <class T, size_t N>
84e78f53d1SNikolas Klauser  bool operator>(const array<T,N>& x, const array<T,N>& y);     // removed in C++20
85e78f53d1SNikolas Klausertemplate <class T, size_t N>
86e78f53d1SNikolas Klauser  bool operator<=(const array<T,N>& x, const array<T,N>& y);    // removed in C++20
87e78f53d1SNikolas Klausertemplate <class T, size_t N>
88e78f53d1SNikolas Klauser  bool operator>=(const array<T,N>& x, const array<T,N>& y);    // removed in C++20
89e78f53d1SNikolas Klausertemplate<class T, size_t N>
90e78f53d1SNikolas Klauser  constexpr synth-three-way-result<T>
91e78f53d1SNikolas Klauser    operator<=>(const array<T, N>& x, const array<T, N>& y);    // since C++20
92e78f53d1SNikolas Klauser
93e78f53d1SNikolas Klausertemplate <class T, size_t N >
94e78f53d1SNikolas Klauser  void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y))); // constexpr in C++20
95e78f53d1SNikolas Klauser
96e78f53d1SNikolas Klausertemplate <class T, size_t N>
97e78f53d1SNikolas Klauser  constexpr array<remove_cv_t<T>, N> to_array(T (&a)[N]);  // C++20
98e78f53d1SNikolas Klausertemplate <class T, size_t N>
99e78f53d1SNikolas Klauser  constexpr array<remove_cv_t<T>, N> to_array(T (&&a)[N]); // C++20
100e78f53d1SNikolas Klauser
101e78f53d1SNikolas Klausertemplate <class T> struct tuple_size;
102e78f53d1SNikolas Klausertemplate <size_t I, class T> struct tuple_element;
103e78f53d1SNikolas Klausertemplate <class T, size_t N> struct tuple_size<array<T, N>>;
104e78f53d1SNikolas Klausertemplate <size_t I, class T, size_t N> struct tuple_element<I, array<T, N>>;
105e78f53d1SNikolas Klausertemplate <size_t I, class T, size_t N> T& get(array<T, N>&) noexcept;               // constexpr in C++14
106e78f53d1SNikolas Klausertemplate <size_t I, class T, size_t N> const T& get(const array<T, N>&) noexcept;   // constexpr in C++14
107e78f53d1SNikolas Klausertemplate <size_t I, class T, size_t N> T&& get(array<T, N>&&) noexcept;             // constexpr in C++14
108e78f53d1SNikolas Klausertemplate <size_t I, class T, size_t N> const T&& get(const array<T, N>&&) noexcept; // constexpr in C++14
109e78f53d1SNikolas Klauser
110e78f53d1SNikolas Klauser}  // std
111e78f53d1SNikolas Klauser
112e78f53d1SNikolas Klauser*/
113e78f53d1SNikolas Klauser
11473fbae83SNikolas Klauser#include <__cxx03/__algorithm/equal.h>
11573fbae83SNikolas Klauser#include <__cxx03/__algorithm/fill_n.h>
11673fbae83SNikolas Klauser#include <__cxx03/__algorithm/lexicographical_compare.h>
11773fbae83SNikolas Klauser#include <__cxx03/__algorithm/lexicographical_compare_three_way.h>
11873fbae83SNikolas Klauser#include <__cxx03/__algorithm/swap_ranges.h>
11973fbae83SNikolas Klauser#include <__cxx03/__assert>
12073fbae83SNikolas Klauser#include <__cxx03/__config>
12173fbae83SNikolas Klauser#include <__cxx03/__fwd/array.h>
12273fbae83SNikolas Klauser#include <__cxx03/__iterator/reverse_iterator.h>
12373fbae83SNikolas Klauser#include <__cxx03/__iterator/wrap_iter.h>
12473fbae83SNikolas Klauser#include <__cxx03/__tuple/sfinae_helpers.h>
12573fbae83SNikolas Klauser#include <__cxx03/__type_traits/conditional.h>
12673fbae83SNikolas Klauser#include <__cxx03/__type_traits/conjunction.h>
12773fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_array.h>
12873fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_const.h>
12973fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_constructible.h>
13073fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_nothrow_constructible.h>
13173fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_same.h>
13273fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_swappable.h>
13373fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_trivially_relocatable.h>
13473fbae83SNikolas Klauser#include <__cxx03/__type_traits/remove_cv.h>
13573fbae83SNikolas Klauser#include <__cxx03/__utility/empty.h>
13673fbae83SNikolas Klauser#include <__cxx03/__utility/integer_sequence.h>
13773fbae83SNikolas Klauser#include <__cxx03/__utility/move.h>
13873fbae83SNikolas Klauser#include <__cxx03/__utility/unreachable.h>
13973fbae83SNikolas Klauser#include <__cxx03/stdexcept>
14073fbae83SNikolas Klauser#include <__cxx03/version>
141e78f53d1SNikolas Klauser
142e78f53d1SNikolas Klauser// standard-mandated includes
143e78f53d1SNikolas Klauser
144e78f53d1SNikolas Klauser// [iterator.range]
14573fbae83SNikolas Klauser#include <__cxx03/__iterator/access.h>
14673fbae83SNikolas Klauser#include <__cxx03/__iterator/data.h>
14773fbae83SNikolas Klauser#include <__cxx03/__iterator/empty.h>
14873fbae83SNikolas Klauser#include <__cxx03/__iterator/reverse_access.h>
14973fbae83SNikolas Klauser#include <__cxx03/__iterator/size.h>
150e78f53d1SNikolas Klauser
151e78f53d1SNikolas Klauser// [array.syn]
15273fbae83SNikolas Klauser#include <__cxx03/compare>
15373fbae83SNikolas Klauser#include <__cxx03/initializer_list>
154e78f53d1SNikolas Klauser
155e78f53d1SNikolas Klauser// [tuple.helper]
15673fbae83SNikolas Klauser#include <__cxx03/__tuple/tuple_element.h>
15773fbae83SNikolas Klauser#include <__cxx03/__tuple/tuple_size.h>
158e78f53d1SNikolas Klauser
159e78f53d1SNikolas Klauser#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
160e78f53d1SNikolas Klauser#  pragma GCC system_header
161e78f53d1SNikolas Klauser#endif
162e78f53d1SNikolas Klauser
163e78f53d1SNikolas Klauser_LIBCPP_PUSH_MACROS
16473fbae83SNikolas Klauser#include <__cxx03/__undef_macros>
165e78f53d1SNikolas Klauser
166e78f53d1SNikolas Klauser_LIBCPP_BEGIN_NAMESPACE_STD
167e78f53d1SNikolas Klauser
168e78f53d1SNikolas Klausertemplate <class _Tp, size_t _Size>
169e78f53d1SNikolas Klauserstruct _LIBCPP_TEMPLATE_VIS array {
170e78f53d1SNikolas Klauser  using __trivially_relocatable = __conditional_t<__libcpp_is_trivially_relocatable<_Tp>::value, array, void>;
171e78f53d1SNikolas Klauser
172e78f53d1SNikolas Klauser  // types:
173e78f53d1SNikolas Klauser  using __self          = array;
174e78f53d1SNikolas Klauser  using value_type      = _Tp;
175e78f53d1SNikolas Klauser  using reference       = value_type&;
176e78f53d1SNikolas Klauser  using const_reference = const value_type&;
177e78f53d1SNikolas Klauser  using pointer         = value_type*;
178e78f53d1SNikolas Klauser  using const_pointer   = const value_type*;
179e78f53d1SNikolas Klauser#if defined(_LIBCPP_ABI_USE_WRAP_ITER_IN_STD_ARRAY)
180e78f53d1SNikolas Klauser  using iterator       = __wrap_iter<pointer>;
181e78f53d1SNikolas Klauser  using const_iterator = __wrap_iter<const_pointer>;
182e78f53d1SNikolas Klauser#else
183e78f53d1SNikolas Klauser  using iterator       = pointer;
184e78f53d1SNikolas Klauser  using const_iterator = const_pointer;
185e78f53d1SNikolas Klauser#endif
186e78f53d1SNikolas Klauser  using size_type              = size_t;
187e78f53d1SNikolas Klauser  using difference_type        = ptrdiff_t;
188e78f53d1SNikolas Klauser  using reverse_iterator       = std::reverse_iterator<iterator>;
189e78f53d1SNikolas Klauser  using const_reverse_iterator = std::reverse_iterator<const_iterator>;
190e78f53d1SNikolas Klauser
191e78f53d1SNikolas Klauser  _Tp __elems_[_Size];
192e78f53d1SNikolas Klauser
193e78f53d1SNikolas Klauser  // No explicit construct/copy/destroy for aggregate type
194e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void fill(const value_type& __u) {
195e78f53d1SNikolas Klauser    std::fill_n(data(), _Size, __u);
196e78f53d1SNikolas Klauser  }
197e78f53d1SNikolas Klauser
198e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void swap(array& __a) _NOEXCEPT_(__is_nothrow_swappable_v<_Tp>) {
199e78f53d1SNikolas Klauser    std::swap_ranges(data(), data() + _Size, __a.data());
200e78f53d1SNikolas Klauser  }
201e78f53d1SNikolas Klauser
202e78f53d1SNikolas Klauser  // iterators:
203e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 iterator begin() _NOEXCEPT { return iterator(data()); }
204e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator begin() const _NOEXCEPT {
205e78f53d1SNikolas Klauser    return const_iterator(data());
206e78f53d1SNikolas Klauser  }
207e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 iterator end() _NOEXCEPT { return iterator(data() + _Size); }
208e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator end() const _NOEXCEPT {
209e78f53d1SNikolas Klauser    return const_iterator(data() + _Size);
210e78f53d1SNikolas Klauser  }
211e78f53d1SNikolas Klauser
212e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator rbegin() _NOEXCEPT {
213e78f53d1SNikolas Klauser    return reverse_iterator(end());
214e78f53d1SNikolas Klauser  }
215e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator rbegin() const _NOEXCEPT {
216e78f53d1SNikolas Klauser    return const_reverse_iterator(end());
217e78f53d1SNikolas Klauser  }
218e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator rend() _NOEXCEPT {
219e78f53d1SNikolas Klauser    return reverse_iterator(begin());
220e78f53d1SNikolas Klauser  }
221e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator rend() const _NOEXCEPT {
222e78f53d1SNikolas Klauser    return const_reverse_iterator(begin());
223e78f53d1SNikolas Klauser  }
224e78f53d1SNikolas Klauser
225e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator cbegin() const _NOEXCEPT { return begin(); }
226e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator cend() const _NOEXCEPT { return end(); }
227e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator crbegin() const _NOEXCEPT {
228e78f53d1SNikolas Klauser    return rbegin();
229e78f53d1SNikolas Klauser  }
230e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator crend() const _NOEXCEPT { return rend(); }
231e78f53d1SNikolas Klauser
232e78f53d1SNikolas Klauser  // capacity:
233e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT { return _Size; }
234e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT { return _Size; }
235e78f53d1SNikolas Klauser  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT { return _Size == 0; }
236e78f53d1SNikolas Klauser
237e78f53d1SNikolas Klauser  // element access:
238e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference operator[](size_type __n) _NOEXCEPT {
239e78f53d1SNikolas Klauser    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n < _Size, "out-of-bounds access in std::array<T, N>");
240e78f53d1SNikolas Klauser    return __elems_[__n];
241e78f53d1SNikolas Klauser  }
242e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference operator[](size_type __n) const _NOEXCEPT {
243e78f53d1SNikolas Klauser    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n < _Size, "out-of-bounds access in std::array<T, N>");
244e78f53d1SNikolas Klauser    return __elems_[__n];
245e78f53d1SNikolas Klauser  }
246e78f53d1SNikolas Klauser
247e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference at(size_type __n) {
248e78f53d1SNikolas Klauser    if (__n >= _Size)
249e78f53d1SNikolas Klauser      __throw_out_of_range("array::at");
250e78f53d1SNikolas Klauser    return __elems_[__n];
251e78f53d1SNikolas Klauser  }
252e78f53d1SNikolas Klauser
253e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference at(size_type __n) const {
254e78f53d1SNikolas Klauser    if (__n >= _Size)
255e78f53d1SNikolas Klauser      __throw_out_of_range("array::at");
256e78f53d1SNikolas Klauser    return __elems_[__n];
257e78f53d1SNikolas Klauser  }
258e78f53d1SNikolas Klauser
259e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference front() _NOEXCEPT { return (*this)[0]; }
260e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference front() const _NOEXCEPT { return (*this)[0]; }
261e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference back() _NOEXCEPT { return (*this)[_Size - 1]; }
262e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference back() const _NOEXCEPT {
263e78f53d1SNikolas Klauser    return (*this)[_Size - 1];
264e78f53d1SNikolas Klauser  }
265e78f53d1SNikolas Klauser
266e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 value_type* data() _NOEXCEPT { return __elems_; }
267e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const value_type* data() const _NOEXCEPT { return __elems_; }
268e78f53d1SNikolas Klauser};
269e78f53d1SNikolas Klauser
270e78f53d1SNikolas Klausertemplate <class _Tp>
271e78f53d1SNikolas Klauserstruct _LIBCPP_TEMPLATE_VIS array<_Tp, 0> {
272e78f53d1SNikolas Klauser  // types:
273e78f53d1SNikolas Klauser  typedef array __self;
274e78f53d1SNikolas Klauser  typedef _Tp value_type;
275e78f53d1SNikolas Klauser  typedef value_type& reference;
276e78f53d1SNikolas Klauser  typedef const value_type& const_reference;
277e78f53d1SNikolas Klauser  typedef value_type* iterator;
278e78f53d1SNikolas Klauser  typedef const value_type* const_iterator;
279e78f53d1SNikolas Klauser  typedef value_type* pointer;
280e78f53d1SNikolas Klauser  typedef const value_type* const_pointer;
281e78f53d1SNikolas Klauser  typedef size_t size_type;
282e78f53d1SNikolas Klauser  typedef ptrdiff_t difference_type;
283e78f53d1SNikolas Klauser  typedef std::reverse_iterator<iterator> reverse_iterator;
284e78f53d1SNikolas Klauser  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
285e78f53d1SNikolas Klauser
286e78f53d1SNikolas Klauser  typedef __conditional_t<is_const<_Tp>::value, const __empty, __empty> _EmptyType;
287e78f53d1SNikolas Klauser
288e78f53d1SNikolas Klauser  struct _ArrayInStructT {
289e78f53d1SNikolas Klauser    _Tp __data_[1];
290e78f53d1SNikolas Klauser  };
291e78f53d1SNikolas Klauser  _ALIGNAS_TYPE(_ArrayInStructT) _EmptyType __elems_[sizeof(_ArrayInStructT)];
292e78f53d1SNikolas Klauser
293e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 value_type* data() _NOEXCEPT { return nullptr; }
294e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const value_type* data() const _NOEXCEPT { return nullptr; }
295e78f53d1SNikolas Klauser
296e78f53d1SNikolas Klauser  // No explicit construct/copy/destroy for aggregate type
297e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void fill(const value_type&) {
298e78f53d1SNikolas Klauser    static_assert(!is_const<_Tp>::value, "cannot fill zero-sized array of type 'const T'");
299e78f53d1SNikolas Klauser  }
300e78f53d1SNikolas Klauser
301e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void swap(array&) _NOEXCEPT {
302e78f53d1SNikolas Klauser    static_assert(!is_const<_Tp>::value, "cannot swap zero-sized array of type 'const T'");
303e78f53d1SNikolas Klauser  }
304e78f53d1SNikolas Klauser
305e78f53d1SNikolas Klauser  // iterators:
306e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 iterator begin() _NOEXCEPT { return iterator(data()); }
307e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator begin() const _NOEXCEPT {
308e78f53d1SNikolas Klauser    return const_iterator(data());
309e78f53d1SNikolas Klauser  }
310e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 iterator end() _NOEXCEPT { return iterator(data()); }
311e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator end() const _NOEXCEPT {
312e78f53d1SNikolas Klauser    return const_iterator(data());
313e78f53d1SNikolas Klauser  }
314e78f53d1SNikolas Klauser
315e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator rbegin() _NOEXCEPT {
316e78f53d1SNikolas Klauser    return reverse_iterator(end());
317e78f53d1SNikolas Klauser  }
318e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator rbegin() const _NOEXCEPT {
319e78f53d1SNikolas Klauser    return const_reverse_iterator(end());
320e78f53d1SNikolas Klauser  }
321e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator rend() _NOEXCEPT {
322e78f53d1SNikolas Klauser    return reverse_iterator(begin());
323e78f53d1SNikolas Klauser  }
324e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator rend() const _NOEXCEPT {
325e78f53d1SNikolas Klauser    return const_reverse_iterator(begin());
326e78f53d1SNikolas Klauser  }
327e78f53d1SNikolas Klauser
328e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator cbegin() const _NOEXCEPT { return begin(); }
329e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator cend() const _NOEXCEPT { return end(); }
330e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator crbegin() const _NOEXCEPT {
331e78f53d1SNikolas Klauser    return rbegin();
332e78f53d1SNikolas Klauser  }
333e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator crend() const _NOEXCEPT { return rend(); }
334e78f53d1SNikolas Klauser
335e78f53d1SNikolas Klauser  // capacity:
336e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT { return 0; }
337e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT { return 0; }
338e78f53d1SNikolas Klauser  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT { return true; }
339e78f53d1SNikolas Klauser
340e78f53d1SNikolas Klauser  // element access:
341e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference operator[](size_type) _NOEXCEPT {
342e78f53d1SNikolas Klauser    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(false, "cannot call array<T, 0>::operator[] on a zero-sized array");
343e78f53d1SNikolas Klauser    __libcpp_unreachable();
344e78f53d1SNikolas Klauser  }
345e78f53d1SNikolas Klauser
346e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference operator[](size_type) const _NOEXCEPT {
347e78f53d1SNikolas Klauser    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(false, "cannot call array<T, 0>::operator[] on a zero-sized array");
348e78f53d1SNikolas Klauser    __libcpp_unreachable();
349e78f53d1SNikolas Klauser  }
350e78f53d1SNikolas Klauser
351e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference at(size_type) {
352e78f53d1SNikolas Klauser    __throw_out_of_range("array<T, 0>::at");
353e78f53d1SNikolas Klauser    __libcpp_unreachable();
354e78f53d1SNikolas Klauser  }
355e78f53d1SNikolas Klauser
356e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference at(size_type) const {
357e78f53d1SNikolas Klauser    __throw_out_of_range("array<T, 0>::at");
358e78f53d1SNikolas Klauser    __libcpp_unreachable();
359e78f53d1SNikolas Klauser  }
360e78f53d1SNikolas Klauser
361e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference front() _NOEXCEPT {
362e78f53d1SNikolas Klauser    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(false, "cannot call array<T, 0>::front() on a zero-sized array");
363e78f53d1SNikolas Klauser    __libcpp_unreachable();
364e78f53d1SNikolas Klauser  }
365e78f53d1SNikolas Klauser
366e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference front() const _NOEXCEPT {
367e78f53d1SNikolas Klauser    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(false, "cannot call array<T, 0>::front() on a zero-sized array");
368e78f53d1SNikolas Klauser    __libcpp_unreachable();
369e78f53d1SNikolas Klauser  }
370e78f53d1SNikolas Klauser
371e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference back() _NOEXCEPT {
372e78f53d1SNikolas Klauser    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(false, "cannot call array<T, 0>::back() on a zero-sized array");
373e78f53d1SNikolas Klauser    __libcpp_unreachable();
374e78f53d1SNikolas Klauser  }
375e78f53d1SNikolas Klauser
376e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference back() const _NOEXCEPT {
377e78f53d1SNikolas Klauser    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(false, "cannot call array<T, 0>::back() on a zero-sized array");
378e78f53d1SNikolas Klauser    __libcpp_unreachable();
379e78f53d1SNikolas Klauser  }
380e78f53d1SNikolas Klauser};
381e78f53d1SNikolas Klauser
382e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17
383e78f53d1SNikolas Klausertemplate <class _Tp, class... _Args, class = enable_if_t<__all<_IsSame<_Tp, _Args>::value...>::value> >
384e78f53d1SNikolas Klauserarray(_Tp, _Args...) -> array<_Tp, 1 + sizeof...(_Args)>;
385e78f53d1SNikolas Klauser#endif
386e78f53d1SNikolas Klauser
387e78f53d1SNikolas Klausertemplate <class _Tp, size_t _Size>
388e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
389e78f53d1SNikolas Klauseroperator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) {
390e78f53d1SNikolas Klauser  return std::equal(__x.begin(), __x.end(), __y.begin());
391e78f53d1SNikolas Klauser}
392e78f53d1SNikolas Klauser
393e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER <= 17
394e78f53d1SNikolas Klauser
395e78f53d1SNikolas Klausertemplate <class _Tp, size_t _Size>
396e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) {
397e78f53d1SNikolas Klauser  return !(__x == __y);
398e78f53d1SNikolas Klauser}
399e78f53d1SNikolas Klauser
400e78f53d1SNikolas Klausertemplate <class _Tp, size_t _Size>
401e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) {
402e78f53d1SNikolas Klauser  return std::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
403e78f53d1SNikolas Klauser}
404e78f53d1SNikolas Klauser
405e78f53d1SNikolas Klausertemplate <class _Tp, size_t _Size>
406e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) {
407e78f53d1SNikolas Klauser  return __y < __x;
408e78f53d1SNikolas Klauser}
409e78f53d1SNikolas Klauser
410e78f53d1SNikolas Klausertemplate <class _Tp, size_t _Size>
411e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) {
412e78f53d1SNikolas Klauser  return !(__y < __x);
413e78f53d1SNikolas Klauser}
414e78f53d1SNikolas Klauser
415e78f53d1SNikolas Klausertemplate <class _Tp, size_t _Size>
416e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) {
417e78f53d1SNikolas Klauser  return !(__x < __y);
418e78f53d1SNikolas Klauser}
419e78f53d1SNikolas Klauser
420e78f53d1SNikolas Klauser#else // _LIBCPP_STD_VER <= 17
421e78f53d1SNikolas Klauser
422e78f53d1SNikolas Klausertemplate <class _Tp, size_t _Size>
423e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI constexpr __synth_three_way_result<_Tp>
424e78f53d1SNikolas Klauseroperator<=>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) {
425e78f53d1SNikolas Klauser  return std::lexicographical_compare_three_way(__x.begin(), __x.end(), __y.begin(), __y.end(), std::__synth_three_way);
426e78f53d1SNikolas Klauser}
427e78f53d1SNikolas Klauser
428e78f53d1SNikolas Klauser#endif // _LIBCPP_STD_VER <= 17
429e78f53d1SNikolas Klauser
430e78f53d1SNikolas Klausertemplate <class _Tp, size_t _Size, __enable_if_t<_Size == 0 || __is_swappable_v<_Tp>, int> = 0>
431e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void swap(array<_Tp, _Size>& __x, array<_Tp, _Size>& __y)
432e78f53d1SNikolas Klauser    _NOEXCEPT_(noexcept(__x.swap(__y))) {
433e78f53d1SNikolas Klauser  __x.swap(__y);
434e78f53d1SNikolas Klauser}
435e78f53d1SNikolas Klauser
436e78f53d1SNikolas Klausertemplate <class _Tp, size_t _Size>
437e78f53d1SNikolas Klauserstruct _LIBCPP_TEMPLATE_VIS tuple_size<array<_Tp, _Size> > : public integral_constant<size_t, _Size> {};
438e78f53d1SNikolas Klauser
439e78f53d1SNikolas Klausertemplate <size_t _Ip, class _Tp, size_t _Size>
440e78f53d1SNikolas Klauserstruct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, array<_Tp, _Size> > {
441e78f53d1SNikolas Klauser  static_assert(_Ip < _Size, "Index out of bounds in std::tuple_element<> (std::array)");
442e78f53d1SNikolas Klauser  typedef _Tp type;
443e78f53d1SNikolas Klauser};
444e78f53d1SNikolas Klauser
445e78f53d1SNikolas Klausertemplate <size_t _Ip, class _Tp, size_t _Size>
446e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp& get(array<_Tp, _Size>& __a) _NOEXCEPT {
447e78f53d1SNikolas Klauser  static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array)");
448e78f53d1SNikolas Klauser  return __a.__elems_[_Ip];
449e78f53d1SNikolas Klauser}
450e78f53d1SNikolas Klauser
451e78f53d1SNikolas Klausertemplate <size_t _Ip, class _Tp, size_t _Size>
452e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const _Tp& get(const array<_Tp, _Size>& __a) _NOEXCEPT {
453e78f53d1SNikolas Klauser  static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array)");
454e78f53d1SNikolas Klauser  return __a.__elems_[_Ip];
455e78f53d1SNikolas Klauser}
456e78f53d1SNikolas Klauser
457e78f53d1SNikolas Klausertemplate <size_t _Ip, class _Tp, size_t _Size>
458e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp&& get(array<_Tp, _Size>&& __a) _NOEXCEPT {
459e78f53d1SNikolas Klauser  static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array &&)");
460e78f53d1SNikolas Klauser  return std::move(__a.__elems_[_Ip]);
461e78f53d1SNikolas Klauser}
462e78f53d1SNikolas Klauser
463e78f53d1SNikolas Klausertemplate <size_t _Ip, class _Tp, size_t _Size>
464e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const _Tp&& get(const array<_Tp, _Size>&& __a) _NOEXCEPT {
465e78f53d1SNikolas Klauser  static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array &&)");
466e78f53d1SNikolas Klauser  return std::move(__a.__elems_[_Ip]);
467e78f53d1SNikolas Klauser}
468e78f53d1SNikolas Klauser
469e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20
470e78f53d1SNikolas Klauser
471e78f53d1SNikolas Klausertemplate <typename _Tp, size_t _Size, size_t... _Index>
472e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI constexpr array<remove_cv_t<_Tp>, _Size>
473e78f53d1SNikolas Klauser__to_array_lvalue_impl(_Tp (&__arr)[_Size], index_sequence<_Index...>) {
474e78f53d1SNikolas Klauser  return {{__arr[_Index]...}};
475e78f53d1SNikolas Klauser}
476e78f53d1SNikolas Klauser
477e78f53d1SNikolas Klausertemplate <typename _Tp, size_t _Size, size_t... _Index>
478e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI constexpr array<remove_cv_t<_Tp>, _Size>
479e78f53d1SNikolas Klauser__to_array_rvalue_impl(_Tp (&&__arr)[_Size], index_sequence<_Index...>) {
480e78f53d1SNikolas Klauser  return {{std::move(__arr[_Index])...}};
481e78f53d1SNikolas Klauser}
482e78f53d1SNikolas Klauser
483e78f53d1SNikolas Klausertemplate <typename _Tp, size_t _Size>
484e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI constexpr array<remove_cv_t<_Tp>, _Size>
485e78f53d1SNikolas Klauserto_array(_Tp (&__arr)[_Size]) noexcept(is_nothrow_constructible_v<_Tp, _Tp&>) {
486e78f53d1SNikolas Klauser  static_assert(!is_array_v<_Tp>, "[array.creation]/1: to_array does not accept multidimensional arrays.");
487e78f53d1SNikolas Klauser  static_assert(is_constructible_v<_Tp, _Tp&>, "[array.creation]/1: to_array requires copy constructible elements.");
488e78f53d1SNikolas Klauser  return std::__to_array_lvalue_impl(__arr, make_index_sequence<_Size>());
489e78f53d1SNikolas Klauser}
490e78f53d1SNikolas Klauser
491e78f53d1SNikolas Klausertemplate <typename _Tp, size_t _Size>
492e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI constexpr array<remove_cv_t<_Tp>, _Size>
493e78f53d1SNikolas Klauserto_array(_Tp (&&__arr)[_Size]) noexcept(is_nothrow_move_constructible_v<_Tp>) {
494e78f53d1SNikolas Klauser  static_assert(!is_array_v<_Tp>, "[array.creation]/4: to_array does not accept multidimensional arrays.");
495e78f53d1SNikolas Klauser  static_assert(is_move_constructible_v<_Tp>, "[array.creation]/4: to_array requires move constructible elements.");
496e78f53d1SNikolas Klauser  return std::__to_array_rvalue_impl(std::move(__arr), make_index_sequence<_Size>());
497e78f53d1SNikolas Klauser}
498e78f53d1SNikolas Klauser
499e78f53d1SNikolas Klauser#endif // _LIBCPP_STD_VER >= 20
500e78f53d1SNikolas Klauser
501e78f53d1SNikolas Klauser_LIBCPP_END_NAMESPACE_STD
502e78f53d1SNikolas Klauser
503e78f53d1SNikolas Klauser_LIBCPP_POP_MACROS
504e78f53d1SNikolas Klauser
505e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
50673fbae83SNikolas Klauser#  include <__cxx03/algorithm>
50773fbae83SNikolas Klauser#  include <__cxx03/concepts>
50873fbae83SNikolas Klauser#  include <__cxx03/cstdlib>
50973fbae83SNikolas Klauser#  include <__cxx03/iterator>
51073fbae83SNikolas Klauser#  include <__cxx03/type_traits>
51173fbae83SNikolas Klauser#  include <__cxx03/utility>
512e78f53d1SNikolas Klauser#endif
513e78f53d1SNikolas Klauser
514*ce777190SNikolas Klauser#endif // _LIBCPP___CXX03_ARRAY
515