1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===---------------------------- array -----------------------------------===// 3*4d6fc14bSjoerg// 4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg// 8*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg#ifndef _LIBCPP_ARRAY 11*4d6fc14bSjoerg#define _LIBCPP_ARRAY 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg/* 14*4d6fc14bSjoerg array synopsis 15*4d6fc14bSjoerg 16*4d6fc14bSjoergnamespace std 17*4d6fc14bSjoerg{ 18*4d6fc14bSjoergtemplate <class T, size_t N > 19*4d6fc14bSjoergstruct array 20*4d6fc14bSjoerg{ 21*4d6fc14bSjoerg // types: 22*4d6fc14bSjoerg typedef T & reference; 23*4d6fc14bSjoerg typedef const T & const_reference; 24*4d6fc14bSjoerg typedef implementation defined iterator; 25*4d6fc14bSjoerg typedef implementation defined const_iterator; 26*4d6fc14bSjoerg typedef size_t size_type; 27*4d6fc14bSjoerg typedef ptrdiff_t difference_type; 28*4d6fc14bSjoerg typedef T value_type; 29*4d6fc14bSjoerg typedef T* pointer; 30*4d6fc14bSjoerg typedef const T* const_pointer; 31*4d6fc14bSjoerg typedef std::reverse_iterator<iterator> reverse_iterator; 32*4d6fc14bSjoerg typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 33*4d6fc14bSjoerg 34*4d6fc14bSjoerg // No explicit construct/copy/destroy for aggregate type 35*4d6fc14bSjoerg void fill(const T& u); // constexpr in C++20 36*4d6fc14bSjoerg void swap(array& a) noexcept(is_nothrow_swappable_v<T>); // constexpr in C++20 37*4d6fc14bSjoerg 38*4d6fc14bSjoerg // iterators: 39*4d6fc14bSjoerg iterator begin() noexcept; // constexpr in C++17 40*4d6fc14bSjoerg const_iterator begin() const noexcept; // constexpr in C++17 41*4d6fc14bSjoerg iterator end() noexcept; // constexpr in C++17 42*4d6fc14bSjoerg const_iterator end() const noexcept; // constexpr in C++17 43*4d6fc14bSjoerg 44*4d6fc14bSjoerg reverse_iterator rbegin() noexcept; // constexpr in C++17 45*4d6fc14bSjoerg const_reverse_iterator rbegin() const noexcept; // constexpr in C++17 46*4d6fc14bSjoerg reverse_iterator rend() noexcept; // constexpr in C++17 47*4d6fc14bSjoerg const_reverse_iterator rend() const noexcept; // constexpr in C++17 48*4d6fc14bSjoerg 49*4d6fc14bSjoerg const_iterator cbegin() const noexcept; // constexpr in C++17 50*4d6fc14bSjoerg const_iterator cend() const noexcept; // constexpr in C++17 51*4d6fc14bSjoerg const_reverse_iterator crbegin() const noexcept; // constexpr in C++17 52*4d6fc14bSjoerg const_reverse_iterator crend() const noexcept; // constexpr in C++17 53*4d6fc14bSjoerg 54*4d6fc14bSjoerg // capacity: 55*4d6fc14bSjoerg constexpr size_type size() const noexcept; 56*4d6fc14bSjoerg constexpr size_type max_size() const noexcept; 57*4d6fc14bSjoerg constexpr bool empty() const noexcept; 58*4d6fc14bSjoerg 59*4d6fc14bSjoerg // element access: 60*4d6fc14bSjoerg reference operator[](size_type n); // constexpr in C++17 61*4d6fc14bSjoerg const_reference operator[](size_type n) const; // constexpr in C++14 62*4d6fc14bSjoerg reference at(size_type n); // constexpr in C++17 63*4d6fc14bSjoerg const_reference at(size_type n) const; // constexpr in C++14 64*4d6fc14bSjoerg 65*4d6fc14bSjoerg reference front(); // constexpr in C++17 66*4d6fc14bSjoerg const_reference front() const; // constexpr in C++14 67*4d6fc14bSjoerg reference back(); // constexpr in C++17 68*4d6fc14bSjoerg const_reference back() const; // constexpr in C++14 69*4d6fc14bSjoerg 70*4d6fc14bSjoerg T* data() noexcept; // constexpr in C++17 71*4d6fc14bSjoerg const T* data() const noexcept; // constexpr in C++17 72*4d6fc14bSjoerg}; 73*4d6fc14bSjoerg 74*4d6fc14bSjoergtemplate <class T, class... U> 75*4d6fc14bSjoerg array(T, U...) -> array<T, 1 + sizeof...(U)>; // C++17 76*4d6fc14bSjoerg 77*4d6fc14bSjoergtemplate <class T, size_t N> 78*4d6fc14bSjoerg bool operator==(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 79*4d6fc14bSjoergtemplate <class T, size_t N> 80*4d6fc14bSjoerg bool operator!=(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 81*4d6fc14bSjoergtemplate <class T, size_t N> 82*4d6fc14bSjoerg bool operator<(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 83*4d6fc14bSjoergtemplate <class T, size_t N> 84*4d6fc14bSjoerg bool operator>(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 85*4d6fc14bSjoergtemplate <class T, size_t N> 86*4d6fc14bSjoerg bool operator<=(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 87*4d6fc14bSjoergtemplate <class T, size_t N> 88*4d6fc14bSjoerg bool operator>=(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 89*4d6fc14bSjoerg 90*4d6fc14bSjoergtemplate <class T, size_t N > 91*4d6fc14bSjoerg void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y))); // constexpr in C++20 92*4d6fc14bSjoerg 93*4d6fc14bSjoergtemplate <class T, size_t N> 94*4d6fc14bSjoerg constexpr array<remove_cv_t<T>, N> to_array(T (&a)[N]); // C++20 95*4d6fc14bSjoergtemplate <class T, size_t N> 96*4d6fc14bSjoerg constexpr array<remove_cv_t<T>, N> to_array(T (&&a)[N]); // C++20 97*4d6fc14bSjoerg 98*4d6fc14bSjoergtemplate <class T> struct tuple_size; 99*4d6fc14bSjoergtemplate <size_t I, class T> struct tuple_element; 100*4d6fc14bSjoergtemplate <class T, size_t N> struct tuple_size<array<T, N>>; 101*4d6fc14bSjoergtemplate <size_t I, class T, size_t N> struct tuple_element<I, array<T, N>>; 102*4d6fc14bSjoergtemplate <size_t I, class T, size_t N> T& get(array<T, N>&) noexcept; // constexpr in C++14 103*4d6fc14bSjoergtemplate <size_t I, class T, size_t N> const T& get(const array<T, N>&) noexcept; // constexpr in C++14 104*4d6fc14bSjoergtemplate <size_t I, class T, size_t N> T&& get(array<T, N>&&) noexcept; // constexpr in C++14 105*4d6fc14bSjoergtemplate <size_t I, class T, size_t N> const T&& get(const array<T, N>&&) noexcept; // constexpr in C++14 106*4d6fc14bSjoerg 107*4d6fc14bSjoerg} // std 108*4d6fc14bSjoerg 109*4d6fc14bSjoerg*/ 110*4d6fc14bSjoerg 111*4d6fc14bSjoerg#include <__config> 112*4d6fc14bSjoerg#include <__tuple> 113*4d6fc14bSjoerg#include <type_traits> 114*4d6fc14bSjoerg#include <utility> 115*4d6fc14bSjoerg#include <iterator> 116*4d6fc14bSjoerg#include <algorithm> 117*4d6fc14bSjoerg#include <stdexcept> 118*4d6fc14bSjoerg#include <cstdlib> // for _LIBCPP_UNREACHABLE 119*4d6fc14bSjoerg#include <version> 120*4d6fc14bSjoerg#include <__debug> 121*4d6fc14bSjoerg 122*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 123*4d6fc14bSjoerg#pragma GCC system_header 124*4d6fc14bSjoerg#endif 125*4d6fc14bSjoerg 126*4d6fc14bSjoerg 127*4d6fc14bSjoerg 128*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD 129*4d6fc14bSjoerg 130*4d6fc14bSjoerg 131*4d6fc14bSjoergtemplate <class _Tp, size_t _Size> 132*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS array 133*4d6fc14bSjoerg{ 134*4d6fc14bSjoerg // types: 135*4d6fc14bSjoerg typedef array __self; 136*4d6fc14bSjoerg typedef _Tp value_type; 137*4d6fc14bSjoerg typedef value_type& reference; 138*4d6fc14bSjoerg typedef const value_type& const_reference; 139*4d6fc14bSjoerg typedef value_type* iterator; 140*4d6fc14bSjoerg typedef const value_type* const_iterator; 141*4d6fc14bSjoerg typedef value_type* pointer; 142*4d6fc14bSjoerg typedef const value_type* const_pointer; 143*4d6fc14bSjoerg typedef size_t size_type; 144*4d6fc14bSjoerg typedef ptrdiff_t difference_type; 145*4d6fc14bSjoerg typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 146*4d6fc14bSjoerg typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 147*4d6fc14bSjoerg 148*4d6fc14bSjoerg _Tp __elems_[_Size]; 149*4d6fc14bSjoerg 150*4d6fc14bSjoerg // No explicit construct/copy/destroy for aggregate type 151*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 152*4d6fc14bSjoerg void fill(const value_type& __u) { 153*4d6fc14bSjoerg _VSTD::fill_n(data(), _Size, __u); 154*4d6fc14bSjoerg } 155*4d6fc14bSjoerg 156*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 157*4d6fc14bSjoerg void swap(array& __a) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) { 158*4d6fc14bSjoerg _VSTD::swap_ranges(data(), data() + _Size, __a.data()); 159*4d6fc14bSjoerg } 160*4d6fc14bSjoerg 161*4d6fc14bSjoerg // iterators: 162*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 163*4d6fc14bSjoerg iterator begin() _NOEXCEPT {return iterator(data());} 164*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 165*4d6fc14bSjoerg const_iterator begin() const _NOEXCEPT {return const_iterator(data());} 166*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 167*4d6fc14bSjoerg iterator end() _NOEXCEPT {return iterator(data() + _Size);} 168*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 169*4d6fc14bSjoerg const_iterator end() const _NOEXCEPT {return const_iterator(data() + _Size);} 170*4d6fc14bSjoerg 171*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 172*4d6fc14bSjoerg reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 173*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 174*4d6fc14bSjoerg const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} 175*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 176*4d6fc14bSjoerg reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 177*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 178*4d6fc14bSjoerg const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} 179*4d6fc14bSjoerg 180*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 181*4d6fc14bSjoerg const_iterator cbegin() const _NOEXCEPT {return begin();} 182*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 183*4d6fc14bSjoerg const_iterator cend() const _NOEXCEPT {return end();} 184*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 185*4d6fc14bSjoerg const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 186*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 187*4d6fc14bSjoerg const_reverse_iterator crend() const _NOEXCEPT {return rend();} 188*4d6fc14bSjoerg 189*4d6fc14bSjoerg // capacity: 190*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 191*4d6fc14bSjoerg _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return _Size;} 192*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 193*4d6fc14bSjoerg _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return _Size;} 194*4d6fc14bSjoerg _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 195*4d6fc14bSjoerg _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return _Size == 0;} 196*4d6fc14bSjoerg 197*4d6fc14bSjoerg // element access: 198*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 199*4d6fc14bSjoerg reference operator[](size_type __n) _NOEXCEPT { 200*4d6fc14bSjoerg _LIBCPP_ASSERT(__n < _Size, "out-of-bounds access in std::array<T, N>"); 201*4d6fc14bSjoerg return __elems_[__n]; 202*4d6fc14bSjoerg } 203*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 204*4d6fc14bSjoerg const_reference operator[](size_type __n) const _NOEXCEPT { 205*4d6fc14bSjoerg _LIBCPP_ASSERT(__n < _Size, "out-of-bounds access in std::array<T, N>"); 206*4d6fc14bSjoerg return __elems_[__n]; 207*4d6fc14bSjoerg } 208*4d6fc14bSjoerg 209*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX14 reference at(size_type __n) 210*4d6fc14bSjoerg { 211*4d6fc14bSjoerg if (__n >= _Size) 212*4d6fc14bSjoerg __throw_out_of_range("array::at"); 213*4d6fc14bSjoerg return __elems_[__n]; 214*4d6fc14bSjoerg } 215*4d6fc14bSjoerg 216*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference at(size_type __n) const 217*4d6fc14bSjoerg { 218*4d6fc14bSjoerg if (__n >= _Size) 219*4d6fc14bSjoerg __throw_out_of_range("array::at"); 220*4d6fc14bSjoerg return __elems_[__n]; 221*4d6fc14bSjoerg } 222*4d6fc14bSjoerg 223*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference front() _NOEXCEPT {return (*this)[0];} 224*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference front() const _NOEXCEPT {return (*this)[0];} 225*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference back() _NOEXCEPT {return (*this)[_Size - 1];} 226*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference back() const _NOEXCEPT {return (*this)[_Size - 1];} 227*4d6fc14bSjoerg 228*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 229*4d6fc14bSjoerg value_type* data() _NOEXCEPT {return __elems_;} 230*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 231*4d6fc14bSjoerg const value_type* data() const _NOEXCEPT {return __elems_;} 232*4d6fc14bSjoerg}; 233*4d6fc14bSjoerg 234*4d6fc14bSjoergtemplate <class _Tp> 235*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS array<_Tp, 0> 236*4d6fc14bSjoerg{ 237*4d6fc14bSjoerg // types: 238*4d6fc14bSjoerg typedef array __self; 239*4d6fc14bSjoerg typedef _Tp value_type; 240*4d6fc14bSjoerg typedef value_type& reference; 241*4d6fc14bSjoerg typedef const value_type& const_reference; 242*4d6fc14bSjoerg typedef value_type* iterator; 243*4d6fc14bSjoerg typedef const value_type* const_iterator; 244*4d6fc14bSjoerg typedef value_type* pointer; 245*4d6fc14bSjoerg typedef const value_type* const_pointer; 246*4d6fc14bSjoerg typedef size_t size_type; 247*4d6fc14bSjoerg typedef ptrdiff_t difference_type; 248*4d6fc14bSjoerg typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 249*4d6fc14bSjoerg typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 250*4d6fc14bSjoerg 251*4d6fc14bSjoerg typedef typename conditional<is_const<_Tp>::value, const char, 252*4d6fc14bSjoerg char>::type _CharType; 253*4d6fc14bSjoerg 254*4d6fc14bSjoerg struct _ArrayInStructT { _Tp __data_[1]; }; 255*4d6fc14bSjoerg _ALIGNAS_TYPE(_ArrayInStructT) _CharType __elems_[sizeof(_ArrayInStructT)]; 256*4d6fc14bSjoerg 257*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 258*4d6fc14bSjoerg value_type* data() _NOEXCEPT {return nullptr;} 259*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 260*4d6fc14bSjoerg const value_type* data() const _NOEXCEPT {return nullptr;} 261*4d6fc14bSjoerg 262*4d6fc14bSjoerg // No explicit construct/copy/destroy for aggregate type 263*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 264*4d6fc14bSjoerg void fill(const value_type&) { 265*4d6fc14bSjoerg static_assert(!is_const<_Tp>::value, 266*4d6fc14bSjoerg "cannot fill zero-sized array of type 'const T'"); 267*4d6fc14bSjoerg } 268*4d6fc14bSjoerg 269*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 270*4d6fc14bSjoerg void swap(array&) _NOEXCEPT { 271*4d6fc14bSjoerg static_assert(!is_const<_Tp>::value, 272*4d6fc14bSjoerg "cannot swap zero-sized array of type 'const T'"); 273*4d6fc14bSjoerg } 274*4d6fc14bSjoerg 275*4d6fc14bSjoerg // iterators: 276*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 277*4d6fc14bSjoerg iterator begin() _NOEXCEPT {return iterator(data());} 278*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 279*4d6fc14bSjoerg const_iterator begin() const _NOEXCEPT {return const_iterator(data());} 280*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 281*4d6fc14bSjoerg iterator end() _NOEXCEPT {return iterator(data());} 282*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 283*4d6fc14bSjoerg const_iterator end() const _NOEXCEPT {return const_iterator(data());} 284*4d6fc14bSjoerg 285*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 286*4d6fc14bSjoerg reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 287*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 288*4d6fc14bSjoerg const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} 289*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 290*4d6fc14bSjoerg reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 291*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 292*4d6fc14bSjoerg const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} 293*4d6fc14bSjoerg 294*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 295*4d6fc14bSjoerg const_iterator cbegin() const _NOEXCEPT {return begin();} 296*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 297*4d6fc14bSjoerg const_iterator cend() const _NOEXCEPT {return end();} 298*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 299*4d6fc14bSjoerg const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 300*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 301*4d6fc14bSjoerg const_reverse_iterator crend() const _NOEXCEPT {return rend();} 302*4d6fc14bSjoerg 303*4d6fc14bSjoerg // capacity: 304*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 305*4d6fc14bSjoerg _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return 0; } 306*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 307*4d6fc14bSjoerg _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return 0;} 308*4d6fc14bSjoerg _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 309*4d6fc14bSjoerg _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return true;} 310*4d6fc14bSjoerg 311*4d6fc14bSjoerg // element access: 312*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 313*4d6fc14bSjoerg reference operator[](size_type) _NOEXCEPT { 314*4d6fc14bSjoerg _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array"); 315*4d6fc14bSjoerg _LIBCPP_UNREACHABLE(); 316*4d6fc14bSjoerg } 317*4d6fc14bSjoerg 318*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 319*4d6fc14bSjoerg const_reference operator[](size_type) const _NOEXCEPT { 320*4d6fc14bSjoerg _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array"); 321*4d6fc14bSjoerg _LIBCPP_UNREACHABLE(); 322*4d6fc14bSjoerg } 323*4d6fc14bSjoerg 324*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 325*4d6fc14bSjoerg reference at(size_type) { 326*4d6fc14bSjoerg __throw_out_of_range("array<T, 0>::at"); 327*4d6fc14bSjoerg _LIBCPP_UNREACHABLE(); 328*4d6fc14bSjoerg } 329*4d6fc14bSjoerg 330*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 331*4d6fc14bSjoerg const_reference at(size_type) const { 332*4d6fc14bSjoerg __throw_out_of_range("array<T, 0>::at"); 333*4d6fc14bSjoerg _LIBCPP_UNREACHABLE(); 334*4d6fc14bSjoerg } 335*4d6fc14bSjoerg 336*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 337*4d6fc14bSjoerg reference front() _NOEXCEPT { 338*4d6fc14bSjoerg _LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array"); 339*4d6fc14bSjoerg _LIBCPP_UNREACHABLE(); 340*4d6fc14bSjoerg } 341*4d6fc14bSjoerg 342*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 343*4d6fc14bSjoerg const_reference front() const _NOEXCEPT { 344*4d6fc14bSjoerg _LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array"); 345*4d6fc14bSjoerg _LIBCPP_UNREACHABLE(); 346*4d6fc14bSjoerg } 347*4d6fc14bSjoerg 348*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 349*4d6fc14bSjoerg reference back() _NOEXCEPT { 350*4d6fc14bSjoerg _LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array"); 351*4d6fc14bSjoerg _LIBCPP_UNREACHABLE(); 352*4d6fc14bSjoerg } 353*4d6fc14bSjoerg 354*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 355*4d6fc14bSjoerg const_reference back() const _NOEXCEPT { 356*4d6fc14bSjoerg _LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array"); 357*4d6fc14bSjoerg _LIBCPP_UNREACHABLE(); 358*4d6fc14bSjoerg } 359*4d6fc14bSjoerg}; 360*4d6fc14bSjoerg 361*4d6fc14bSjoerg 362*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES 363*4d6fc14bSjoergtemplate<class _Tp, class... _Args, 364*4d6fc14bSjoerg class = _EnableIf<__all<_IsSame<_Tp, _Args>::value...>::value> 365*4d6fc14bSjoerg > 366*4d6fc14bSjoergarray(_Tp, _Args...) 367*4d6fc14bSjoerg -> array<_Tp, 1 + sizeof...(_Args)>; 368*4d6fc14bSjoerg#endif 369*4d6fc14bSjoerg 370*4d6fc14bSjoergtemplate <class _Tp, size_t _Size> 371*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 372*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 373*4d6fc14bSjoergoperator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 374*4d6fc14bSjoerg{ 375*4d6fc14bSjoerg return _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 376*4d6fc14bSjoerg} 377*4d6fc14bSjoerg 378*4d6fc14bSjoergtemplate <class _Tp, size_t _Size> 379*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 380*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 381*4d6fc14bSjoergoperator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 382*4d6fc14bSjoerg{ 383*4d6fc14bSjoerg return !(__x == __y); 384*4d6fc14bSjoerg} 385*4d6fc14bSjoerg 386*4d6fc14bSjoergtemplate <class _Tp, size_t _Size> 387*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 388*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 389*4d6fc14bSjoergoperator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 390*4d6fc14bSjoerg{ 391*4d6fc14bSjoerg return _VSTD::lexicographical_compare(__x.begin(), __x.end(), 392*4d6fc14bSjoerg __y.begin(), __y.end()); 393*4d6fc14bSjoerg} 394*4d6fc14bSjoerg 395*4d6fc14bSjoergtemplate <class _Tp, size_t _Size> 396*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 397*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 398*4d6fc14bSjoergoperator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 399*4d6fc14bSjoerg{ 400*4d6fc14bSjoerg return __y < __x; 401*4d6fc14bSjoerg} 402*4d6fc14bSjoerg 403*4d6fc14bSjoergtemplate <class _Tp, size_t _Size> 404*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 405*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 406*4d6fc14bSjoergoperator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 407*4d6fc14bSjoerg{ 408*4d6fc14bSjoerg return !(__y < __x); 409*4d6fc14bSjoerg} 410*4d6fc14bSjoerg 411*4d6fc14bSjoergtemplate <class _Tp, size_t _Size> 412*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 413*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 414*4d6fc14bSjoergoperator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 415*4d6fc14bSjoerg{ 416*4d6fc14bSjoerg return !(__x < __y); 417*4d6fc14bSjoerg} 418*4d6fc14bSjoerg 419*4d6fc14bSjoergtemplate <class _Tp, size_t _Size> 420*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 421*4d6fc14bSjoergtypename enable_if 422*4d6fc14bSjoerg< 423*4d6fc14bSjoerg _Size == 0 || 424*4d6fc14bSjoerg __is_swappable<_Tp>::value, 425*4d6fc14bSjoerg void 426*4d6fc14bSjoerg>::type 427*4d6fc14bSjoergswap(array<_Tp, _Size>& __x, array<_Tp, _Size>& __y) 428*4d6fc14bSjoerg _NOEXCEPT_(noexcept(__x.swap(__y))) 429*4d6fc14bSjoerg{ 430*4d6fc14bSjoerg __x.swap(__y); 431*4d6fc14bSjoerg} 432*4d6fc14bSjoerg 433*4d6fc14bSjoergtemplate <class _Tp, size_t _Size> 434*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS tuple_size<array<_Tp, _Size> > 435*4d6fc14bSjoerg : public integral_constant<size_t, _Size> {}; 436*4d6fc14bSjoerg 437*4d6fc14bSjoergtemplate <size_t _Ip, class _Tp, size_t _Size> 438*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, array<_Tp, _Size> > 439*4d6fc14bSjoerg{ 440*4d6fc14bSjoerg static_assert(_Ip < _Size, "Index out of bounds in std::tuple_element<> (std::array)"); 441*4d6fc14bSjoerg typedef _Tp type; 442*4d6fc14bSjoerg}; 443*4d6fc14bSjoerg 444*4d6fc14bSjoergtemplate <size_t _Ip, class _Tp, size_t _Size> 445*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 446*4d6fc14bSjoerg_Tp& 447*4d6fc14bSjoergget(array<_Tp, _Size>& __a) _NOEXCEPT 448*4d6fc14bSjoerg{ 449*4d6fc14bSjoerg static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array)"); 450*4d6fc14bSjoerg return __a.__elems_[_Ip]; 451*4d6fc14bSjoerg} 452*4d6fc14bSjoerg 453*4d6fc14bSjoergtemplate <size_t _Ip, class _Tp, size_t _Size> 454*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 455*4d6fc14bSjoergconst _Tp& 456*4d6fc14bSjoergget(const array<_Tp, _Size>& __a) _NOEXCEPT 457*4d6fc14bSjoerg{ 458*4d6fc14bSjoerg static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array)"); 459*4d6fc14bSjoerg return __a.__elems_[_Ip]; 460*4d6fc14bSjoerg} 461*4d6fc14bSjoerg 462*4d6fc14bSjoergtemplate <size_t _Ip, class _Tp, size_t _Size> 463*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 464*4d6fc14bSjoerg_Tp&& 465*4d6fc14bSjoergget(array<_Tp, _Size>&& __a) _NOEXCEPT 466*4d6fc14bSjoerg{ 467*4d6fc14bSjoerg static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array &&)"); 468*4d6fc14bSjoerg return _VSTD::move(__a.__elems_[_Ip]); 469*4d6fc14bSjoerg} 470*4d6fc14bSjoerg 471*4d6fc14bSjoergtemplate <size_t _Ip, class _Tp, size_t _Size> 472*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 473*4d6fc14bSjoergconst _Tp&& 474*4d6fc14bSjoergget(const array<_Tp, _Size>&& __a) _NOEXCEPT 475*4d6fc14bSjoerg{ 476*4d6fc14bSjoerg static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array &&)"); 477*4d6fc14bSjoerg return _VSTD::move(__a.__elems_[_Ip]); 478*4d6fc14bSjoerg} 479*4d6fc14bSjoerg 480*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17 481*4d6fc14bSjoerg 482*4d6fc14bSjoergtemplate <typename _Tp, size_t _Size, size_t... _Index> 483*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 484*4d6fc14bSjoerg__to_array_lvalue_impl(_Tp (&__arr)[_Size], index_sequence<_Index...>) { 485*4d6fc14bSjoerg return {{__arr[_Index]...}}; 486*4d6fc14bSjoerg} 487*4d6fc14bSjoerg 488*4d6fc14bSjoergtemplate <typename _Tp, size_t _Size, size_t... _Index> 489*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 490*4d6fc14bSjoerg__to_array_rvalue_impl(_Tp(&&__arr)[_Size], index_sequence<_Index...>) { 491*4d6fc14bSjoerg return {{_VSTD::move(__arr[_Index])...}}; 492*4d6fc14bSjoerg} 493*4d6fc14bSjoerg 494*4d6fc14bSjoergtemplate <typename _Tp, size_t _Size> 495*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 496*4d6fc14bSjoergto_array(_Tp (&__arr)[_Size]) noexcept(is_nothrow_constructible_v<_Tp, _Tp&>) { 497*4d6fc14bSjoerg static_assert( 498*4d6fc14bSjoerg !is_array_v<_Tp>, 499*4d6fc14bSjoerg "[array.creation]/1: to_array does not accept multidimensional arrays."); 500*4d6fc14bSjoerg static_assert( 501*4d6fc14bSjoerg is_constructible_v<_Tp, _Tp&>, 502*4d6fc14bSjoerg "[array.creation]/1: to_array requires copy constructible elements."); 503*4d6fc14bSjoerg return _VSTD::__to_array_lvalue_impl(__arr, make_index_sequence<_Size>()); 504*4d6fc14bSjoerg} 505*4d6fc14bSjoerg 506*4d6fc14bSjoergtemplate <typename _Tp, size_t _Size> 507*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 508*4d6fc14bSjoergto_array(_Tp(&&__arr)[_Size]) noexcept(is_nothrow_move_constructible_v<_Tp>) { 509*4d6fc14bSjoerg static_assert( 510*4d6fc14bSjoerg !is_array_v<_Tp>, 511*4d6fc14bSjoerg "[array.creation]/4: to_array does not accept multidimensional arrays."); 512*4d6fc14bSjoerg static_assert( 513*4d6fc14bSjoerg is_move_constructible_v<_Tp>, 514*4d6fc14bSjoerg "[array.creation]/4: to_array requires move constructible elements."); 515*4d6fc14bSjoerg return _VSTD::__to_array_rvalue_impl(_VSTD::move(__arr), 516*4d6fc14bSjoerg make_index_sequence<_Size>()); 517*4d6fc14bSjoerg} 518*4d6fc14bSjoerg 519*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER > 17 520*4d6fc14bSjoerg 521*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD 522*4d6fc14bSjoerg 523*4d6fc14bSjoerg#endif // _LIBCPP_ARRAY 524