13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===---------------------------- array -----------------------------------===// 33e519524SHoward Hinnant// 45b08a8a4SHoward Hinnant// The LLVM Compiler Infrastructure 53e519524SHoward Hinnant// 6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details. 83e519524SHoward Hinnant// 93e519524SHoward Hinnant//===----------------------------------------------------------------------===// 103e519524SHoward Hinnant 113e519524SHoward Hinnant#ifndef _LIBCPP_ARRAY 123e519524SHoward Hinnant#define _LIBCPP_ARRAY 133e519524SHoward Hinnant 143e519524SHoward Hinnant/* 153e519524SHoward Hinnant array synopsis 163e519524SHoward Hinnant 173e519524SHoward Hinnantnamespace std 183e519524SHoward Hinnant{ 193e519524SHoward Hinnanttemplate <class T, size_t N > 203e519524SHoward Hinnantstruct array 213e519524SHoward Hinnant{ 223e519524SHoward Hinnant // types: 233e519524SHoward Hinnant typedef T & reference; 243e519524SHoward Hinnant typedef const T & const_reference; 253e519524SHoward Hinnant typedef implementation defined iterator; 263e519524SHoward Hinnant typedef implementation defined const_iterator; 273e519524SHoward Hinnant typedef size_t size_type; 283e519524SHoward Hinnant typedef ptrdiff_t difference_type; 293e519524SHoward Hinnant typedef T value_type; 303e519524SHoward Hinnant typedef T* pointer; 313e519524SHoward Hinnant typedef const T* const_pointer; 323e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 333e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 343e519524SHoward Hinnant 353e519524SHoward Hinnant // No explicit construct/copy/destroy for aggregate type 363e519524SHoward Hinnant void fill(const T& u); 37f07dd8d0SEric Fiselier void swap(array& a) noexcept(is_nothrow_swappable_v<T>); 383e519524SHoward Hinnant 393e519524SHoward Hinnant // iterators: 408f0cd597SHoward Hinnant iterator begin() noexcept; 418f0cd597SHoward Hinnant const_iterator begin() const noexcept; 428f0cd597SHoward Hinnant iterator end() noexcept; 438f0cd597SHoward Hinnant const_iterator end() const noexcept; 443e519524SHoward Hinnant 458f0cd597SHoward Hinnant reverse_iterator rbegin() noexcept; 468f0cd597SHoward Hinnant const_reverse_iterator rbegin() const noexcept; 478f0cd597SHoward Hinnant reverse_iterator rend() noexcept; 488f0cd597SHoward Hinnant const_reverse_iterator rend() const noexcept; 493e519524SHoward Hinnant 508f0cd597SHoward Hinnant const_iterator cbegin() const noexcept; 518f0cd597SHoward Hinnant const_iterator cend() const noexcept; 528f0cd597SHoward Hinnant const_reverse_iterator crbegin() const noexcept; 538f0cd597SHoward Hinnant const_reverse_iterator crend() const noexcept; 543e519524SHoward Hinnant 553e519524SHoward Hinnant // capacity: 568f0cd597SHoward Hinnant constexpr size_type size() const noexcept; 578f0cd597SHoward Hinnant constexpr size_type max_size() const noexcept; 58397717b7SHoward Hinnant constexpr bool empty() const noexcept; 593e519524SHoward Hinnant 603e519524SHoward Hinnant // element access: 613e519524SHoward Hinnant reference operator[](size_type n); 628bf1f08aSMarshall Clow const_reference operator[](size_type n) const; // constexpr in C++14 638bf1f08aSMarshall Clow const_reference at(size_type n) const; // constexpr in C++14 643e519524SHoward Hinnant reference at(size_type n); 653e519524SHoward Hinnant 663e519524SHoward Hinnant reference front(); 678bf1f08aSMarshall Clow const_reference front() const; // constexpr in C++14 683e519524SHoward Hinnant reference back(); 698bf1f08aSMarshall Clow const_reference back() const; // constexpr in C++14 703e519524SHoward Hinnant 718f0cd597SHoward Hinnant T* data() noexcept; 728f0cd597SHoward Hinnant const T* data() const noexcept; 733e519524SHoward Hinnant}; 743e519524SHoward Hinnant 753e519524SHoward Hinnanttemplate <class T, size_t N> 763e519524SHoward Hinnant bool operator==(const array<T,N>& x, const array<T,N>& y); 773e519524SHoward Hinnanttemplate <class T, size_t N> 783e519524SHoward Hinnant bool operator!=(const array<T,N>& x, const array<T,N>& y); 793e519524SHoward Hinnanttemplate <class T, size_t N> 803e519524SHoward Hinnant bool operator<(const array<T,N>& x, const array<T,N>& y); 813e519524SHoward Hinnanttemplate <class T, size_t N> 823e519524SHoward Hinnant bool operator>(const array<T,N>& x, const array<T,N>& y); 833e519524SHoward Hinnanttemplate <class T, size_t N> 843e519524SHoward Hinnant bool operator<=(const array<T,N>& x, const array<T,N>& y); 853e519524SHoward Hinnanttemplate <class T, size_t N> 863e519524SHoward Hinnant bool operator>=(const array<T,N>& x, const array<T,N>& y); 873e519524SHoward Hinnant 883e519524SHoward Hinnanttemplate <class T, size_t N > 898f0cd597SHoward Hinnant void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y))); 903e519524SHoward Hinnant 913e519524SHoward Hinnanttemplate <class T> class tuple_size; 925fcc8169SMarshall Clowtemplate <size_t I, class T> class tuple_element; 933e519524SHoward Hinnanttemplate <class T, size_t N> struct tuple_size<array<T, N>>; 945fcc8169SMarshall Clowtemplate <size_t I, class T, size_t N> struct tuple_element<I, array<T, N>>; 955fcc8169SMarshall Clowtemplate <size_t I, class T, size_t N> T& get(array<T, N>&) noexcept; // constexpr in C++14 965fcc8169SMarshall Clowtemplate <size_t I, class T, size_t N> const T& get(const array<T, N>&) noexcept; // constexpr in C++14 975fcc8169SMarshall Clowtemplate <size_t I, class T, size_t N> T&& get(array<T, N>&&) noexcept; // constexpr in C++14 98545b8861SEric Fiseliertemplate <size_t I, class T, size_t N> const T&& get(const array<T, N>&&) noexcept; // constexpr in C++14 993e519524SHoward Hinnant 1003e519524SHoward Hinnant} // std 1013e519524SHoward Hinnant 1023e519524SHoward Hinnant*/ 1033e519524SHoward Hinnant 1043e519524SHoward Hinnant#include <__config> 1053e519524SHoward Hinnant#include <__tuple> 1063e519524SHoward Hinnant#include <type_traits> 1073e519524SHoward Hinnant#include <utility> 1083e519524SHoward Hinnant#include <iterator> 1093e519524SHoward Hinnant#include <algorithm> 1103e519524SHoward Hinnant#include <stdexcept> 1113e519524SHoward Hinnant 112073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1133e519524SHoward Hinnant#pragma GCC system_header 114073458b1SHoward Hinnant#endif 1153e519524SHoward Hinnant 116a016efb1SEric Fiselier 117a016efb1SEric Fiselier 1183e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 1193e519524SHoward Hinnant 1203e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 121*afeda5c2SEric Fiselierstruct __array_traits { 122*afeda5c2SEric Fiselier typedef _Tp _StorageT[_Size]; 123*afeda5c2SEric Fiselier 124*afeda5c2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 125*afeda5c2SEric Fiselier static _LIBCPP_CONSTEXPR_AFTER_CXX14 _Tp* __data(_StorageT& __store) { 126*afeda5c2SEric Fiselier return __store; 127*afeda5c2SEric Fiselier } 128*afeda5c2SEric Fiselier 129*afeda5c2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 130*afeda5c2SEric Fiselier static _LIBCPP_CONSTEXPR_AFTER_CXX14 _Tp const* __data(const _StorageT& __store) { 131*afeda5c2SEric Fiselier return __store; 132*afeda5c2SEric Fiselier } 133*afeda5c2SEric Fiselier 134*afeda5c2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 135*afeda5c2SEric Fiselier static void __swap(_StorageT& __lhs, _StorageT& __rhs) { 136*afeda5c2SEric Fiselier std::swap_ranges(__lhs, __lhs + _Size, __rhs); 137*afeda5c2SEric Fiselier } 138*afeda5c2SEric Fiselier 139*afeda5c2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 140*afeda5c2SEric Fiselier static void __fill(_StorageT& __arr, _Tp const& __val) { 141*afeda5c2SEric Fiselier _VSTD::fill_n(__arr, _Size, __val); 142*afeda5c2SEric Fiselier } 143*afeda5c2SEric Fiselier}; 144*afeda5c2SEric Fiselier 145*afeda5c2SEric Fiseliertemplate <class _Tp> 146*afeda5c2SEric Fiselierstruct __array_traits<_Tp, 0> { 147*afeda5c2SEric Fiselier typedef typename aligned_storage<sizeof(_Tp), alignment_of<_Tp>::value>::type _StorageT; 148*afeda5c2SEric Fiselier 149*afeda5c2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 150*afeda5c2SEric Fiselier static _Tp* __data(_StorageT& __store) { 151*afeda5c2SEric Fiselier _StorageT *__ptr = std::addressof(__store); 152*afeda5c2SEric Fiselier return reinterpret_cast<_Tp*>(__ptr); 153*afeda5c2SEric Fiselier } 154*afeda5c2SEric Fiselier 155*afeda5c2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 156*afeda5c2SEric Fiselier static const _Tp* __data(const _StorageT& __store) { 157*afeda5c2SEric Fiselier const _StorageT *__ptr = std::addressof(__store); 158*afeda5c2SEric Fiselier return reinterpret_cast<const _Tp*>(__ptr); 159*afeda5c2SEric Fiselier } 160*afeda5c2SEric Fiselier 161*afeda5c2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 162*afeda5c2SEric Fiselier static void __swap(_StorageT&, _StorageT&) {} 163*afeda5c2SEric Fiselier 164*afeda5c2SEric Fiselier _LIBCPP_INLINE_VISIBILITY 165*afeda5c2SEric Fiselier static void __fill(_StorageT&, _Tp const&) { 166*afeda5c2SEric Fiselier } 167*afeda5c2SEric Fiselier}; 168*afeda5c2SEric Fiselier 169*afeda5c2SEric Fiseliertemplate <class _Tp, size_t _Size> 170e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS array 1713e519524SHoward Hinnant{ 1723e519524SHoward Hinnant // types: 1733e519524SHoward Hinnant typedef array __self; 1743e519524SHoward Hinnant typedef _Tp value_type; 1753e519524SHoward Hinnant typedef value_type& reference; 1763e519524SHoward Hinnant typedef const value_type& const_reference; 1773e519524SHoward Hinnant typedef value_type* iterator; 1783e519524SHoward Hinnant typedef const value_type* const_iterator; 1793e519524SHoward Hinnant typedef value_type* pointer; 1803e519524SHoward Hinnant typedef const value_type* const_pointer; 1813e519524SHoward Hinnant typedef size_t size_type; 1823e519524SHoward Hinnant typedef ptrdiff_t difference_type; 1833e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 1843e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 1853e519524SHoward Hinnant 186*afeda5c2SEric Fiselier typedef __array_traits<_Tp, _Size> _Traits; 187*afeda5c2SEric Fiselier typename _Traits::_StorageT __elems_; 1883e519524SHoward Hinnant 1893e519524SHoward Hinnant // No explicit construct/copy/destroy for aggregate type 190f5ab703fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void fill(const value_type& __u) 191*afeda5c2SEric Fiselier {_Traits::__fill(__elems_, __u);} 192*afeda5c2SEric Fiselier 1938f0cd597SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 194f07dd8d0SEric Fiselier void swap(array& __a) _NOEXCEPT_(_Size == 0 || __is_nothrow_swappable<_Tp>::value) 195*afeda5c2SEric Fiselier { _Traits::__swap(__elems_, __a.__elems_); } 1963e519524SHoward Hinnant 1973e519524SHoward Hinnant // iterators: 198020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 199*afeda5c2SEric Fiselier iterator begin() _NOEXCEPT {return iterator(data());} 200020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 201*afeda5c2SEric Fiselier const_iterator begin() const _NOEXCEPT {return const_iterator(data());} 202020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 203*afeda5c2SEric Fiselier iterator end() _NOEXCEPT {return iterator(data() + _Size);} 204020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 205*afeda5c2SEric Fiselier const_iterator end() const _NOEXCEPT {return const_iterator(data() + _Size);} 2063e519524SHoward Hinnant 207020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2088f0cd597SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 209020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2108f0cd597SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} 211020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2128f0cd597SHoward Hinnant reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 213020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2148f0cd597SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} 2153e519524SHoward Hinnant 216020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2178f0cd597SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 218020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2198f0cd597SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 220020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2218f0cd597SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 222020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 2238f0cd597SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 2243e519524SHoward Hinnant 2253e519524SHoward Hinnant // capacity: 2268f0cd597SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 227397717b7SHoward Hinnant _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return _Size;} 2288f0cd597SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 229397717b7SHoward Hinnant _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return _Size;} 23072c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 231397717b7SHoward Hinnant _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return _Size == 0;} 2323e519524SHoward Hinnant 2333e519524SHoward Hinnant // element access: 234e7826950SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 235e7826950SMarshall Clow reference operator[](size_type __n) {return __elems_[__n];} 236e7826950SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 237e7826950SMarshall Clow const_reference operator[](size_type __n) const {return __elems_[__n];} 238e7826950SMarshall Clow 239e7826950SMarshall Clow _LIBCPP_CONSTEXPR_AFTER_CXX14 reference at(size_type __n); 2408bf1f08aSMarshall Clow _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference at(size_type __n) const; 2413e519524SHoward Hinnant 242e7826950SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference front() {return __elems_[0];} 2438bf1f08aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference front() const {return __elems_[0];} 244e7826950SMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference back() {return __elems_[_Size > 0 ? _Size-1 : 0];} 2458bf1f08aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference back() const {return __elems_[_Size > 0 ? _Size-1 : 0];} 2463e519524SHoward Hinnant 247020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 248*afeda5c2SEric Fiselier value_type* data() _NOEXCEPT {return _Traits::__data(__elems_);} 249020b623aSMarshall Clow _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 250*afeda5c2SEric Fiselier const value_type* data() const _NOEXCEPT {return _Traits::__data(__elems_);} 2513e519524SHoward Hinnant}; 2523e519524SHoward Hinnant 2533e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 254e7826950SMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX14 2553e519524SHoward Hinnanttypename array<_Tp, _Size>::reference 2563e519524SHoward Hinnantarray<_Tp, _Size>::at(size_type __n) 2573e519524SHoward Hinnant{ 2583e519524SHoward Hinnant if (__n >= _Size) 259d437fa5cSMarshall Clow __throw_out_of_range("array::at"); 260d437fa5cSMarshall Clow 2613e519524SHoward Hinnant return __elems_[__n]; 2623e519524SHoward Hinnant} 2633e519524SHoward Hinnant 2643e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 2658bf1f08aSMarshall Clow_LIBCPP_CONSTEXPR_AFTER_CXX11 2663e519524SHoward Hinnanttypename array<_Tp, _Size>::const_reference 2673e519524SHoward Hinnantarray<_Tp, _Size>::at(size_type __n) const 2683e519524SHoward Hinnant{ 2693e519524SHoward Hinnant if (__n >= _Size) 270d437fa5cSMarshall Clow __throw_out_of_range("array::at"); 2713e519524SHoward Hinnant return __elems_[__n]; 2723e519524SHoward Hinnant} 2733e519524SHoward Hinnant 2743e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 2753af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2763e519524SHoward Hinnantbool 2773e519524SHoward Hinnantoperator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 2783e519524SHoward Hinnant{ 279ce48a113SHoward Hinnant return _VSTD::equal(__x.__elems_, __x.__elems_ + _Size, __y.__elems_); 2803e519524SHoward Hinnant} 2813e519524SHoward Hinnant 2823e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 2833af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2843e519524SHoward Hinnantbool 2853e519524SHoward Hinnantoperator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 2863e519524SHoward Hinnant{ 2873e519524SHoward Hinnant return !(__x == __y); 2883e519524SHoward Hinnant} 2893e519524SHoward Hinnant 2903e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 2913af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2923e519524SHoward Hinnantbool 2933e519524SHoward Hinnantoperator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 2943e519524SHoward Hinnant{ 295ce48a113SHoward Hinnant return _VSTD::lexicographical_compare(__x.__elems_, __x.__elems_ + _Size, __y.__elems_, __y.__elems_ + _Size); 2963e519524SHoward Hinnant} 2973e519524SHoward Hinnant 2983e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 2993af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3003e519524SHoward Hinnantbool 3013e519524SHoward Hinnantoperator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 3023e519524SHoward Hinnant{ 3033e519524SHoward Hinnant return __y < __x; 3043e519524SHoward Hinnant} 3053e519524SHoward Hinnant 3063e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 3073af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3083e519524SHoward Hinnantbool 3093e519524SHoward Hinnantoperator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 3103e519524SHoward Hinnant{ 3113e519524SHoward Hinnant return !(__y < __x); 3123e519524SHoward Hinnant} 3133e519524SHoward Hinnant 3143e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 3153af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3163e519524SHoward Hinnantbool 3173e519524SHoward Hinnantoperator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 3183e519524SHoward Hinnant{ 3193e519524SHoward Hinnant return !(__x < __y); 3203e519524SHoward Hinnant} 3213e519524SHoward Hinnant 3223e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 3233af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 324bc95cf0dSHoward Hinnanttypename enable_if 325bc95cf0dSHoward Hinnant< 326f07dd8d0SEric Fiselier _Size == 0 || 327bc95cf0dSHoward Hinnant __is_swappable<_Tp>::value, 3283e519524SHoward Hinnant void 329bc95cf0dSHoward Hinnant>::type 330ee66eb13SMarshall Clowswap(array<_Tp, _Size>& __x, array<_Tp, _Size>& __y) 331f07dd8d0SEric Fiselier _NOEXCEPT_(noexcept(__x.swap(__y))) 3323e519524SHoward Hinnant{ 3333e519524SHoward Hinnant __x.swap(__y); 3343e519524SHoward Hinnant} 3353e519524SHoward Hinnant 3363e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 337e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS tuple_size<array<_Tp, _Size> > 338f5ab703fSHoward Hinnant : public integral_constant<size_t, _Size> {}; 3393e519524SHoward Hinnant 3403e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 341e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, array<_Tp, _Size> > 3423e519524SHoward Hinnant{ 3436db379a2SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::tuple_element<> (std::array)"); 3443e519524SHoward Hinnantpublic: 3453e519524SHoward Hinnant typedef _Tp type; 3463e519524SHoward Hinnant}; 3473e519524SHoward Hinnant 3483e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 3493af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3503e519524SHoward Hinnant_Tp& 3518f0cd597SHoward Hinnantget(array<_Tp, _Size>& __a) _NOEXCEPT 3523e519524SHoward Hinnant{ 35336a60721SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array)"); 3548bf1f08aSMarshall Clow return __a.__elems_[_Ip]; 3553e519524SHoward Hinnant} 3563e519524SHoward Hinnant 3573e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 3583af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 3593e519524SHoward Hinnantconst _Tp& 3608f0cd597SHoward Hinnantget(const array<_Tp, _Size>& __a) _NOEXCEPT 3613e519524SHoward Hinnant{ 36236a60721SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array)"); 3638bf1f08aSMarshall Clow return __a.__elems_[_Ip]; 3643e519524SHoward Hinnant} 3653e519524SHoward Hinnant 366208156e8SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 367601afb30SHoward Hinnant 368601afb30SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 3693af48ef7SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 370601afb30SHoward Hinnant_Tp&& 3718f0cd597SHoward Hinnantget(array<_Tp, _Size>&& __a) _NOEXCEPT 372601afb30SHoward Hinnant{ 37336a60721SMarshall Clow static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array &&)"); 3748bf1f08aSMarshall Clow return _VSTD::move(__a.__elems_[_Ip]); 375601afb30SHoward Hinnant} 376601afb30SHoward Hinnant 377545b8861SEric Fiseliertemplate <size_t _Ip, class _Tp, size_t _Size> 378545b8861SEric Fiselierinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 379545b8861SEric Fiselierconst _Tp&& 380545b8861SEric Fiselierget(const array<_Tp, _Size>&& __a) _NOEXCEPT 381545b8861SEric Fiselier{ 382545b8861SEric Fiselier static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array &&)"); 383545b8861SEric Fiselier return _VSTD::move(__a.__elems_[_Ip]); 384545b8861SEric Fiselier} 385545b8861SEric Fiselier 386208156e8SEric Fiselier#endif // !_LIBCPP_CXX03_LANG 387601afb30SHoward Hinnant 3883e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 3893e519524SHoward Hinnant 3903e519524SHoward Hinnant#endif // _LIBCPP_ARRAY 391