6 #ifndef DISMEC_EIGEN_GENERIC_H
7 #define DISMEC_EIGEN_GENERIC_H
13 template<
typename Derived>
18 #define EIGEN_VISITORS_IMPLEMENT_VISITOR(VISITOR, BASE, CALL) \
20 template<class Derived, class... Args> \
21 auto operator()(const Eigen::BASE<Derived>& source, Args&&... args) const { \
22 return source.CALL(std::forward<Args>(args)...); \
32 #undef EIGEN_VISITORS_IMPLEMENT_VISITOR
37 template<
class... Types>
45 [[nodiscard]]
auto size()
const {
49 [[nodiscard]]
auto rows()
const {
53 [[nodiscard]]
auto cols()
const {
71 const T&
get()
const {
90 return source.unpack_variant();
94 template<
class F,
class... Variants>
95 auto visit(F&& f, Variants&& ... variants) {
99 template<
class Dense,
class Sparse>
103 using base_t::base_t;
105 [[nodiscard]]
const Dense&
dense()
const {
113 [[nodiscard]]
const Sparse&
sparse()
const {
114 return std::get<Sparse>(this->
m_Variant);
118 return std::get<Sparse>(this->
m_Variant);
127 template<
class... Types>
131 using base_t::base_t;
146 return this->
template get<DenseRef>();
150 return this->
template get<DenseRef>();
154 return this->
template get<SparseRef>();
158 return this->
template get<SparseRef>();
EigenVariantWrapper(T &&source)
variant_t & unpack_variant()
const variant_t & unpack_variant() const
std::variant< Types... > variant_t
Eigen::Ref< SparseColMajor< T > > SparseColMajorRef
GenericMatrixRef(SparseRowMajorRef m)
Eigen::Ref< SparseRowMajor< T > > SparseRowMajorRef
GenericMatrixRef(const DenseRowMajor< T > &m)
Eigen::Ref< DenseColMajor< T > > DenseColMajorRef
GenericMatrixRef(const SparseRowMajor< T > &m)
GenericMatrixRef(const SparseColMajor< T > &m)
Eigen::Ref< DenseRowMajor< T > > DenseRowMajorRef
GenericMatrixRef(SparseColMajorRef m)
GenericMatrixRef(DenseColMajorRef m)
GenericMatrixRef(DenseRowMajorRef m)
GenericMatrixRef(const DenseColMajor< T > &m)
const Dense & dense() const
const Sparse & sparse() const
Eigen::Ref< DenseVector< T > > DenseRef
GenericVectorRef(const SparseVector< T > &m)
const SparseRef & sparse() const
const DenseRef & dense() const
Eigen::Ref< SparseVector< T > > SparseRef
GenericVectorRef(const DenseVector< T > &m)
EIGEN_VISITORS_IMPLEMENT_VISITOR(ColsVisitor, EigenBase, cols)
outer_const< T, sparse_col_major_h > SparseColMajor
outer_const< T, sparse_row_major_h > SparseRowMajor
outer_const< T, dense_row_major_h > DenseRowMajor
outer_const< T, dense_vector_h > DenseVector
outer_const< T, sparse_vector_h > SparseVector
outer_const< T, dense_col_major_h > DenseColMajor
auto visit(F &&f, Variants &&... variants)
decltype(auto) unpack_variant_wrapper(T &&source, std::enable_if_t<!is_variant_wrapper< T >, void * > dispatch=nullptr)
constexpr bool is_variant_wrapper