11#ifndef EIGEN_STRUCTURED_BINDINGS_H
12#define EIGEN_STRUCTURED_BINDINGS_H
15#include "./InternalHeaderCheck.h"
17#if EIGEN_MAX_CPP_VER >= 17 && EIGEN_COMP_CXXVER >= 17
45template <
int Rows_,
int Cols_,
bool IsFixedSize_ = (Rows_ != Dynamic && Cols_ != Dynamic)>
46struct structured_binding_size {};
48template <
int Rows_,
int Cols_>
49struct structured_binding_size<Rows_, Cols_, true>
50 : std::integral_constant<size_t, static_cast<size_t>(Rows_) * static_cast<size_t>(Cols_)> {};
53template <
size_t Idx_,
typename Scalar_,
int Rows_,
int Cols_,
54 bool IsFixedSize_ = (Rows_ != Dynamic && Cols_ != Dynamic)>
55struct structured_binding_element {};
57template <
size_t Idx_,
typename Scalar_,
int Rows_,
int Cols_>
58struct structured_binding_element<Idx_, Scalar_, Rows_, Cols_, true> {
59 static_assert(Idx_ < static_cast<size_t>(Rows_) *
static_cast<size_t>(Cols_),
"Index out of range.");
69template <
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
70struct tuple_size<Eigen::Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>>
71 : Eigen::internal::structured_binding_size<Rows_, Cols_> {};
73template <
size_t Idx_,
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
74struct tuple_element<Idx_, Eigen::Matrix<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>>
75 : Eigen::internal::structured_binding_element<Idx_, Scalar_, Rows_, Cols_> {};
78template <
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
79struct tuple_size<Eigen::Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>>
80 : Eigen::internal::structured_binding_size<Rows_, Cols_> {};
82template <
size_t Idx_,
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
83struct tuple_element<Idx_, Eigen::Array<Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_>>
84 : Eigen::internal::structured_binding_element<Idx_, Scalar_, Rows_, Cols_> {};
97#define EIGEN_STRUCTURED_BINDINGS_ASSERT_COL_MAJOR(ROWS, COLS, OPTIONS) \
98 static_assert((ROWS <= 1 || COLS <= 1) || ((OPTIONS & RowMajor) == 0), \
99 "Structured bindings on 2D RowMajor Eigen matrices are disabled to prevent storage-order confusion.");
102template <
size_t Idx_,
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
103EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar_& get(
105 static_assert(Rows_ != Dynamic && Cols_ != Dynamic,
"Structured bindings require fixed-size Eigen types.");
106 static_assert(Idx_ < static_cast<size_t>(Rows_ * Cols_),
"Index out of range.");
107 EIGEN_STRUCTURED_BINDINGS_ASSERT_COL_MAJOR(Rows_, Cols_, Options_);
108 return m.coeffRef(
static_cast<Index
>(Idx_));
111template <
size_t Idx_,
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
112EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar_& get(
114 static_assert(Rows_ != Dynamic && Cols_ != Dynamic,
"Structured bindings require fixed-size Eigen types.");
115 static_assert(Idx_ < static_cast<size_t>(Rows_ * Cols_),
"Index out of range.");
116 EIGEN_STRUCTURED_BINDINGS_ASSERT_COL_MAJOR(Rows_, Cols_, Options_);
117 return m.coeffRef(
static_cast<Index
>(Idx_));
120template <
size_t Idx_,
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
121EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar_&& get(
123 static_assert(Rows_ != Dynamic && Cols_ != Dynamic,
"Structured bindings require fixed-size Eigen types.");
124 static_assert(Idx_ < static_cast<size_t>(Rows_ * Cols_),
"Index out of range.");
125 EIGEN_STRUCTURED_BINDINGS_ASSERT_COL_MAJOR(Rows_, Cols_, Options_);
126 return std::move(m.coeffRef(
static_cast<Index
>(Idx_)));
130template <
size_t Idx_,
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
131EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar_& get(
133 static_assert(Rows_ != Dynamic && Cols_ != Dynamic,
"Structured bindings require fixed-size Eigen types.");
134 static_assert(Idx_ < static_cast<size_t>(Rows_ * Cols_),
"Index out of range.");
135 EIGEN_STRUCTURED_BINDINGS_ASSERT_COL_MAJOR(Rows_, Cols_, Options_);
136 return a.coeffRef(
static_cast<Index
>(Idx_));
139template <
size_t Idx_,
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
140EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar_& get(
142 static_assert(Rows_ != Dynamic && Cols_ != Dynamic,
"Structured bindings require fixed-size Eigen types.");
143 static_assert(Idx_ < static_cast<size_t>(Rows_ * Cols_),
"Index out of range.");
144 EIGEN_STRUCTURED_BINDINGS_ASSERT_COL_MAJOR(Rows_, Cols_, Options_);
145 return a.coeffRef(
static_cast<Index
>(Idx_));
148template <
size_t Idx_,
typename Scalar_,
int Rows_,
int Cols_,
int Options_,
int MaxRows_,
int MaxCols_>
149EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar_&& get(
151 static_assert(Rows_ != Dynamic && Cols_ != Dynamic,
"Structured bindings require fixed-size Eigen types.");
152 static_assert(Idx_ < static_cast<size_t>(Rows_ * Cols_),
"Index out of range.");
153 EIGEN_STRUCTURED_BINDINGS_ASSERT_COL_MAJOR(Rows_, Cols_, Options_);
154 return std::move(a.coeffRef(
static_cast<Index
>(Idx_)));
General-purpose arrays with easy API for coefficient-wise operations.
Definition Array.h:55
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:188