10#ifndef EIGEN_EMULATE_ARRAY_H
11#define EIGEN_EMULATE_ARRAY_H
14#if defined(EIGEN_GPUCC) || defined(EIGEN_AVOID_STL_ARRAY)
17template <
typename T,
size_t n>
22 typedef const T* const_iterator;
24 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE iterator begin() {
return values; }
25 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const_iterator begin()
const {
return values; }
27 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE iterator end() {
return values + n; }
28 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const_iterator end()
const {
return values + n; }
30 typedef std::reverse_iterator<iterator> reverse_iterator;
31 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
33 EIGEN_STRONG_INLINE reverse_iterator rbegin() {
return reverse_iterator(end()); }
34 EIGEN_STRONG_INLINE const_reverse_iterator rbegin()
const {
return const_reverse_iterator(end()); }
36 EIGEN_STRONG_INLINE reverse_iterator rend() {
return reverse_iterator(begin()); }
37 EIGEN_STRONG_INLINE const_reverse_iterator rend()
const {
return const_reverse_iterator(begin()); }
39 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& operator[](
size_t index) {
40 eigen_internal_assert(index < size());
43 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& operator[](
size_t index)
const {
44 eigen_internal_assert(index < size());
48 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& at(
size_t index) {
49 eigen_assert(index < size());
52 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& at(
size_t index)
const {
53 eigen_assert(index < size());
57 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& front() {
return values[0]; }
58 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& front()
const {
return values[0]; }
60 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& back() {
return values[n - 1]; }
61 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& back()
const {
return values[n - 1]; }
63 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
static std::size_t size() {
return n; }
67 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array() {}
68 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v) {
69 EIGEN_STATIC_ASSERT(n == 1, YOU_MADE_A_PROGRAMMING_MISTAKE)
72 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2) {
73 EIGEN_STATIC_ASSERT(n == 2, YOU_MADE_A_PROGRAMMING_MISTAKE)
77 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3) {
78 EIGEN_STATIC_ASSERT(n == 3, YOU_MADE_A_PROGRAMMING_MISTAKE)
83 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
const T& v4) {
84 EIGEN_STATIC_ASSERT(n == 4, YOU_MADE_A_PROGRAMMING_MISTAKE)
90 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
const T& v4,
const T& v5) {
91 EIGEN_STATIC_ASSERT(n == 5, YOU_MADE_A_PROGRAMMING_MISTAKE)
98 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
const T& v4,
const T& v5,
100 EIGEN_STATIC_ASSERT(n == 6, YOU_MADE_A_PROGRAMMING_MISTAKE)
108 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
const T& v4,
const T& v5,
109 const T& v6,
const T& v7) {
110 EIGEN_STATIC_ASSERT(n == 7, YOU_MADE_A_PROGRAMMING_MISTAKE)
119 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
const T& v4,
const T& v5,
120 const T& v6,
const T& v7,
const T& v8) {
121 EIGEN_STATIC_ASSERT(n == 8, YOU_MADE_A_PROGRAMMING_MISTAKE)
132 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array(std::initializer_list<T> l) {
133 eigen_assert(l.size() == n);
134 internal::smart_copy(l.begin(), l.end(), values);
142 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& operator[](
size_t) {
143 eigen_assert(
false &&
"Can't index a zero size array");
146 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& operator[](
size_t)
const {
147 eigen_assert(
false &&
"Can't index a zero size array");
151 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& front() {
152 eigen_assert(
false &&
"Can't index a zero size array");
155 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& front()
const {
156 eigen_assert(
false &&
"Can't index a zero size array");
159 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& back() {
160 eigen_assert(
false &&
"Can't index a zero size array");
163 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& back()
const {
164 eigen_assert(
false &&
"Can't index a zero size array");
168 static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::size_t size() {
return 0; }
170 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE array() : dummy() {}
172 EIGEN_DEVICE_FUNC array(std::initializer_list<T> l) : dummy() {
173 EIGEN_UNUSED_VARIABLE(l);
174 eigen_assert(l.size() == 0);
183template <
class T, std::
size_t N>
184EIGEN_DEVICE_FUNC
bool operator==(
const array<T, N>& lhs,
const array<T, N>& rhs) {
185 for (std::size_t i = 0; i < N; ++i) {
186 if (lhs[i] != rhs[i]) {
194template <std::
size_t I_,
class T, std::
size_t N>
195EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& array_get(array<T, N>& a) {
198template <std::
size_t I_,
class T, std::
size_t N>
199EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T& array_get(
const array<T, N>& a) {
203template <
class T, std::
size_t N>
204struct array_size<array<T, N> > {
205 static constexpr Index value = N;
207template <
class T, std::
size_t N>
208struct array_size<array<T, N>&> {
209 static constexpr Index value = N;
211template <
class T, std::
size_t N>
212struct array_size<const array<T, N> > {
213 static constexpr Index value = N;
215template <
class T, std::
size_t N>
216struct array_size<const array<T, N>&> {
217 static constexpr Index value = N;
230template <
typename T, std::
size_t N>
231using array = std::array<T, N>;
242#if defined(__GLIBCXX__) && __GLIBCXX__ < 20120322
243#define STD_GET_ARR_HACK a._M_instance[I_]
244#elif defined(_LIBCPP_VERSION)
245#define STD_GET_ARR_HACK a.__elems_[I_]
247#define STD_GET_ARR_HACK std::template get<I_, T, N>(a)
250template <std::
size_t I_,
class T, std::
size_t N>
251constexpr inline T& array_get(std::array<T, N>& a) {
252 return (T&)STD_GET_ARR_HACK;
254template <std::
size_t I_,
class T, std::
size_t N>
255constexpr inline T&& array_get(std::array<T, N>&& a) {
256 return (T&&)STD_GET_ARR_HACK;
258template <std::
size_t I_,
class T, std::
size_t N>
259constexpr inline T
const& array_get(std::array<T, N>
const& a) {
260 return (T
const&)STD_GET_ARR_HACK;
263#undef STD_GET_ARR_HACK
Namespace containing all symbols from the Eigen library.
Definition Core:137