10b57cec5SDimitry Andric// -*- C++ -*- 2349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 30b57cec5SDimitry Andric// 40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70b57cec5SDimitry Andric// 80b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric 100b57cec5SDimitry Andric#ifndef _LIBCPP_ARRAY 110b57cec5SDimitry Andric#define _LIBCPP_ARRAY 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric/* 140b57cec5SDimitry Andric array synopsis 150b57cec5SDimitry Andric 160b57cec5SDimitry Andricnamespace std 170b57cec5SDimitry Andric{ 180b57cec5SDimitry Andrictemplate <class T, size_t N > 190b57cec5SDimitry Andricstruct array 200b57cec5SDimitry Andric{ 210b57cec5SDimitry Andric // types: 220b57cec5SDimitry Andric typedef T & reference; 230b57cec5SDimitry Andric typedef const T & const_reference; 240b57cec5SDimitry Andric typedef implementation defined iterator; 250b57cec5SDimitry Andric typedef implementation defined const_iterator; 260b57cec5SDimitry Andric typedef size_t size_type; 270b57cec5SDimitry Andric typedef ptrdiff_t difference_type; 280b57cec5SDimitry Andric typedef T value_type; 290b57cec5SDimitry Andric typedef T* pointer; 300b57cec5SDimitry Andric typedef const T* const_pointer; 310b57cec5SDimitry Andric typedef std::reverse_iterator<iterator> reverse_iterator; 320b57cec5SDimitry Andric typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric // No explicit construct/copy/destroy for aggregate type 355ffd83dbSDimitry Andric void fill(const T& u); // constexpr in C++20 365ffd83dbSDimitry Andric void swap(array& a) noexcept(is_nothrow_swappable_v<T>); // constexpr in C++20 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric // iterators: 395ffd83dbSDimitry Andric iterator begin() noexcept; // constexpr in C++17 405ffd83dbSDimitry Andric const_iterator begin() const noexcept; // constexpr in C++17 415ffd83dbSDimitry Andric iterator end() noexcept; // constexpr in C++17 425ffd83dbSDimitry Andric const_iterator end() const noexcept; // constexpr in C++17 430b57cec5SDimitry Andric 445ffd83dbSDimitry Andric reverse_iterator rbegin() noexcept; // constexpr in C++17 455ffd83dbSDimitry Andric const_reverse_iterator rbegin() const noexcept; // constexpr in C++17 465ffd83dbSDimitry Andric reverse_iterator rend() noexcept; // constexpr in C++17 475ffd83dbSDimitry Andric const_reverse_iterator rend() const noexcept; // constexpr in C++17 480b57cec5SDimitry Andric 495ffd83dbSDimitry Andric const_iterator cbegin() const noexcept; // constexpr in C++17 505ffd83dbSDimitry Andric const_iterator cend() const noexcept; // constexpr in C++17 515ffd83dbSDimitry Andric const_reverse_iterator crbegin() const noexcept; // constexpr in C++17 525ffd83dbSDimitry Andric const_reverse_iterator crend() const noexcept; // constexpr in C++17 530b57cec5SDimitry Andric 540b57cec5SDimitry Andric // capacity: 550b57cec5SDimitry Andric constexpr size_type size() const noexcept; 560b57cec5SDimitry Andric constexpr size_type max_size() const noexcept; 570b57cec5SDimitry Andric constexpr bool empty() const noexcept; 580b57cec5SDimitry Andric 590b57cec5SDimitry Andric // element access: 605ffd83dbSDimitry Andric reference operator[](size_type n); // constexpr in C++17 610b57cec5SDimitry Andric const_reference operator[](size_type n) const; // constexpr in C++14 625ffd83dbSDimitry Andric reference at(size_type n); // constexpr in C++17 630b57cec5SDimitry Andric const_reference at(size_type n) const; // constexpr in C++14 640b57cec5SDimitry Andric 655ffd83dbSDimitry Andric reference front(); // constexpr in C++17 660b57cec5SDimitry Andric const_reference front() const; // constexpr in C++14 675ffd83dbSDimitry Andric reference back(); // constexpr in C++17 680b57cec5SDimitry Andric const_reference back() const; // constexpr in C++14 690b57cec5SDimitry Andric 705ffd83dbSDimitry Andric T* data() noexcept; // constexpr in C++17 715ffd83dbSDimitry Andric const T* data() const noexcept; // constexpr in C++17 720b57cec5SDimitry Andric}; 730b57cec5SDimitry Andric 740b57cec5SDimitry Andrictemplate <class T, class... U> 755ffd83dbSDimitry Andric array(T, U...) -> array<T, 1 + sizeof...(U)>; // C++17 760b57cec5SDimitry Andric 770b57cec5SDimitry Andrictemplate <class T, size_t N> 785ffd83dbSDimitry Andric bool operator==(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 790b57cec5SDimitry Andrictemplate <class T, size_t N> 805ffd83dbSDimitry Andric bool operator!=(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 810b57cec5SDimitry Andrictemplate <class T, size_t N> 825ffd83dbSDimitry Andric bool operator<(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 830b57cec5SDimitry Andrictemplate <class T, size_t N> 845ffd83dbSDimitry Andric bool operator>(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 850b57cec5SDimitry Andrictemplate <class T, size_t N> 865ffd83dbSDimitry Andric bool operator<=(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 870b57cec5SDimitry Andrictemplate <class T, size_t N> 885ffd83dbSDimitry Andric bool operator>=(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 890b57cec5SDimitry Andric 900b57cec5SDimitry Andrictemplate <class T, size_t N > 915ffd83dbSDimitry Andric void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y))); // constexpr in C++20 925ffd83dbSDimitry Andric 935ffd83dbSDimitry Andrictemplate <class T, size_t N> 945ffd83dbSDimitry Andric constexpr array<remove_cv_t<T>, N> to_array(T (&a)[N]); // C++20 955ffd83dbSDimitry Andrictemplate <class T, size_t N> 965ffd83dbSDimitry Andric constexpr array<remove_cv_t<T>, N> to_array(T (&&a)[N]); // C++20 970b57cec5SDimitry Andric 980b57cec5SDimitry Andrictemplate <class T> struct tuple_size; 990b57cec5SDimitry Andrictemplate <size_t I, class T> struct tuple_element; 1000b57cec5SDimitry Andrictemplate <class T, size_t N> struct tuple_size<array<T, N>>; 1010b57cec5SDimitry Andrictemplate <size_t I, class T, size_t N> struct tuple_element<I, array<T, N>>; 1020b57cec5SDimitry Andrictemplate <size_t I, class T, size_t N> T& get(array<T, N>&) noexcept; // constexpr in C++14 1030b57cec5SDimitry Andrictemplate <size_t I, class T, size_t N> const T& get(const array<T, N>&) noexcept; // constexpr in C++14 1040b57cec5SDimitry Andrictemplate <size_t I, class T, size_t N> T&& get(array<T, N>&&) noexcept; // constexpr in C++14 1050b57cec5SDimitry Andrictemplate <size_t I, class T, size_t N> const T&& get(const array<T, N>&&) noexcept; // constexpr in C++14 1060b57cec5SDimitry Andric 1070b57cec5SDimitry Andric} // std 1080b57cec5SDimitry Andric 1090b57cec5SDimitry Andric*/ 1100b57cec5SDimitry Andric 11181ad6265SDimitry Andric#include <__algorithm/equal.h> 11281ad6265SDimitry Andric#include <__algorithm/fill_n.h> 11381ad6265SDimitry Andric#include <__algorithm/lexicographical_compare.h> 11481ad6265SDimitry Andric#include <__algorithm/swap_ranges.h> 11581ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler 1160b57cec5SDimitry Andric#include <__config> 11781ad6265SDimitry Andric#include <__iterator/reverse_iterator.h> 118*bdd1243dSDimitry Andric#include <__tuple_dir/sfinae_helpers.h> 11981ad6265SDimitry Andric#include <__utility/integer_sequence.h> 12081ad6265SDimitry Andric#include <__utility/move.h> 12181ad6265SDimitry Andric#include <__utility/unreachable.h> 122fe6060f1SDimitry Andric#include <stdexcept> 1230b57cec5SDimitry Andric#include <type_traits> 1240b57cec5SDimitry Andric#include <version> 1250b57cec5SDimitry Andric 12681ad6265SDimitry Andric// standard-mandated includes 12781ad6265SDimitry Andric 12881ad6265SDimitry Andric// [iterator.range] 12981ad6265SDimitry Andric#include <__iterator/access.h> 13081ad6265SDimitry Andric#include <__iterator/data.h> 13181ad6265SDimitry Andric#include <__iterator/empty.h> 13281ad6265SDimitry Andric#include <__iterator/reverse_access.h> 13381ad6265SDimitry Andric#include <__iterator/size.h> 13481ad6265SDimitry Andric 13581ad6265SDimitry Andric// [array.syn] 13681ad6265SDimitry Andric#include <compare> 13781ad6265SDimitry Andric#include <initializer_list> 13881ad6265SDimitry Andric 139*bdd1243dSDimitry Andric// [tuple.helper] 140*bdd1243dSDimitry Andric#include <__tuple_dir/tuple_element.h> 141*bdd1243dSDimitry Andric#include <__tuple_dir/tuple_size.h> 142*bdd1243dSDimitry Andric 1430b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1440b57cec5SDimitry Andric# pragma GCC system_header 1450b57cec5SDimitry Andric#endif 1460b57cec5SDimitry Andric 1470b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 1480b57cec5SDimitry Andric 1490b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 1500b57cec5SDimitry Andricstruct _LIBCPP_TEMPLATE_VIS array 1510b57cec5SDimitry Andric{ 1520b57cec5SDimitry Andric // types: 1530b57cec5SDimitry Andric typedef array __self; 1540b57cec5SDimitry Andric typedef _Tp value_type; 1550b57cec5SDimitry Andric typedef value_type& reference; 1560b57cec5SDimitry Andric typedef const value_type& const_reference; 1570b57cec5SDimitry Andric typedef value_type* iterator; 1580b57cec5SDimitry Andric typedef const value_type* const_iterator; 1590b57cec5SDimitry Andric typedef value_type* pointer; 1600b57cec5SDimitry Andric typedef const value_type* const_pointer; 1610b57cec5SDimitry Andric typedef size_t size_type; 1620b57cec5SDimitry Andric typedef ptrdiff_t difference_type; 163e8d8bef9SDimitry Andric typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 164e8d8bef9SDimitry Andric typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 1650b57cec5SDimitry Andric 1660b57cec5SDimitry Andric _Tp __elems_[_Size]; 1670b57cec5SDimitry Andric 1680b57cec5SDimitry Andric // No explicit construct/copy/destroy for aggregate type 169*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 1705ffd83dbSDimitry Andric void fill(const value_type& __u) { 1715ffd83dbSDimitry Andric _VSTD::fill_n(data(), _Size, __u); 1720b57cec5SDimitry Andric } 1730b57cec5SDimitry Andric 174*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 1750b57cec5SDimitry Andric void swap(array& __a) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) { 176e8d8bef9SDimitry Andric _VSTD::swap_ranges(data(), data() + _Size, __a.data()); 1770b57cec5SDimitry Andric } 1780b57cec5SDimitry Andric 1790b57cec5SDimitry Andric // iterators: 180*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 1810b57cec5SDimitry Andric iterator begin() _NOEXCEPT {return iterator(data());} 182*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 1830b57cec5SDimitry Andric const_iterator begin() const _NOEXCEPT {return const_iterator(data());} 184*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 1850b57cec5SDimitry Andric iterator end() _NOEXCEPT {return iterator(data() + _Size);} 186*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 1870b57cec5SDimitry Andric const_iterator end() const _NOEXCEPT {return const_iterator(data() + _Size);} 1880b57cec5SDimitry Andric 189*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 1900b57cec5SDimitry Andric reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 191*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 1920b57cec5SDimitry Andric const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} 193*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 1940b57cec5SDimitry Andric reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 195*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 1960b57cec5SDimitry Andric const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} 1970b57cec5SDimitry Andric 198*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 1990b57cec5SDimitry Andric const_iterator cbegin() const _NOEXCEPT {return begin();} 200*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 2010b57cec5SDimitry Andric const_iterator cend() const _NOEXCEPT {return end();} 202*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 2030b57cec5SDimitry Andric const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 204*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 2050b57cec5SDimitry Andric const_reverse_iterator crend() const _NOEXCEPT {return rend();} 2060b57cec5SDimitry Andric 2070b57cec5SDimitry Andric // capacity: 2080b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 2090b57cec5SDimitry Andric _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return _Size;} 2100b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 2110b57cec5SDimitry Andric _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return _Size;} 2120b57cec5SDimitry Andric _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 2135ffd83dbSDimitry Andric _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return _Size == 0;} 2140b57cec5SDimitry Andric 2150b57cec5SDimitry Andric // element access: 216*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 2175ffd83dbSDimitry Andric reference operator[](size_type __n) _NOEXCEPT { 2185ffd83dbSDimitry Andric _LIBCPP_ASSERT(__n < _Size, "out-of-bounds access in std::array<T, N>"); 2195ffd83dbSDimitry Andric return __elems_[__n]; 2205ffd83dbSDimitry Andric } 221*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 2225ffd83dbSDimitry Andric const_reference operator[](size_type __n) const _NOEXCEPT { 2235ffd83dbSDimitry Andric _LIBCPP_ASSERT(__n < _Size, "out-of-bounds access in std::array<T, N>"); 2245ffd83dbSDimitry Andric return __elems_[__n]; 2255ffd83dbSDimitry Andric } 2260b57cec5SDimitry Andric 227*bdd1243dSDimitry Andric _LIBCPP_CONSTEXPR_SINCE_CXX17 reference at(size_type __n) 2285ffd83dbSDimitry Andric { 2295ffd83dbSDimitry Andric if (__n >= _Size) 2305ffd83dbSDimitry Andric __throw_out_of_range("array::at"); 2315ffd83dbSDimitry Andric return __elems_[__n]; 2325ffd83dbSDimitry Andric } 2330b57cec5SDimitry Andric 234*bdd1243dSDimitry Andric _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference at(size_type __n) const 2355ffd83dbSDimitry Andric { 2365ffd83dbSDimitry Andric if (__n >= _Size) 2375ffd83dbSDimitry Andric __throw_out_of_range("array::at"); 2385ffd83dbSDimitry Andric return __elems_[__n]; 2395ffd83dbSDimitry Andric } 2405ffd83dbSDimitry Andric 241*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 reference front() _NOEXCEPT {return (*this)[0];} 242*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference front() const _NOEXCEPT {return (*this)[0];} 243*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 reference back() _NOEXCEPT {return (*this)[_Size - 1];} 244*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference back() const _NOEXCEPT {return (*this)[_Size - 1];} 2450b57cec5SDimitry Andric 246*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 2470b57cec5SDimitry Andric value_type* data() _NOEXCEPT {return __elems_;} 248*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 2490b57cec5SDimitry Andric const value_type* data() const _NOEXCEPT {return __elems_;} 2500b57cec5SDimitry Andric}; 2510b57cec5SDimitry Andric 2520b57cec5SDimitry Andrictemplate <class _Tp> 2530b57cec5SDimitry Andricstruct _LIBCPP_TEMPLATE_VIS array<_Tp, 0> 2540b57cec5SDimitry Andric{ 2550b57cec5SDimitry Andric // types: 2560b57cec5SDimitry Andric typedef array __self; 2570b57cec5SDimitry Andric typedef _Tp value_type; 2580b57cec5SDimitry Andric typedef value_type& reference; 2590b57cec5SDimitry Andric typedef const value_type& const_reference; 2600b57cec5SDimitry Andric typedef value_type* iterator; 2610b57cec5SDimitry Andric typedef const value_type* const_iterator; 2620b57cec5SDimitry Andric typedef value_type* pointer; 2630b57cec5SDimitry Andric typedef const value_type* const_pointer; 2640b57cec5SDimitry Andric typedef size_t size_type; 2650b57cec5SDimitry Andric typedef ptrdiff_t difference_type; 266e8d8bef9SDimitry Andric typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 267e8d8bef9SDimitry Andric typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 2680b57cec5SDimitry Andric 269*bdd1243dSDimitry Andric typedef __conditional_t<is_const<_Tp>::value, const char, char> _CharType; 2700b57cec5SDimitry Andric 2710b57cec5SDimitry Andric struct _ArrayInStructT { _Tp __data_[1]; }; 2720b57cec5SDimitry Andric _ALIGNAS_TYPE(_ArrayInStructT) _CharType __elems_[sizeof(_ArrayInStructT)]; 2730b57cec5SDimitry Andric 274*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 2755ffd83dbSDimitry Andric value_type* data() _NOEXCEPT {return nullptr;} 276*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 2775ffd83dbSDimitry Andric const value_type* data() const _NOEXCEPT {return nullptr;} 2785ffd83dbSDimitry Andric 2790b57cec5SDimitry Andric // No explicit construct/copy/destroy for aggregate type 280*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 2815ffd83dbSDimitry Andric void fill(const value_type&) { 2820b57cec5SDimitry Andric static_assert(!is_const<_Tp>::value, 2830b57cec5SDimitry Andric "cannot fill zero-sized array of type 'const T'"); 2840b57cec5SDimitry Andric } 2850b57cec5SDimitry Andric 286*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 2870b57cec5SDimitry Andric void swap(array&) _NOEXCEPT { 2880b57cec5SDimitry Andric static_assert(!is_const<_Tp>::value, 2890b57cec5SDimitry Andric "cannot swap zero-sized array of type 'const T'"); 2900b57cec5SDimitry Andric } 2910b57cec5SDimitry Andric 2920b57cec5SDimitry Andric // iterators: 293*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 2940b57cec5SDimitry Andric iterator begin() _NOEXCEPT {return iterator(data());} 295*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 2960b57cec5SDimitry Andric const_iterator begin() const _NOEXCEPT {return const_iterator(data());} 297*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 2980b57cec5SDimitry Andric iterator end() _NOEXCEPT {return iterator(data());} 299*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 3000b57cec5SDimitry Andric const_iterator end() const _NOEXCEPT {return const_iterator(data());} 3010b57cec5SDimitry Andric 302*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 3030b57cec5SDimitry Andric reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 304*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 3050b57cec5SDimitry Andric const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} 306*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 3070b57cec5SDimitry Andric reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 308*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 3090b57cec5SDimitry Andric const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} 3100b57cec5SDimitry Andric 311*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 3120b57cec5SDimitry Andric const_iterator cbegin() const _NOEXCEPT {return begin();} 313*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 3140b57cec5SDimitry Andric const_iterator cend() const _NOEXCEPT {return end();} 315*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 3160b57cec5SDimitry Andric const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 317*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 3180b57cec5SDimitry Andric const_reverse_iterator crend() const _NOEXCEPT {return rend();} 3190b57cec5SDimitry Andric 3200b57cec5SDimitry Andric // capacity: 3210b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 3220b57cec5SDimitry Andric _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return 0; } 3230b57cec5SDimitry Andric _LIBCPP_INLINE_VISIBILITY 3240b57cec5SDimitry Andric _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return 0;} 3250b57cec5SDimitry Andric _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 3260b57cec5SDimitry Andric _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return true;} 3270b57cec5SDimitry Andric 3280b57cec5SDimitry Andric // element access: 329*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 3300b57cec5SDimitry Andric reference operator[](size_type) _NOEXCEPT { 3310b57cec5SDimitry Andric _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array"); 33281ad6265SDimitry Andric __libcpp_unreachable(); 3330b57cec5SDimitry Andric } 3340b57cec5SDimitry Andric 335*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 3360b57cec5SDimitry Andric const_reference operator[](size_type) const _NOEXCEPT { 3370b57cec5SDimitry Andric _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array"); 33881ad6265SDimitry Andric __libcpp_unreachable(); 3390b57cec5SDimitry Andric } 3400b57cec5SDimitry Andric 341*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 3420b57cec5SDimitry Andric reference at(size_type) { 3430b57cec5SDimitry Andric __throw_out_of_range("array<T, 0>::at"); 34481ad6265SDimitry Andric __libcpp_unreachable(); 3450b57cec5SDimitry Andric } 3460b57cec5SDimitry Andric 347*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 3480b57cec5SDimitry Andric const_reference at(size_type) const { 3490b57cec5SDimitry Andric __throw_out_of_range("array<T, 0>::at"); 35081ad6265SDimitry Andric __libcpp_unreachable(); 3510b57cec5SDimitry Andric } 3520b57cec5SDimitry Andric 353*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 3540b57cec5SDimitry Andric reference front() _NOEXCEPT { 3550b57cec5SDimitry Andric _LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array"); 35681ad6265SDimitry Andric __libcpp_unreachable(); 3570b57cec5SDimitry Andric } 3580b57cec5SDimitry Andric 359*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 3600b57cec5SDimitry Andric const_reference front() const _NOEXCEPT { 3610b57cec5SDimitry Andric _LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array"); 36281ad6265SDimitry Andric __libcpp_unreachable(); 3630b57cec5SDimitry Andric } 3640b57cec5SDimitry Andric 365*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 3660b57cec5SDimitry Andric reference back() _NOEXCEPT { 3670b57cec5SDimitry Andric _LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array"); 36881ad6265SDimitry Andric __libcpp_unreachable(); 3690b57cec5SDimitry Andric } 3700b57cec5SDimitry Andric 371*bdd1243dSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 3720b57cec5SDimitry Andric const_reference back() const _NOEXCEPT { 3730b57cec5SDimitry Andric _LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array"); 37481ad6265SDimitry Andric __libcpp_unreachable(); 3750b57cec5SDimitry Andric } 3760b57cec5SDimitry Andric}; 3770b57cec5SDimitry Andric 3780b57cec5SDimitry Andric 37981ad6265SDimitry Andric#if _LIBCPP_STD_VER > 14 3800b57cec5SDimitry Andrictemplate<class _Tp, class... _Args, 381349cc55cSDimitry Andric class = enable_if_t<__all<_IsSame<_Tp, _Args>::value...>::value> 3820b57cec5SDimitry Andric > 3830b57cec5SDimitry Andricarray(_Tp, _Args...) 3840b57cec5SDimitry Andric -> array<_Tp, 1 + sizeof...(_Args)>; 3850b57cec5SDimitry Andric#endif 3860b57cec5SDimitry Andric 3870b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 3880b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 389*bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR_SINCE_CXX20 bool 3900b57cec5SDimitry Andricoperator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 3910b57cec5SDimitry Andric{ 3920b57cec5SDimitry Andric return _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 3930b57cec5SDimitry Andric} 3940b57cec5SDimitry Andric 3950b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 3960b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 397*bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR_SINCE_CXX20 bool 3980b57cec5SDimitry Andricoperator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 3990b57cec5SDimitry Andric{ 4000b57cec5SDimitry Andric return !(__x == __y); 4010b57cec5SDimitry Andric} 4020b57cec5SDimitry Andric 4030b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 4040b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 405*bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR_SINCE_CXX20 bool 4060b57cec5SDimitry Andricoperator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4070b57cec5SDimitry Andric{ 4080b57cec5SDimitry Andric return _VSTD::lexicographical_compare(__x.begin(), __x.end(), 4090b57cec5SDimitry Andric __y.begin(), __y.end()); 4100b57cec5SDimitry Andric} 4110b57cec5SDimitry Andric 4120b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 4130b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 414*bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR_SINCE_CXX20 bool 4150b57cec5SDimitry Andricoperator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4160b57cec5SDimitry Andric{ 4170b57cec5SDimitry Andric return __y < __x; 4180b57cec5SDimitry Andric} 4190b57cec5SDimitry Andric 4200b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 4210b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 422*bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR_SINCE_CXX20 bool 4230b57cec5SDimitry Andricoperator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4240b57cec5SDimitry Andric{ 4250b57cec5SDimitry Andric return !(__y < __x); 4260b57cec5SDimitry Andric} 4270b57cec5SDimitry Andric 4280b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 4290b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 430*bdd1243dSDimitry Andric_LIBCPP_CONSTEXPR_SINCE_CXX20 bool 4310b57cec5SDimitry Andricoperator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 4320b57cec5SDimitry Andric{ 4330b57cec5SDimitry Andric return !(__x < __y); 4340b57cec5SDimitry Andric} 4350b57cec5SDimitry Andric 4360b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 437*bdd1243dSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 438753f127fSDimitry Andric__enable_if_t<_Size == 0 || __is_swappable<_Tp>::value, void> 4390b57cec5SDimitry Andricswap(array<_Tp, _Size>& __x, array<_Tp, _Size>& __y) 4400b57cec5SDimitry Andric _NOEXCEPT_(noexcept(__x.swap(__y))) 4410b57cec5SDimitry Andric{ 4420b57cec5SDimitry Andric __x.swap(__y); 4430b57cec5SDimitry Andric} 4440b57cec5SDimitry Andric 4450b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 4460b57cec5SDimitry Andricstruct _LIBCPP_TEMPLATE_VIS tuple_size<array<_Tp, _Size> > 4470b57cec5SDimitry Andric : public integral_constant<size_t, _Size> {}; 4480b57cec5SDimitry Andric 4490b57cec5SDimitry Andrictemplate <size_t _Ip, class _Tp, size_t _Size> 4500b57cec5SDimitry Andricstruct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, array<_Tp, _Size> > 4510b57cec5SDimitry Andric{ 4520b57cec5SDimitry Andric static_assert(_Ip < _Size, "Index out of bounds in std::tuple_element<> (std::array)"); 4530b57cec5SDimitry Andric typedef _Tp type; 4540b57cec5SDimitry Andric}; 4550b57cec5SDimitry Andric 4560b57cec5SDimitry Andrictemplate <size_t _Ip, class _Tp, size_t _Size> 457*bdd1243dSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 4580b57cec5SDimitry Andric_Tp& 4590b57cec5SDimitry Andricget(array<_Tp, _Size>& __a) _NOEXCEPT 4600b57cec5SDimitry Andric{ 4610b57cec5SDimitry Andric static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array)"); 4620b57cec5SDimitry Andric return __a.__elems_[_Ip]; 4630b57cec5SDimitry Andric} 4640b57cec5SDimitry Andric 4650b57cec5SDimitry Andrictemplate <size_t _Ip, class _Tp, size_t _Size> 466*bdd1243dSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 4670b57cec5SDimitry Andricconst _Tp& 4680b57cec5SDimitry Andricget(const array<_Tp, _Size>& __a) _NOEXCEPT 4690b57cec5SDimitry Andric{ 4700b57cec5SDimitry Andric static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array)"); 4710b57cec5SDimitry Andric return __a.__elems_[_Ip]; 4720b57cec5SDimitry Andric} 4730b57cec5SDimitry Andric 4740b57cec5SDimitry Andrictemplate <size_t _Ip, class _Tp, size_t _Size> 475*bdd1243dSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 4760b57cec5SDimitry Andric_Tp&& 4770b57cec5SDimitry Andricget(array<_Tp, _Size>&& __a) _NOEXCEPT 4780b57cec5SDimitry Andric{ 4790b57cec5SDimitry Andric static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array &&)"); 4800b57cec5SDimitry Andric return _VSTD::move(__a.__elems_[_Ip]); 4810b57cec5SDimitry Andric} 4820b57cec5SDimitry Andric 4830b57cec5SDimitry Andrictemplate <size_t _Ip, class _Tp, size_t _Size> 484*bdd1243dSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 4850b57cec5SDimitry Andricconst _Tp&& 4860b57cec5SDimitry Andricget(const array<_Tp, _Size>&& __a) _NOEXCEPT 4870b57cec5SDimitry Andric{ 4880b57cec5SDimitry Andric static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array &&)"); 4890b57cec5SDimitry Andric return _VSTD::move(__a.__elems_[_Ip]); 4900b57cec5SDimitry Andric} 4910b57cec5SDimitry Andric 4925ffd83dbSDimitry Andric#if _LIBCPP_STD_VER > 17 4935ffd83dbSDimitry Andric 4945ffd83dbSDimitry Andrictemplate <typename _Tp, size_t _Size, size_t... _Index> 4955ffd83dbSDimitry Andric_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 4965ffd83dbSDimitry Andric__to_array_lvalue_impl(_Tp (&__arr)[_Size], index_sequence<_Index...>) { 4975ffd83dbSDimitry Andric return {{__arr[_Index]...}}; 4985ffd83dbSDimitry Andric} 4995ffd83dbSDimitry Andric 5005ffd83dbSDimitry Andrictemplate <typename _Tp, size_t _Size, size_t... _Index> 5015ffd83dbSDimitry Andric_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 5025ffd83dbSDimitry Andric__to_array_rvalue_impl(_Tp(&&__arr)[_Size], index_sequence<_Index...>) { 5035ffd83dbSDimitry Andric return {{_VSTD::move(__arr[_Index])...}}; 5045ffd83dbSDimitry Andric} 5055ffd83dbSDimitry Andric 5065ffd83dbSDimitry Andrictemplate <typename _Tp, size_t _Size> 5075ffd83dbSDimitry Andric_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 5085ffd83dbSDimitry Andricto_array(_Tp (&__arr)[_Size]) noexcept(is_nothrow_constructible_v<_Tp, _Tp&>) { 5095ffd83dbSDimitry Andric static_assert( 5105ffd83dbSDimitry Andric !is_array_v<_Tp>, 5115ffd83dbSDimitry Andric "[array.creation]/1: to_array does not accept multidimensional arrays."); 5125ffd83dbSDimitry Andric static_assert( 5135ffd83dbSDimitry Andric is_constructible_v<_Tp, _Tp&>, 5145ffd83dbSDimitry Andric "[array.creation]/1: to_array requires copy constructible elements."); 515e8d8bef9SDimitry Andric return _VSTD::__to_array_lvalue_impl(__arr, make_index_sequence<_Size>()); 5165ffd83dbSDimitry Andric} 5175ffd83dbSDimitry Andric 5185ffd83dbSDimitry Andrictemplate <typename _Tp, size_t _Size> 5195ffd83dbSDimitry Andric_LIBCPP_INLINE_VISIBILITY constexpr array<remove_cv_t<_Tp>, _Size> 5205ffd83dbSDimitry Andricto_array(_Tp(&&__arr)[_Size]) noexcept(is_nothrow_move_constructible_v<_Tp>) { 5215ffd83dbSDimitry Andric static_assert( 5225ffd83dbSDimitry Andric !is_array_v<_Tp>, 5235ffd83dbSDimitry Andric "[array.creation]/4: to_array does not accept multidimensional arrays."); 5245ffd83dbSDimitry Andric static_assert( 5255ffd83dbSDimitry Andric is_move_constructible_v<_Tp>, 5265ffd83dbSDimitry Andric "[array.creation]/4: to_array requires move constructible elements."); 527e8d8bef9SDimitry Andric return _VSTD::__to_array_rvalue_impl(_VSTD::move(__arr), 5285ffd83dbSDimitry Andric make_index_sequence<_Size>()); 5295ffd83dbSDimitry Andric} 5305ffd83dbSDimitry Andric 5315ffd83dbSDimitry Andric#endif // _LIBCPP_STD_VER > 17 5325ffd83dbSDimitry Andric 5330b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 5340b57cec5SDimitry Andric 535*bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 536*bdd1243dSDimitry Andric# include <algorithm> 537*bdd1243dSDimitry Andric# include <concepts> 538*bdd1243dSDimitry Andric# include <iterator> 539*bdd1243dSDimitry Andric# include <utility> 540*bdd1243dSDimitry Andric#endif 541*bdd1243dSDimitry Andric 5420b57cec5SDimitry Andric#endif // _LIBCPP_ARRAY 543