1*3e519524SHoward Hinnant// -*- C++ -*- 2*3e519524SHoward Hinnant//===---------------------------- array -----------------------------------===// 3*3e519524SHoward Hinnant// 4*3e519524SHoward Hinnant// ��������������������The LLVM Compiler Infrastructure 5*3e519524SHoward Hinnant// 6*3e519524SHoward Hinnant// This file is distributed under the University of Illinois Open Source 7*3e519524SHoward Hinnant// License. See LICENSE.TXT for details. 8*3e519524SHoward Hinnant// 9*3e519524SHoward Hinnant//===----------------------------------------------------------------------===// 10*3e519524SHoward Hinnant 11*3e519524SHoward Hinnant#ifndef _LIBCPP_ARRAY 12*3e519524SHoward Hinnant#define _LIBCPP_ARRAY 13*3e519524SHoward Hinnant 14*3e519524SHoward Hinnant/* 15*3e519524SHoward Hinnant array synopsis 16*3e519524SHoward Hinnant 17*3e519524SHoward Hinnantnamespace std 18*3e519524SHoward Hinnant{ 19*3e519524SHoward Hinnanttemplate <class T, size_t N > 20*3e519524SHoward Hinnantstruct array 21*3e519524SHoward Hinnant{ 22*3e519524SHoward Hinnant // types: 23*3e519524SHoward Hinnant typedef T & reference; 24*3e519524SHoward Hinnant typedef const T & const_reference; 25*3e519524SHoward Hinnant typedef implementation defined iterator; 26*3e519524SHoward Hinnant typedef implementation defined const_iterator; 27*3e519524SHoward Hinnant typedef size_t size_type; 28*3e519524SHoward Hinnant typedef ptrdiff_t difference_type; 29*3e519524SHoward Hinnant typedef T value_type; 30*3e519524SHoward Hinnant typedef T* pointer; 31*3e519524SHoward Hinnant typedef const T* const_pointer; 32*3e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 33*3e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 34*3e519524SHoward Hinnant 35*3e519524SHoward Hinnant // No explicit construct/copy/destroy for aggregate type 36*3e519524SHoward Hinnant void fill(const T& u); 37*3e519524SHoward Hinnant void swap(array& a); 38*3e519524SHoward Hinnant 39*3e519524SHoward Hinnant // iterators: 40*3e519524SHoward Hinnant iterator begin(); 41*3e519524SHoward Hinnant const_iterator begin() const; 42*3e519524SHoward Hinnant iterator end(); 43*3e519524SHoward Hinnant const_iterator end() const; 44*3e519524SHoward Hinnant 45*3e519524SHoward Hinnant reverse_iterator rbegin(); 46*3e519524SHoward Hinnant const_reverse_iterator rbegin() const; 47*3e519524SHoward Hinnant reverse_iterator rend(); 48*3e519524SHoward Hinnant const_reverse_iterator rend() const; 49*3e519524SHoward Hinnant 50*3e519524SHoward Hinnant const_iterator cbegin() const; 51*3e519524SHoward Hinnant const_iterator cend() const; 52*3e519524SHoward Hinnant const_reverse_iterator crbegin() const; 53*3e519524SHoward Hinnant const_reverse_iterator crend() const; 54*3e519524SHoward Hinnant 55*3e519524SHoward Hinnant // capacity: 56*3e519524SHoward Hinnant constexpr size_type size() const; 57*3e519524SHoward Hinnant constexpr size_type max_size() const; 58*3e519524SHoward Hinnant bool empty() const; 59*3e519524SHoward Hinnant 60*3e519524SHoward Hinnant // element access: 61*3e519524SHoward Hinnant reference operator[](size_type n); 62*3e519524SHoward Hinnant const_reference operator[](size_type n) const; 63*3e519524SHoward Hinnant const_reference at(size_type n) const; 64*3e519524SHoward Hinnant reference at(size_type n); 65*3e519524SHoward Hinnant 66*3e519524SHoward Hinnant reference front(); 67*3e519524SHoward Hinnant const_reference front() const; 68*3e519524SHoward Hinnant reference back(); 69*3e519524SHoward Hinnant const_reference back() const; 70*3e519524SHoward Hinnant 71*3e519524SHoward Hinnant T* data(); 72*3e519524SHoward Hinnant const T* data() const; 73*3e519524SHoward Hinnant}; 74*3e519524SHoward Hinnant 75*3e519524SHoward Hinnanttemplate <class T, size_t N> 76*3e519524SHoward Hinnant bool operator==(const array<T,N>& x, const array<T,N>& y); 77*3e519524SHoward Hinnanttemplate <class T, size_t N> 78*3e519524SHoward Hinnant bool operator!=(const array<T,N>& x, const array<T,N>& y); 79*3e519524SHoward Hinnanttemplate <class T, size_t N> 80*3e519524SHoward Hinnant bool operator<(const array<T,N>& x, const array<T,N>& y); 81*3e519524SHoward Hinnanttemplate <class T, size_t N> 82*3e519524SHoward Hinnant bool operator>(const array<T,N>& x, const array<T,N>& y); 83*3e519524SHoward Hinnanttemplate <class T, size_t N> 84*3e519524SHoward Hinnant bool operator<=(const array<T,N>& x, const array<T,N>& y); 85*3e519524SHoward Hinnanttemplate <class T, size_t N> 86*3e519524SHoward Hinnant bool operator>=(const array<T,N>& x, const array<T,N>& y); 87*3e519524SHoward Hinnant 88*3e519524SHoward Hinnanttemplate <class T, size_t N > 89*3e519524SHoward Hinnant void swap(array<T,N>& x, array<T,N>& y); 90*3e519524SHoward Hinnant 91*3e519524SHoward Hinnanttemplate <class T> class tuple_size; 92*3e519524SHoward Hinnanttemplate <int I, class T> class tuple_element; 93*3e519524SHoward Hinnanttemplate <class T, size_t N> struct tuple_size<array<T, N>>; 94*3e519524SHoward Hinnanttemplate <int I, class T, size_t N> struct tuple_element<I, array<T, N>>; 95*3e519524SHoward Hinnanttemplate <int I, class T, size_t N> T& get(array<T, N>&); 96*3e519524SHoward Hinnanttemplate <int I, class T, size_t N> const T& get(const array<T, N>&); 97*3e519524SHoward Hinnant 98*3e519524SHoward Hinnant} // std 99*3e519524SHoward Hinnant 100*3e519524SHoward Hinnant*/ 101*3e519524SHoward Hinnant 102*3e519524SHoward Hinnant#include <__config> 103*3e519524SHoward Hinnant#include <__tuple> 104*3e519524SHoward Hinnant#include <type_traits> 105*3e519524SHoward Hinnant#include <utility> 106*3e519524SHoward Hinnant#include <iterator> 107*3e519524SHoward Hinnant#include <algorithm> 108*3e519524SHoward Hinnant#include <stdexcept> 109*3e519524SHoward Hinnant#if defined(_LIBCPP_NO_EXCEPTIONS) 110*3e519524SHoward Hinnant #include <cassert> 111*3e519524SHoward Hinnant#endif 112*3e519524SHoward Hinnant 113*3e519524SHoward Hinnant#pragma GCC system_header 114*3e519524SHoward Hinnant 115*3e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 116*3e519524SHoward Hinnant 117*3e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 118*3e519524SHoward Hinnantstruct array 119*3e519524SHoward Hinnant{ 120*3e519524SHoward Hinnant // types: 121*3e519524SHoward Hinnant typedef array __self; 122*3e519524SHoward Hinnant typedef _Tp value_type; 123*3e519524SHoward Hinnant typedef value_type& reference; 124*3e519524SHoward Hinnant typedef const value_type& const_reference; 125*3e519524SHoward Hinnant typedef value_type* iterator; 126*3e519524SHoward Hinnant typedef const value_type* const_iterator; 127*3e519524SHoward Hinnant typedef value_type* pointer; 128*3e519524SHoward Hinnant typedef const value_type* const_pointer; 129*3e519524SHoward Hinnant typedef size_t size_type; 130*3e519524SHoward Hinnant typedef ptrdiff_t difference_type; 131*3e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 132*3e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 133*3e519524SHoward Hinnant 134*3e519524SHoward Hinnant value_type __elems_[_Size > 0 ? _Size : 1]; 135*3e519524SHoward Hinnant 136*3e519524SHoward Hinnant // No explicit construct/copy/destroy for aggregate type 137*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void fill(const value_type& __u) {_STD::fill_n(__elems_, _Size, __u);} 138*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void swap(array& __a) {_STD::swap_ranges(__elems_, __elems_ + _Size, __a.__elems_);} 139*3e519524SHoward Hinnant 140*3e519524SHoward Hinnant // iterators: 141*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY iterator begin() {return iterator(__elems_);} 142*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_iterator begin() const {return const_iterator(__elems_);} 143*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY iterator end() {return iterator(__elems_ + _Size);} 144*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_iterator end() const {return const_iterator(__elems_ + _Size);} 145*3e519524SHoward Hinnant 146*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY reverse_iterator rbegin() {return reverse_iterator(end());} 147*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rbegin() const {return const_reverse_iterator(end());} 148*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY reverse_iterator rend() {return reverse_iterator(begin());} 149*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rend() const {return const_reverse_iterator(begin());} 150*3e519524SHoward Hinnant 151*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_iterator cbegin() const {return begin();} 152*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_iterator cend() const {return end();} 153*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crbegin() const {return rbegin();} 154*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crend() const {return rend();} 155*3e519524SHoward Hinnant 156*3e519524SHoward Hinnant // capacity: 157*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY /*constexpr*/ size_type size() const {return _Size;} 158*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY /*constexpr*/ size_type max_size() const {return _Size;} 159*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool empty() const {return _Size == 0;} 160*3e519524SHoward Hinnant 161*3e519524SHoward Hinnant // element access: 162*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __elems_[__n];} 163*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __elems_[__n];} 164*3e519524SHoward Hinnant reference at(size_type __n); 165*3e519524SHoward Hinnant const_reference at(size_type __n) const; 166*3e519524SHoward Hinnant 167*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY reference front() {return __elems_[0];} 168*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __elems_[0];} 169*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY reference back() {return __elems_[_Size > 0 ? _Size-1 : 0];} 170*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __elems_[_Size > 0 ? _Size-1 : 0];} 171*3e519524SHoward Hinnant 172*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY value_type* data() {return __elems_;} 173*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY const value_type* data() const {return __elems_;} 174*3e519524SHoward Hinnant}; 175*3e519524SHoward Hinnant 176*3e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 177*3e519524SHoward Hinnanttypename array<_Tp, _Size>::reference 178*3e519524SHoward Hinnantarray<_Tp, _Size>::at(size_type __n) 179*3e519524SHoward Hinnant{ 180*3e519524SHoward Hinnant if (__n >= _Size) 181*3e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 182*3e519524SHoward Hinnant throw out_of_range("array::at"); 183*3e519524SHoward Hinnant#else 184*3e519524SHoward Hinnant assert(!"array::at out_of_range"); 185*3e519524SHoward Hinnant#endif 186*3e519524SHoward Hinnant return __elems_[__n]; 187*3e519524SHoward Hinnant} 188*3e519524SHoward Hinnant 189*3e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 190*3e519524SHoward Hinnanttypename array<_Tp, _Size>::const_reference 191*3e519524SHoward Hinnantarray<_Tp, _Size>::at(size_type __n) const 192*3e519524SHoward Hinnant{ 193*3e519524SHoward Hinnant if (__n >= _Size) 194*3e519524SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 195*3e519524SHoward Hinnant throw out_of_range("array::at"); 196*3e519524SHoward Hinnant#else 197*3e519524SHoward Hinnant assert(!"array::at out_of_range"); 198*3e519524SHoward Hinnant#endif 199*3e519524SHoward Hinnant return __elems_[__n]; 200*3e519524SHoward Hinnant} 201*3e519524SHoward Hinnant 202*3e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 203*3e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 204*3e519524SHoward Hinnantbool 205*3e519524SHoward Hinnantoperator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 206*3e519524SHoward Hinnant{ 207*3e519524SHoward Hinnant return _STD::equal(__x.__elems_, __x.__elems_ + _Size, __y.__elems_); 208*3e519524SHoward Hinnant} 209*3e519524SHoward Hinnant 210*3e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 211*3e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 212*3e519524SHoward Hinnantbool 213*3e519524SHoward Hinnantoperator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 214*3e519524SHoward Hinnant{ 215*3e519524SHoward Hinnant return !(__x == __y); 216*3e519524SHoward Hinnant} 217*3e519524SHoward Hinnant 218*3e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 219*3e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 220*3e519524SHoward Hinnantbool 221*3e519524SHoward Hinnantoperator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 222*3e519524SHoward Hinnant{ 223*3e519524SHoward Hinnant return _STD::lexicographical_compare(__x.__elems_, __x.__elems_ + _Size, __y.__elems_, __y.__elems_ + _Size); 224*3e519524SHoward Hinnant} 225*3e519524SHoward Hinnant 226*3e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 227*3e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 228*3e519524SHoward Hinnantbool 229*3e519524SHoward Hinnantoperator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 230*3e519524SHoward Hinnant{ 231*3e519524SHoward Hinnant return __y < __x; 232*3e519524SHoward Hinnant} 233*3e519524SHoward Hinnant 234*3e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 235*3e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 236*3e519524SHoward Hinnantbool 237*3e519524SHoward Hinnantoperator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 238*3e519524SHoward Hinnant{ 239*3e519524SHoward Hinnant return !(__y < __x); 240*3e519524SHoward Hinnant} 241*3e519524SHoward Hinnant 242*3e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 243*3e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 244*3e519524SHoward Hinnantbool 245*3e519524SHoward Hinnantoperator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 246*3e519524SHoward Hinnant{ 247*3e519524SHoward Hinnant return !(__x < __y); 248*3e519524SHoward Hinnant} 249*3e519524SHoward Hinnant 250*3e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 251*3e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 252*3e519524SHoward Hinnantvoid 253*3e519524SHoward Hinnantswap(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) 254*3e519524SHoward Hinnant{ 255*3e519524SHoward Hinnant __x.swap(__y); 256*3e519524SHoward Hinnant} 257*3e519524SHoward Hinnant 258*3e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 259*3e519524SHoward Hinnant class tuple_size<array<_Tp, _Size> > : public integral_constant<size_t, _Size> {}; 260*3e519524SHoward Hinnant 261*3e519524SHoward Hinnanttemplate <class _Tp, size_t _Size> 262*3e519524SHoward Hinnant class tuple_size<const array<_Tp, _Size> > : public integral_constant<size_t, _Size> {}; 263*3e519524SHoward Hinnant 264*3e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 265*3e519524SHoward Hinnantclass tuple_element<_Ip, array<_Tp, _Size> > 266*3e519524SHoward Hinnant{ 267*3e519524SHoward Hinnantpublic: 268*3e519524SHoward Hinnant typedef _Tp type; 269*3e519524SHoward Hinnant}; 270*3e519524SHoward Hinnant 271*3e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 272*3e519524SHoward Hinnantclass tuple_element<_Ip, const array<_Tp, _Size> > 273*3e519524SHoward Hinnant{ 274*3e519524SHoward Hinnantpublic: 275*3e519524SHoward Hinnant typedef const _Tp type; 276*3e519524SHoward Hinnant}; 277*3e519524SHoward Hinnant 278*3e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 279*3e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 280*3e519524SHoward Hinnant_Tp& 281*3e519524SHoward Hinnantget(array<_Tp, _Size>& __a) 282*3e519524SHoward Hinnant{ 283*3e519524SHoward Hinnant return __a[_Ip]; 284*3e519524SHoward Hinnant} 285*3e519524SHoward Hinnant 286*3e519524SHoward Hinnanttemplate <size_t _Ip, class _Tp, size_t _Size> 287*3e519524SHoward Hinnant_LIBCPP_INLINE_VISIBILITY inline 288*3e519524SHoward Hinnantconst _Tp& 289*3e519524SHoward Hinnantget(const array<_Tp, _Size>& __a) 290*3e519524SHoward Hinnant{ 291*3e519524SHoward Hinnant return __a[_Ip]; 292*3e519524SHoward Hinnant} 293*3e519524SHoward Hinnant 294*3e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 295*3e519524SHoward Hinnant 296*3e519524SHoward Hinnant#endif // _LIBCPP_ARRAY 297