13e519524SHoward Hinnant// -*- C++ -*- 2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===// 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 3577b9abfcSLouis Dionne void fill(const T& u); // constexpr in C++20 3677b9abfcSLouis Dionne void swap(array& a) noexcept(is_nothrow_swappable_v<T>); // constexpr in C++20 373e519524SHoward Hinnant 383e519524SHoward Hinnant // iterators: 3977b9abfcSLouis Dionne iterator begin() noexcept; // constexpr in C++17 4077b9abfcSLouis Dionne const_iterator begin() const noexcept; // constexpr in C++17 4177b9abfcSLouis Dionne iterator end() noexcept; // constexpr in C++17 4277b9abfcSLouis Dionne const_iterator end() const noexcept; // constexpr in C++17 433e519524SHoward Hinnant 4477b9abfcSLouis Dionne reverse_iterator rbegin() noexcept; // constexpr in C++17 4577b9abfcSLouis Dionne const_reverse_iterator rbegin() const noexcept; // constexpr in C++17 4677b9abfcSLouis Dionne reverse_iterator rend() noexcept; // constexpr in C++17 4777b9abfcSLouis Dionne const_reverse_iterator rend() const noexcept; // constexpr in C++17 483e519524SHoward Hinnant 4977b9abfcSLouis Dionne const_iterator cbegin() const noexcept; // constexpr in C++17 5077b9abfcSLouis Dionne const_iterator cend() const noexcept; // constexpr in C++17 5177b9abfcSLouis Dionne const_reverse_iterator crbegin() const noexcept; // constexpr in C++17 5277b9abfcSLouis 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: 6077b9abfcSLouis Dionne reference operator[](size_type n); // constexpr in C++17 618bf1f08aSMarshall Clow const_reference operator[](size_type n) const; // constexpr in C++14 6277b9abfcSLouis 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 6577b9abfcSLouis Dionne reference front(); // constexpr in C++17 668bf1f08aSMarshall Clow const_reference front() const; // constexpr in C++14 6777b9abfcSLouis Dionne reference back(); // constexpr in C++17 688bf1f08aSMarshall Clow const_reference back() const; // constexpr in C++14 693e519524SHoward Hinnant 7077b9abfcSLouis Dionne T* data() noexcept; // constexpr in C++17 7177b9abfcSLouis Dionne const T* data() const noexcept; // constexpr in C++17 723e519524SHoward Hinnant}; 733e519524SHoward Hinnant 740ca8c089SMarshall Clowtemplate <class T, class... U> 7577b9abfcSLouis Dionne array(T, U...) -> array<T, 1 + sizeof...(U)>; // C++17 760ca8c089SMarshall Clow 773e519524SHoward Hinnanttemplate <class T, size_t N> 7877b9abfcSLouis Dionne bool operator==(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 793e519524SHoward Hinnanttemplate <class T, size_t N> 8077b9abfcSLouis Dionne bool operator!=(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 813e519524SHoward Hinnanttemplate <class T, size_t N> 8277b9abfcSLouis Dionne bool operator<(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 833e519524SHoward Hinnanttemplate <class T, size_t N> 8477b9abfcSLouis Dionne bool operator>(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 853e519524SHoward Hinnanttemplate <class T, size_t N> 8677b9abfcSLouis Dionne bool operator<=(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 873e519524SHoward Hinnanttemplate <class T, size_t N> 8877b9abfcSLouis 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 > 9177b9abfcSLouis Dionne void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y))); // constexpr in C++20 9277b9abfcSLouis Dionne 9377b9abfcSLouis Dionnetemplate <class T, size_t N> 9477b9abfcSLouis Dionne constexpr array<remove_cv_t<T>, N> to_array(T (&a)[N]); // C++20 9577b9abfcSLouis Dionnetemplate <class T, size_t N> 9677b9abfcSLouis 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 1112e2f3158SNikolas Klauser#include <__algorithm/equal.h> 1122e2f3158SNikolas Klauser#include <__algorithm/fill_n.h> 1132e2f3158SNikolas Klauser#include <__algorithm/lexicographical_compare.h> 1142e2f3158SNikolas Klauser#include <__algorithm/swap_ranges.h> 115385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler 1163e519524SHoward Hinnant#include <__config> 1173cd4531bSNikolas Klauser#include <__iterator/reverse_iterator.h> 1183e519524SHoward Hinnant#include <__tuple> 11952915d78SNikolas Klauser#include <__utility/integer_sequence.h> 12052915d78SNikolas Klauser#include <__utility/move.h> 1212a8f9a5eSNikolas Klauser#include <__utility/unreachable.h> 122bfbd73f8SArthur O'Dwyer#include <stdexcept> 1233e519524SHoward Hinnant#include <type_traits> 124f56972e2SMarshall Clow#include <version> 1253e519524SHoward Hinnant 126de4a57cbSLouis Dionne#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES 127de4a57cbSLouis Dionne# include <algorithm> 128de4a57cbSLouis Dionne# include <iterator> 129de4a57cbSLouis Dionne# include <utility> 130de4a57cbSLouis Dionne#endif 131de4a57cbSLouis Dionne 132db1978b6SNikolas Klauser// standard-mandated includes 133db1978b6SNikolas Klauser 134db1978b6SNikolas Klauser// [iterator.range] 135db1978b6SNikolas Klauser#include <__iterator/access.h> 136db1978b6SNikolas Klauser#include <__iterator/data.h> 137db1978b6SNikolas Klauser#include <__iterator/empty.h> 138db1978b6SNikolas Klauser#include <__iterator/reverse_access.h> 139db1978b6SNikolas Klauser#include <__iterator/size.h> 140db1978b6SNikolas Klauser 141db1978b6SNikolas Klauser// [array.syn] 142db1978b6SNikolas Klauser#include <compare> 143db1978b6SNikolas Klauser#include <initializer_list> 144db1978b6SNikolas Klauser 145073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1463e519524SHoward Hinnant# pragma GCC system_header 147073458b1SHoward Hinnant#endif 1483e519524SHoward Hinnant 1493e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 1503e519524SHoward Hinnant 1513e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 152e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS array 1533e519524SHoward Hinnant{ 1543e519524SHoward Hinnant // types: 1553e519524SHoward Hinnant typedef array __self; 1563e519524SHoward Hinnant typedef _Tp value_type; 1573e519524SHoward Hinnant typedef value_type& reference; 1583e519524SHoward Hinnant typedef const value_type& const_reference; 1593e519524SHoward Hinnant typedef value_type* iterator; 1603e519524SHoward Hinnant typedef const value_type* const_iterator; 1613e519524SHoward Hinnant typedef value_type* pointer; 1623e519524SHoward Hinnant typedef const value_type* const_pointer; 1633e519524SHoward Hinnant typedef size_t size_type; 1643e519524SHoward Hinnant typedef ptrdiff_t difference_type; 165d586f92cSArthur O'Dwyer typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 166d586f92cSArthur O'Dwyer typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 1673e519524SHoward Hinnant 16859cdf90aSEric Fiselier _Tp __elems_[_Size]; 1693e519524SHoward Hinnant 1703e519524SHoward Hinnant // No explicit construct/copy/destroy for aggregate type 17177b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 17277b9abfcSLouis Dionne void fill(const value_type& __u) { 17366a14d15SLouis Dionne _VSTD::fill_n(data(), _Size, __u); 17459cdf90aSEric Fiselier } 175afeda5c2SEric Fiselier 17677b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 17759cdf90aSEric Fiselier void swap(array& __a) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) { 178d586f92cSArthur O'Dwyer _VSTD::swap_ranges(data(), data() + _Size, __a.data()); 17959cdf90aSEric Fiselier } 1803e519524SHoward Hinnant 1813e519524SHoward Hinnant // iterators: 182020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 18359cdf90aSEric Fiselier iterator begin() _NOEXCEPT {return iterator(data());} 184020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 18559cdf90aSEric Fiselier const_iterator begin() const _NOEXCEPT {return const_iterator(data());} 186020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 18759cdf90aSEric Fiselier iterator end() _NOEXCEPT {return iterator(data() + _Size);} 188020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 18959cdf90aSEric Fiselier const_iterator end() const _NOEXCEPT {return const_iterator(data() + _Size);} 1903e519524SHoward Hinnant 191020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1928f0cd597SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 193020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1948f0cd597SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} 195020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1968f0cd597SHoward Hinnant reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 197020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1988f0cd597SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} 1993e519524SHoward Hinnant 200020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2018f0cd597SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 202020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2038f0cd597SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 204020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2058f0cd597SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 206020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2078f0cd597SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 2083e519524SHoward Hinnant 2093e519524SHoward Hinnant // capacity: 2108f0cd597SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 211397717b7SHoward Hinnant _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return _Size;} 2128f0cd597SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 213397717b7SHoward Hinnant _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return _Size;} 21472c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 21566a14d15SLouis Dionne _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return _Size == 0;} 2163e519524SHoward Hinnant 2173e519524SHoward Hinnant // element access: 218e7826950SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 21923776a17SLouis Dionne reference operator[](size_type __n) _NOEXCEPT { 22023776a17SLouis Dionne _LIBCPP_ASSERT(__n < _Size, "out-of-bounds access in std::array<T, N>"); 22123776a17SLouis Dionne return __elems_[__n]; 22223776a17SLouis Dionne } 223e7826950SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 22423776a17SLouis Dionne const_reference operator[](size_type __n) const _NOEXCEPT { 22523776a17SLouis Dionne _LIBCPP_ASSERT(__n < _Size, "out-of-bounds access in std::array<T, N>"); 22623776a17SLouis Dionne return __elems_[__n]; 22723776a17SLouis Dionne } 228e7826950SMarshall Clow 2290161874cSLouis Dionne _LIBCPP_CONSTEXPR_AFTER_CXX14 reference at(size_type __n) 2300161874cSLouis Dionne { 2310161874cSLouis Dionne if (__n >= _Size) 2320161874cSLouis Dionne __throw_out_of_range("array::at"); 2330161874cSLouis Dionne return __elems_[__n]; 2340161874cSLouis Dionne } 2350161874cSLouis Dionne 2360161874cSLouis Dionne _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference at(size_type __n) const 2370161874cSLouis Dionne { 2380161874cSLouis Dionne if (__n >= _Size) 2390161874cSLouis Dionne __throw_out_of_range("array::at"); 2400161874cSLouis Dionne return __elems_[__n]; 2410161874cSLouis Dionne } 2423e519524SHoward Hinnant 24323776a17SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference front() _NOEXCEPT {return (*this)[0];} 24423776a17SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference front() const _NOEXCEPT {return (*this)[0];} 24523776a17SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference back() _NOEXCEPT {return (*this)[_Size - 1];} 24623776a17SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference back() const _NOEXCEPT {return (*this)[_Size - 1];} 2473e519524SHoward Hinnant 248020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 249936ff584SNirav Dave value_type* data() _NOEXCEPT {return __elems_;} 250020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 251936ff584SNirav Dave const value_type* data() const _NOEXCEPT {return __elems_;} 2523e519524SHoward Hinnant}; 2533e519524SHoward Hinnant 25459cdf90aSEric Fiseliertemplate <class _Tp> 25559cdf90aSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS array<_Tp, 0> 25659cdf90aSEric Fiselier{ 25759cdf90aSEric Fiselier // types: 25859cdf90aSEric Fiselier typedef array __self; 25959cdf90aSEric Fiselier typedef _Tp value_type; 26059cdf90aSEric Fiselier typedef value_type& reference; 26159cdf90aSEric Fiselier typedef const value_type& const_reference; 26259cdf90aSEric Fiselier typedef value_type* iterator; 26359cdf90aSEric Fiselier typedef const value_type* const_iterator; 26459cdf90aSEric Fiselier typedef value_type* pointer; 26559cdf90aSEric Fiselier typedef const value_type* const_pointer; 26659cdf90aSEric Fiselier typedef size_t size_type; 26759cdf90aSEric Fiselier typedef ptrdiff_t difference_type; 268d586f92cSArthur O'Dwyer typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 269d586f92cSArthur O'Dwyer typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 27059cdf90aSEric Fiselier 27159cdf90aSEric Fiselier typedef typename conditional<is_const<_Tp>::value, const char, 27259cdf90aSEric Fiselier char>::type _CharType; 2731a78ae3cSEric Fiselier 2741a78ae3cSEric Fiselier struct _ArrayInStructT { _Tp __data_[1]; }; 2751a78ae3cSEric Fiselier _ALIGNAS_TYPE(_ArrayInStructT) _CharType __elems_[sizeof(_ArrayInStructT)]; 27659cdf90aSEric Fiselier 2777265ff92SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2787265ff92SLouis Dionne value_type* data() _NOEXCEPT {return nullptr;} 2797265ff92SLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2807265ff92SLouis Dionne const value_type* data() const _NOEXCEPT {return nullptr;} 28177b9abfcSLouis Dionne 28259cdf90aSEric Fiselier // No explicit construct/copy/destroy for aggregate type 28377b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 28477b9abfcSLouis Dionne void fill(const value_type&) { 28559cdf90aSEric Fiselier static_assert(!is_const<_Tp>::value, 28659cdf90aSEric Fiselier "cannot fill zero-sized array of type 'const T'"); 28759cdf90aSEric Fiselier } 28859cdf90aSEric Fiselier 28977b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 29059cdf90aSEric Fiselier void swap(array&) _NOEXCEPT { 29159cdf90aSEric Fiselier static_assert(!is_const<_Tp>::value, 29259cdf90aSEric Fiselier "cannot swap zero-sized array of type 'const T'"); 29359cdf90aSEric Fiselier } 29459cdf90aSEric Fiselier 29559cdf90aSEric Fiselier // iterators: 29677b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 29759cdf90aSEric Fiselier iterator begin() _NOEXCEPT {return iterator(data());} 29877b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 29959cdf90aSEric Fiselier const_iterator begin() const _NOEXCEPT {return const_iterator(data());} 30077b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 30159cdf90aSEric Fiselier iterator end() _NOEXCEPT {return iterator(data());} 30277b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 30359cdf90aSEric Fiselier const_iterator end() const _NOEXCEPT {return const_iterator(data());} 30459cdf90aSEric Fiselier 30577b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 30659cdf90aSEric Fiselier reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 30777b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 30859cdf90aSEric Fiselier const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} 30977b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 31059cdf90aSEric Fiselier reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 31177b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 31259cdf90aSEric Fiselier const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} 31359cdf90aSEric Fiselier 31477b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 31559cdf90aSEric Fiselier const_iterator cbegin() const _NOEXCEPT {return begin();} 31677b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 31759cdf90aSEric Fiselier const_iterator cend() const _NOEXCEPT {return end();} 31877b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 31959cdf90aSEric Fiselier const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 32077b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 32159cdf90aSEric Fiselier const_reverse_iterator crend() const _NOEXCEPT {return rend();} 32259cdf90aSEric Fiselier 32359cdf90aSEric Fiselier // capacity: 32459cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 32559cdf90aSEric Fiselier _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return 0; } 32659cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY 32759cdf90aSEric Fiselier _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return 0;} 32859cdf90aSEric Fiselier _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 32959cdf90aSEric Fiselier _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return true;} 33059cdf90aSEric Fiselier 33159cdf90aSEric Fiselier // element access: 33277b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 3335f6a5ac1SMarshall Clow reference operator[](size_type) _NOEXCEPT { 33459cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array"); 3352a8f9a5eSNikolas Klauser __libcpp_unreachable(); 33659cdf90aSEric Fiselier } 33759cdf90aSEric Fiselier 33859cdf90aSEric Fiselier _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3395f6a5ac1SMarshall Clow const_reference operator[](size_type) const _NOEXCEPT { 34059cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array"); 3412a8f9a5eSNikolas Klauser __libcpp_unreachable(); 34259cdf90aSEric Fiselier } 34359cdf90aSEric Fiselier 34477b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 34559cdf90aSEric Fiselier reference at(size_type) { 34659cdf90aSEric Fiselier __throw_out_of_range("array<T, 0>::at"); 3472a8f9a5eSNikolas Klauser __libcpp_unreachable(); 34859cdf90aSEric Fiselier } 34959cdf90aSEric Fiselier 35077b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 35159cdf90aSEric Fiselier const_reference at(size_type) const { 35259cdf90aSEric Fiselier __throw_out_of_range("array<T, 0>::at"); 3532a8f9a5eSNikolas Klauser __libcpp_unreachable(); 35459cdf90aSEric Fiselier } 35559cdf90aSEric Fiselier 35677b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 3579ea0e473SMarshall Clow reference front() _NOEXCEPT { 35859cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array"); 3592a8f9a5eSNikolas Klauser __libcpp_unreachable(); 36059cdf90aSEric Fiselier } 36159cdf90aSEric Fiselier 36277b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3639ea0e473SMarshall Clow const_reference front() const _NOEXCEPT { 36459cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array"); 3652a8f9a5eSNikolas Klauser __libcpp_unreachable(); 36659cdf90aSEric Fiselier } 36759cdf90aSEric Fiselier 36877b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 3699ea0e473SMarshall Clow reference back() _NOEXCEPT { 37059cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array"); 3712a8f9a5eSNikolas Klauser __libcpp_unreachable(); 37259cdf90aSEric Fiselier } 37359cdf90aSEric Fiselier 37477b9abfcSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3759ea0e473SMarshall Clow const_reference back() const _NOEXCEPT { 37659cdf90aSEric Fiselier _LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array"); 3772a8f9a5eSNikolas Klauser __libcpp_unreachable(); 37859cdf90aSEric Fiselier } 37959cdf90aSEric Fiselier}; 38059cdf90aSEric Fiselier 38159cdf90aSEric Fiselier 3822a8f9a5eSNikolas Klauser#if _LIBCPP_STD_VER > 14 3830ca8c089SMarshall Clowtemplate<class _Tp, class... _Args, 3844e0ea2cfSLouis Dionne class = enable_if_t<__all<_IsSame<_Tp, _Args>::value...>::value> 3850ca8c089SMarshall Clow > 3860ca8c089SMarshall Clowarray(_Tp, _Args...) 3870ca8c089SMarshall Clow -> array<_Tp, 1 + sizeof...(_Args)>; 3880ca8c089SMarshall Clow#endif 3890ca8c089SMarshall Clow 3903e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 3913af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 39207d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 3933e519524SHoward Hinnantoperator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 3943e519524SHoward Hinnant{ 39559cdf90aSEric Fiselier return _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 3963e519524SHoward Hinnant} 3973e519524SHoward Hinnant 3983e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 3993af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 40007d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 4013e519524SHoward Hinnantoperator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4023e519524SHoward Hinnant{ 4033e519524SHoward Hinnant return !(__x == __y); 4043e519524SHoward Hinnant} 4053e519524SHoward Hinnant 4063e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 4073af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 40807d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 4093e519524SHoward Hinnantoperator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4103e519524SHoward Hinnant{ 41159cdf90aSEric Fiselier return _VSTD::lexicographical_compare(__x.begin(), __x.end(), 41259cdf90aSEric Fiselier __y.begin(), __y.end()); 4133e519524SHoward Hinnant} 4143e519524SHoward Hinnant 4153e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 4163af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 41707d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 4183e519524SHoward Hinnantoperator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4193e519524SHoward Hinnant{ 4203e519524SHoward Hinnant return __y < __x; 4213e519524SHoward Hinnant} 4223e519524SHoward Hinnant 4233e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 4243af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 42507d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 4263e519524SHoward Hinnantoperator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4273e519524SHoward Hinnant{ 4283e519524SHoward Hinnant return !(__y < __x); 4293e519524SHoward Hinnant} 4303e519524SHoward Hinnant 4313e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 4323af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 43307d8ac0aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX17 bool 4343e519524SHoward Hinnantoperator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4353e519524SHoward Hinnant{ 4363e519524SHoward Hinnant return !(__x < __y); 4373e519524SHoward Hinnant} 4383e519524SHoward Hinnant 4393e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 44077b9abfcSLouis Dionneinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 441*4887d047SNikolas Klauser__enable_if_t<_Size == 0 || __is_swappable<_Tp>::value, void> 442ee66eb13SMarshall Clowswap(array<_Tp, _Size>& __x, array<_Tp, _Size>& __y) 443f07dd8d0SEric Fiselier _NOEXCEPT_(noexcept(__x.swap(__y))) 4443e519524SHoward Hinnant{ 4453e519524SHoward Hinnant __x.swap(__y); 4463e519524SHoward Hinnant} 4473e519524SHoward Hinnant 4483e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 449e4957601SMarshall Clowstruct _LIBCPP_TEMPLATE_VIS tuple_size<array<_Tp, _Size> > 450f5ab703fSHoward Hinnant : public integral_constant<size_t, _Size> {}; 4513e519524SHoward Hinnant 4523e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 4532b0c7abbSLouis Dionnestruct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, array<_Tp, _Size> > 4543e519524SHoward Hinnant{ 4556db379a2SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::tuple_element<> (std::array)"); 4563e519524SHoward Hinnant typedef _Tp type; 4573e519524SHoward Hinnant}; 4583e519524SHoward Hinnant 4593e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 4603af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4613e519524SHoward Hinnant_Tp& 4628f0cd597SHoward Hinnantget(array<_Tp, _Size>& __a) _NOEXCEPT 4633e519524SHoward Hinnant{ 46436a60721SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array)"); 4658bf1f08aSMarshall Clow return __a.__elems_[_Ip]; 4663e519524SHoward Hinnant} 4673e519524SHoward Hinnant 4683e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 4693af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 4703e519524SHoward Hinnantconst _Tp& 4718f0cd597SHoward Hinnantget(const array<_Tp, _Size>& __a) _NOEXCEPT 4723e519524SHoward Hinnant{ 47336a60721SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array)"); 4748bf1f08aSMarshall Clow return __a.__elems_[_Ip]; 4753e519524SHoward Hinnant} 4763e519524SHoward Hinnant 477601afb30SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 4783af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 479601afb30SHoward Hinnant_Tp&& 4808f0cd597SHoward Hinnantget(array<_Tp, _Size>&& __a) _NOEXCEPT 481601afb30SHoward Hinnant{ 48236a60721SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array &&)"); 4838bf1f08aSMarshall Clow return _VSTD::move(__a.__elems_[_Ip]); 484601afb30SHoward Hinnant} 485601afb30SHoward Hinnant 486545b8861SEric Fiseliertemplate <size_t _Ip, class _Tp, size_t _Size> 487545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 488545b8861SEric Fiselierconst _Tp&& 489545b8861SEric Fiselierget(const array<_Tp, _Size>&& __a) _NOEXCEPT 490545b8861SEric Fiselier{ 491545b8861SEric Fiselier static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array &&)"); 492545b8861SEric Fiselier return _VSTD::move(__a.__elems_[_Ip]); 493545b8861SEric Fiselier} 494545b8861SEric Fiselier 495e93e58c6SMarek Kurdej#if _LIBCPP_STD_VER > 17 496e93e58c6SMarek Kurdej 497e93e58c6SMarek Kurdejtemplate <typename _Tp, size_t _Size, size_t... _Index> 498e93e58c6SMarek Kurdej_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 499e93e58c6SMarek Kurdej__to_array_lvalue_impl(_Tp (&__arr)[_Size], index_sequence<_Index...>) { 500e93e58c6SMarek Kurdej return {{__arr[_Index]...}}; 501e93e58c6SMarek Kurdej} 502e93e58c6SMarek Kurdej 503e93e58c6SMarek Kurdejtemplate <typename _Tp, size_t _Size, size_t... _Index> 504e93e58c6SMarek Kurdej_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 505e93e58c6SMarek Kurdej__to_array_rvalue_impl(_Tp(&&__arr)[_Size], index_sequence<_Index...>) { 506e93e58c6SMarek Kurdej return {{_VSTD::move(__arr[_Index])...}}; 507e93e58c6SMarek Kurdej} 508e93e58c6SMarek Kurdej 509e93e58c6SMarek Kurdejtemplate <typename _Tp, size_t _Size> 510e93e58c6SMarek Kurdej_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 511e93e58c6SMarek Kurdejto_array(_Tp (&__arr)[_Size]) noexcept(is_nothrow_constructible_v<_Tp, _Tp&>) { 512e93e58c6SMarek Kurdej static_assert( 513e93e58c6SMarek Kurdej !is_array_v<_Tp>, 514e93e58c6SMarek Kurdej "[array.creation]/1: to_array does not accept multidimensional arrays."); 515e93e58c6SMarek Kurdej static_assert( 516e93e58c6SMarek Kurdej is_constructible_v<_Tp, _Tp&>, 517e93e58c6SMarek Kurdej "[array.creation]/1: to_array requires copy constructible elements."); 518781c476cSArthur O'Dwyer return _VSTD::__to_array_lvalue_impl(__arr, make_index_sequence<_Size>()); 519e93e58c6SMarek Kurdej} 520e93e58c6SMarek Kurdej 521e93e58c6SMarek Kurdejtemplate <typename _Tp, size_t _Size> 522e93e58c6SMarek Kurdej_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 523e93e58c6SMarek Kurdejto_array(_Tp(&&__arr)[_Size]) noexcept(is_nothrow_move_constructible_v<_Tp>) { 524e93e58c6SMarek Kurdej static_assert( 525e93e58c6SMarek Kurdej !is_array_v<_Tp>, 526e93e58c6SMarek Kurdej "[array.creation]/4: to_array does not accept multidimensional arrays."); 527e93e58c6SMarek Kurdej static_assert( 528e93e58c6SMarek Kurdej is_move_constructible_v<_Tp>, 529e93e58c6SMarek Kurdej "[array.creation]/4: to_array requires move constructible elements."); 530781c476cSArthur O'Dwyer return _VSTD::__to_array_rvalue_impl(_VSTD::move(__arr), 531e93e58c6SMarek Kurdej make_index_sequence<_Size>()); 532e93e58c6SMarek Kurdej} 533e93e58c6SMarek Kurdej 534e93e58c6SMarek Kurdej#endif // _LIBCPP_STD_VER > 17 535e93e58c6SMarek Kurdej 5363e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 5373e519524SHoward Hinnant 5383e519524SHoward Hinnant#endif // _LIBCPP_ARRAY 539