10#ifndef EIGEN_INTEGRAL_CONSTANT_H
11#define EIGEN_INTEGRAL_CONSTANT_H
14#include "../InternalHeaderCheck.h"
23class VariableAndFixedInt;
57 static constexpr int value = N;
58 constexpr operator int()
const {
return N; }
60 constexpr FixedInt() =
default;
61 constexpr FixedInt(std::integral_constant<int, N>) {}
63 constexpr FixedInt(VariableAndFixedInt<N> other) {
64#ifndef EIGEN_INTERNAL_DEBUGGING
65 EIGEN_UNUSED_VARIABLE(other);
67 eigen_internal_assert(
int(other) == N);
70 constexpr FixedInt<-N> operator-()
const {
return FixedInt<-N>(); }
73 constexpr FixedInt<N + M> operator+(FixedInt<M>)
const {
74 return FixedInt<N + M>();
78 constexpr FixedInt<N - M> operator-(FixedInt<M>)
const {
79 return FixedInt<N - M>();
83 constexpr FixedInt<N * M> operator*(FixedInt<M>)
const {
84 return FixedInt<N * M>();
88 constexpr FixedInt<N / M> operator/(FixedInt<M>)
const {
89 return FixedInt<N / M>();
93 constexpr FixedInt<N % M> operator%(FixedInt<M>)
const {
94 return FixedInt<N % M>();
98 constexpr FixedInt<N | M> operator|(FixedInt<M>)
const {
99 return FixedInt<N | M>();
103 constexpr FixedInt<N & M> operator&(FixedInt<M>)
const {
104 return FixedInt<N & M>();
108 constexpr FixedInt operator()()
const {
return *
this; }
110 constexpr VariableAndFixedInt<N> operator()(
int val)
const {
return VariableAndFixedInt<N>(val); }
144class VariableAndFixedInt {
146 static const int value = N;
147 operator int()
const {
return m_value; }
148 VariableAndFixedInt(
int val) { m_value = val; }
154template <
typename T,
int Default = Dynamic>
155struct get_fixed_value {
156 static const int value = Default;
159template <
int N,
int Default>
160struct get_fixed_value<FixedInt<N>, Default> {
161 static const int value = N;
164template <
int N,
int Default>
165struct get_fixed_value<VariableAndFixedInt<N>, Default> {
166 static const int value = N;
169template <
typename T,
int N,
int Default>
170struct get_fixed_value<variable_if_dynamic<T, N>, Default> {
171 static const int value = N;
175EIGEN_DEVICE_FUNC Index get_runtime_value(
const T &x) {
182template <
typename T,
int DynamicKey = Dynamic,
typename EnableIf =
void>
183struct cleanup_index_type {
188template <
typename T,
int DynamicKey>
189struct cleanup_index_type<T, DynamicKey, std::enable_if_t<internal::is_integral<T>::value>> {
194template <
int N,
int DynamicKey>
195struct cleanup_index_type<VariableAndFixedInt<N>, DynamicKey> {
196 typedef FixedInt<N> type;
199template <
int DynamicKey>
200struct cleanup_index_type<VariableAndFixedInt<DynamicKey>, DynamicKey> {
204template <
int N,
int DynamicKey>
205struct cleanup_index_type<std::integral_constant<int, N>, DynamicKey> {
206 typedef FixedInt<N> type;
211#ifndef EIGEN_PARSED_BY_DOXYGEN
214constexpr internal::FixedInt<N> fix{};
241static const auto fix();
273static const auto fix(
int val);
Namespace containing all symbols from the Eigen library.
Definition Core:137