19 #include <EASTL/internal/config.h>
20 #include <EASTL/iterator.h>
21 #include <EASTL/algorithm.h>
22 #include <EASTL/utility.h>
25 #if EASTL_EXCEPTIONS_ENABLED
26 EA_DISABLE_ALL_VC_WARNINGS()
28 EA_RESTORE_ALL_VC_WARNINGS()
31 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
57 template <
typename T,
size_t N = 1>
63 typedef value_type& reference;
64 typedef const value_type& const_reference;
65 typedef value_type* iterator;
66 typedef const value_type* const_iterator;
69 typedef eastl_size_t size_type;
70 typedef ptrdiff_t difference_type;
81 value_type mValue[N ? N : 1];
86 void fill(
const value_type& value);
92 EA_CPP14_CONSTEXPR iterator begin() EA_NOEXCEPT;
93 EA_CPP14_CONSTEXPR const_iterator begin()
const EA_NOEXCEPT;
94 EA_CPP14_CONSTEXPR const_iterator cbegin()
const EA_NOEXCEPT;
96 EA_CPP14_CONSTEXPR iterator end() EA_NOEXCEPT;
97 EA_CPP14_CONSTEXPR const_iterator end()
const EA_NOEXCEPT;
98 EA_CPP14_CONSTEXPR const_iterator cend()
const EA_NOEXCEPT;
108 EA_CPP14_CONSTEXPR
bool empty()
const EA_NOEXCEPT;
109 EA_CPP14_CONSTEXPR size_type size()
const EA_NOEXCEPT;
110 EA_CPP14_CONSTEXPR size_type max_size()
const EA_NOEXCEPT;
112 EA_CPP14_CONSTEXPR T* data() EA_NOEXCEPT;
113 EA_CPP14_CONSTEXPR
const T* data()
const EA_NOEXCEPT;
115 EA_CPP14_CONSTEXPR reference operator[](size_type i);
116 EA_CPP14_CONSTEXPR const_reference operator[](size_type i)
const;
117 EA_CPP14_CONSTEXPR const_reference at(size_type i)
const;
118 EA_CPP14_CONSTEXPR reference at(size_type i);
120 EA_CPP14_CONSTEXPR reference front();
121 EA_CPP14_CONSTEXPR const_reference front()
const;
123 EA_CPP14_CONSTEXPR reference back();
124 EA_CPP14_CONSTEXPR const_reference back()
const;
126 bool validate()
const;
127 int validate_iterator(const_iterator i)
const;
135 #ifdef __cpp_deduction_guides
136 template <
class T,
class... U>
array(T, U...) ->
array<T, 1 +
sizeof...(U)>;
145 template <
typename T,
size_t N>
152 template <
typename T,
size_t N>
159 template <
typename T,
size_t N>
160 EA_CPP14_CONSTEXPR
inline typename array<T, N>::iterator
161 array<T, N>::begin() EA_NOEXCEPT
167 template <
typename T,
size_t N>
168 EA_CPP14_CONSTEXPR
inline typename array<T, N>::const_iterator
169 array<T, N>::begin() const EA_NOEXCEPT
175 template <
typename T,
size_t N>
176 EA_CPP14_CONSTEXPR
inline typename array<T, N>::const_iterator
177 array<T, N>::cbegin() const EA_NOEXCEPT
183 template <
typename T,
size_t N>
184 EA_CPP14_CONSTEXPR
inline typename array<T, N>::iterator
185 array<T, N>::end() EA_NOEXCEPT
191 template <
typename T,
size_t N>
192 EA_CPP14_CONSTEXPR
inline typename array<T, N>::const_iterator
193 array<T, N>::end() const EA_NOEXCEPT
199 template <
typename T,
size_t N>
200 EA_CPP14_CONSTEXPR
inline typename array<T, N>::const_iterator
201 array<T, N>::cend() const EA_NOEXCEPT
207 template <
typename T,
size_t N>
208 EA_CPP14_CONSTEXPR
inline typename array<T, N>::reverse_iterator
209 array<T, N>::rbegin() EA_NOEXCEPT
211 return reverse_iterator(&mValue[N]);
215 template <
typename T,
size_t N>
216 EA_CPP14_CONSTEXPR
inline typename array<T, N>::const_reverse_iterator
217 array<T, N>::rbegin() const EA_NOEXCEPT
219 return const_reverse_iterator(&mValue[N]);
223 template <
typename T,
size_t N>
224 EA_CPP14_CONSTEXPR
inline typename array<T, N>::const_reverse_iterator
225 array<T, N>::crbegin() const EA_NOEXCEPT
227 return const_reverse_iterator(&mValue[N]);
231 template <
typename T,
size_t N>
232 EA_CPP14_CONSTEXPR
inline typename array<T, N>::reverse_iterator
233 array<T, N>::rend() EA_NOEXCEPT
235 return reverse_iterator(&mValue[0]);
239 template <
typename T,
size_t N>
240 EA_CPP14_CONSTEXPR
inline typename array<T, N>::const_reverse_iterator
241 array<T, N>::rend() const EA_NOEXCEPT
243 return const_reverse_iterator(
static_cast<const_iterator
>(&mValue[0]));
247 template <
typename T,
size_t N>
248 EA_CPP14_CONSTEXPR
inline typename array<T, N>::const_reverse_iterator
249 array<T, N>::crend() const EA_NOEXCEPT
251 return const_reverse_iterator(
static_cast<const_iterator
>(&mValue[0]));
255 template <
typename T,
size_t N>
256 EA_CPP14_CONSTEXPR
inline typename array<T, N>::size_type
257 array<T, N>::size() const EA_NOEXCEPT
263 template <
typename T,
size_t N>
264 EA_CPP14_CONSTEXPR
inline typename array<T, N>::size_type
265 array<T, N>::max_size() const EA_NOEXCEPT
271 template <
typename T,
size_t N>
272 EA_CPP14_CONSTEXPR
inline bool array<T, N>::empty() const EA_NOEXCEPT
278 template <
typename T,
size_t N>
279 EA_CPP14_CONSTEXPR
inline typename array<T, N>::reference
280 array<T, N>::operator[](size_type i)
286 template <
typename T,
size_t N>
287 EA_CPP14_CONSTEXPR
inline typename array<T, N>::const_reference
288 array<T, N>::operator[](size_type i)
const
294 template <
typename T,
size_t N>
295 EA_CPP14_CONSTEXPR
inline typename array<T, N>::reference
302 template <
typename T,
size_t N>
303 EA_CPP14_CONSTEXPR
inline typename array<T, N>::const_reference
304 array<T, N>::front()
const
310 template <
typename T,
size_t N>
311 EA_CPP14_CONSTEXPR
inline typename array<T, N>::reference
314 return mValue[N - 1];
318 template <
typename T,
size_t N>
319 EA_CPP14_CONSTEXPR
inline typename array<T, N>::const_reference
320 array<T, N>::back()
const
322 return mValue[N - 1];
326 template <
typename T,
size_t N>
327 EA_CPP14_CONSTEXPR
inline T* array<T, N>::data() EA_NOEXCEPT
333 template <
typename T,
size_t N>
334 EA_CPP14_CONSTEXPR
inline const T* array<T, N>::data() const EA_NOEXCEPT
340 template <
typename T,
size_t N>
341 EA_CPP14_CONSTEXPR
inline typename array<T, N>::const_reference array<T, N>::at(size_type i)
const
343 #if EASTL_EXCEPTIONS_ENABLED
344 if(EASTL_UNLIKELY(i >= N))
345 throw std::out_of_range(
"array::at -- out of range");
346 #elif EASTL_ASSERT_ENABLED
347 if(EASTL_UNLIKELY(i >= N))
348 EASTL_FAIL_MSG(
"array::at -- out of range");
351 return static_cast<const_reference
>(mValue[i]);
355 template <
typename T,
size_t N>
356 EA_CPP14_CONSTEXPR
inline typename array<T, N>::reference array<T, N>::at(size_type i)
358 #if EASTL_EXCEPTIONS_ENABLED
359 if(EASTL_UNLIKELY(i >= N))
360 throw std::out_of_range(
"array::at -- out of range");
361 #elif EASTL_ASSERT_ENABLED
362 if(EASTL_UNLIKELY(i >= N))
363 EASTL_FAIL_MSG(
"array::at -- out of range");
366 return static_cast<reference
>(mValue[i]);
370 template <
typename T,
size_t N>
371 inline bool array<T, N>::validate()
const
377 template <
typename T,
size_t N>
378 inline int array<T, N>::validate_iterator(const_iterator i)
const
383 return (isf_valid | isf_current | isf_can_dereference);
385 if(i <= (mValue + N))
386 return (isf_valid | isf_current);
398 template <
typename T,
size_t N>
399 EA_CPP14_CONSTEXPR
inline bool operator==(
const array<T, N>& a,
const array<T, N>& b)
401 return eastl::equal(&a.mValue[0], &a.mValue[N], &b.mValue[0]);
405 template <
typename T,
size_t N>
406 EA_CPP14_CONSTEXPR
inline bool operator<(
const array<T, N>& a,
const array<T, N>& b)
412 template <
typename T,
size_t N>
413 EA_CPP14_CONSTEXPR
inline bool operator!=(
const array<T, N>& a,
const array<T, N>& b)
415 return !
eastl::equal(&a.mValue[0], &a.mValue[N], &b.mValue[0]);
419 template <
typename T,
size_t N>
420 EA_CPP14_CONSTEXPR
inline bool operator>(
const array<T, N>& a,
const array<T, N>& b)
426 template <
typename T,
size_t N>
427 EA_CPP14_CONSTEXPR
inline bool operator<=(
const array<T, N>& a,
const array<T, N>& b)
433 template <
typename T,
size_t N>
434 EA_CPP14_CONSTEXPR
inline bool operator>=(
const array<T, N>& a,
const array<T, N>& b)
440 template <
typename T,
size_t N>
441 inline void swap(array<T, N>& a, array<T, N>& b)
452 template<
class T,
size_t N,
size_t... I>
453 EA_CONSTEXPR
auto to_array(T (&a)[N], index_sequence<I...>)
458 template<
class T,
size_t N,
size_t... I>
459 EA_CONSTEXPR
auto to_array(T (&&a)[N], index_sequence<I...>)
465 template<
class T,
size_t N>
468 static_assert(eastl::is_constructible_v<T, T&>,
"element type T must be copy-initializable");
469 static_assert(!eastl::is_array_v<T>,
"passing multidimensional arrays to to_array is ill-formed");
470 return internal::to_array(a, eastl::make_index_sequence<N>{});
473 template<
class T,
size_t N>
476 static_assert(eastl::is_move_constructible_v<T>,
"element type T must be move-constructible");
477 static_assert(!eastl::is_array_v<T>,
"passing multidimensional arrays to to_array is ill-formed");
478 return internal::to_array(
eastl::move(a), eastl::make_index_sequence<N>{});
481 #if EASTL_TUPLE_ENABLED
483 template <
typename T,
size_t N>
484 class tuple_size<array<T, N>> :
public integral_constant<size_t, N>
488 template <
typename T,
size_t N>
489 class tuple_size<const array<T, N>> :
public integral_constant<size_t, N>
493 template <
size_t I,
typename T,
size_t N>
494 class tuple_element<I, array<T, N>>
500 template <
size_t I,
typename T,
size_t N>
501 class tuple_element<I, const array<T, N>>
504 using type =
const T;
510 template <
typename T,
size_t N>
511 static EA_CONSTEXPR T& getInternal(array<T, N>& a)
516 template <
typename T,
size_t N>
517 static EA_CONSTEXPR
const T& getInternal(
const array<T, N>& a)
522 template <
typename T,
size_t N>
523 static EA_CONSTEXPR T&& getInternal(array<T, N>&& a)
525 return eastl::forward<T>(a[I]);
529 template <
size_t I,
typename T,
size_t N>
530 EA_CONSTEXPR tuple_element_t<I, array<T, N>>& get(array<T, N>& p)
532 return GetArray<I>::getInternal(p);
535 template <
size_t I,
typename T,
size_t N>
536 EA_CONSTEXPR
const tuple_element_t<I, array<T, N>>& get(
const array<T, N>& p)
538 return GetArray<I>::getInternal(p);
541 template <
size_t I,
typename T,
size_t N>
542 EA_CONSTEXPR tuple_element_t<I, array<T, N>>&& get(array<T, N>&& p)
555 #ifndef EA_COMPILER_NO_STRUCTURED_BINDING
558 template <
typename T,
size_t N>
563 template <
size_t I,
typename T,
size_t N>
566 static_assert(I < N,
"index is out of bounds");
Definition: iterator.h:224
EA Standard Template Library.
Definition: algorithm.h:288
OutputIterator fill_n(OutputIterator first, Size n, const T &value)
Definition: fill_help.h:299
OutputIterator move(InputIterator first, InputIterator last, OutputIterator result)
Definition: copy_help.h:170
ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2)
Definition: utility.h:266
EA_CPP14_CONSTEXPR bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)
Definition: algorithm.h:1856
bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2)
Definition: algorithm.h:1996
Definition: type_traits.h:263
Definition: utility.h:130