10#ifndef EIGEN_EMULATE_ARRAY_H
11#define EIGEN_EMULATE_ARRAY_H
18#if (__cplusplus <= 199711L && EIGEN_COMP_MSVC < 1900) || defined(__CUDACC__) || defined(EIGEN_AVOID_STL_ARRAY)
21template <
typename T,
size_t n>
class array {
24 EIGEN_STRONG_INLINE T& operator[] (
size_t index) {
return values[index]; }
26 EIGEN_STRONG_INLINE
const T& operator[] (
size_t index)
const {
return values[index]; }
29 EIGEN_STRONG_INLINE T& front() {
return values[0]; }
31 EIGEN_STRONG_INLINE
const T& front()
const {
return values[0]; }
34 EIGEN_STRONG_INLINE T& back() {
return values[n-1]; }
36 EIGEN_STRONG_INLINE
const T& back()
const {
return values[n-1]; }
38 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
39 static std::size_t size() {
return n; }
44 EIGEN_STRONG_INLINE array() { }
46 EIGEN_STRONG_INLINE array(
const T& v) {
47 EIGEN_STATIC_ASSERT(n==1, YOU_MADE_A_PROGRAMMING_MISTAKE)
51 EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2) {
52 EIGEN_STATIC_ASSERT(n==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
57 EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3) {
58 EIGEN_STATIC_ASSERT(n==3, YOU_MADE_A_PROGRAMMING_MISTAKE)
64 EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
66 EIGEN_STATIC_ASSERT(n==4, YOU_MADE_A_PROGRAMMING_MISTAKE)
73 EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
const T& v4,
75 EIGEN_STATIC_ASSERT(n==5, YOU_MADE_A_PROGRAMMING_MISTAKE)
83 EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
const T& v4,
84 const T& v5,
const T& v6) {
85 EIGEN_STATIC_ASSERT(n==6, YOU_MADE_A_PROGRAMMING_MISTAKE)
94 EIGEN_STRONG_INLINE array(
const T& v1,
const T& v2,
const T& v3,
const T& v4,
95 const T& v5,
const T& v6,
const T& v7) {
96 EIGEN_STATIC_ASSERT(n==7, YOU_MADE_A_PROGRAMMING_MISTAKE)
106 EIGEN_STRONG_INLINE array(
107 const T& v1,
const T& v2,
const T& v3,
const T& v4,
108 const T& v5,
const T& v6,
const T& v7,
const T& v8) {
109 EIGEN_STATIC_ASSERT(n==8, YOU_MADE_A_PROGRAMMING_MISTAKE)
120#if EIGEN_HAS_VARIADIC_TEMPLATES
122 EIGEN_STRONG_INLINE array(std::initializer_list<T> l) {
123 eigen_assert(l.size() == n);
124 internal::smart_copy(l.begin(), l.end(), values);
131template <
typename T>
class array<T, 0> {
134 EIGEN_STRONG_INLINE T& operator[] (
size_t) {
135 eigen_assert(
false &&
"Can't index a zero size array");
139 EIGEN_STRONG_INLINE
const T& operator[] (
size_t)
const {
140 eigen_assert(
false &&
"Can't index a zero size array");
145 EIGEN_STRONG_INLINE T& front() {
146 eigen_assert(
false &&
"Can't index a zero size array");
150 EIGEN_STRONG_INLINE
const T& front()
const {
151 eigen_assert(
false &&
"Can't index a zero size array");
155 EIGEN_STRONG_INLINE T& back() {
156 eigen_assert(
false &&
"Can't index a zero size array");
160 EIGEN_STRONG_INLINE
const T& back()
const {
161 eigen_assert(
false &&
"Can't index a zero size array");
165 static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::size_t size() {
return 0; }
168 EIGEN_STRONG_INLINE array() : dummy() { }
170#if EIGEN_HAS_VARIADIC_TEMPLATES
171 EIGEN_DEVICE_FUNC array(std::initializer_list<T> l) : dummy() {
172 EIGEN_ONLY_USED_FOR_DEBUG(l);
173 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]) {
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 <
typename T>
struct array_size;
205template<
class T, std::
size_t N>
struct array_size<array<T,N> > {
206 static const size_t value = N;
208template <
typename T>
struct array_size;
209template<
class T, std::
size_t N>
struct array_size<array<T,N>& > {
210 static const size_t value = N;
212template <
typename T>
struct array_size;
213template<
class T, std::
size_t N>
struct array_size<const array<T,N> > {
214 static const size_t value = N;
216template <
typename T>
struct array_size;
217template<
class T, std::
size_t N>
struct array_size<const array<T,N>& > {
218 static const size_t value = N;
230template <
typename T, std::
size_t N>
using array = std::array<T, N>;
241#if defined(__GLIBCXX__) && __GLIBCXX__ < 20120322
242#define STD_GET_ARR_HACK a._M_instance[I]
243#elif defined(_LIBCPP_VERSION)
244#define STD_GET_ARR_HACK a.__elems_[I]
246#define STD_GET_ARR_HACK std::template get<I, T, N>(a)
249template<std::
size_t I,
class T, std::
size_t N>
constexpr inline T& array_get(std::array<T,N>& a) {
return (T&) STD_GET_ARR_HACK; }
250template<std::
size_t I,
class T, std::
size_t N>
constexpr inline T&& array_get(std::array<T,N>&& a) {
return (T&&) STD_GET_ARR_HACK; }
251template<std::
size_t I,
class T, std::
size_t N>
constexpr inline T
const& array_get(std::array<T,N>
const& a) {
return (T
const&) STD_GET_ARR_HACK; }
253#undef STD_GET_ARR_HACK
255template <
typename T>
struct array_size;
256template<
class T, std::
size_t N>
struct array_size<const std::array<T,N> > {
257 static const size_t value = N;
259template <
typename T>
struct array_size;
260template<
class T, std::
size_t N>
struct array_size<std::array<T,N> > {
261 static const size_t value = N;
Namespace containing all symbols from the Eigen library.