11#ifndef EIGEN_INTEGRAL_CONSTANT_H
12#define EIGEN_INTEGRAL_CONSTANT_H
15#include "../InternalHeaderCheck.h"
24class VariableAndFixedInt;
58 static constexpr int value = N;
59 constexpr operator int()
const {
return N; }
61 constexpr FixedInt() =
default;
62 constexpr FixedInt(std::integral_constant<int, N>) {}
64 constexpr FixedInt(VariableAndFixedInt<N> other) {
65 EIGEN_UNUSED_VARIABLE(other);
66 eigen_internal_assert(
int(other) == N);
69 constexpr FixedInt<-N> operator-()
const {
return FixedInt<-N>(); }
72 constexpr FixedInt<N + M> operator+(FixedInt<M>)
const {
73 return FixedInt<N + M>();
77 constexpr FixedInt<N - M> operator-(FixedInt<M>)
const {
78 return FixedInt<N - M>();
82 constexpr FixedInt<N * M> operator*(FixedInt<M>)
const {
83 return FixedInt<N * M>();
87 constexpr FixedInt<N / M> operator/(FixedInt<M>)
const {
88 return FixedInt<N / M>();
92 constexpr FixedInt<N % M> operator%(FixedInt<M>)
const {
93 return FixedInt<N % M>();
97 constexpr FixedInt<N | M> operator|(FixedInt<M>)
const {
98 return FixedInt<N | M>();
102 constexpr FixedInt<N & M> operator&(FixedInt<M>)
const {
103 return FixedInt<N & M>();
107 constexpr FixedInt operator()()
const {
return *
this; }
109 constexpr VariableAndFixedInt<N> operator()(
int val)
const {
return VariableAndFixedInt<N>(val); }
143class VariableAndFixedInt {
145 static const int value = N;
146 constexpr operator int()
const {
return m_value; }
147 constexpr VariableAndFixedInt(
int val) : m_value(val) {}
153template <
typename T,
int Default = Dynamic>
154struct get_fixed_value {
155 static const int value = Default;
158template <
int N,
int Default>
159struct get_fixed_value<FixedInt<N>, Default> {
160 static const int value = N;
163template <
int N,
int Default>
164struct get_fixed_value<VariableAndFixedInt<N>, Default> {
165 static const int value = N;
168template <
typename T,
int N,
int Default>
169struct get_fixed_value<variable_if_dynamic<T, N>, Default> {
170 static const int value = N;
174EIGEN_DEVICE_FUNC
constexpr Index get_runtime_value(
const T &x) {
181template <
typename T,
int DynamicKey = Dynamic,
typename EnableIf =
void>
182struct cleanup_index_type {
187template <
typename T,
int DynamicKey>
188struct cleanup_index_type<T, DynamicKey, std::enable_if_t<std::is_integral<T>::value>> {
193template <
int N,
int DynamicKey>
194struct cleanup_index_type<VariableAndFixedInt<N>, DynamicKey> {
195 using type = FixedInt<N>;
198template <
int DynamicKey>
199struct cleanup_index_type<VariableAndFixedInt<DynamicKey>, DynamicKey> {
203template <
int N,
int DynamicKey>
204struct cleanup_index_type<std::integral_constant<int, N>, DynamicKey> {
205 using type = FixedInt<N>;
210#ifndef EIGEN_PARSED_BY_DOXYGEN
213constexpr internal::FixedInt<N>
fix{};
272static const auto fix(
int val);