11#ifndef EIGEN_EMULATE_ARRAY_H
12#define EIGEN_EMULATE_ARRAY_H
15#if defined(EIGEN_GPUCC) || defined(EIGEN_AVOID_STL_ARRAY)
18template <
typename T,
size_t n>
23 using const_iterator =
const T*;
25 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE iterator begin() {
return values; }
26 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const_iterator begin()
const {
return values; }
28 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE iterator end() {
return values + n; }
29 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const_iterator end()
const {
return values + n; }
31 using reverse_iterator = std::reverse_iterator<iterator>;
32 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
34 EIGEN_STRONG_INLINE reverse_iterator rbegin() {
return reverse_iterator(end()); }
35 EIGEN_STRONG_INLINE const_reverse_iterator rbegin()
const {
return const_reverse_iterator(end()); }
37 EIGEN_STRONG_INLINE reverse_iterator rend() {
return reverse_iterator(begin()); }
38 EIGEN_STRONG_INLINE const_reverse_iterator rend()
const {
return const_reverse_iterator(begin()); }
40 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& operator[](
size_t index) {
41 eigen_internal_assert(index < size());
44 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& operator[](
size_t index)
const {
45 eigen_internal_assert(index < size());
49 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& at(
size_t index) {
50 eigen_assert(index < size());
53 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& at(
size_t index)
const {
54 eigen_assert(index < size());
58 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& front() {
return values[0]; }
59 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& front()
const {
return values[0]; }
61 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& back() {
return values[n - 1]; }
62 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& back()
const {
return values[n - 1]; }
64 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
static std::size_t size() {
return n; }
68 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array() {}
69 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v) {
70 EIGEN_STATIC_ASSERT(n == 1, YOU_MADE_A_PROGRAMMING_MISTAKE)
73 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2) {
74 EIGEN_STATIC_ASSERT(n == 2, YOU_MADE_A_PROGRAMMING_MISTAKE)
78 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3) {
79 EIGEN_STATIC_ASSERT(n == 3, YOU_MADE_A_PROGRAMMING_MISTAKE)
84 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
const T& v4) {
85 EIGEN_STATIC_ASSERT(n == 4, YOU_MADE_A_PROGRAMMING_MISTAKE)
91 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
const T& v4,
const T& v5) {
92 EIGEN_STATIC_ASSERT(n == 5, YOU_MADE_A_PROGRAMMING_MISTAKE)
99 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
const T& v4,
const T& v5,
101 EIGEN_STATIC_ASSERT(n == 6, YOU_MADE_A_PROGRAMMING_MISTAKE)
109 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
const T& v4,
const T& v5,
110 const T& v6,
const T& v7) {
111 EIGEN_STATIC_ASSERT(n == 7, YOU_MADE_A_PROGRAMMING_MISTAKE)
120 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
const T& v4,
const T& v5,
121 const T& v6,
const T& v7,
const T& v8) {
122 EIGEN_STATIC_ASSERT(n == 8, YOU_MADE_A_PROGRAMMING_MISTAKE)
133 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(std::initializer_list<T> l) {
134 eigen_assert(l.size() == n);
135 internal::smart_copy(l.begin(), l.end(), values);
143 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& operator[](
size_t) {
144 eigen_assert(
false &&
"Can't index a zero size array");
147 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& operator[](
size_t)
const {
148 eigen_assert(
false &&
"Can't index a zero size array");
152 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& front() {
153 eigen_assert(
false &&
"Can't index a zero size array");
156 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& front()
const {
157 eigen_assert(
false &&
"Can't index a zero size array");
160 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& back() {
161 eigen_assert(
false &&
"Can't index a zero size array");
164 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& back()
const {
165 eigen_assert(
false &&
"Can't index a zero size array");
169 static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::size_t size() {
return 0; }
171 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array() : dummy() {}
173 EIGEN_DEVICE_FUNC array(std::initializer_list<T> l) : dummy() {
174 EIGEN_UNUSED_VARIABLE(l);
175 eigen_assert(l.size() == 0);
184template <
class T, std::
size_t N>
185EIGEN_DEVICE_FUNC
bool operator==(
const array<T, N>& lhs,
const array<T, N>& rhs) {
186 for (std::size_t i = 0; i < N; ++i) {
187 if (lhs[i] != rhs[i]) {
195template <std::
size_t I_,
class T, std::
size_t N>
196EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& array_get(array<T, N>& a) {
199template <std::
size_t I_,
class T, std::
size_t N>
200EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& array_get(
const array<T, N>& a) {
204template <
class T, std::
size_t N>
205struct array_size<array<T, N> > {
206 static constexpr Index value = N;
208template <
class T, std::
size_t N>
209struct array_size<array<T, N>&> {
210 static constexpr Index value = N;
212template <
class T, std::
size_t N>
213struct array_size<const array<T, N> > {
214 static constexpr Index value = N;
216template <
class T, std::
size_t N>
217struct array_size<const array<T, N>&> {
218 static constexpr Index value = N;
231template <
typename T, std::
size_t N>
232using array = std::array<T, N>;
236template <std::
size_t I_,
class T, std::
size_t N>
237constexpr T& array_get(std::array<T, N>& a) {
238 return std::get<I_>(a);
240template <std::
size_t I_,
class T, std::
size_t N>
241constexpr T&& array_get(std::array<T, N>&& a) {
242 return std::get<I_>(std::move(a));
244template <std::
size_t I_,
class T, std::
size_t N>
245constexpr T
const& array_get(std::array<T, N>
const& a) {
246 return std::get<I_>(a);