1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2015 Benoit Steiner <benoit.steiner.goog@gmail.com>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#include "main.h"
11#include <limits>
12#include <map>
13
14#include <Eigen/Dense>
15#include <Eigen/CXX11/Tensor>
16
17using Eigen::Tensor;
18
19
20template <int DataLayout>
21static void test_map_as_index()
22{
23#ifdef EIGEN_HAS_SFINAE
24  Tensor<float, 4, DataLayout> tensor(2, 3, 5, 7);
25  tensor.setRandom();
26
27  using NormalIndex = DSizes<ptrdiff_t, 4>;
28  using CustomIndex = std::map<ptrdiff_t, ptrdiff_t>;
29  CustomIndex coeffC;
30  coeffC[0] = 1;
31  coeffC[1] = 2;
32  coeffC[2] = 4;
33  coeffC[3] = 1;
34  NormalIndex coeff(1,2,4,1);
35
36  VERIFY_IS_EQUAL(tensor.coeff(coeffC), tensor.coeff(coeff));
37  VERIFY_IS_EQUAL(tensor.coeffRef(coeffC), tensor.coeffRef(coeff));
38#endif
39}
40
41
42template <int DataLayout>
43static void test_matrix_as_index()
44{
45#ifdef EIGEN_HAS_SFINAE
46  Tensor<float, 4, DataLayout> tensor(2, 3, 5, 7);
47  tensor.setRandom();
48
49  using NormalIndex = DSizes<ptrdiff_t, 4>;
50  using CustomIndex = Matrix<unsigned int, 4, 1>;
51  CustomIndex coeffC(1,2,4,1);
52  NormalIndex coeff(1,2,4,1);
53
54  VERIFY_IS_EQUAL(tensor.coeff(coeffC), tensor.coeff(coeff));
55  VERIFY_IS_EQUAL(tensor.coeffRef(coeffC), tensor.coeffRef(coeff));
56#endif
57}
58
59
60template <int DataLayout>
61static void test_varlist_as_index()
62{
63#ifdef EIGEN_HAS_SFINAE
64  Tensor<float, 4, DataLayout> tensor(2, 3, 5, 7);
65  tensor.setRandom();
66
67  DSizes<ptrdiff_t, 4> coeff(1,2,4,1);
68
69  VERIFY_IS_EQUAL(tensor.coeff({1,2,4,1}), tensor.coeff(coeff));
70  VERIFY_IS_EQUAL(tensor.coeffRef({1,2,4,1}), tensor.coeffRef(coeff));
71#endif
72}
73
74
75template <int DataLayout>
76static void test_sizes_as_index()
77{
78#ifdef EIGEN_HAS_SFINAE
79  Tensor<float, 4, DataLayout> tensor(2, 3, 5, 7);
80  tensor.setRandom();
81
82  DSizes<ptrdiff_t, 4> coeff(1,2,4,1);
83  Sizes<1,2,4,1> coeffC;
84
85  VERIFY_IS_EQUAL(tensor.coeff(coeffC), tensor.coeff(coeff));
86  VERIFY_IS_EQUAL(tensor.coeffRef(coeffC), tensor.coeffRef(coeff));
87#endif
88}
89
90
91void test_cxx11_tensor_custom_index() {
92  test_map_as_index<ColMajor>();
93  test_map_as_index<RowMajor>();
94  test_matrix_as_index<ColMajor>();
95  test_matrix_as_index<RowMajor>();
96  test_varlist_as_index<ColMajor>();
97  test_varlist_as_index<RowMajor>();
98  test_sizes_as_index<ColMajor>();
99  test_sizes_as_index<RowMajor>();
100}
101