xref: /llvm-project-15.0.7/libcxx/include/array (revision 3e519524)
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