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