mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-05-05 02:04:07 +08:00
Moved the array code into it's own file.
This commit is contained in:
parent
aa5f1ca714
commit
1e072424e8
@ -32,11 +32,12 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "src/Core/util/EmulateArray.h"
|
||||||
|
|
||||||
// Emulate the cxx11 functionality that we need if the compiler doesn't support it.
|
// Emulate the cxx11 functionality that we need if the compiler doesn't support it.
|
||||||
#if __cplusplus <= 199711L || defined(__CUDACC__)
|
#if __cplusplus <= 199711L
|
||||||
#include "src/Core/util/EmulateCXX11Meta.h"
|
#include "src/Core/util/EmulateCXX11Meta.h"
|
||||||
#else
|
#else
|
||||||
#include <array>
|
|
||||||
#include "src/Core/util/CXX11Workarounds.h"
|
#include "src/Core/util/CXX11Workarounds.h"
|
||||||
#include "src/Core/util/CXX11Meta.h"
|
#include "src/Core/util/CXX11Meta.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -334,7 +334,7 @@ constexpr inline Array h_array_reverse(Array arr, numeric_list<int, n...>)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, std::size_t N>
|
template<typename T, std::size_t N>
|
||||||
constexpr inline std::array<T, N> array_reverse(std::array<T, N> arr)
|
constexpr inline array<T, N> array_reverse(array<T, N> arr)
|
||||||
{
|
{
|
||||||
return h_array_reverse(arr, typename gen_numeric_list<int, N>::type());
|
return h_array_reverse(arr, typename gen_numeric_list<int, N>::type());
|
||||||
}
|
}
|
||||||
@ -349,7 +349,7 @@ constexpr inline std::array<T, N> array_reverse(std::array<T, N> arr)
|
|||||||
// an infinite loop)
|
// an infinite loop)
|
||||||
template<typename Reducer, typename T, std::size_t N, std::size_t n = N - 1>
|
template<typename Reducer, typename T, std::size_t N, std::size_t n = N - 1>
|
||||||
struct h_array_reduce {
|
struct h_array_reduce {
|
||||||
constexpr static inline auto run(std::array<T, N> arr, T identity) -> decltype(Reducer::run(h_array_reduce<Reducer, T, N, n - 1>::run(arr, identity), array_get<n>(arr)))
|
constexpr static inline auto run(array<T, N> arr, T identity) -> decltype(Reducer::run(h_array_reduce<Reducer, T, N, n - 1>::run(arr, identity), array_get<n>(arr)))
|
||||||
{
|
{
|
||||||
return Reducer::run(h_array_reduce<Reducer, T, N, n - 1>::run(arr, identity), array_get<n>(arr));
|
return Reducer::run(h_array_reduce<Reducer, T, N, n - 1>::run(arr, identity), array_get<n>(arr));
|
||||||
}
|
}
|
||||||
@ -358,7 +358,7 @@ struct h_array_reduce {
|
|||||||
template<typename Reducer, typename T, std::size_t N>
|
template<typename Reducer, typename T, std::size_t N>
|
||||||
struct h_array_reduce<Reducer, T, N, 0>
|
struct h_array_reduce<Reducer, T, N, 0>
|
||||||
{
|
{
|
||||||
constexpr static inline T run(const std::array<T, N>& arr, T)
|
constexpr static inline T run(const array<T, N>& arr, T)
|
||||||
{
|
{
|
||||||
return array_get<0>(arr);
|
return array_get<0>(arr);
|
||||||
}
|
}
|
||||||
@ -367,14 +367,14 @@ struct h_array_reduce<Reducer, T, N, 0>
|
|||||||
template<typename Reducer, typename T>
|
template<typename Reducer, typename T>
|
||||||
struct h_array_reduce<Reducer, T, 0>
|
struct h_array_reduce<Reducer, T, 0>
|
||||||
{
|
{
|
||||||
constexpr static inline T run(const std::array<T, 0>&, T identity)
|
constexpr static inline T run(const array<T, 0>&, T identity)
|
||||||
{
|
{
|
||||||
return identity;
|
return identity;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Reducer, typename T, std::size_t N>
|
template<typename Reducer, typename T, std::size_t N>
|
||||||
constexpr inline auto array_reduce(const std::array<T, N>& arr, T identity) -> decltype(h_array_reduce<Reducer, T, N>::run(arr, identity))
|
constexpr inline auto array_reduce(const array<T, N>& arr, T identity) -> decltype(h_array_reduce<Reducer, T, N>::run(arr, identity))
|
||||||
{
|
{
|
||||||
return h_array_reduce<Reducer, T, N>::run(arr, identity);
|
return h_array_reduce<Reducer, T, N>::run(arr, identity);
|
||||||
}
|
}
|
||||||
@ -382,13 +382,13 @@ constexpr inline auto array_reduce(const std::array<T, N>& arr, T identity) -> d
|
|||||||
/* standard array reductions */
|
/* standard array reductions */
|
||||||
|
|
||||||
template<typename T, std::size_t N>
|
template<typename T, std::size_t N>
|
||||||
constexpr inline auto array_sum(const std::array<T, N>& arr) -> decltype(array_reduce<sum_op, T, N>(arr, static_cast<T>(0)))
|
constexpr inline auto array_sum(const array<T, N>& arr) -> decltype(array_reduce<sum_op, T, N>(arr, static_cast<T>(0)))
|
||||||
{
|
{
|
||||||
return array_reduce<sum_op, T, N>(arr, static_cast<T>(0));
|
return array_reduce<sum_op, T, N>(arr, static_cast<T>(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, std::size_t N>
|
template<typename T, std::size_t N>
|
||||||
constexpr inline auto array_prod(const std::array<T, N>& arr) -> decltype(array_reduce<product_op, T, N>(arr, static_cast<T>(1)))
|
constexpr inline auto array_prod(const array<T, N>& arr) -> decltype(array_reduce<product_op, T, N>(arr, static_cast<T>(1)))
|
||||||
{
|
{
|
||||||
return array_reduce<product_op, T, N>(arr, static_cast<T>(1));
|
return array_reduce<product_op, T, N>(arr, static_cast<T>(1));
|
||||||
}
|
}
|
||||||
@ -404,13 +404,13 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE t array_prod(const std::vector<t>& a) {
|
|||||||
/* zip an array */
|
/* zip an array */
|
||||||
|
|
||||||
template<typename Op, typename A, typename B, std::size_t N, int... n>
|
template<typename Op, typename A, typename B, std::size_t N, int... n>
|
||||||
constexpr inline std::array<decltype(Op::run(A(), B())),N> h_array_zip(std::array<A, N> a, std::array<B, N> b, numeric_list<int, n...>)
|
constexpr inline array<decltype(Op::run(A(), B())),N> h_array_zip(array<A, N> a, array<B, N> b, numeric_list<int, n...>)
|
||||||
{
|
{
|
||||||
return std::array<decltype(Op::run(A(), B())),N>{{ Op::run(array_get<n>(a), array_get<n>(b))... }};
|
return array<decltype(Op::run(A(), B())),N>{{ Op::run(array_get<n>(a), array_get<n>(b))... }};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Op, typename A, typename B, std::size_t N>
|
template<typename Op, typename A, typename B, std::size_t N>
|
||||||
constexpr inline std::array<decltype(Op::run(A(), B())),N> array_zip(std::array<A, N> a, std::array<B, N> b)
|
constexpr inline array<decltype(Op::run(A(), B())),N> array_zip(array<A, N> a, array<B, N> b)
|
||||||
{
|
{
|
||||||
return h_array_zip<Op>(a, b, typename gen_numeric_list<int, N>::type());
|
return h_array_zip<Op>(a, b, typename gen_numeric_list<int, N>::type());
|
||||||
}
|
}
|
||||||
@ -418,13 +418,13 @@ constexpr inline std::array<decltype(Op::run(A(), B())),N> array_zip(std::array<
|
|||||||
/* zip an array and reduce the result */
|
/* zip an array and reduce the result */
|
||||||
|
|
||||||
template<typename Reducer, typename Op, typename A, typename B, std::size_t N, int... n>
|
template<typename Reducer, typename Op, typename A, typename B, std::size_t N, int... n>
|
||||||
constexpr inline auto h_array_zip_and_reduce(std::array<A, N> a, std::array<B, N> b, numeric_list<int, n...>) -> decltype(reduce<Reducer, typename id_numeric<int,n,decltype(Op::run(A(), B()))>::type...>::run(Op::run(array_get<n>(a), array_get<n>(b))...))
|
constexpr inline auto h_array_zip_and_reduce(array<A, N> a, array<B, N> b, numeric_list<int, n...>) -> decltype(reduce<Reducer, typename id_numeric<int,n,decltype(Op::run(A(), B()))>::type...>::run(Op::run(array_get<n>(a), array_get<n>(b))...))
|
||||||
{
|
{
|
||||||
return reduce<Reducer, typename id_numeric<int,n,decltype(Op::run(A(), B()))>::type...>::run(Op::run(array_get<n>(a), array_get<n>(b))...);
|
return reduce<Reducer, typename id_numeric<int,n,decltype(Op::run(A(), B()))>::type...>::run(Op::run(array_get<n>(a), array_get<n>(b))...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Reducer, typename Op, typename A, typename B, std::size_t N>
|
template<typename Reducer, typename Op, typename A, typename B, std::size_t N>
|
||||||
constexpr inline auto array_zip_and_reduce(std::array<A, N> a, std::array<B, N> b) -> decltype(h_array_zip_and_reduce<Reducer, Op, A, B, N>(a, b, typename gen_numeric_list<int, N>::type()))
|
constexpr inline auto array_zip_and_reduce(array<A, N> a, array<B, N> b) -> decltype(h_array_zip_and_reduce<Reducer, Op, A, B, N>(a, b, typename gen_numeric_list<int, N>::type()))
|
||||||
{
|
{
|
||||||
return h_array_zip_and_reduce<Reducer, Op, A, B, N>(a, b, typename gen_numeric_list<int, N>::type());
|
return h_array_zip_and_reduce<Reducer, Op, A, B, N>(a, b, typename gen_numeric_list<int, N>::type());
|
||||||
}
|
}
|
||||||
@ -432,13 +432,13 @@ constexpr inline auto array_zip_and_reduce(std::array<A, N> a, std::array<B, N>
|
|||||||
/* apply stuff to an array */
|
/* apply stuff to an array */
|
||||||
|
|
||||||
template<typename Op, typename A, std::size_t N, int... n>
|
template<typename Op, typename A, std::size_t N, int... n>
|
||||||
constexpr inline std::array<decltype(Op::run(A())),N> h_array_apply(std::array<A, N> a, numeric_list<int, n...>)
|
constexpr inline array<decltype(Op::run(A())),N> h_array_apply(array<A, N> a, numeric_list<int, n...>)
|
||||||
{
|
{
|
||||||
return std::array<decltype(Op::run(A())),N>{{ Op::run(array_get<n>(a))... }};
|
return array<decltype(Op::run(A())),N>{{ Op::run(array_get<n>(a))... }};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Op, typename A, std::size_t N>
|
template<typename Op, typename A, std::size_t N>
|
||||||
constexpr inline std::array<decltype(Op::run(A())),N> array_apply(std::array<A, N> a)
|
constexpr inline array<decltype(Op::run(A())),N> array_apply(array<A, N> a)
|
||||||
{
|
{
|
||||||
return h_array_apply<Op>(a, typename gen_numeric_list<int, N>::type());
|
return h_array_apply<Op>(a, typename gen_numeric_list<int, N>::type());
|
||||||
}
|
}
|
||||||
@ -446,34 +446,34 @@ constexpr inline std::array<decltype(Op::run(A())),N> array_apply(std::array<A,
|
|||||||
/* apply stuff to an array and reduce */
|
/* apply stuff to an array and reduce */
|
||||||
|
|
||||||
template<typename Reducer, typename Op, typename A, std::size_t N, int... n>
|
template<typename Reducer, typename Op, typename A, std::size_t N, int... n>
|
||||||
constexpr inline auto h_array_apply_and_reduce(std::array<A, N> arr, numeric_list<int, n...>) -> decltype(reduce<Reducer, typename id_numeric<int,n,decltype(Op::run(A()))>::type...>::run(Op::run(array_get<n>(arr))...))
|
constexpr inline auto h_array_apply_and_reduce(array<A, N> arr, numeric_list<int, n...>) -> decltype(reduce<Reducer, typename id_numeric<int,n,decltype(Op::run(A()))>::type...>::run(Op::run(array_get<n>(arr))...))
|
||||||
{
|
{
|
||||||
return reduce<Reducer, typename id_numeric<int,n,decltype(Op::run(A()))>::type...>::run(Op::run(array_get<n>(arr))...);
|
return reduce<Reducer, typename id_numeric<int,n,decltype(Op::run(A()))>::type...>::run(Op::run(array_get<n>(arr))...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Reducer, typename Op, typename A, std::size_t N>
|
template<typename Reducer, typename Op, typename A, std::size_t N>
|
||||||
constexpr inline auto array_apply_and_reduce(std::array<A, N> a) -> decltype(h_array_apply_and_reduce<Reducer, Op, A, N>(a, typename gen_numeric_list<int, N>::type()))
|
constexpr inline auto array_apply_and_reduce(array<A, N> a) -> decltype(h_array_apply_and_reduce<Reducer, Op, A, N>(a, typename gen_numeric_list<int, N>::type()))
|
||||||
{
|
{
|
||||||
return h_array_apply_and_reduce<Reducer, Op, A, N>(a, typename gen_numeric_list<int, N>::type());
|
return h_array_apply_and_reduce<Reducer, Op, A, N>(a, typename gen_numeric_list<int, N>::type());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* repeat a value n times (and make an array out of it
|
/* repeat a value n times (and make an array out of it
|
||||||
* usage:
|
* usage:
|
||||||
* std::array<int, 16> = repeat<16>(42);
|
* array<int, 16> = repeat<16>(42);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
template<int n>
|
template<int n>
|
||||||
struct h_repeat
|
struct h_repeat
|
||||||
{
|
{
|
||||||
template<typename t, int... ii>
|
template<typename t, int... ii>
|
||||||
constexpr static inline std::array<t, n> run(t v, numeric_list<int, ii...>)
|
constexpr static inline array<t, n> run(t v, numeric_list<int, ii...>)
|
||||||
{
|
{
|
||||||
return {{ typename id_numeric<int, ii, t>::type(v)... }};
|
return {{ typename id_numeric<int, ii, t>::type(v)... }};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<int n, typename t>
|
template<int n, typename t>
|
||||||
constexpr std::array<t, n> repeat(t v) { return h_repeat<n>::run(v, typename gen_numeric_list<int, n>::type()); }
|
constexpr array<t, n> repeat(t v) { return h_repeat<n>::run(v, typename gen_numeric_list<int, n>::type()); }
|
||||||
|
|
||||||
/* instantiate a class by a C-style array */
|
/* instantiate a class by a C-style array */
|
||||||
template<class InstType, typename ArrType, std::size_t N, bool Reverse, typename... Ps>
|
template<class InstType, typename ArrType, std::size_t N, bool Reverse, typename... Ps>
|
||||||
|
@ -39,46 +39,16 @@
|
|||||||
|
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
|
|
||||||
// Use std::array as Eigen array
|
|
||||||
template <typename T, std::size_t N> using array = std::array<T, N>;
|
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
/* std::get is only constexpr in C++14, not yet in C++11
|
/* std::get is only constexpr in C++14, not yet in C++11
|
||||||
* - libstdc++ from version 4.7 onwards has it nevertheless,
|
|
||||||
* so use that
|
|
||||||
* - libstdc++ older versions: use _M_instance directly
|
|
||||||
* - libc++ all versions so far: use __elems_ directly
|
|
||||||
* - all other libs: use std::get to be portable, but
|
|
||||||
* this may not be constexpr
|
|
||||||
*/
|
*/
|
||||||
#if defined(__GLIBCXX__) && __GLIBCXX__ < 20120322
|
|
||||||
#define STD_GET_ARR_HACK a._M_instance[I]
|
|
||||||
#elif defined(_LIBCPP_VERSION)
|
|
||||||
#define STD_GET_ARR_HACK a.__elems_[I]
|
|
||||||
#else
|
|
||||||
#define STD_GET_ARR_HACK std::template get<I, T, N>(a)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template<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; }
|
|
||||||
template<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; }
|
|
||||||
template<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; }
|
|
||||||
|
|
||||||
template<std::size_t I, class T> constexpr inline T& array_get(std::vector<T>& a) { return a[I]; }
|
template<std::size_t I, class T> constexpr inline T& array_get(std::vector<T>& a) { return a[I]; }
|
||||||
template<std::size_t I, class T> constexpr inline T&& array_get(std::vector<T>&& a) { return a[I]; }
|
template<std::size_t I, class T> constexpr inline T&& array_get(std::vector<T>&& a) { return a[I]; }
|
||||||
template<std::size_t I, class T> constexpr inline T const& array_get(std::vector<T> const& a) { return a[I]; }
|
template<std::size_t I, class T> constexpr inline T const& array_get(std::vector<T> const& a) { return a[I]; }
|
||||||
|
|
||||||
#undef STD_GET_ARR_HACK
|
|
||||||
|
|
||||||
template <typename T> struct array_size;
|
|
||||||
template<class T, std::size_t N> struct array_size<const std::array<T,N> > {
|
|
||||||
static const size_t value = N;
|
|
||||||
};
|
|
||||||
template <typename T> struct array_size;
|
|
||||||
template<class T, std::size_t N> struct array_size<std::array<T,N> > {
|
|
||||||
static const size_t value = N;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Suppose you have a template of the form
|
/* Suppose you have a template of the form
|
||||||
* template<typename T> struct X;
|
* template<typename T> struct X;
|
||||||
* And you want to specialize it in such a way:
|
* And you want to specialize it in such a way:
|
||||||
|
221
unsupported/Eigen/CXX11/src/Core/util/EmulateArray.h
Normal file
221
unsupported/Eigen/CXX11/src/Core/util/EmulateArray.h
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
// This file is part of Eigen, a lightweight C++ template library
|
||||||
|
// for linear algebra.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
|
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
#ifndef EIGEN_EMULATE_ARRAY_H
|
||||||
|
#define EIGEN_EMULATE_ARRAY_H
|
||||||
|
|
||||||
|
|
||||||
|
namespace Eigen {
|
||||||
|
|
||||||
|
// The array class is only available starting with cxx11. Emulate our own here
|
||||||
|
// if needed.
|
||||||
|
// Moreover, CUDA doesn't support the STL containers, so we use our own instead.
|
||||||
|
#if __cplusplus <= 199711L || defined(__CUDACC__)
|
||||||
|
|
||||||
|
template <typename T, size_t n> class array {
|
||||||
|
public:
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE T& operator[] (size_t index) { return values[index]; }
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE const T& operator[] (size_t index) const { return values[index]; }
|
||||||
|
|
||||||
|
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
|
||||||
|
static std::size_t size() { return n; }
|
||||||
|
|
||||||
|
T values[n];
|
||||||
|
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE array() { }
|
||||||
|
explicit EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE array(const T& v) {
|
||||||
|
EIGEN_STATIC_ASSERT(n==1, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
||||||
|
values[0] = v;
|
||||||
|
}
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE array(const T& v1, const T& v2) {
|
||||||
|
EIGEN_STATIC_ASSERT(n==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
||||||
|
values[0] = v1;
|
||||||
|
values[1] = v2;
|
||||||
|
}
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3) {
|
||||||
|
EIGEN_STATIC_ASSERT(n==3, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
||||||
|
values[0] = v1;
|
||||||
|
values[1] = v2;
|
||||||
|
values[2] = v3;
|
||||||
|
}
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3,
|
||||||
|
const T& v4) {
|
||||||
|
EIGEN_STATIC_ASSERT(n==4, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
||||||
|
values[0] = v1;
|
||||||
|
values[1] = v2;
|
||||||
|
values[2] = v3;
|
||||||
|
values[3] = v4;
|
||||||
|
}
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4,
|
||||||
|
const T& v5) {
|
||||||
|
EIGEN_STATIC_ASSERT(n==5, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
||||||
|
values[0] = v1;
|
||||||
|
values[1] = v2;
|
||||||
|
values[2] = v3;
|
||||||
|
values[3] = v4;
|
||||||
|
values[4] = v5;
|
||||||
|
}
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4,
|
||||||
|
const T& v5, const T& v6) {
|
||||||
|
EIGEN_STATIC_ASSERT(n==6, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
||||||
|
values[0] = v1;
|
||||||
|
values[1] = v2;
|
||||||
|
values[2] = v3;
|
||||||
|
values[3] = v4;
|
||||||
|
values[4] = v5;
|
||||||
|
values[5] = v6;
|
||||||
|
}
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4,
|
||||||
|
const T& v5, const T& v6, const T& v7) {
|
||||||
|
EIGEN_STATIC_ASSERT(n==7, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
||||||
|
values[0] = v1;
|
||||||
|
values[1] = v2;
|
||||||
|
values[2] = v3;
|
||||||
|
values[3] = v4;
|
||||||
|
values[4] = v5;
|
||||||
|
values[5] = v6;
|
||||||
|
values[6] = v7;
|
||||||
|
}
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE array(
|
||||||
|
const T& v1, const T& v2, const T& v3, const T& v4,
|
||||||
|
const T& v5, const T& v6, const T& v7, const T& v8) {
|
||||||
|
EIGEN_STATIC_ASSERT(n==8, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
||||||
|
values[0] = v1;
|
||||||
|
values[1] = v2;
|
||||||
|
values[2] = v3;
|
||||||
|
values[3] = v4;
|
||||||
|
values[4] = v5;
|
||||||
|
values[5] = v6;
|
||||||
|
values[6] = v7;
|
||||||
|
values[7] = v8;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef EIGEN_HAS_VARIADIC_TEMPLATES
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE array(std::initializer_list<T> l) {
|
||||||
|
eigen_assert(l.size() == n);
|
||||||
|
internal::smart_copy(l.begin(), l.end(), values);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Specialize array for zero size
|
||||||
|
template <typename T> class array<T, 0> {
|
||||||
|
public:
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE T& operator[] (size_t) {
|
||||||
|
eigen_assert(false && "Can't index a zero size array");
|
||||||
|
return *static_cast<T*>(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE const T& operator[] (size_t) const {
|
||||||
|
eigen_assert(false && "Can't index a zero size array");
|
||||||
|
return *static_cast<const T*>(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static EIGEN_ALWAYS_INLINE std::size_t size() { return 0; }
|
||||||
|
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE array() { }
|
||||||
|
|
||||||
|
#ifdef EIGEN_HAS_VARIADIC_TEMPLATES
|
||||||
|
array(std::initializer_list<T> l) {
|
||||||
|
eigen_assert(l.size() == 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
template<std::size_t I, class T, std::size_t N>
|
||||||
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& array_get(array<T,N>& a) {
|
||||||
|
return a[I];
|
||||||
|
}
|
||||||
|
template<std::size_t I, class T, std::size_t N>
|
||||||
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& array_get(const array<T,N>& a) {
|
||||||
|
return a[I];
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T> struct array_size;
|
||||||
|
template<class T, std::size_t N> struct array_size<array<T,N> > {
|
||||||
|
static const size_t value = N;
|
||||||
|
};
|
||||||
|
template <typename T> struct array_size;
|
||||||
|
template<class T, std::size_t N> struct array_size<array<T,N>& > {
|
||||||
|
static const size_t value = N;
|
||||||
|
};
|
||||||
|
template <typename T> struct array_size;
|
||||||
|
template<class T, std::size_t N> struct array_size<const array<T,N> > {
|
||||||
|
static const size_t value = N;
|
||||||
|
};
|
||||||
|
template <typename T> struct array_size;
|
||||||
|
template<class T, std::size_t N> struct array_size<const array<T,N>& > {
|
||||||
|
static const size_t value = N;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
#include <array>
|
||||||
|
// The compiler supports c++11, and we're not targetting cuda: use std::array as Eigen array
|
||||||
|
template <typename T, std::size_t N> using array = std::array<T, N>;
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
/* std::get is only constexpr in C++14, not yet in C++11
|
||||||
|
* - libstdc++ from version 4.7 onwards has it nevertheless,
|
||||||
|
* so use that
|
||||||
|
* - libstdc++ older versions: use _M_instance directly
|
||||||
|
* - libc++ all versions so far: use __elems_ directly
|
||||||
|
* - all other libs: use std::get to be portable, but
|
||||||
|
* this may not be constexpr
|
||||||
|
*/
|
||||||
|
#if defined(__GLIBCXX__) && __GLIBCXX__ < 20120322
|
||||||
|
#define STD_GET_ARR_HACK a._M_instance[I]
|
||||||
|
#elif defined(_LIBCPP_VERSION)
|
||||||
|
#define STD_GET_ARR_HACK a.__elems_[I]
|
||||||
|
#else
|
||||||
|
#define STD_GET_ARR_HACK std::template get<I, T, N>(a)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template<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; }
|
||||||
|
template<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; }
|
||||||
|
template<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; }
|
||||||
|
|
||||||
|
#undef STD_GET_ARR_HACK
|
||||||
|
|
||||||
|
template <typename T> struct array_size;
|
||||||
|
template<class T, std::size_t N> struct array_size<const std::array<T,N> > {
|
||||||
|
static const size_t value = N;
|
||||||
|
};
|
||||||
|
template <typename T> struct array_size;
|
||||||
|
template<class T, std::size_t N> struct array_size<std::array<T,N> > {
|
||||||
|
static const size_t value = N;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
} // end namespace Eigen
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // EIGEN_EMULATE_ARRAY_H
|
@ -14,136 +14,6 @@
|
|||||||
|
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
|
|
||||||
// The array class is only available starting with cxx11. Emulate our own here
|
|
||||||
// if needed
|
|
||||||
template <typename T, size_t n> class array {
|
|
||||||
public:
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE T& operator[] (size_t index) { return values[index]; }
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE const T& operator[] (size_t index) const { return values[index]; }
|
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
|
|
||||||
static std::size_t size() { return n; }
|
|
||||||
|
|
||||||
T values[n];
|
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE array() { }
|
|
||||||
explicit EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE array(const T& v) {
|
|
||||||
EIGEN_STATIC_ASSERT(n==1, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
|
||||||
values[0] = v;
|
|
||||||
}
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE array(const T& v1, const T& v2) {
|
|
||||||
EIGEN_STATIC_ASSERT(n==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
|
||||||
values[0] = v1;
|
|
||||||
values[1] = v2;
|
|
||||||
}
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3) {
|
|
||||||
EIGEN_STATIC_ASSERT(n==3, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
|
||||||
values[0] = v1;
|
|
||||||
values[1] = v2;
|
|
||||||
values[2] = v3;
|
|
||||||
}
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3,
|
|
||||||
const T& v4) {
|
|
||||||
EIGEN_STATIC_ASSERT(n==4, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
|
||||||
values[0] = v1;
|
|
||||||
values[1] = v2;
|
|
||||||
values[2] = v3;
|
|
||||||
values[3] = v4;
|
|
||||||
}
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4,
|
|
||||||
const T& v5) {
|
|
||||||
EIGEN_STATIC_ASSERT(n==5, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
|
||||||
values[0] = v1;
|
|
||||||
values[1] = v2;
|
|
||||||
values[2] = v3;
|
|
||||||
values[3] = v4;
|
|
||||||
values[4] = v5;
|
|
||||||
}
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4,
|
|
||||||
const T& v5, const T& v6) {
|
|
||||||
EIGEN_STATIC_ASSERT(n==6, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
|
||||||
values[0] = v1;
|
|
||||||
values[1] = v2;
|
|
||||||
values[2] = v3;
|
|
||||||
values[3] = v4;
|
|
||||||
values[4] = v5;
|
|
||||||
values[5] = v6;
|
|
||||||
}
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE array(const T& v1, const T& v2, const T& v3, const T& v4,
|
|
||||||
const T& v5, const T& v6, const T& v7) {
|
|
||||||
EIGEN_STATIC_ASSERT(n==7, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
|
||||||
values[0] = v1;
|
|
||||||
values[1] = v2;
|
|
||||||
values[2] = v3;
|
|
||||||
values[3] = v4;
|
|
||||||
values[4] = v5;
|
|
||||||
values[5] = v6;
|
|
||||||
values[6] = v7;
|
|
||||||
}
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE array(
|
|
||||||
const T& v1, const T& v2, const T& v3, const T& v4,
|
|
||||||
const T& v5, const T& v6, const T& v7, const T& v8) {
|
|
||||||
EIGEN_STATIC_ASSERT(n==8, YOU_MADE_A_PROGRAMMING_MISTAKE)
|
|
||||||
values[0] = v1;
|
|
||||||
values[1] = v2;
|
|
||||||
values[2] = v3;
|
|
||||||
values[3] = v4;
|
|
||||||
values[4] = v5;
|
|
||||||
values[5] = v6;
|
|
||||||
values[6] = v7;
|
|
||||||
values[7] = v8;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef EIGEN_HAS_VARIADIC_TEMPLATES
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE array(std::initializer_list<T> l) {
|
|
||||||
eigen_assert(l.size() == n);
|
|
||||||
internal::smart_copy(l.begin(), l.end(), values);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Specialize array for zero size
|
|
||||||
template <typename T> class array<T, 0> {
|
|
||||||
public:
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE T& operator[] (size_t) {
|
|
||||||
eigen_assert(false && "Can't index a zero size array");
|
|
||||||
return *static_cast<T*>(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE const T& operator[] (size_t) const {
|
|
||||||
eigen_assert(false && "Can't index a zero size array");
|
|
||||||
return *static_cast<const T*>(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static EIGEN_ALWAYS_INLINE std::size_t size() { return 0; }
|
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC
|
|
||||||
EIGEN_STRONG_INLINE array() { }
|
|
||||||
|
|
||||||
#ifdef EIGEN_HAS_VARIADIC_TEMPLATES
|
|
||||||
array(std::initializer_list<T> l) {
|
|
||||||
eigen_assert(l.size() == 0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
/** \internal
|
/** \internal
|
||||||
@ -329,14 +199,6 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE t array_prod(const std::vector<t>& a) {
|
|||||||
return prod;
|
return prod;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<std::size_t I, class T, std::size_t N>
|
|
||||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& array_get(array<T,N>& a) {
|
|
||||||
return a[I];
|
|
||||||
}
|
|
||||||
template<std::size_t I, class T, std::size_t N>
|
|
||||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& array_get(const array<T,N>& a) {
|
|
||||||
return a[I];
|
|
||||||
}
|
|
||||||
|
|
||||||
template<std::size_t I, class T>
|
template<std::size_t I, class T>
|
||||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& array_get(std::vector<T>& a) {
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T& array_get(std::vector<T>& a) {
|
||||||
@ -347,23 +209,6 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T& array_get(const std::vector<T>& a
|
|||||||
return a[I];
|
return a[I];
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> struct array_size;
|
|
||||||
template<class T, std::size_t N> struct array_size<array<T,N> > {
|
|
||||||
static const size_t value = N;
|
|
||||||
};
|
|
||||||
template <typename T> struct array_size;
|
|
||||||
template<class T, std::size_t N> struct array_size<array<T,N>& > {
|
|
||||||
static const size_t value = N;
|
|
||||||
};
|
|
||||||
template <typename T> struct array_size;
|
|
||||||
template<class T, std::size_t N> struct array_size<const array<T,N> > {
|
|
||||||
static const size_t value = N;
|
|
||||||
};
|
|
||||||
template <typename T> struct array_size;
|
|
||||||
template<class T, std::size_t N> struct array_size<const array<T,N>& > {
|
|
||||||
static const size_t value = N;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sum_op {
|
struct sum_op {
|
||||||
template<typename A, typename B> static inline bool run(A a, B b) { return a + b; }
|
template<typename A, typename B> static inline bool run(A a, B b) { return a + b; }
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user