Please, help us to better know about our user community by answering the following short survey: https://forms.gle/wpyrxWi18ox9Z5ae9
Eigen  3.4.0
 
Loading...
Searching...
No Matches
IndexedViewMethods.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2017 Gael Guennebaud <gael.guennebaud@inria.fr>
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#if !defined(EIGEN_PARSED_BY_DOXYGEN)
11
12// This file is automatically included twice to generate const and non-const versions
13
14#ifndef EIGEN_INDEXED_VIEW_METHOD_2ND_PASS
15#define EIGEN_INDEXED_VIEW_METHOD_CONST const
16#define EIGEN_INDEXED_VIEW_METHOD_TYPE ConstIndexedViewType
17#else
18#define EIGEN_INDEXED_VIEW_METHOD_CONST
19#define EIGEN_INDEXED_VIEW_METHOD_TYPE IndexedViewType
20#endif
21
22#ifndef EIGEN_INDEXED_VIEW_METHOD_2ND_PASS
23protected:
24
25// define some aliases to ease readability
26
27template<typename Indices>
28struct IvcRowType : public internal::IndexedViewCompatibleType<Indices,RowsAtCompileTime> {};
29
30template<typename Indices>
31struct IvcColType : public internal::IndexedViewCompatibleType<Indices,ColsAtCompileTime> {};
32
33template<typename Indices>
34struct IvcType : public internal::IndexedViewCompatibleType<Indices,SizeAtCompileTime> {};
35
36typedef typename internal::IndexedViewCompatibleType<Index,1>::type IvcIndex;
37
38template<typename Indices>
39typename IvcRowType<Indices>::type
40ivcRow(const Indices& indices) const {
41 return internal::makeIndexedViewCompatible(indices, internal::variable_if_dynamic<Index,RowsAtCompileTime>(derived().rows()),Specialized);
42}
43
44template<typename Indices>
45typename IvcColType<Indices>::type
46ivcCol(const Indices& indices) const {
47 return internal::makeIndexedViewCompatible(indices, internal::variable_if_dynamic<Index,ColsAtCompileTime>(derived().cols()),Specialized);
48}
49
50template<typename Indices>
51typename IvcColType<Indices>::type
52ivcSize(const Indices& indices) const {
53 return internal::makeIndexedViewCompatible(indices, internal::variable_if_dynamic<Index,SizeAtCompileTime>(derived().size()),Specialized);
54}
55
56public:
57
58#endif
59
60template<typename RowIndices, typename ColIndices>
61struct EIGEN_INDEXED_VIEW_METHOD_TYPE {
62 typedef IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,
63 typename IvcRowType<RowIndices>::type,
64 typename IvcColType<ColIndices>::type> type;
65};
66
67// This is the generic version
68
69template<typename RowIndices, typename ColIndices>
70typename internal::enable_if<internal::valid_indexed_view_overload<RowIndices,ColIndices>::value
71 && internal::traits<typename EIGEN_INDEXED_VIEW_METHOD_TYPE<RowIndices,ColIndices>::type>::ReturnAsIndexedView,
72 typename EIGEN_INDEXED_VIEW_METHOD_TYPE<RowIndices,ColIndices>::type >::type
73operator()(const RowIndices& rowIndices, const ColIndices& colIndices) EIGEN_INDEXED_VIEW_METHOD_CONST
74{
75 return typename EIGEN_INDEXED_VIEW_METHOD_TYPE<RowIndices,ColIndices>::type
76 (derived(), ivcRow(rowIndices), ivcCol(colIndices));
77}
78
79// The following overload returns a Block<> object
80
81template<typename RowIndices, typename ColIndices>
82typename internal::enable_if<internal::valid_indexed_view_overload<RowIndices,ColIndices>::value
83 && internal::traits<typename EIGEN_INDEXED_VIEW_METHOD_TYPE<RowIndices,ColIndices>::type>::ReturnAsBlock,
84 typename internal::traits<typename EIGEN_INDEXED_VIEW_METHOD_TYPE<RowIndices,ColIndices>::type>::BlockType>::type
85operator()(const RowIndices& rowIndices, const ColIndices& colIndices) EIGEN_INDEXED_VIEW_METHOD_CONST
86{
87 typedef typename internal::traits<typename EIGEN_INDEXED_VIEW_METHOD_TYPE<RowIndices,ColIndices>::type>::BlockType BlockType;
88 typename IvcRowType<RowIndices>::type actualRowIndices = ivcRow(rowIndices);
89 typename IvcColType<ColIndices>::type actualColIndices = ivcCol(colIndices);
90 return BlockType(derived(),
91 internal::first(actualRowIndices),
92 internal::first(actualColIndices),
93 internal::size(actualRowIndices),
94 internal::size(actualColIndices));
95}
96
97// The following overload returns a Scalar
98
99template<typename RowIndices, typename ColIndices>
100typename internal::enable_if<internal::valid_indexed_view_overload<RowIndices,ColIndices>::value
101 && internal::traits<typename EIGEN_INDEXED_VIEW_METHOD_TYPE<RowIndices,ColIndices>::type>::ReturnAsScalar,
102 CoeffReturnType >::type
103operator()(const RowIndices& rowIndices, const ColIndices& colIndices) EIGEN_INDEXED_VIEW_METHOD_CONST
104{
105 return Base::operator()(internal::eval_expr_given_size(rowIndices,rows()),internal::eval_expr_given_size(colIndices,cols()));
106}
107
108#if EIGEN_HAS_STATIC_ARRAY_TEMPLATE
109
110// The following three overloads are needed to handle raw Index[N] arrays.
111
112template<typename RowIndicesT, std::size_t RowIndicesN, typename ColIndices>
113IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,const RowIndicesT (&)[RowIndicesN],typename IvcColType<ColIndices>::type>
114operator()(const RowIndicesT (&rowIndices)[RowIndicesN], const ColIndices& colIndices) EIGEN_INDEXED_VIEW_METHOD_CONST
115{
116 return IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,const RowIndicesT (&)[RowIndicesN],typename IvcColType<ColIndices>::type>
117 (derived(), rowIndices, ivcCol(colIndices));
118}
119
120template<typename RowIndices, typename ColIndicesT, std::size_t ColIndicesN>
121IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,typename IvcRowType<RowIndices>::type, const ColIndicesT (&)[ColIndicesN]>
122operator()(const RowIndices& rowIndices, const ColIndicesT (&colIndices)[ColIndicesN]) EIGEN_INDEXED_VIEW_METHOD_CONST
123{
124 return IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,typename IvcRowType<RowIndices>::type,const ColIndicesT (&)[ColIndicesN]>
125 (derived(), ivcRow(rowIndices), colIndices);
126}
127
128template<typename RowIndicesT, std::size_t RowIndicesN, typename ColIndicesT, std::size_t ColIndicesN>
129IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,const RowIndicesT (&)[RowIndicesN], const ColIndicesT (&)[ColIndicesN]>
130operator()(const RowIndicesT (&rowIndices)[RowIndicesN], const ColIndicesT (&colIndices)[ColIndicesN]) EIGEN_INDEXED_VIEW_METHOD_CONST
131{
132 return IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,const RowIndicesT (&)[RowIndicesN],const ColIndicesT (&)[ColIndicesN]>
133 (derived(), rowIndices, colIndices);
134}
135
136#endif // EIGEN_HAS_STATIC_ARRAY_TEMPLATE
137
138// Overloads for 1D vectors/arrays
139
140template<typename Indices>
141typename internal::enable_if<
142 IsRowMajor && (!(internal::get_compile_time_incr<typename IvcType<Indices>::type>::value==1 || internal::is_valid_index_type<Indices>::value)),
143 IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,IvcIndex,typename IvcType<Indices>::type> >::type
144operator()(const Indices& indices) EIGEN_INDEXED_VIEW_METHOD_CONST
145{
146 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
147 return IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,IvcIndex,typename IvcType<Indices>::type>
148 (derived(), IvcIndex(0), ivcCol(indices));
149}
150
151template<typename Indices>
152typename internal::enable_if<
153 (!IsRowMajor) && (!(internal::get_compile_time_incr<typename IvcType<Indices>::type>::value==1 || internal::is_valid_index_type<Indices>::value)),
154 IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,typename IvcType<Indices>::type,IvcIndex> >::type
155operator()(const Indices& indices) EIGEN_INDEXED_VIEW_METHOD_CONST
156{
157 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
158 return IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,typename IvcType<Indices>::type,IvcIndex>
159 (derived(), ivcRow(indices), IvcIndex(0));
160}
161
162template<typename Indices>
163typename internal::enable_if<
164 (internal::get_compile_time_incr<typename IvcType<Indices>::type>::value==1) && (!internal::is_valid_index_type<Indices>::value) && (!symbolic::is_symbolic<Indices>::value),
165 VectorBlock<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,internal::array_size<Indices>::value> >::type
166operator()(const Indices& indices) EIGEN_INDEXED_VIEW_METHOD_CONST
167{
168 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
169 typename IvcType<Indices>::type actualIndices = ivcSize(indices);
170 return VectorBlock<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,internal::array_size<Indices>::value>
171 (derived(), internal::first(actualIndices), internal::size(actualIndices));
172}
173
174template<typename IndexType>
175typename internal::enable_if<symbolic::is_symbolic<IndexType>::value, CoeffReturnType >::type
176operator()(const IndexType& id) EIGEN_INDEXED_VIEW_METHOD_CONST
177{
178 return Base::operator()(internal::eval_expr_given_size(id,size()));
179}
180
181#if EIGEN_HAS_STATIC_ARRAY_TEMPLATE
182
183template<typename IndicesT, std::size_t IndicesN>
184typename internal::enable_if<IsRowMajor,
185 IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,IvcIndex,const IndicesT (&)[IndicesN]> >::type
186operator()(const IndicesT (&indices)[IndicesN]) EIGEN_INDEXED_VIEW_METHOD_CONST
187{
188 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
189 return IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,IvcIndex,const IndicesT (&)[IndicesN]>
190 (derived(), IvcIndex(0), indices);
191}
192
193template<typename IndicesT, std::size_t IndicesN>
194typename internal::enable_if<!IsRowMajor,
195 IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,const IndicesT (&)[IndicesN],IvcIndex> >::type
196operator()(const IndicesT (&indices)[IndicesN]) EIGEN_INDEXED_VIEW_METHOD_CONST
197{
198 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
199 return IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,const IndicesT (&)[IndicesN],IvcIndex>
200 (derived(), indices, IvcIndex(0));
201}
202
203#endif // EIGEN_HAS_STATIC_ARRAY_TEMPLATE
204
205#undef EIGEN_INDEXED_VIEW_METHOD_CONST
206#undef EIGEN_INDEXED_VIEW_METHOD_TYPE
207
208#ifndef EIGEN_INDEXED_VIEW_METHOD_2ND_PASS
209#define EIGEN_INDEXED_VIEW_METHOD_2ND_PASS
210#include "IndexedViewMethods.h"
211#undef EIGEN_INDEXED_VIEW_METHOD_2ND_PASS
212#endif
213
214#else // EIGEN_PARSED_BY_DOXYGEN
215
250template<typename RowIndices, typename ColIndices>
251IndexedView_or_Block
252operator()(const RowIndices& rowIndices, const ColIndices& colIndices);
253
258template<typename Indices>
259IndexedView_or_VectorBlock
260operator()(const Indices& indices);
261
262#endif // EIGEN_PARSED_BY_DOXYGEN