#ifndef EIGEN_PRODUCT_H
#define EIGEN_PRODUCT_H
#include "./InternalHeaderCheck.h"
namespace Eigen {
template <typename Lhs, typename Rhs, int Option, typename StorageKind>
class ProductImpl;
namespace internal {
traits<Product<Lhs, Rhs, Option>>;
struct TransposeProductEnum { … };
template <typename Xpr>
struct TransposeKind { … };
template <typename Lhs, typename Rhs>
struct TransposeProductKind { … };
template <typename Lhs, typename Rhs, int Option, int Kind = TransposeProductKind<Lhs, Rhs>::Kind>
struct product_transpose_helper { … };
product_transpose_helper<Lhs, Rhs, Option, TransposeProductEnum::MatrixMatrix>;
product_transpose_helper<Lhs, Rhs, Option, TransposeProductEnum::PermutationMatrix>;
product_transpose_helper<Lhs, Rhs, Option, TransposeProductEnum::MatrixPermutation>;
}
template <typename Lhs_, typename Rhs_, int Option>
class Product
: public ProductImpl<Lhs_, Rhs_, Option,
typename internal::product_promote_storage_type<
typename internal::traits<Lhs_>::StorageKind, typename internal::traits<Rhs_>::StorageKind,
internal::product_type<Lhs_, Rhs_>::ret>::ret> { … };
namespace internal {
template <typename Lhs, typename Rhs, int Option, int ProductTag = internal::product_type<Lhs, Rhs>::ret>
class dense_product_base : public internal::dense_xpr_base<Product<Lhs, Rhs, Option>>::type { … };
dense_product_base<Lhs, Rhs, Option, InnerProduct>;
}
template <typename Lhs, typename Rhs, int Option, typename StorageKind>
class ProductImpl : public internal::generic_xpr_base<Product<Lhs, Rhs, Option>, MatrixXpr, StorageKind>::type { … };
ProductImpl<Lhs, Rhs, Option, Dense>;
}
#endif