2
//===---------------------------- array -----------------------------------===//
4
// The LLVM Compiler Infrastructure
6
// This file is dual licensed under the MIT and the University of Illinois Open
7
// Source Licenses. See LICENSE.TXT for details.
9
//===----------------------------------------------------------------------===//
19
template <class T, size_t N >
23
typedef T & reference;
24
typedef const T & const_reference;
25
typedef implementation defined iterator;
26
typedef implementation defined const_iterator;
27
typedef size_t size_type;
28
typedef ptrdiff_t difference_type;
31
typedef const T* const_pointer;
32
typedef std::reverse_iterator<iterator> reverse_iterator;
33
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
35
// No explicit construct/copy/destroy for aggregate type
36
void fill(const T& u);
37
void swap(array& a) noexcept(noexcept(swap(declval<T&>(), declval<T&>())));
40
iterator begin() noexcept;
41
const_iterator begin() const noexcept;
42
iterator end() noexcept;
43
const_iterator end() const noexcept;
45
reverse_iterator rbegin() noexcept;
46
const_reverse_iterator rbegin() const noexcept;
47
reverse_iterator rend() noexcept;
48
const_reverse_iterator rend() const noexcept;
50
const_iterator cbegin() const noexcept;
51
const_iterator cend() const noexcept;
52
const_reverse_iterator crbegin() const noexcept;
53
const_reverse_iterator crend() const noexcept;
56
constexpr size_type size() const noexcept;
57
constexpr size_type max_size() const noexcept;
58
constexpr bool empty() const noexcept;
61
reference operator[](size_type n);
62
const_reference operator[](size_type n) const;
63
const_reference at(size_type n) const;
64
reference at(size_type n);
67
const_reference front() const;
69
const_reference back() const;
72
const T* data() const noexcept;
75
template <class T, size_t N>
76
bool operator==(const array<T,N>& x, const array<T,N>& y);
77
template <class T, size_t N>
78
bool operator!=(const array<T,N>& x, const array<T,N>& y);
79
template <class T, size_t N>
80
bool operator<(const array<T,N>& x, const array<T,N>& y);
81
template <class T, size_t N>
82
bool operator>(const array<T,N>& x, const array<T,N>& y);
83
template <class T, size_t N>
84
bool operator<=(const array<T,N>& x, const array<T,N>& y);
85
template <class T, size_t N>
86
bool operator>=(const array<T,N>& x, const array<T,N>& y);
88
template <class T, size_t N >
89
void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y)));
91
template <class T> class tuple_size;
92
template <int I, class T> class tuple_element;
93
template <class T, size_t N> struct tuple_size<array<T, N>>;
94
template <int I, class T, size_t N> struct tuple_element<I, array<T, N>>;
95
template <int I, class T, size_t N> T& get(array<T, N>&) noexcept;
96
template <int I, class T, size_t N> const T& get(const array<T, N>&) noexcept;
97
template <int I, class T, size_t N> T&& get(array<T, N>&&) noexcept;
105
#include <type_traits>
110
#if defined(_LIBCPP_NO_EXCEPTIONS)
114
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
115
#pragma GCC system_header
118
_LIBCPP_BEGIN_NAMESPACE_STD
120
template <class _Tp, size_t _Size>
121
struct _LIBCPP_TYPE_VIS array
124
typedef array __self;
125
typedef _Tp value_type;
126
typedef value_type& reference;
127
typedef const value_type& const_reference;
128
typedef value_type* iterator;
129
typedef const value_type* const_iterator;
130
typedef value_type* pointer;
131
typedef const value_type* const_pointer;
132
typedef size_t size_type;
133
typedef ptrdiff_t difference_type;
134
typedef std::reverse_iterator<iterator> reverse_iterator;
135
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
137
value_type __elems_[_Size > 0 ? _Size : 1];
139
// No explicit construct/copy/destroy for aggregate type
140
_LIBCPP_INLINE_VISIBILITY void fill(const value_type& __u)
141
{_VSTD::fill_n(__elems_, _Size, __u);}
142
_LIBCPP_INLINE_VISIBILITY
143
void swap(array& __a) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value)
144
{_VSTD::swap_ranges(__elems_, __elems_ + _Size, __a.__elems_);}
147
_LIBCPP_INLINE_VISIBILITY
148
iterator begin() _NOEXCEPT {return iterator(__elems_);}
149
_LIBCPP_INLINE_VISIBILITY
150
const_iterator begin() const _NOEXCEPT {return const_iterator(__elems_);}
151
_LIBCPP_INLINE_VISIBILITY
152
iterator end() _NOEXCEPT {return iterator(__elems_ + _Size);}
153
_LIBCPP_INLINE_VISIBILITY
154
const_iterator end() const _NOEXCEPT {return const_iterator(__elems_ + _Size);}
156
_LIBCPP_INLINE_VISIBILITY
157
reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
158
_LIBCPP_INLINE_VISIBILITY
159
const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());}
160
_LIBCPP_INLINE_VISIBILITY
161
reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
162
_LIBCPP_INLINE_VISIBILITY
163
const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());}
165
_LIBCPP_INLINE_VISIBILITY
166
const_iterator cbegin() const _NOEXCEPT {return begin();}
167
_LIBCPP_INLINE_VISIBILITY
168
const_iterator cend() const _NOEXCEPT {return end();}
169
_LIBCPP_INLINE_VISIBILITY
170
const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
171
_LIBCPP_INLINE_VISIBILITY
172
const_reverse_iterator crend() const _NOEXCEPT {return rend();}
175
_LIBCPP_INLINE_VISIBILITY
176
_LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return _Size;}
177
_LIBCPP_INLINE_VISIBILITY
178
_LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return _Size;}
179
_LIBCPP_INLINE_VISIBILITY
180
_LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return _Size == 0;}
183
_LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __elems_[__n];}
184
_LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __elems_[__n];}
185
reference at(size_type __n);
186
const_reference at(size_type __n) const;
188
_LIBCPP_INLINE_VISIBILITY reference front() {return __elems_[0];}
189
_LIBCPP_INLINE_VISIBILITY const_reference front() const {return __elems_[0];}
190
_LIBCPP_INLINE_VISIBILITY reference back() {return __elems_[_Size > 0 ? _Size-1 : 0];}
191
_LIBCPP_INLINE_VISIBILITY const_reference back() const {return __elems_[_Size > 0 ? _Size-1 : 0];}
193
_LIBCPP_INLINE_VISIBILITY
194
value_type* data() _NOEXCEPT {return __elems_;}
195
_LIBCPP_INLINE_VISIBILITY
196
const value_type* data() const _NOEXCEPT {return __elems_;}
199
template <class _Tp, size_t _Size>
200
typename array<_Tp, _Size>::reference
201
array<_Tp, _Size>::at(size_type __n)
204
#ifndef _LIBCPP_NO_EXCEPTIONS
205
throw out_of_range("array::at");
207
assert(!"array::at out_of_range");
209
return __elems_[__n];
212
template <class _Tp, size_t _Size>
213
typename array<_Tp, _Size>::const_reference
214
array<_Tp, _Size>::at(size_type __n) const
217
#ifndef _LIBCPP_NO_EXCEPTIONS
218
throw out_of_range("array::at");
220
assert(!"array::at out_of_range");
222
return __elems_[__n];
225
template <class _Tp, size_t _Size>
226
_LIBCPP_INLINE_VISIBILITY inline
228
operator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
230
return _VSTD::equal(__x.__elems_, __x.__elems_ + _Size, __y.__elems_);
233
template <class _Tp, size_t _Size>
234
_LIBCPP_INLINE_VISIBILITY inline
236
operator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
238
return !(__x == __y);
241
template <class _Tp, size_t _Size>
242
_LIBCPP_INLINE_VISIBILITY inline
244
operator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
246
return _VSTD::lexicographical_compare(__x.__elems_, __x.__elems_ + _Size, __y.__elems_, __y.__elems_ + _Size);
249
template <class _Tp, size_t _Size>
250
_LIBCPP_INLINE_VISIBILITY inline
252
operator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
257
template <class _Tp, size_t _Size>
258
_LIBCPP_INLINE_VISIBILITY inline
260
operator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
265
template <class _Tp, size_t _Size>
266
_LIBCPP_INLINE_VISIBILITY inline
268
operator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
273
template <class _Tp, size_t _Size>
274
_LIBCPP_INLINE_VISIBILITY inline
277
__is_swappable<_Tp>::value,
280
swap(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
281
_NOEXCEPT_(__is_nothrow_swappable<_Tp>::value)
286
template <class _Tp, size_t _Size>
287
class _LIBCPP_TYPE_VIS tuple_size<array<_Tp, _Size> >
288
: public integral_constant<size_t, _Size> {};
290
template <class _Tp, size_t _Size>
291
class _LIBCPP_TYPE_VIS tuple_size<const array<_Tp, _Size> >
292
: public integral_constant<size_t, _Size> {};
294
template <size_t _Ip, class _Tp, size_t _Size>
295
class _LIBCPP_TYPE_VIS tuple_element<_Ip, array<_Tp, _Size> >
301
template <size_t _Ip, class _Tp, size_t _Size>
302
class _LIBCPP_TYPE_VIS tuple_element<_Ip, const array<_Tp, _Size> >
305
typedef const _Tp type;
308
template <size_t _Ip, class _Tp, size_t _Size>
309
_LIBCPP_INLINE_VISIBILITY inline
311
get(array<_Tp, _Size>& __a) _NOEXCEPT
313
static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array)");
317
template <size_t _Ip, class _Tp, size_t _Size>
318
_LIBCPP_INLINE_VISIBILITY inline
320
get(const array<_Tp, _Size>& __a) _NOEXCEPT
322
static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array)");
326
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
328
template <size_t _Ip, class _Tp, size_t _Size>
329
_LIBCPP_INLINE_VISIBILITY inline
331
get(array<_Tp, _Size>&& __a) _NOEXCEPT
333
static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array &&)");
334
return _VSTD::move(__a[_Ip]);
337
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
339
_LIBCPP_END_NAMESPACE_STD
341
#endif // _LIBCPP_ARRAY