13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===---------------------------- array -----------------------------------===// 33e519524SHoward Hinnant// 45b08a8a4SHoward Hinnant// The LLVM Compiler Infrastructure 53e519524SHoward Hinnant// 6*412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 7*412dbebeSHoward 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); 373e519524SHoward Hinnant void swap(array& a); 383e519524SHoward Hinnant 393e519524SHoward Hinnant // iterators: 403e519524SHoward Hinnant iterator begin(); 413e519524SHoward Hinnant const_iterator begin() const; 423e519524SHoward Hinnant iterator end(); 433e519524SHoward Hinnant const_iterator end() const; 443e519524SHoward Hinnant 453e519524SHoward Hinnant reverse_iterator rbegin(); 463e519524SHoward Hinnant const_reverse_iterator rbegin() const; 473e519524SHoward Hinnant reverse_iterator rend(); 483e519524SHoward Hinnant const_reverse_iterator rend() const; 493e519524SHoward Hinnant 503e519524SHoward Hinnant const_iterator cbegin() const; 513e519524SHoward Hinnant const_iterator cend() const; 523e519524SHoward Hinnant const_reverse_iterator crbegin() const; 533e519524SHoward Hinnant const_reverse_iterator crend() const; 543e519524SHoward Hinnant 553e519524SHoward Hinnant // capacity: 563e519524SHoward Hinnant constexpr size_type size() const; 573e519524SHoward Hinnant constexpr size_type max_size() const; 583e519524SHoward Hinnant bool empty() const; 593e519524SHoward Hinnant 603e519524SHoward Hinnant // element access: 613e519524SHoward Hinnant reference operator[](size_type n); 623e519524SHoward Hinnant const_reference operator[](size_type n) const; 633e519524SHoward Hinnant const_reference at(size_type n) const; 643e519524SHoward Hinnant reference at(size_type n); 653e519524SHoward Hinnant 663e519524SHoward Hinnant reference front(); 673e519524SHoward Hinnant const_reference front() const; 683e519524SHoward Hinnant reference back(); 693e519524SHoward Hinnant const_reference back() const; 703e519524SHoward Hinnant 713e519524SHoward Hinnant T* data(); 723e519524SHoward Hinnant const T* data() const; 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 > 893e519524SHoward Hinnant void swap(array<T,N>& x, array<T,N>& y); 903e519524SHoward Hinnant 913e519524SHoward Hinnanttemplate <class T> class tuple_size; 923e519524SHoward Hinnanttemplate <int I, class T> class tuple_element; 933e519524SHoward Hinnanttemplate <class T, size_t N> struct tuple_size<array<T, N>>; 943e519524SHoward Hinnanttemplate <int I, class T, size_t N> struct tuple_element<I, array<T, N>>; 953e519524SHoward Hinnanttemplate <int I, class T, size_t N> T& get(array<T, N>&); 963e519524SHoward Hinnanttemplate <int I, class T, size_t N> const T& get(const array<T, N>&); 973e519524SHoward Hinnant 983e519524SHoward Hinnant} // std 993e519524SHoward Hinnant 1003e519524SHoward Hinnant*/ 1013e519524SHoward Hinnant 1023e519524SHoward Hinnant#include <__config> 1033e519524SHoward Hinnant#include <__tuple> 1043e519524SHoward Hinnant#include <type_traits> 1053e519524SHoward Hinnant#include <utility> 1063e519524SHoward Hinnant#include <iterator> 1073e519524SHoward Hinnant#include <algorithm> 1083e519524SHoward Hinnant#include <stdexcept> 1093e519524SHoward Hinnant#if defined(_LIBCPP_NO_EXCEPTIONS) 1103e519524SHoward Hinnant #include <cassert> 1113e519524SHoward Hinnant#endif 1123e519524SHoward Hinnant 1133e519524SHoward Hinnant#pragma GCC system_header 1143e519524SHoward Hinnant 1153e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 1163e519524SHoward Hinnant 1173e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 118f5ab703fSHoward Hinnantstruct _LIBCPP_VISIBLE array 1193e519524SHoward Hinnant{ 1203e519524SHoward Hinnant // types: 1213e519524SHoward Hinnant typedef array __self; 1223e519524SHoward Hinnant typedef _Tp value_type; 1233e519524SHoward Hinnant typedef value_type& reference; 1243e519524SHoward Hinnant typedef const value_type& const_reference; 1253e519524SHoward Hinnant typedef value_type* iterator; 1263e519524SHoward Hinnant typedef const value_type* const_iterator; 1273e519524SHoward Hinnant typedef value_type* pointer; 1283e519524SHoward Hinnant typedef const value_type* const_pointer; 1293e519524SHoward Hinnant typedef size_t size_type; 1303e519524SHoward Hinnant typedef ptrdiff_t difference_type; 1313e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 1323e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 1333e519524SHoward Hinnant 1343e519524SHoward Hinnant value_type __elems_[_Size > 0 ? _Size : 1]; 1353e519524SHoward Hinnant 1363e519524SHoward Hinnant // No explicit construct/copy/destroy for aggregate type 137f5ab703fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void fill(const value_type& __u) 138f5ab703fSHoward Hinnant {_STD::fill_n(__elems_, _Size, __u);} 139f5ab703fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(array& __a) 140f5ab703fSHoward Hinnant {_STD::swap_ranges(__elems_, __elems_ + _Size, __a.__elems_);} 1413e519524SHoward Hinnant 1423e519524SHoward Hinnant // iterators: 1433e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY iterator begin() {return iterator(__elems_);} 1443e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_iterator begin() const {return const_iterator(__elems_);} 1453e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY iterator end() {return iterator(__elems_ + _Size);} 1463e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_iterator end() const {return const_iterator(__elems_ + _Size);} 1473e519524SHoward Hinnant 1483e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY reverse_iterator rbegin() {return reverse_iterator(end());} 1493e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rbegin() const {return const_reverse_iterator(end());} 1503e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY reverse_iterator rend() {return reverse_iterator(begin());} 1513e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rend() const {return const_reverse_iterator(begin());} 1523e519524SHoward Hinnant 1533e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_iterator cbegin() const {return begin();} 1543e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_iterator cend() const {return end();} 1553e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crbegin() const {return rbegin();} 1563e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crend() const {return rend();} 1573e519524SHoward Hinnant 1583e519524SHoward Hinnant // capacity: 1593e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY /*constexpr*/ size_type size() const {return _Size;} 1603e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY /*constexpr*/ size_type max_size() const {return _Size;} 1613e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool empty() const {return _Size == 0;} 1623e519524SHoward Hinnant 1633e519524SHoward Hinnant // element access: 1643e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __elems_[__n];} 1653e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __elems_[__n];} 1663e519524SHoward Hinnant reference at(size_type __n); 1673e519524SHoward Hinnant const_reference at(size_type __n) const; 1683e519524SHoward Hinnant 1693e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY reference front() {return __elems_[0];} 1703e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __elems_[0];} 1713e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY reference back() {return __elems_[_Size > 0 ? _Size-1 : 0];} 1723e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __elems_[_Size > 0 ? _Size-1 : 0];} 1733e519524SHoward Hinnant 1743e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY value_type* data() {return __elems_;} 1753e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const value_type* data() const {return __elems_;} 1763e519524SHoward Hinnant}; 1773e519524SHoward Hinnant 1783e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 1793e519524SHoward Hinnanttypename array<_Tp, _Size>::reference 1803e519524SHoward Hinnantarray<_Tp, _Size>::at(size_type __n) 1813e519524SHoward Hinnant{ 1823e519524SHoward Hinnant if (__n >= _Size) 1833e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 1843e519524SHoward Hinnant throw out_of_range("array::at"); 1853e519524SHoward Hinnant#else 1863e519524SHoward Hinnant assert(!"array::at out_of_range"); 1873e519524SHoward Hinnant#endif 1883e519524SHoward Hinnant return __elems_[__n]; 1893e519524SHoward Hinnant} 1903e519524SHoward Hinnant 1913e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 1923e519524SHoward Hinnanttypename array<_Tp, _Size>::const_reference 1933e519524SHoward Hinnantarray<_Tp, _Size>::at(size_type __n) const 1943e519524SHoward Hinnant{ 1953e519524SHoward Hinnant if (__n >= _Size) 1963e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 1973e519524SHoward Hinnant throw out_of_range("array::at"); 1983e519524SHoward Hinnant#else 1993e519524SHoward Hinnant assert(!"array::at out_of_range"); 2003e519524SHoward Hinnant#endif 2013e519524SHoward Hinnant return __elems_[__n]; 2023e519524SHoward Hinnant} 2033e519524SHoward Hinnant 2043e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 2053e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 2063e519524SHoward Hinnantbool 2073e519524SHoward Hinnantoperator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 2083e519524SHoward Hinnant{ 2093e519524SHoward Hinnant return _STD::equal(__x.__elems_, __x.__elems_ + _Size, __y.__elems_); 2103e519524SHoward Hinnant} 2113e519524SHoward Hinnant 2123e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 2133e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 2143e519524SHoward Hinnantbool 2153e519524SHoward Hinnantoperator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 2163e519524SHoward Hinnant{ 2173e519524SHoward Hinnant return !(__x == __y); 2183e519524SHoward Hinnant} 2193e519524SHoward Hinnant 2203e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 2213e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 2223e519524SHoward Hinnantbool 2233e519524SHoward Hinnantoperator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 2243e519524SHoward Hinnant{ 2253e519524SHoward Hinnant return _STD::lexicographical_compare(__x.__elems_, __x.__elems_ + _Size, __y.__elems_, __y.__elems_ + _Size); 2263e519524SHoward Hinnant} 2273e519524SHoward Hinnant 2283e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 2293e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 2303e519524SHoward Hinnantbool 2313e519524SHoward Hinnantoperator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 2323e519524SHoward Hinnant{ 2333e519524SHoward Hinnant return __y < __x; 2343e519524SHoward Hinnant} 2353e519524SHoward Hinnant 2363e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 2373e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 2383e519524SHoward Hinnantbool 2393e519524SHoward Hinnantoperator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 2403e519524SHoward Hinnant{ 2413e519524SHoward Hinnant return !(__y < __x); 2423e519524SHoward Hinnant} 2433e519524SHoward Hinnant 2443e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 2453e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 2463e519524SHoward Hinnantbool 2473e519524SHoward Hinnantoperator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 2483e519524SHoward Hinnant{ 2493e519524SHoward Hinnant return !(__x < __y); 2503e519524SHoward Hinnant} 2513e519524SHoward Hinnant 2523e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 2533e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 2543e519524SHoward Hinnantvoid 2553e519524SHoward Hinnantswap(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 2563e519524SHoward Hinnant{ 2573e519524SHoward Hinnant __x.swap(__y); 2583e519524SHoward Hinnant} 2593e519524SHoward Hinnant 2603e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 261f5ab703fSHoward Hinnantclass _LIBCPP_VISIBLE tuple_size<array<_Tp, _Size> > 262f5ab703fSHoward Hinnant : public integral_constant<size_t, _Size> {}; 2633e519524SHoward Hinnant 2643e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 265f5ab703fSHoward Hinnantclass _LIBCPP_VISIBLE tuple_size<const array<_Tp, _Size> > 266f5ab703fSHoward Hinnant : public integral_constant<size_t, _Size> {}; 2673e519524SHoward Hinnant 2683e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 269f5ab703fSHoward Hinnantclass _LIBCPP_VISIBLE tuple_element<_Ip, array<_Tp, _Size> > 2703e519524SHoward Hinnant{ 2713e519524SHoward Hinnantpublic: 2723e519524SHoward Hinnant typedef _Tp type; 2733e519524SHoward Hinnant}; 2743e519524SHoward Hinnant 2753e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 276f5ab703fSHoward Hinnantclass _LIBCPP_VISIBLE tuple_element<_Ip, const array<_Tp, _Size> > 2773e519524SHoward Hinnant{ 2783e519524SHoward Hinnantpublic: 2793e519524SHoward Hinnant typedef const _Tp type; 2803e519524SHoward Hinnant}; 2813e519524SHoward Hinnant 2823e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 2833e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 2843e519524SHoward Hinnant_Tp& 2853e519524SHoward Hinnantget(array<_Tp, _Size>& __a) 2863e519524SHoward Hinnant{ 2873e519524SHoward Hinnant return __a[_Ip]; 2883e519524SHoward Hinnant} 2893e519524SHoward Hinnant 2903e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 2913e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 2923e519524SHoward Hinnantconst _Tp& 2933e519524SHoward Hinnantget(const array<_Tp, _Size>& __a) 2943e519524SHoward Hinnant{ 2953e519524SHoward Hinnant return __a[_Ip]; 2963e519524SHoward Hinnant} 2973e519524SHoward Hinnant 2983e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 2993e519524SHoward Hinnant 3003e519524SHoward Hinnant#endif // _LIBCPP_ARRAY 301