86template <
class T,
size_t Size>
struct array {
90 typedef value_type& reference;
91 typedef const value_type& const_reference;
92 typedef value_type* iterator;
93 typedef const value_type* const_iterator;
94 typedef value_type* pointer;
95 typedef const value_type* const_pointer;
96 typedef size_t size_type;
97 typedef ptrdiff_t difference_type;
98 typedef std::reverse_iterator<iterator> reverse_iterator;
99 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
101 value_type elems_[Size > 0 ? Size : 1];
104 void fill(
const value_type& u_) { std::fill_n(elems_, Size, u_); }
105 void swap(
array& a_)
noexcept(std::swap(std::declval<T &>(), std::declval<T &>()))
107 std::swap_ranges(elems_, elems_ + Size, a_.elems_);
111 iterator begin()
noexcept {
return iterator(elems_); }
112 const_iterator begin()
const noexcept {
return const_iterator(elems_); }
113 iterator end()
noexcept {
return iterator(elems_ + Size); }
114 const_iterator end()
const noexcept {
return const_iterator(elems_ + Size); }
115 reverse_iterator rbegin()
noexcept {
return reverse_iterator(end()); }
116 const_reverse_iterator rbegin()
const noexcept
118 return const_reverse_iterator(end());
120 reverse_iterator rend()
noexcept {
return reverse_iterator(begin()); }
121 const_reverse_iterator rend()
const noexcept
123 return const_reverse_iterator(begin());
126 const_iterator cbegin()
const noexcept {
return begin(); }
127 const_iterator cend()
const noexcept {
return end(); }
128 const_reverse_iterator crbegin()
const noexcept {
return rbegin(); }
129 const_reverse_iterator crend()
const noexcept {
return rend(); }
131 constexpr size_type size()
const noexcept {
return Size; }
132 constexpr size_type max_size()
const noexcept {
return Size; }
133 constexpr bool empty()
const noexcept {
return Size == 0; }
135 reference operator[](size_type n_) {
return elems_[n_]; }
136 constexpr const_reference operator[](size_type n_)
const {
return elems_[n_]; }
142 template <
typename I>
143 Vc_ALWAYS_INLINE
auto operator[](I&& arg_)
144 ->
decltype(subscript_operator(*
this, std::forward<I>(arg_)))
146 return subscript_operator(*
this, std::forward<I>(arg_));
149 template <
typename I>
150 Vc_ALWAYS_INLINE
auto operator[](I&& arg_)
const
151 ->
decltype(subscript_operator(*
this, std::forward<I>(arg_)))
153 return subscript_operator(*
this, std::forward<I>(arg_));
157 reference at(size_type n_);
158 constexpr const_reference at(size_type n_)
const;
160 reference front() {
return elems_[0]; }
161 constexpr const_reference front()
const {
return elems_[0]; }
162 reference back() {
return elems_[Size > 0 ? Size - 1 : 0]; }
163 constexpr const_reference back()
const {
return elems_[Size > 0 ? Size - 1 : 0]; }
164 value_type* data()
noexcept {
return elems_; }
165 const value_type* data()
const noexcept {
return elems_; }
198 return std::lexicographical_compare(x_.elems_, x_.elems_ + Size, y_.elems_,
271 typename enable_if<is_same<void, decltype(swap(declval<T&>(), declval<T&>()))>::value,
281class tuple_size<Vc::array<T, Size>> :
public integral_constant<size_t, Size>