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