10 #ifndef EIGEN_CXX11_TENSOR_TENSOR_DIMENSIONS_H 11 #define EIGEN_CXX11_TENSOR_TENSOR_DIMENSIONS_H 35 template<std::
size_t n,
typename Dimension>
struct dget {
40 template<
typename Index, std::
size_t NumIndices, std::
size_t n,
bool RowMajor>
43 template <
typename Dimensions> EIGEN_DEVICE_FUNC
45 const Dimensions& dimensions)
47 return array_get<
RowMajor ? n - 1 : (NumIndices - n)>(indices) +
48 dget<
RowMajor ? n - 1 : (NumIndices - n), Dimensions>::value *
53 template<
typename Index, std::
size_t NumIndices,
bool RowMajor>
56 template <
typename Dimensions> EIGEN_DEVICE_FUNC
63 template<
typename Index, std::
size_t n>
66 template <
typename Dimensions> EIGEN_DEVICE_FUNC
68 const Dimensions& dimensions)
70 const Index mult = (index == n-1) ? 1 : 0;
71 return array_get<n-1>(dimensions) * mult +
76 template<
typename Index>
79 template <
typename Dimensions> EIGEN_DEVICE_FUNC
91 #ifndef EIGEN_EMULATE_CXX11_META_H 92 template <
typename std::ptrdiff_t... Indices>
93 struct Sizes : internal::numeric_list<std::ptrdiff_t, Indices...> {
94 typedef internal::numeric_list<std::ptrdiff_t, Indices...> Base;
97 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t rank()
const {
101 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t TotalSize() {
105 EIGEN_DEVICE_FUNC
Sizes() { }
106 template <
typename DenseIndex>
110 #if EIGEN_HAS_VARIADIC_TEMPLATES 111 template <
typename... DenseIndex> EIGEN_DEVICE_FUNC
Sizes(DenseIndex...) { }
112 explicit EIGEN_DEVICE_FUNC
Sizes(std::initializer_list<std::ptrdiff_t> ) {
117 template <
typename T>
Sizes& operator = (
const T& ) {
122 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t operator[] (
const std::size_t index)
const {
126 template <
typename DenseIndex> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
130 template <
typename DenseIndex> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
137 template <
typename std::ptrdiff_t... Indices>
138 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_prod(
const Sizes<Indices...>&) {
139 return Sizes<Indices...>::total_size;
145 template <std::
size_t n>
146 struct non_zero_size {
150 struct non_zero_size<0> {
154 template <std::
size_t V1=0, std::
size_t V2=0, std::
size_t V3=0, std::
size_t V4=0, std::
size_t V5=0>
struct Sizes {
156 static const size_t count = Base::count;
159 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
size_t rank()
const {
163 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
size_t TotalSize() {
168 template <
typename DenseIndex>
172 template <
typename T>
Sizes& operator = (
const T& ) {
177 #if EIGEN_HAS_VARIADIC_TEMPLATES 178 template <
typename... DenseIndex>
Sizes(DenseIndex... ) { }
179 explicit Sizes(std::initializer_list<std::size_t>) {
183 EIGEN_DEVICE_FUNC
explicit Sizes(
const DenseIndex) {
185 EIGEN_DEVICE_FUNC
Sizes(
const DenseIndex,
const DenseIndex) {
187 EIGEN_DEVICE_FUNC
Sizes(
const DenseIndex,
const DenseIndex,
const DenseIndex) {
189 EIGEN_DEVICE_FUNC
Sizes(
const DenseIndex,
const DenseIndex,
const DenseIndex,
const DenseIndex) {
191 EIGEN_DEVICE_FUNC
Sizes(
const DenseIndex,
const DenseIndex,
const DenseIndex,
const DenseIndex,
const DenseIndex) {
195 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex operator[] (
const int index)
const {
208 eigen_assert(
false &&
"index overflow");
209 return static_cast<DenseIndex
>(-1);
213 template <
typename DenseIndex> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
217 template <
typename DenseIndex> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
224 template <std::
size_t V1, std::
size_t V2, std::
size_t V3, std::
size_t V4, std::
size_t V5>
234 template<
typename Index, std::
size_t NumIndices, std::
size_t n,
bool RowMajor>
237 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
240 return array_get<
RowMajor ? n : (NumIndices - n - 1)>(indices) +
241 array_get<
RowMajor ? n : (NumIndices - n - 1)>(dimensions) *
246 template<
typename Index, std::
size_t NumIndices,
bool RowMajor>
249 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
252 return array_get<
RowMajor ? 0 : NumIndices - 1>(indices);
260 template <
typename DenseIndex,
int NumDims>
263 static const int count = NumDims;
265 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
size_t rank()
const {
269 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex TotalSize()
const {
270 return (NumDims == 0) ? 1 : internal::array_prod(*static_cast<const Base*>(
this));
273 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
DSizes() {
274 for (
int i = 0 ; i < NumDims; ++i) {
280 EIGEN_DEVICE_FUNC
explicit DSizes(
const DenseIndex i0) {
281 eigen_assert(NumDims == 1);
285 #if EIGEN_HAS_VARIADIC_TEMPLATES 286 template<
typename... IndexTypes> EIGEN_DEVICE_FUNC
287 EIGEN_STRONG_INLINE
explicit DSizes(DenseIndex firstDimension, DenseIndex secondDimension, IndexTypes... otherDimensions) : Base({{firstDimension, secondDimension, otherDimensions...}}) {
288 EIGEN_STATIC_ASSERT(
sizeof...(otherDimensions) + 2 == NumDims, YOU_MADE_A_PROGRAMMING_MISTAKE)
291 EIGEN_DEVICE_FUNC DSizes(
const DenseIndex i0,
const DenseIndex i1) {
292 eigen_assert(NumDims == 2);
296 EIGEN_DEVICE_FUNC DSizes(
const DenseIndex i0,
const DenseIndex i1,
const DenseIndex i2) {
297 eigen_assert(NumDims == 3);
302 EIGEN_DEVICE_FUNC DSizes(
const DenseIndex i0,
const DenseIndex i1,
const DenseIndex i2,
const DenseIndex i3) {
303 eigen_assert(NumDims == 4);
309 EIGEN_DEVICE_FUNC DSizes(
const DenseIndex i0,
const DenseIndex i1,
const DenseIndex i2,
const DenseIndex i3,
const DenseIndex i4) {
310 eigen_assert(NumDims == 5);
320 *
static_cast<Base*
>(
this) = other;
338 template<
typename Index, std::
size_t NumIndices, std::
size_t n,
bool RowMajor>
341 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
344 return array_get<
RowMajor ? n : (NumIndices - n - 1)>(indices) +
345 array_get<
RowMajor ? n : (NumIndices - n - 1)>(dimensions) *
350 template<
typename Index, std::
size_t NumIndices,
bool RowMajor>
353 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
356 return array_get<
RowMajor ? 0 : NumIndices - 1>(indices);
364 template <
typename DenseIndex,
int NumDims>
struct array_size<const
DSizes<DenseIndex, NumDims> > {
365 static const size_t value = NumDims;
367 template <
typename DenseIndex,
int NumDims>
struct array_size<
DSizes<DenseIndex, NumDims> > {
368 static const size_t value = NumDims;
370 #ifndef EIGEN_EMULATE_CXX11_META_H 371 template <
typename std::ptrdiff_t... Indices>
struct array_size<const
Sizes<Indices...> > {
372 static const std::ptrdiff_t value =
Sizes<Indices...>::count;
375 static const std::ptrdiff_t value =
Sizes<Indices...>::count;
377 template <std::ptrdiff_t n,
typename std::ptrdiff_t... Indices> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_get(
const Sizes<Indices...>&) {
378 return get<n, internal::numeric_list<std::size_t, Indices...> >::value;
380 template <std::ptrdiff_t n> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::ptrdiff_t array_get(
const Sizes<>&) {
381 eigen_assert(
false &&
"should never be called");
385 template <std::
size_t V1, std::
size_t V2, std::
size_t V3, std::
size_t V4, std::
size_t V5>
struct array_size<const Sizes<V1,V2,V3,V4,V5> > {
388 template <std::
size_t V1, std::
size_t V2, std::
size_t V3, std::
size_t V4, std::
size_t V5>
struct array_size<Sizes<V1,V2,V3,V4,V5> > {
391 template <std::
size_t n, std::
size_t V1, std::
size_t V2, std::
size_t V3, std::
size_t V4, std::
size_t V5> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::size_t array_get(
const Sizes<V1,V2,V3,V4,V5>&) {
398 template <
typename Dims1,
typename Dims2,
size_t n,
size_t m>
400 static EIGEN_DEVICE_FUNC
inline bool run(Dims1&, Dims2&) {
404 template <
typename Dims1,
typename Dims2,
size_t n>
406 static EIGEN_DEVICE_FUNC
inline bool run(Dims1& dims1, Dims2& dims2) {
407 return (array_get<n-1>(dims1) == array_get<n-1>(dims2)) &
411 template <
typename Dims1,
typename Dims2>
413 static EIGEN_DEVICE_FUNC
inline bool run(Dims1&, Dims2&) {
421 template <
typename Dims1,
typename Dims2>
422 EIGEN_DEVICE_FUNC
bool dimensions_match(Dims1& dims1, Dims2& dims2) {
428 #endif // EIGEN_CXX11_TENSOR_TENSOR_DIMENSIONS_H
Definition: TensorDimensions.h:261
Definition: EmulateCXX11Meta.h:35
Definition: TensorDimensions.h:235
Definition: EmulateCXX11Meta.h:40
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:85
Definition: EmulateCXX11Meta.h:114
Definition: TensorDimensions.h:339
Definition: TensorDimensions.h:93
Definition: TensorDimensions.h:35
Definition: EmulateCXX11Meta.h:154
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:33
Definition: TensorDimensions.h:399
Definition: EmulateArray.h:21
Definition: BandTriangularSolver.h:13
Storage order is row major (see TopicStorageOrders).
Definition: Constants.h:322
Definition: TensorDimensions.h:41
Definition: EmulateCXX11Meta.h:68
Definition: EmulateArray.h:203