WPILibC++ 2023.4.3-108-ge5452e3
IndexedViewHelper.h
Go to the documentation of this file.
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
11#ifndef EIGEN_INDEXED_VIEW_HELPER_H
12#define EIGEN_INDEXED_VIEW_HELPER_H
13
14namespace Eigen {
15
16namespace internal {
18}
19
20/** \var last
21 * \ingroup Core_Module
22 *
23 * Can be used as a parameter to Eigen::seq and Eigen::seqN functions to symbolically reference the last element/row/columns
24 * of the underlying vector or matrix once passed to DenseBase::operator()(const RowIndices&, const ColIndices&).
25 *
26 * This symbolic placeholder supports standard arithmetic operations.
27 *
28 * A typical usage example would be:
29 * \code
30 * using namespace Eigen;
31 * using Eigen::last;
32 * VectorXd v(n);
33 * v(seq(2,last-2)).setOnes();
34 * \endcode
35 *
36 * \sa end
37 */
38static const symbolic::SymbolExpr<internal::symbolic_last_tag> last; // PLEASE use Eigen::last instead of Eigen::placeholders::last
39
40/** \var lastp1
41 * \ingroup Core_Module
42 *
43 * Can be used as a parameter to Eigen::seq and Eigen::seqN functions to symbolically
44 * reference the last+1 element/row/columns of the underlying vector or matrix once
45 * passed to DenseBase::operator()(const RowIndices&, const ColIndices&).
46 *
47 * This symbolic placeholder supports standard arithmetic operations.
48 * It is essentially an alias to last+fix<1>.
49 *
50 * \sa last
51 */
52#ifdef EIGEN_PARSED_BY_DOXYGEN
53static const auto lastp1 = last+fix<1>;
54#else
55// Using a FixedExpr<1> expression is important here to make sure the compiler
56// can fully optimize the computation starting indices with zero overhead.
58#endif
59
60namespace internal {
61
62 // Replace symbolic last/end "keywords" by their true runtime value
63inline Index eval_expr_given_size(Index x, Index /* size */) { return x; }
64
65template<int N>
67
68template<typename Derived>
70{
71 return x.derived().eval(last=size-1);
72}
73
74// Extract increment/step at compile time
75template<typename T, typename EnableIf = void> struct get_compile_time_incr {
76 enum { value = UndefinedIncr };
77};
78
79// Analogue of std::get<0>(x), but tailored for our needs.
80template<typename T>
81EIGEN_CONSTEXPR Index first(const T& x) EIGEN_NOEXCEPT { return x.first(); }
82
83// IndexedViewCompatibleType/makeIndexedViewCompatible turn an arbitrary object of type T into something usable by MatrixSlice
84// The generic implementation is a no-op
85template<typename T,int XprSize,typename EnableIf=void>
87 typedef T type;
88};
89
90template<typename T,typename Q>
91const T& makeIndexedViewCompatible(const T& x, Index /*size*/, Q) { return x; }
92
93//--------------------------------------------------------------------------------
94// Handling of a single Index
95//--------------------------------------------------------------------------------
96
98 enum {
100 };
101 SingleRange(Index val) : m_value(val) {}
102 Index operator[](Index) const { return m_value; }
104 Index first() const EIGEN_NOEXCEPT { return m_value; }
106};
107
109 enum { value = 1 }; // 1 or 0 ??
110};
111
112// Turn a single index into something that looks like an array (i.e., that exposes a .size(), and operator[](int) methods)
113template<typename T, int XprSize>
114struct IndexedViewCompatibleType<T,XprSize,typename internal::enable_if<internal::is_integral<T>::value>::type> {
115 // Here we could simply use Array, but maybe it's less work for the compiler to use
116 // a simpler wrapper as SingleRange
117 //typedef Eigen::Array<Index,1,1> type;
119};
120
121template<typename T, int XprSize>
122struct IndexedViewCompatibleType<T, XprSize, typename enable_if<symbolic::is_symbolic<T>::value>::type> {
124};
125
126
127template<typename T>
130 return eval_expr_given_size(id,size);
131}
132
133//--------------------------------------------------------------------------------
134// Handling of all
135//--------------------------------------------------------------------------------
136
137struct all_t { all_t() {} };
138
139// Convert a symbolic 'all' into a usable range type
140template<int XprSize>
141struct AllRange {
142 enum { SizeAtCompileTime = XprSize };
143 AllRange(Index size = XprSize) : m_size(size) {}
148};
149
150template<int XprSize>
153};
154
155template<typename XprSizeType>
158}
159
160template<int Size> struct get_compile_time_incr<AllRange<Size> > {
161 enum { value = 1 };
162};
163
164} // end namespace internal
165
166
167/** \var all
168 * \ingroup Core_Module
169 * Can be used as a parameter to DenseBase::operator()(const RowIndices&, const ColIndices&) to index all rows or columns
170 */
171static const Eigen::internal::all_t all; // PLEASE use Eigen::all instead of Eigen::placeholders::all
172
173
174namespace placeholders {
178
179 EIGEN_DEPRECATED static const all_t all = Eigen::all; // PLEASE use Eigen::all instead of Eigen::placeholders::all
180 EIGEN_DEPRECATED static const last_t last = Eigen::last; // PLEASE use Eigen::last instead of Eigen::placeholders::last
181 EIGEN_DEPRECATED static const end_t end = Eigen::lastp1; // PLEASE use Eigen::lastp1 instead of Eigen::placeholders::end
182}
183
184} // end namespace Eigen
185
186#endif // EIGEN_INDEXED_VIEW_HELPER_H
#define EIGEN_DEPRECATED
Definition: Macros.h:1068
#define EIGEN_NOEXCEPT
Definition: Macros.h:1428
#define EIGEN_CONSTEXPR
Definition: Macros.h:797
Definition: IntegralConstant.h:52
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR T value()
Definition: XprHelper.h:135
Definition: SymbolicIndex.h:252
Common base class of any symbolic expressions.
Definition: SymbolicIndex.h:78
const Derived & derived() const
Definition: SymbolicIndex.h:80
Expression of a symbol uniquely identified by the template parameter type tag.
Definition: SymbolicIndex.h:214
Definition: SymbolicIndex.h:52
Definition: core.h:1240
type
Definition: core.h:575
static const symbolic::SymbolExpr< internal::symbolic_last_tag > last
Can be used as a parameter to Eigen::seq and Eigen::seqN functions to symbolically reference the last...
Definition: IndexedViewHelper.h:38
static const Eigen::internal::all_t all
Can be used as a parameter to DenseBase::operator()(const RowIndices&, const ColIndices&) to index al...
Definition: IndexedViewHelper.h:171
ArithmeticSequence< Index, typename make_size_type< SizeType >::type, IncrType > makeIndexedViewCompatible(const ArithmeticSequence< FirstType, SizeType, IncrType > &ids, Index size, SpecializedType)
Definition: ArithmeticSequence.h:366
Index eval_expr_given_size(Index x, Index)
Definition: IndexedViewHelper.h:63
EIGEN_CONSTEXPR Index size(const T &x)
Definition: Meta.h:479
EIGEN_CONSTEXPR Index first(const T &x) EIGEN_NOEXCEPT
Definition: IndexedViewHelper.h:81
static EIGEN_DEPRECATED const all_t all
Definition: IndexedViewHelper.h:179
symbolic::AddExpr< symbolic::SymbolExpr< internal::symbolic_last_tag >, symbolic::ValueExpr< Eigen::internal::FixedInt< 1 > > > end_t
Definition: IndexedViewHelper.h:176
static EIGEN_DEPRECATED const end_t end
Definition: IndexedViewHelper.h:181
symbolic::SymbolExpr< internal::symbolic_last_tag > last_t
Definition: IndexedViewHelper.h:175
Eigen::internal::all_t all_t
Definition: IndexedViewHelper.h:177
static EIGEN_DEPRECATED const last_t last
Definition: IndexedViewHelper.h:180
Namespace containing all symbols from the Eigen library.
Definition: Core:141
const int UndefinedIncr
This value means that the increment to go from one value to another in a sequence is not constant for...
Definition: Constants.h:31
static const symbolic::AddExpr< symbolic::SymbolExpr< internal::symbolic_last_tag >, symbolic::ValueExpr< Eigen::internal::FixedInt< 1 > > > lastp1(last+fix< 1 >())
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
SpecializedType
Definition: Constants.h:309
Definition: Eigen_Colamd.h:50
Definition: IndexedViewHelper.h:141
variable_if_dynamic< Index, XprSize > m_size
Definition: IndexedViewHelper.h:147
AllRange(Index size=XprSize)
Definition: IndexedViewHelper.h:143
EIGEN_CONSTEXPR Index size() const EIGEN_NOEXCEPT
Definition: IndexedViewHelper.h:145
@ SizeAtCompileTime
Definition: IndexedViewHelper.h:142
EIGEN_CONSTEXPR Index first() const EIGEN_NOEXCEPT
Definition: IndexedViewHelper.h:146
EIGEN_CONSTEXPR Index operator[](Index i) const EIGEN_NOEXCEPT
Definition: IndexedViewHelper.h:144
AllRange< XprSize > type
Definition: IndexedViewHelper.h:152
Definition: IndexedViewHelper.h:86
T type
Definition: IndexedViewHelper.h:87
Definition: IndexedViewHelper.h:97
static EIGEN_CONSTEXPR Index size() EIGEN_NOEXCEPT
Definition: IndexedViewHelper.h:103
Index m_value
Definition: IndexedViewHelper.h:105
SingleRange(Index val)
Definition: IndexedViewHelper.h:101
Index first() const EIGEN_NOEXCEPT
Definition: IndexedViewHelper.h:104
Index operator[](Index) const
Definition: IndexedViewHelper.h:102
@ SizeAtCompileTime
Definition: IndexedViewHelper.h:99
Definition: IndexedViewHelper.h:137
all_t()
Definition: IndexedViewHelper.h:137
Definition: Meta.h:273
Definition: IndexedViewHelper.h:75
Definition: IndexedViewHelper.h:17