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 #ifndef EIGEN_CXX11_TENSOR_TENSOR_DIMENSION_LIST_H
11 #define EIGEN_CXX11_TENSOR_TENSOR_DIMENSION_LIST_H
12 
13 namespace Eigen {
14 
15 /** \internal
16   *
17   * \class TensorDimensionList
18   * \ingroup CXX11_Tensor_Module
19   *
20   * \brief Special case of tensor index list used to list all the dimensions of a tensor of rank n.
21   *
22   * \sa Tensor
23   */
24 
25 template <typename Index, std::size_t Rank> struct DimensionList {
26   EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
27   const Index operator[] (const Index i) const { return i; }
28 };
29 
30 namespace internal {
31 
32 template<typename Index, std::size_t Rank> struct array_size<DimensionList<Index, Rank> > {
33   static const size_t value = Rank;
34 };
35 template<typename Index, std::size_t Rank> struct array_size<const DimensionList<Index, Rank> > {
36   static const size_t value = Rank;
37 };
38 
39 template<DenseIndex n, typename Index, std::size_t Rank> const Index array_get(DimensionList<Index, Rank>&) {
40   return n;
41 }
42 template<DenseIndex n, typename Index, std::size_t Rank> const Index array_get(const DimensionList<Index, Rank>&) {
43   return n;
44 }
45 
46 
47 #if EIGEN_HAS_CONSTEXPR
48 template <typename Index, std::size_t Rank>
49 struct index_known_statically_impl<DimensionList<Index, Rank> > {
50   EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex) {
51     return true;
52   }
53 };
54 template <typename Index, std::size_t Rank>
55 struct index_known_statically_impl<const DimensionList<Index, Rank> > {
56   EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex) {
57     return true;
58   }
59 };
60 
61 template <typename Index, std::size_t Rank>
62 struct all_indices_known_statically_impl<DimensionList<Index, Rank> > {
63   EIGEN_DEVICE_FUNC static constexpr bool run() {
64     return true;
65   }
66 };
67 template <typename Index, std::size_t Rank>
68 struct all_indices_known_statically_impl<const DimensionList<Index, Rank> > {
69   EIGEN_DEVICE_FUNC static constexpr bool run() {
70     return true;
71   }
72 };
73 
74 template <typename Index, std::size_t Rank>
75 struct indices_statically_known_to_increase_impl<DimensionList<Index, Rank> > {
76   EIGEN_DEVICE_FUNC static constexpr bool run() {
77     return true;
78   }
79 };
80 template <typename Index, std::size_t Rank>
81 struct indices_statically_known_to_increase_impl<const DimensionList<Index, Rank> > {
82   EIGEN_DEVICE_FUNC static constexpr bool run() {
83     return true;
84   }
85 };
86 
87 template <typename Index, std::size_t Rank>
88 struct index_statically_eq_impl<DimensionList<Index, Rank> > {
89   static constexpr bool run(const DenseIndex i, const DenseIndex value) {
90     return i == value;
91   }
92 };
93 template <typename Index, std::size_t Rank>
94 struct index_statically_eq_impl<const DimensionList<Index, Rank> > {
95   EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) {
96     return i == value;
97   }
98 };
99 
100 template <typename Index, std::size_t Rank>
101 struct index_statically_ne_impl<DimensionList<Index, Rank> > {
102   EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) {
103     return i != value;
104   }
105 };
106 template <typename Index, std::size_t Rank>
107 struct index_statically_ne_impl<const DimensionList<Index, Rank> > {
108   static constexpr bool run(const DenseIndex i, const DenseIndex value) {
109     return i != value;
110   }
111 };
112 
113 template <typename Index, std::size_t Rank>
114 struct index_statically_gt_impl<DimensionList<Index, Rank> > {
115   EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) {
116     return i > value;
117   }
118 };
119 template <typename Index, std::size_t Rank>
120 struct index_statically_gt_impl<const DimensionList<Index, Rank> > {
121   EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) {
122     return i > value;
123   }
124 };
125 
126 template <typename Index, std::size_t Rank>
127 struct index_statically_lt_impl<DimensionList<Index, Rank> > {
128   EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) {
129     return i < value;
130   }
131 };
132 template <typename Index, std::size_t Rank>
133 struct index_statically_lt_impl<const DimensionList<Index, Rank> > {
134   EIGEN_DEVICE_FUNC static constexpr bool run(const DenseIndex i, const DenseIndex value) {
135     return i < value;
136   }
137 };
138 
139 #else
140 template <typename Index, std::size_t Rank>
141 struct index_known_statically_impl<DimensionList<Index, Rank> > {
142   EIGEN_DEVICE_FUNC static EIGEN_ALWAYS_INLINE bool run(const DenseIndex) {
143     return true;
144   }
145 };
146 template <typename Index, std::size_t Rank>
147 struct index_known_statically_impl<const DimensionList<Index, Rank> > {
148   EIGEN_DEVICE_FUNC static EIGEN_ALWAYS_INLINE bool run(const DenseIndex) {
149     return true;
150   }
151 };
152 
153 template <typename Index, std::size_t Rank>
154 struct all_indices_known_statically_impl<DimensionList<Index, Rank> > {
155   EIGEN_DEVICE_FUNC static EIGEN_ALWAYS_INLINE bool run() {
156     return true;
157   }
158 };
159 template <typename Index, std::size_t Rank>
160 struct all_indices_known_statically_impl<const DimensionList<Index, Rank> > {
161   EIGEN_DEVICE_FUNC static EIGEN_ALWAYS_INLINE bool run() {
162     return true;
163   }
164 };
165 
166 template <typename Index, std::size_t Rank>
167 struct indices_statically_known_to_increase_impl<DimensionList<Index, Rank> > {
168   static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run() {
169     return true;
170   }
171 };
172 template <typename Index, std::size_t Rank>
173 struct indices_statically_known_to_increase_impl<const DimensionList<Index, Rank> > {
174   static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run() {
175     return true;
176   }
177 };
178 
179 template <typename Index, std::size_t Rank>
180 struct index_statically_eq_impl<DimensionList<Index, Rank> > {
181   static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) {
182     return false;
183   }
184 };
185 template <typename Index, std::size_t Rank>
186 struct index_statically_eq_impl<const DimensionList<Index, Rank> > {
187   static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) {
188     return false;
189   }
190 };
191 
192 template <typename Index, std::size_t Rank>
193 struct index_statically_ne_impl<DimensionList<Index, Rank> > {
194   static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex){
195     return false;
196   }
197 };
198 template <typename Index, std::size_t Rank>
199 struct index_statically_ne_impl<const DimensionList<Index, Rank> > {
200   static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) {
201     return false;
202   }
203 };
204 
205 template <typename Index, std::size_t Rank>
206 struct index_statically_gt_impl<DimensionList<Index, Rank> > {
207   static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) {
208     return false;
209   }
210 };
211 template <typename Index, std::size_t Rank>
212 struct index_statically_gt_impl<const DimensionList<Index, Rank> > {
213   static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) {
214     return false;
215   }
216 };
217 
218 template <typename Index, std::size_t Rank>
219 struct index_statically_lt_impl<DimensionList<Index, Rank> > {
220   static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) {
221     return false;
222   }
223 };
224 template <typename Index, std::size_t Rank>
225 struct index_statically_lt_impl<const DimensionList<Index, Rank> > {
226   static EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool run(const DenseIndex, const DenseIndex) {
227     return false;
228   }
229 };
230 #endif
231 
232 }  // end namespace internal
233 }  // end namespace Eigen
234 
235 
236 #endif // EIGEN_CXX11_TENSOR_TENSOR_DIMENSION_LIST_H
237