13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===---------------------------- array -----------------------------------===// 33e519524SHoward Hinnant// 457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information. 657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 73e519524SHoward Hinnant// 83e519524SHoward Hinnant//===----------------------------------------------------------------------===// 93e519524SHoward Hinnant 103e519524SHoward Hinnant#ifndef _LIBCPP_ARRAY 113e519524SHoward Hinnant#define _LIBCPP_ARRAY 123e519524SHoward Hinnant 133e519524SHoward Hinnant/* 143e519524SHoward Hinnant array synopsis 153e519524SHoward Hinnant 163e519524SHoward Hinnantnamespace std 173e519524SHoward Hinnant{ 183e519524SHoward Hinnanttemplate <class T, size_t N > 193e519524SHoward Hinnantstruct array 203e519524SHoward Hinnant{ 213e519524SHoward Hinnant // types: 223e519524SHoward Hinnant typedef T & reference; 233e519524SHoward Hinnant typedef const T & const_reference; 243e519524SHoward Hinnant typedef implementation defined iterator; 253e519524SHoward Hinnant typedef implementation defined const_iterator; 263e519524SHoward Hinnant typedef size_t size_type; 273e519524SHoward Hinnant typedef ptrdiff_t difference_type; 283e519524SHoward Hinnant typedef T value_type; 293e519524SHoward Hinnant typedef T* pointer; 303e519524SHoward Hinnant typedef const T* const_pointer; 313e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 323e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 333e519524SHoward Hinnant 343e519524SHoward Hinnant // No explicit construct/copy/destroy for aggregate type 353e519524SHoward Hinnant void fill(const T& u); 36f07dd8d0SEric Fiselier void swap(array& a) noexcept(is_nothrow_swappable_v<T>); 373e519524SHoward Hinnant 383e519524SHoward Hinnant // iterators: 398f0cd597SHoward Hinnant iterator begin() noexcept; 408f0cd597SHoward Hinnant const_iterator begin() const noexcept; 418f0cd597SHoward Hinnant iterator end() noexcept; 428f0cd597SHoward Hinnant const_iterator end() const noexcept; 433e519524SHoward Hinnant 448f0cd597SHoward Hinnant reverse_iterator rbegin() noexcept; 458f0cd597SHoward Hinnant const_reverse_iterator rbegin() const noexcept; 468f0cd597SHoward Hinnant reverse_iterator rend() noexcept; 478f0cd597SHoward Hinnant const_reverse_iterator rend() const noexcept; 483e519524SHoward Hinnant 498f0cd597SHoward Hinnant const_iterator cbegin() const noexcept; 508f0cd597SHoward Hinnant const_iterator cend() const noexcept; 518f0cd597SHoward Hinnant const_reverse_iterator crbegin() const noexcept; 528f0cd597SHoward Hinnant const_reverse_iterator crend() const noexcept; 533e519524SHoward Hinnant 543e519524SHoward Hinnant // capacity: 558f0cd597SHoward Hinnant constexpr size_type size() const noexcept; 568f0cd597SHoward Hinnant constexpr size_type max_size() const noexcept; 57397717b7SHoward Hinnant constexpr bool empty() const noexcept; 583e519524SHoward Hinnant 593e519524SHoward Hinnant // element access: 603e519524SHoward Hinnant reference operator[](size_type n); 618bf1f08aSMarshall Clow const_reference operator[](size_type n) const; // constexpr in C++14 628bf1f08aSMarshall Clow const_reference at(size_type n) const; // constexpr in C++14 633e519524SHoward Hinnant reference at(size_type n); 643e519524SHoward Hinnant 653e519524SHoward Hinnant reference front(); 668bf1f08aSMarshall Clow const_reference front() const; // constexpr in C++14 673e519524SHoward Hinnant reference back(); 688bf1f08aSMarshall Clow const_reference back() const; // constexpr in C++14 693e519524SHoward Hinnant 708f0cd597SHoward Hinnant T* data() noexcept; 718f0cd597SHoward Hinnant const T* data() const noexcept; 723e519524SHoward Hinnant}; 733e519524SHoward Hinnant 740ca8c089SMarshall Clow template <class T, class... U> 750ca8c089SMarshall Clow array(T, U...) -> array<T, 1 + sizeof...(U)>; 760ca8c089SMarshall Clow 773e519524SHoward Hinnanttemplate <class T, size_t N> 783e519524SHoward Hinnant bool operator==(const array<T,N>& x, const array<T,N>& y); 793e519524SHoward Hinnanttemplate <class T, size_t N> 803e519524SHoward Hinnant bool operator!=(const array<T,N>& x, const array<T,N>& y); 813e519524SHoward Hinnanttemplate <class T, size_t N> 823e519524SHoward Hinnant bool operator<(const array<T,N>& x, const array<T,N>& y); 833e519524SHoward Hinnanttemplate <class T, size_t N> 843e519524SHoward Hinnant bool operator>(const array<T,N>& x, const array<T,N>& y); 853e519524SHoward Hinnanttemplate <class T, size_t N> 863e519524SHoward Hinnant bool operator<=(const array<T,N>& x, const array<T,N>& y); 873e519524SHoward Hinnanttemplate <class T, size_t N> 883e519524SHoward Hinnant bool operator>=(const array<T,N>& x, const array<T,N>& y); 893e519524SHoward Hinnant 903e519524SHoward Hinnanttemplate <class T, size_t N > 910ca8c089SMarshall Clow void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y))); // C++17 923e519524SHoward Hinnant 93e4957601SMarshall Clowtemplate <class T> struct tuple_size; 94*2b0c7abbSLouis Dionnetemplate <size_t I, class T> struct tuple_element; 953e519524SHoward Hinnanttemplate <class T, size_t N> struct tuple_size<array<T, N>>; 965fcc8169SMarshall Clowtemplate <size_t I, class T, size_t N> struct tuple_element<I, array<T, N>>; 975fcc8169SMarshall Clowtemplate <size_t I, class T, size_t N> T& get(array<T, N>&) noexcept; // constexpr in C++14 985fcc8169SMarshall Clowtemplate <size_t I, class T, size_t N> const T& get(const array<T, N>&) noexcept; // constexpr in C++14 995fcc8169SMarshall Clowtemplate <size_t I, class T, size_t N> T&& get(array<T, N>&&) noexcept; // constexpr in C++14 100545b8861SEric Fiseliertemplate <size_t I, class T, size_t N> const T&& get(const array<T, N>&&) noexcept; // constexpr in C++14 1013e519524SHoward Hinnant 1023e519524SHoward Hinnant} // std 1033e519524SHoward Hinnant 1043e519524SHoward Hinnant*/ 1053e519524SHoward Hinnant 1063e519524SHoward Hinnant#include <__config> 1073e519524SHoward Hinnant#include <__tuple> 1083e519524SHoward Hinnant#include <type_traits> 1093e519524SHoward Hinnant#include <utility> 1103e519524SHoward Hinnant#include <iterator> 1113e519524SHoward Hinnant#include <algorithm> 1123e519524SHoward Hinnant#include <stdexcept> 11359cdf90aSEric Fiselier#include <cstdlib> // for _LIBCPP_UNREACHABLE 114f56972e2SMarshall Clow#include <version> 11559cdf90aSEric Fiselier#include <__debug> 1163e519524SHoward Hinnant 117073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1183e519524SHoward Hinnant#pragma GCC system_header 119073458b1SHoward Hinnant#endif 1203e519524SHoward Hinnant 121a016efb1SEric Fiselier 122a016efb1SEric Fiselier 1233e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 1243e519524SHoward Hinnant 12559cdf90aSEric Fiselier 1263e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 127e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS array 1283e519524SHoward Hinnant{ 1293e519524SHoward Hinnant // types: 1303e519524SHoward Hinnant typedef array __self; 1313e519524SHoward Hinnant typedef _Tp value_type; 1323e519524SHoward Hinnant typedef value_type& reference; 1333e519524SHoward Hinnant typedef const value_type& const_reference; 1343e519524SHoward Hinnant typedef value_type* iterator; 1353e519524SHoward Hinnant typedef const value_type* const_iterator; 1363e519524SHoward Hinnant typedef value_type* pointer; 1373e519524SHoward Hinnant typedef const value_type* const_pointer; 1383e519524SHoward Hinnant typedef size_t size_type; 1393e519524SHoward Hinnant typedef ptrdiff_t difference_type; 1403e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 1413e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 1423e519524SHoward Hinnant 14359cdf90aSEric Fiselier _Tp __elems_[_Size]; 1443e519524SHoward Hinnant 1453e519524SHoward Hinnant // No explicit construct/copy/destroy for aggregate type 14659cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY void fill(const value_type& __u) { 14759cdf90aSEric Fiselier _VSTD::fill_n(__elems_, _Size, __u); 14859cdf90aSEric Fiselier } 149afeda5c2SEric Fiselier 1508f0cd597SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15159cdf90aSEric Fiselier void swap(array& __a) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) { 15259cdf90aSEric Fiselier std::swap_ranges(__elems_, __elems_ + _Size, __a.__elems_); 15359cdf90aSEric Fiselier } 1543e519524SHoward Hinnant 1553e519524SHoward Hinnant // iterators: 156020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 15759cdf90aSEric Fiselier iterator begin() _NOEXCEPT {return iterator(data());} 158020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 15959cdf90aSEric Fiselier const_iterator begin() const _NOEXCEPT {return const_iterator(data());} 160020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 16159cdf90aSEric Fiselier iterator end() _NOEXCEPT {return iterator(data() + _Size);} 162020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 16359cdf90aSEric Fiselier const_iterator end() const _NOEXCEPT {return const_iterator(data() + _Size);} 1643e519524SHoward Hinnant 165020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1668f0cd597SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 167020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1688f0cd597SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} 169020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1708f0cd597SHoward Hinnant reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 171020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1728f0cd597SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} 1733e519524SHoward Hinnant 174020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1758f0cd597SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 176020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1778f0cd597SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 178020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1798f0cd597SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 180020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1818f0cd597SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 1823e519524SHoward Hinnant 1833e519524SHoward Hinnant // capacity: 1848f0cd597SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 185397717b7SHoward Hinnant _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return _Size;} 1868f0cd597SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 187397717b7SHoward Hinnant _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return _Size;} 18872c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 18959cdf90aSEric Fiselier _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return false; } 1903e519524SHoward Hinnant 1913e519524SHoward Hinnant // element access: 192e7826950SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1935f6a5ac1SMarshall Clow reference operator[](size_type __n) _NOEXCEPT {return __elems_[__n];} 194e7826950SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1955f6a5ac1SMarshall Clow const_reference operator[](size_type __n) const _NOEXCEPT {return __elems_[__n];} 196e7826950SMarshall Clow 197e7826950SMarshall Clow _LIBCPP_CONSTEXPR_AFTER_CXX14 reference at(size_type __n); 1988bf1f08aSMarshall Clow _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference at(size_type __n) const; 1993e519524SHoward Hinnant 2009ea0e473SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference front() _NOEXCEPT {return __elems_[0];} 2019ea0e473SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference front() const _NOEXCEPT {return __elems_[0];} 2029ea0e473SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference back() _NOEXCEPT {return __elems_[_Size - 1];} 2039ea0e473SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference back() const _NOEXCEPT {return __elems_[_Size - 1];} 2043e519524SHoward Hinnant 205020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 206936ff584SNirav Dave value_type* data() _NOEXCEPT {return __elems_;} 207020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 208936ff584SNirav Dave const value_type* data() const _NOEXCEPT {return __elems_;} 2093e519524SHoward Hinnant}; 2103e519524SHoward Hinnant 21159cdf90aSEric Fiselier 2123e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 213e7826950SMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX14 2143e519524SHoward Hinnanttypename array<_Tp, _Size>::reference 2153e519524SHoward Hinnantarray<_Tp, _Size>::at(size_type __n) 2163e519524SHoward Hinnant{ 2173e519524SHoward Hinnant if (__n >= _Size) 218d437fa5cSMarshall Clow __throw_out_of_range("array::at"); 219d437fa5cSMarshall Clow 2203e519524SHoward Hinnant return __elems_[__n]; 2213e519524SHoward Hinnant} 2223e519524SHoward Hinnant 2233e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 2248bf1f08aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX11 2253e519524SHoward Hinnanttypename array<_Tp, _Size>::const_reference 2263e519524SHoward Hinnantarray<_Tp, _Size>::at(size_type __n) const 2273e519524SHoward Hinnant{ 2283e519524SHoward Hinnant if (__n >= _Size) 229d437fa5cSMarshall Clow __throw_out_of_range("array::at"); 2303e519524SHoward Hinnant return __elems_[__n]; 2313e519524SHoward Hinnant} 2323e519524SHoward Hinnant 23359cdf90aSEric Fiseliertemplate <class _Tp> 23459cdf90aSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS array<_Tp, 0> 23559cdf90aSEric Fiselier{ 23659cdf90aSEric Fiselier // types: 23759cdf90aSEric Fiselier typedef array __self; 23859cdf90aSEric Fiselier typedef _Tp value_type; 23959cdf90aSEric Fiselier typedef value_type& reference; 24059cdf90aSEric Fiselier typedef const value_type& const_reference; 24159cdf90aSEric Fiselier typedef value_type* iterator; 24259cdf90aSEric Fiselier typedef const value_type* const_iterator; 24359cdf90aSEric Fiselier typedef value_type* pointer; 24459cdf90aSEric Fiselier typedef const value_type* const_pointer; 24559cdf90aSEric Fiselier typedef size_t size_type; 24659cdf90aSEric Fiselier typedef ptrdiff_t difference_type; 24759cdf90aSEric Fiselier typedef std::reverse_iterator<iterator> reverse_iterator; 24859cdf90aSEric Fiselier typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 24959cdf90aSEric Fiselier 25059cdf90aSEric Fiselier typedef typename conditional<is_const<_Tp>::value, const char, 25159cdf90aSEric Fiselier char>::type _CharType; 2521a78ae3cSEric Fiselier 2531a78ae3cSEric Fiselier struct _ArrayInStructT { _Tp __data_[1]; }; 2541a78ae3cSEric Fiselier _ALIGNAS_TYPE(_ArrayInStructT) _CharType __elems_[sizeof(_ArrayInStructT)]; 25559cdf90aSEric Fiselier 25659cdf90aSEric Fiselier // No explicit construct/copy/destroy for aggregate type 25759cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY void fill(const value_type&) { 25859cdf90aSEric Fiselier static_assert(!is_const<_Tp>::value, 25959cdf90aSEric Fiselier "cannot fill zero-sized array of type 'const T'"); 26059cdf90aSEric Fiselier } 26159cdf90aSEric Fiselier 26259cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 26359cdf90aSEric Fiselier void swap(array&) _NOEXCEPT { 26459cdf90aSEric Fiselier static_assert(!is_const<_Tp>::value, 26559cdf90aSEric Fiselier "cannot swap zero-sized array of type 'const T'"); 26659cdf90aSEric Fiselier } 26759cdf90aSEric Fiselier 26859cdf90aSEric Fiselier // iterators: 26959cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 27059cdf90aSEric Fiselier iterator begin() _NOEXCEPT {return iterator(data());} 27159cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 27259cdf90aSEric Fiselier const_iterator begin() const _NOEXCEPT {return const_iterator(data());} 27359cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 27459cdf90aSEric Fiselier iterator end() _NOEXCEPT {return iterator(data());} 27559cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 27659cdf90aSEric Fiselier const_iterator end() const _NOEXCEPT {return const_iterator(data());} 27759cdf90aSEric Fiselier 27859cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 27959cdf90aSEric Fiselier reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 28059cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 28159cdf90aSEric Fiselier const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} 28259cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 28359cdf90aSEric Fiselier reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 28459cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 28559cdf90aSEric Fiselier const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} 28659cdf90aSEric Fiselier 28759cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 28859cdf90aSEric Fiselier const_iterator cbegin() const _NOEXCEPT {return begin();} 28959cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 29059cdf90aSEric Fiselier const_iterator cend() const _NOEXCEPT {return end();} 29159cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 29259cdf90aSEric Fiselier const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 29359cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 29459cdf90aSEric Fiselier const_reverse_iterator crend() const _NOEXCEPT {return rend();} 29559cdf90aSEric Fiselier 29659cdf90aSEric Fiselier // capacity: 29759cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 29859cdf90aSEric Fiselier _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return 0; } 29959cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 30059cdf90aSEric Fiselier _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return 0;} 30159cdf90aSEric Fiselier _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 30259cdf90aSEric Fiselier _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return true;} 30359cdf90aSEric Fiselier 30459cdf90aSEric Fiselier // element access: 30559cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 3065f6a5ac1SMarshall Clow reference operator[](size_type) _NOEXCEPT { 30759cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array"); 30859cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 30959cdf90aSEric Fiselier } 31059cdf90aSEric Fiselier 31159cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3125f6a5ac1SMarshall Clow const_reference operator[](size_type) const _NOEXCEPT { 31359cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array"); 31459cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 31559cdf90aSEric Fiselier } 31659cdf90aSEric Fiselier 31759cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 31859cdf90aSEric Fiselier reference at(size_type) { 31959cdf90aSEric Fiselier __throw_out_of_range("array<T, 0>::at"); 32059cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 32159cdf90aSEric Fiselier } 32259cdf90aSEric Fiselier 32359cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 32459cdf90aSEric Fiselier const_reference at(size_type) const { 32559cdf90aSEric Fiselier __throw_out_of_range("array<T, 0>::at"); 32659cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 32759cdf90aSEric Fiselier } 32859cdf90aSEric Fiselier 32959cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 3309ea0e473SMarshall Clow reference front() _NOEXCEPT { 33159cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array"); 33259cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 33359cdf90aSEric Fiselier } 33459cdf90aSEric Fiselier 33559cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 3369ea0e473SMarshall Clow const_reference front() const _NOEXCEPT { 33759cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array"); 33859cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 33959cdf90aSEric Fiselier } 34059cdf90aSEric Fiselier 34159cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 3429ea0e473SMarshall Clow reference back() _NOEXCEPT { 34359cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array"); 34459cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 34559cdf90aSEric Fiselier } 34659cdf90aSEric Fiselier 34759cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 3489ea0e473SMarshall Clow const_reference back() const _NOEXCEPT { 34959cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array"); 35059cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 35159cdf90aSEric Fiselier } 35259cdf90aSEric Fiselier 35359cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 35459cdf90aSEric Fiselier value_type* data() _NOEXCEPT {return reinterpret_cast<value_type*>(__elems_);} 35559cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 35659cdf90aSEric Fiselier const value_type* data() const _NOEXCEPT {return reinterpret_cast<const value_type*>(__elems_);} 35759cdf90aSEric Fiselier}; 35859cdf90aSEric Fiselier 35959cdf90aSEric Fiselier 3600ca8c089SMarshall Clow#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES 3610ca8c089SMarshall Clowtemplate<class _Tp, class... _Args, 3620ca8c089SMarshall Clow class = typename enable_if<(is_same_v<_Tp, _Args> && ...), void>::type 3630ca8c089SMarshall Clow > 3640ca8c089SMarshall Clowarray(_Tp, _Args...) 3650ca8c089SMarshall Clow -> array<_Tp, 1 + sizeof...(_Args)>; 3660ca8c089SMarshall Clow#endif 3670ca8c089SMarshall Clow 3683e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 3693af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37007d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 3713e519524SHoward Hinnantoperator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 3723e519524SHoward Hinnant{ 37359cdf90aSEric Fiselier return _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 3743e519524SHoward Hinnant} 3753e519524SHoward Hinnant 3763e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 3773af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 37807d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 3793e519524SHoward Hinnantoperator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 3803e519524SHoward Hinnant{ 3813e519524SHoward Hinnant return !(__x == __y); 3823e519524SHoward Hinnant} 3833e519524SHoward Hinnant 3843e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 3853af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38607d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 3873e519524SHoward Hinnantoperator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 3883e519524SHoward Hinnant{ 38959cdf90aSEric Fiselier return _VSTD::lexicographical_compare(__x.begin(), __x.end(), 39059cdf90aSEric Fiselier __y.begin(), __y.end()); 3913e519524SHoward Hinnant} 3923e519524SHoward Hinnant 3933e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 3943af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 39507d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 3963e519524SHoward Hinnantoperator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 3973e519524SHoward Hinnant{ 3983e519524SHoward Hinnant return __y < __x; 3993e519524SHoward Hinnant} 4003e519524SHoward Hinnant 4013e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 4023af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 40307d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 4043e519524SHoward Hinnantoperator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4053e519524SHoward Hinnant{ 4063e519524SHoward Hinnant return !(__y < __x); 4073e519524SHoward Hinnant} 4083e519524SHoward Hinnant 4093e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 4103af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 41107d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 4123e519524SHoward Hinnantoperator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4133e519524SHoward Hinnant{ 4143e519524SHoward Hinnant return !(__x < __y); 4153e519524SHoward Hinnant} 4163e519524SHoward Hinnant 4173e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 4183af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 419bc95cf0dSHoward Hinnanttypename enable_if 420bc95cf0dSHoward Hinnant< 421f07dd8d0SEric Fiselier _Size == 0 || 422bc95cf0dSHoward Hinnant __is_swappable<_Tp>::value, 4233e519524SHoward Hinnant void 424bc95cf0dSHoward Hinnant>::type 425ee66eb13SMarshall Clowswap(array<_Tp, _Size>& __x, array<_Tp, _Size>& __y) 426f07dd8d0SEric Fiselier _NOEXCEPT_(noexcept(__x.swap(__y))) 4273e519524SHoward Hinnant{ 4283e519524SHoward Hinnant __x.swap(__y); 4293e519524SHoward Hinnant} 4303e519524SHoward Hinnant 4313e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 432e4957601SMarshall Clowstruct _LIBCPP_TEMPLATE_VIS tuple_size<array<_Tp, _Size> > 433f5ab703fSHoward Hinnant : public integral_constant<size_t, _Size> {}; 4343e519524SHoward Hinnant 4353e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 436*2b0c7abbSLouis Dionnestruct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, array<_Tp, _Size> > 4373e519524SHoward Hinnant{ 4386db379a2SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::tuple_element<> (std::array)"); 4393e519524SHoward Hinnant typedef _Tp type; 4403e519524SHoward Hinnant}; 4413e519524SHoward Hinnant 4423e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 4433af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4443e519524SHoward Hinnant_Tp& 4458f0cd597SHoward Hinnantget(array<_Tp, _Size>& __a) _NOEXCEPT 4463e519524SHoward Hinnant{ 44736a60721SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array)"); 4488bf1f08aSMarshall Clow return __a.__elems_[_Ip]; 4493e519524SHoward Hinnant} 4503e519524SHoward Hinnant 4513e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 4523af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4533e519524SHoward Hinnantconst _Tp& 4548f0cd597SHoward Hinnantget(const array<_Tp, _Size>& __a) _NOEXCEPT 4553e519524SHoward Hinnant{ 45636a60721SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array)"); 4578bf1f08aSMarshall Clow return __a.__elems_[_Ip]; 4583e519524SHoward Hinnant} 4593e519524SHoward Hinnant 460208156e8SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 461601afb30SHoward Hinnant 462601afb30SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 4633af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 464601afb30SHoward Hinnant_Tp&& 4658f0cd597SHoward Hinnantget(array<_Tp, _Size>&& __a) _NOEXCEPT 466601afb30SHoward Hinnant{ 46736a60721SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array &&)"); 4688bf1f08aSMarshall Clow return _VSTD::move(__a.__elems_[_Ip]); 469601afb30SHoward Hinnant} 470601afb30SHoward Hinnant 471545b8861SEric Fiseliertemplate <size_t _Ip, class _Tp, size_t _Size> 472545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 473545b8861SEric Fiselierconst _Tp&& 474545b8861SEric Fiselierget(const array<_Tp, _Size>&& __a) _NOEXCEPT 475545b8861SEric Fiselier{ 476545b8861SEric Fiselier static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array &&)"); 477545b8861SEric Fiselier return _VSTD::move(__a.__elems_[_Ip]); 478545b8861SEric Fiselier} 479545b8861SEric Fiselier 480208156e8SEric Fiselier#endif // !_LIBCPP_CXX03_LANG 481601afb30SHoward Hinnant 4823e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 4833e519524SHoward Hinnant 4843e519524SHoward Hinnant#endif // _LIBCPP_ARRAY 485