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 35*77b9abfcSLouis Dionne void fill(const T& u); // constexpr in C++20 36*77b9abfcSLouis Dionne void swap(array& a) noexcept(is_nothrow_swappable_v<T>); // constexpr in C++20 373e519524SHoward Hinnant 383e519524SHoward Hinnant // iterators: 39*77b9abfcSLouis Dionne iterator begin() noexcept; // constexpr in C++17 40*77b9abfcSLouis Dionne const_iterator begin() const noexcept; // constexpr in C++17 41*77b9abfcSLouis Dionne iterator end() noexcept; // constexpr in C++17 42*77b9abfcSLouis Dionne const_iterator end() const noexcept; // constexpr in C++17 433e519524SHoward Hinnant 44*77b9abfcSLouis Dionne reverse_iterator rbegin() noexcept; // constexpr in C++17 45*77b9abfcSLouis Dionne const_reverse_iterator rbegin() const noexcept; // constexpr in C++17 46*77b9abfcSLouis Dionne reverse_iterator rend() noexcept; // constexpr in C++17 47*77b9abfcSLouis Dionne const_reverse_iterator rend() const noexcept; // constexpr in C++17 483e519524SHoward Hinnant 49*77b9abfcSLouis Dionne const_iterator cbegin() const noexcept; // constexpr in C++17 50*77b9abfcSLouis Dionne const_iterator cend() const noexcept; // constexpr in C++17 51*77b9abfcSLouis Dionne const_reverse_iterator crbegin() const noexcept; // constexpr in C++17 52*77b9abfcSLouis Dionne const_reverse_iterator crend() const noexcept; // constexpr in C++17 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: 60*77b9abfcSLouis Dionne reference operator[](size_type n); // constexpr in C++17 618bf1f08aSMarshall Clow const_reference operator[](size_type n) const; // constexpr in C++14 62*77b9abfcSLouis Dionne reference at(size_type n); // constexpr in C++17 638bf1f08aSMarshall Clow const_reference at(size_type n) const; // constexpr in C++14 643e519524SHoward Hinnant 65*77b9abfcSLouis Dionne reference front(); // constexpr in C++17 668bf1f08aSMarshall Clow const_reference front() const; // constexpr in C++14 67*77b9abfcSLouis Dionne reference back(); // constexpr in C++17 688bf1f08aSMarshall Clow const_reference back() const; // constexpr in C++14 693e519524SHoward Hinnant 70*77b9abfcSLouis Dionne T* data() noexcept; // constexpr in C++17 71*77b9abfcSLouis Dionne const T* data() const noexcept; // constexpr in C++17 723e519524SHoward Hinnant}; 733e519524SHoward Hinnant 740ca8c089SMarshall Clowtemplate <class T, class... U> 75*77b9abfcSLouis Dionne array(T, U...) -> array<T, 1 + sizeof...(U)>; // C++17 760ca8c089SMarshall Clow 773e519524SHoward Hinnanttemplate <class T, size_t N> 78*77b9abfcSLouis Dionne bool operator==(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 793e519524SHoward Hinnanttemplate <class T, size_t N> 80*77b9abfcSLouis Dionne bool operator!=(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 813e519524SHoward Hinnanttemplate <class T, size_t N> 82*77b9abfcSLouis Dionne bool operator<(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 833e519524SHoward Hinnanttemplate <class T, size_t N> 84*77b9abfcSLouis Dionne bool operator>(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 853e519524SHoward Hinnanttemplate <class T, size_t N> 86*77b9abfcSLouis Dionne bool operator<=(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 873e519524SHoward Hinnanttemplate <class T, size_t N> 88*77b9abfcSLouis Dionne bool operator>=(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 893e519524SHoward Hinnant 903e519524SHoward Hinnanttemplate <class T, size_t N > 91*77b9abfcSLouis Dionne void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y))); // constexpr in C++20 92*77b9abfcSLouis Dionne 93*77b9abfcSLouis Dionnetemplate <class T, size_t N> 94*77b9abfcSLouis Dionne constexpr array<remove_cv_t<T>, N> to_array(T (&a)[N]); // C++20 95*77b9abfcSLouis Dionnetemplate <class T, size_t N> 96*77b9abfcSLouis Dionne constexpr array<remove_cv_t<T>, N> to_array(T (&&a)[N]); // C++20 973e519524SHoward Hinnant 98e4957601SMarshall Clowtemplate <class T> struct tuple_size; 992b0c7abbSLouis Dionnetemplate <size_t I, class T> struct tuple_element; 1003e519524SHoward Hinnanttemplate <class T, size_t N> struct tuple_size<array<T, N>>; 1015fcc8169SMarshall Clowtemplate <size_t I, class T, size_t N> struct tuple_element<I, array<T, N>>; 1025fcc8169SMarshall Clowtemplate <size_t I, class T, size_t N> T& get(array<T, N>&) noexcept; // constexpr in C++14 1035fcc8169SMarshall Clowtemplate <size_t I, class T, size_t N> const T& get(const array<T, N>&) noexcept; // constexpr in C++14 1045fcc8169SMarshall Clowtemplate <size_t I, class T, size_t N> T&& get(array<T, N>&&) noexcept; // constexpr in C++14 105545b8861SEric Fiseliertemplate <size_t I, class T, size_t N> const T&& get(const array<T, N>&&) noexcept; // constexpr in C++14 1063e519524SHoward Hinnant 1073e519524SHoward Hinnant} // std 1083e519524SHoward Hinnant 1093e519524SHoward Hinnant*/ 1103e519524SHoward Hinnant 1113e519524SHoward Hinnant#include <__config> 1123e519524SHoward Hinnant#include <__tuple> 1133e519524SHoward Hinnant#include <type_traits> 1143e519524SHoward Hinnant#include <utility> 1153e519524SHoward Hinnant#include <iterator> 1163e519524SHoward Hinnant#include <algorithm> 1173e519524SHoward Hinnant#include <stdexcept> 11859cdf90aSEric Fiselier#include <cstdlib> // for _LIBCPP_UNREACHABLE 119f56972e2SMarshall Clow#include <version> 12059cdf90aSEric Fiselier#include <__debug> 1213e519524SHoward Hinnant 122073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1233e519524SHoward Hinnant#pragma GCC system_header 124073458b1SHoward Hinnant#endif 1253e519524SHoward Hinnant 126a016efb1SEric Fiselier 127a016efb1SEric Fiselier 1283e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 1293e519524SHoward Hinnant 13059cdf90aSEric Fiselier 1313e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 132e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS array 1333e519524SHoward Hinnant{ 1343e519524SHoward Hinnant // types: 1353e519524SHoward Hinnant typedef array __self; 1363e519524SHoward Hinnant typedef _Tp value_type; 1373e519524SHoward Hinnant typedef value_type& reference; 1383e519524SHoward Hinnant typedef const value_type& const_reference; 1393e519524SHoward Hinnant typedef value_type* iterator; 1403e519524SHoward Hinnant typedef const value_type* const_iterator; 1413e519524SHoward Hinnant typedef value_type* pointer; 1423e519524SHoward Hinnant typedef const value_type* const_pointer; 1433e519524SHoward Hinnant typedef size_t size_type; 1443e519524SHoward Hinnant typedef ptrdiff_t difference_type; 1453e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 1463e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 1473e519524SHoward Hinnant 14859cdf90aSEric Fiselier _Tp __elems_[_Size]; 1493e519524SHoward Hinnant 1503e519524SHoward Hinnant // No explicit construct/copy/destroy for aggregate type 151*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 152*77b9abfcSLouis Dionne void fill(const value_type& __u) { 15359cdf90aSEric Fiselier _VSTD::fill_n(__elems_, _Size, __u); 15459cdf90aSEric Fiselier } 155afeda5c2SEric Fiselier 156*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 15759cdf90aSEric Fiselier void swap(array& __a) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) { 15859cdf90aSEric Fiselier std::swap_ranges(__elems_, __elems_ + _Size, __a.__elems_); 15959cdf90aSEric Fiselier } 1603e519524SHoward Hinnant 1613e519524SHoward Hinnant // iterators: 162020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 16359cdf90aSEric Fiselier iterator begin() _NOEXCEPT {return iterator(data());} 164020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 16559cdf90aSEric Fiselier const_iterator begin() const _NOEXCEPT {return const_iterator(data());} 166020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 16759cdf90aSEric Fiselier iterator end() _NOEXCEPT {return iterator(data() + _Size);} 168020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 16959cdf90aSEric Fiselier const_iterator end() const _NOEXCEPT {return const_iterator(data() + _Size);} 1703e519524SHoward Hinnant 171020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1728f0cd597SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 173020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1748f0cd597SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} 175020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1768f0cd597SHoward Hinnant reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 177020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1788f0cd597SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} 1793e519524SHoward Hinnant 180020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1818f0cd597SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 182020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1838f0cd597SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 184020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1858f0cd597SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 186020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1878f0cd597SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 1883e519524SHoward Hinnant 1893e519524SHoward Hinnant // capacity: 1908f0cd597SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 191397717b7SHoward Hinnant _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return _Size;} 1928f0cd597SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 193397717b7SHoward Hinnant _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return _Size;} 19472c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 19559cdf90aSEric Fiselier _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return false; } 1963e519524SHoward Hinnant 1973e519524SHoward Hinnant // element access: 198e7826950SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1995f6a5ac1SMarshall Clow reference operator[](size_type __n) _NOEXCEPT {return __elems_[__n];} 200e7826950SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 2015f6a5ac1SMarshall Clow const_reference operator[](size_type __n) const _NOEXCEPT {return __elems_[__n];} 202e7826950SMarshall Clow 2030161874cSLouis Dionne _LIBCPP_CONSTEXPR_AFTER_CXX14 reference at(size_type __n) 2040161874cSLouis Dionne { 2050161874cSLouis Dionne if (__n >= _Size) 2060161874cSLouis Dionne __throw_out_of_range("array::at"); 2070161874cSLouis Dionne return __elems_[__n]; 2080161874cSLouis Dionne } 2090161874cSLouis Dionne 2100161874cSLouis Dionne _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference at(size_type __n) const 2110161874cSLouis Dionne { 2120161874cSLouis Dionne if (__n >= _Size) 2130161874cSLouis Dionne __throw_out_of_range("array::at"); 2140161874cSLouis Dionne return __elems_[__n]; 2150161874cSLouis Dionne } 2163e519524SHoward Hinnant 2179ea0e473SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference front() _NOEXCEPT {return __elems_[0];} 2189ea0e473SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference front() const _NOEXCEPT {return __elems_[0];} 2199ea0e473SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference back() _NOEXCEPT {return __elems_[_Size - 1];} 2209ea0e473SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference back() const _NOEXCEPT {return __elems_[_Size - 1];} 2213e519524SHoward Hinnant 222020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 223936ff584SNirav Dave value_type* data() _NOEXCEPT {return __elems_;} 224020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 225936ff584SNirav Dave const value_type* data() const _NOEXCEPT {return __elems_;} 2263e519524SHoward Hinnant}; 2273e519524SHoward Hinnant 22859cdf90aSEric Fiseliertemplate <class _Tp> 22959cdf90aSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS array<_Tp, 0> 23059cdf90aSEric Fiselier{ 23159cdf90aSEric Fiselier // types: 23259cdf90aSEric Fiselier typedef array __self; 23359cdf90aSEric Fiselier typedef _Tp value_type; 23459cdf90aSEric Fiselier typedef value_type& reference; 23559cdf90aSEric Fiselier typedef const value_type& const_reference; 23659cdf90aSEric Fiselier typedef value_type* iterator; 23759cdf90aSEric Fiselier typedef const value_type* const_iterator; 23859cdf90aSEric Fiselier typedef value_type* pointer; 23959cdf90aSEric Fiselier typedef const value_type* const_pointer; 24059cdf90aSEric Fiselier typedef size_t size_type; 24159cdf90aSEric Fiselier typedef ptrdiff_t difference_type; 24259cdf90aSEric Fiselier typedef std::reverse_iterator<iterator> reverse_iterator; 24359cdf90aSEric Fiselier typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 24459cdf90aSEric Fiselier 245*77b9abfcSLouis Dionne#ifndef _LIBCPP_CXX03_LANG 246*77b9abfcSLouis Dionne union __wrapper { 247*77b9abfcSLouis Dionne _LIBCPP_CONSTEXPR __wrapper() : __b() { } 248*77b9abfcSLouis Dionne ~__wrapper() = default; 249*77b9abfcSLouis Dionne 250*77b9abfcSLouis Dionne bool __b; 251*77b9abfcSLouis Dionne _Tp __t; 252*77b9abfcSLouis Dionne } __w; 253*77b9abfcSLouis Dionne 254*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 255*77b9abfcSLouis Dionne value_type* data() _NOEXCEPT {return &__w.__t;} 256*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 257*77b9abfcSLouis Dionne const value_type* data() const _NOEXCEPT {return &__w.__t;} 258*77b9abfcSLouis Dionne#else // C++03 25959cdf90aSEric Fiselier typedef typename conditional<is_const<_Tp>::value, const char, 26059cdf90aSEric Fiselier char>::type _CharType; 2611a78ae3cSEric Fiselier 2621a78ae3cSEric Fiselier struct _ArrayInStructT { _Tp __data_[1]; }; 2631a78ae3cSEric Fiselier _ALIGNAS_TYPE(_ArrayInStructT) _CharType __elems_[sizeof(_ArrayInStructT)]; 26459cdf90aSEric Fiselier 265*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY 266*77b9abfcSLouis Dionne value_type* data() _NOEXCEPT {return reinterpret_cast<value_type*>(__elems_);} 267*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY 268*77b9abfcSLouis Dionne const value_type* data() const _NOEXCEPT {return reinterpret_cast<const value_type*>(__elems_);} 269*77b9abfcSLouis Dionne#endif 270*77b9abfcSLouis Dionne 27159cdf90aSEric Fiselier // No explicit construct/copy/destroy for aggregate type 272*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 273*77b9abfcSLouis Dionne void fill(const value_type&) { 27459cdf90aSEric Fiselier static_assert(!is_const<_Tp>::value, 27559cdf90aSEric Fiselier "cannot fill zero-sized array of type 'const T'"); 27659cdf90aSEric Fiselier } 27759cdf90aSEric Fiselier 278*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 27959cdf90aSEric Fiselier void swap(array&) _NOEXCEPT { 28059cdf90aSEric Fiselier static_assert(!is_const<_Tp>::value, 28159cdf90aSEric Fiselier "cannot swap zero-sized array of type 'const T'"); 28259cdf90aSEric Fiselier } 28359cdf90aSEric Fiselier 28459cdf90aSEric Fiselier // iterators: 285*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 28659cdf90aSEric Fiselier iterator begin() _NOEXCEPT {return iterator(data());} 287*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 28859cdf90aSEric Fiselier const_iterator begin() const _NOEXCEPT {return const_iterator(data());} 289*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 29059cdf90aSEric Fiselier iterator end() _NOEXCEPT {return iterator(data());} 291*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 29259cdf90aSEric Fiselier const_iterator end() const _NOEXCEPT {return const_iterator(data());} 29359cdf90aSEric Fiselier 294*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 29559cdf90aSEric Fiselier reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 296*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 29759cdf90aSEric Fiselier const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} 298*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 29959cdf90aSEric Fiselier reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 300*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 30159cdf90aSEric Fiselier const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} 30259cdf90aSEric Fiselier 303*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 30459cdf90aSEric Fiselier const_iterator cbegin() const _NOEXCEPT {return begin();} 305*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 30659cdf90aSEric Fiselier const_iterator cend() const _NOEXCEPT {return end();} 307*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 30859cdf90aSEric Fiselier const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 309*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 31059cdf90aSEric Fiselier const_reverse_iterator crend() const _NOEXCEPT {return rend();} 31159cdf90aSEric Fiselier 31259cdf90aSEric Fiselier // capacity: 31359cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 31459cdf90aSEric Fiselier _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return 0; } 31559cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 31659cdf90aSEric Fiselier _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return 0;} 31759cdf90aSEric Fiselier _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 31859cdf90aSEric Fiselier _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return true;} 31959cdf90aSEric Fiselier 32059cdf90aSEric Fiselier // element access: 321*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 3225f6a5ac1SMarshall Clow reference operator[](size_type) _NOEXCEPT { 32359cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array"); 32459cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 32559cdf90aSEric Fiselier } 32659cdf90aSEric Fiselier 32759cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3285f6a5ac1SMarshall Clow const_reference operator[](size_type) const _NOEXCEPT { 32959cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array"); 33059cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 33159cdf90aSEric Fiselier } 33259cdf90aSEric Fiselier 333*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 33459cdf90aSEric Fiselier reference at(size_type) { 33559cdf90aSEric Fiselier __throw_out_of_range("array<T, 0>::at"); 33659cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 33759cdf90aSEric Fiselier } 33859cdf90aSEric Fiselier 339*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 34059cdf90aSEric Fiselier const_reference at(size_type) const { 34159cdf90aSEric Fiselier __throw_out_of_range("array<T, 0>::at"); 34259cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 34359cdf90aSEric Fiselier } 34459cdf90aSEric Fiselier 345*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 3469ea0e473SMarshall Clow reference front() _NOEXCEPT { 34759cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array"); 34859cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 34959cdf90aSEric Fiselier } 35059cdf90aSEric Fiselier 351*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3529ea0e473SMarshall Clow const_reference front() const _NOEXCEPT { 35359cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array"); 35459cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 35559cdf90aSEric Fiselier } 35659cdf90aSEric Fiselier 357*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 3589ea0e473SMarshall Clow reference back() _NOEXCEPT { 35959cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array"); 36059cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 36159cdf90aSEric Fiselier } 36259cdf90aSEric Fiselier 363*77b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3649ea0e473SMarshall Clow const_reference back() const _NOEXCEPT { 36559cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array"); 36659cdf90aSEric Fiselier _LIBCPP_UNREACHABLE(); 36759cdf90aSEric Fiselier } 36859cdf90aSEric Fiselier}; 36959cdf90aSEric Fiselier 37059cdf90aSEric Fiselier 3710ca8c089SMarshall Clow#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES 3720ca8c089SMarshall Clowtemplate<class _Tp, class... _Args, 373c6eb584cSEric Fiselier class = _EnableIf<__all<_IsSame<_Tp, _Args>::value...>::value> 3740ca8c089SMarshall Clow > 3750ca8c089SMarshall Clowarray(_Tp, _Args...) 3760ca8c089SMarshall Clow -> array<_Tp, 1 + sizeof...(_Args)>; 3770ca8c089SMarshall Clow#endif 3780ca8c089SMarshall Clow 3793e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 3803af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38107d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 3823e519524SHoward Hinnantoperator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 3833e519524SHoward Hinnant{ 38459cdf90aSEric Fiselier return _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 3853e519524SHoward Hinnant} 3863e519524SHoward Hinnant 3873e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 3883af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 38907d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 3903e519524SHoward Hinnantoperator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 3913e519524SHoward Hinnant{ 3923e519524SHoward Hinnant return !(__x == __y); 3933e519524SHoward Hinnant} 3943e519524SHoward Hinnant 3953e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 3963af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 39707d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 3983e519524SHoward Hinnantoperator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 3993e519524SHoward Hinnant{ 40059cdf90aSEric Fiselier return _VSTD::lexicographical_compare(__x.begin(), __x.end(), 40159cdf90aSEric Fiselier __y.begin(), __y.end()); 4023e519524SHoward Hinnant} 4033e519524SHoward Hinnant 4043e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 4053af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 40607d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 4073e519524SHoward Hinnantoperator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4083e519524SHoward Hinnant{ 4093e519524SHoward Hinnant return __y < __x; 4103e519524SHoward Hinnant} 4113e519524SHoward Hinnant 4123e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 4133af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 41407d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 4153e519524SHoward Hinnantoperator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4163e519524SHoward Hinnant{ 4173e519524SHoward Hinnant return !(__y < __x); 4183e519524SHoward Hinnant} 4193e519524SHoward Hinnant 4203e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 4213af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 42207d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 4233e519524SHoward Hinnantoperator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4243e519524SHoward Hinnant{ 4253e519524SHoward Hinnant return !(__x < __y); 4263e519524SHoward Hinnant} 4273e519524SHoward Hinnant 4283e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 429*77b9abfcSLouis Dionneinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 430bc95cf0dSHoward Hinnanttypename enable_if 431bc95cf0dSHoward Hinnant< 432f07dd8d0SEric Fiselier _Size == 0 || 433bc95cf0dSHoward Hinnant __is_swappable<_Tp>::value, 4343e519524SHoward Hinnant void 435bc95cf0dSHoward Hinnant>::type 436ee66eb13SMarshall Clowswap(array<_Tp, _Size>& __x, array<_Tp, _Size>& __y) 437f07dd8d0SEric Fiselier _NOEXCEPT_(noexcept(__x.swap(__y))) 4383e519524SHoward Hinnant{ 4393e519524SHoward Hinnant __x.swap(__y); 4403e519524SHoward Hinnant} 4413e519524SHoward Hinnant 4423e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 443e4957601SMarshall Clowstruct _LIBCPP_TEMPLATE_VIS tuple_size<array<_Tp, _Size> > 444f5ab703fSHoward Hinnant : public integral_constant<size_t, _Size> {}; 4453e519524SHoward Hinnant 4463e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 4472b0c7abbSLouis Dionnestruct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, array<_Tp, _Size> > 4483e519524SHoward Hinnant{ 4496db379a2SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::tuple_element<> (std::array)"); 4503e519524SHoward Hinnant typedef _Tp type; 4513e519524SHoward Hinnant}; 4523e519524SHoward Hinnant 4533e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 4543af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4553e519524SHoward Hinnant_Tp& 4568f0cd597SHoward Hinnantget(array<_Tp, _Size>& __a) _NOEXCEPT 4573e519524SHoward Hinnant{ 45836a60721SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array)"); 4598bf1f08aSMarshall Clow return __a.__elems_[_Ip]; 4603e519524SHoward Hinnant} 4613e519524SHoward Hinnant 4623e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 4633af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4643e519524SHoward Hinnantconst _Tp& 4658f0cd597SHoward Hinnantget(const array<_Tp, _Size>& __a) _NOEXCEPT 4663e519524SHoward Hinnant{ 46736a60721SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array)"); 4688bf1f08aSMarshall Clow return __a.__elems_[_Ip]; 4693e519524SHoward Hinnant} 4703e519524SHoward Hinnant 471208156e8SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 472601afb30SHoward Hinnant 473601afb30SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 4743af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 475601afb30SHoward Hinnant_Tp&& 4768f0cd597SHoward Hinnantget(array<_Tp, _Size>&& __a) _NOEXCEPT 477601afb30SHoward Hinnant{ 47836a60721SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array &&)"); 4798bf1f08aSMarshall Clow return _VSTD::move(__a.__elems_[_Ip]); 480601afb30SHoward Hinnant} 481601afb30SHoward Hinnant 482545b8861SEric Fiseliertemplate <size_t _Ip, class _Tp, size_t _Size> 483545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 484545b8861SEric Fiselierconst _Tp&& 485545b8861SEric Fiselierget(const array<_Tp, _Size>&& __a) _NOEXCEPT 486545b8861SEric Fiselier{ 487545b8861SEric Fiselier static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array &&)"); 488545b8861SEric Fiselier return _VSTD::move(__a.__elems_[_Ip]); 489545b8861SEric Fiselier} 490545b8861SEric Fiselier 491208156e8SEric Fiselier#endif // !_LIBCPP_CXX03_LANG 492601afb30SHoward Hinnant 493e93e58c6SMarek Kurdej#if _LIBCPP_STD_VER > 17 494e93e58c6SMarek Kurdej 495e93e58c6SMarek Kurdejtemplate <typename _Tp, size_t _Size, size_t... _Index> 496e93e58c6SMarek Kurdej_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 497e93e58c6SMarek Kurdej__to_array_lvalue_impl(_Tp (&__arr)[_Size], index_sequence<_Index...>) { 498e93e58c6SMarek Kurdej return {{__arr[_Index]...}}; 499e93e58c6SMarek Kurdej} 500e93e58c6SMarek Kurdej 501e93e58c6SMarek Kurdejtemplate <typename _Tp, size_t _Size, size_t... _Index> 502e93e58c6SMarek Kurdej_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 503e93e58c6SMarek Kurdej__to_array_rvalue_impl(_Tp(&&__arr)[_Size], index_sequence<_Index...>) { 504e93e58c6SMarek Kurdej return {{_VSTD::move(__arr[_Index])...}}; 505e93e58c6SMarek Kurdej} 506e93e58c6SMarek Kurdej 507e93e58c6SMarek Kurdejtemplate <typename _Tp, size_t _Size> 508e93e58c6SMarek Kurdej_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 509e93e58c6SMarek Kurdejto_array(_Tp (&__arr)[_Size]) noexcept(is_nothrow_constructible_v<_Tp, _Tp&>) { 510e93e58c6SMarek Kurdej static_assert( 511e93e58c6SMarek Kurdej !is_array_v<_Tp>, 512e93e58c6SMarek Kurdej "[array.creation]/1: to_array does not accept multidimensional arrays."); 513e93e58c6SMarek Kurdej static_assert( 514e93e58c6SMarek Kurdej is_constructible_v<_Tp, _Tp&>, 515e93e58c6SMarek Kurdej "[array.creation]/1: to_array requires copy constructible elements."); 516e93e58c6SMarek Kurdej return __to_array_lvalue_impl(__arr, make_index_sequence<_Size>()); 517e93e58c6SMarek Kurdej} 518e93e58c6SMarek Kurdej 519e93e58c6SMarek Kurdejtemplate <typename _Tp, size_t _Size> 520e93e58c6SMarek Kurdej_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 521e93e58c6SMarek Kurdejto_array(_Tp(&&__arr)[_Size]) noexcept(is_nothrow_move_constructible_v<_Tp>) { 522e93e58c6SMarek Kurdej static_assert( 523e93e58c6SMarek Kurdej !is_array_v<_Tp>, 524e93e58c6SMarek Kurdej "[array.creation]/4: to_array does not accept multidimensional arrays."); 525e93e58c6SMarek Kurdej static_assert( 526e93e58c6SMarek Kurdej is_move_constructible_v<_Tp>, 527e93e58c6SMarek Kurdej "[array.creation]/4: to_array requires move constructible elements."); 528e93e58c6SMarek Kurdej return __to_array_rvalue_impl(_VSTD::move(__arr), 529e93e58c6SMarek Kurdej make_index_sequence<_Size>()); 530e93e58c6SMarek Kurdej} 531e93e58c6SMarek Kurdej 532e93e58c6SMarek Kurdej#endif // _LIBCPP_STD_VER > 17 533e93e58c6SMarek Kurdej 5343e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 5353e519524SHoward Hinnant 5363e519524SHoward Hinnant#endif // _LIBCPP_ARRAY 537