diff options
author | 2015-06-19 15:38:19 +0200 | |
---|---|---|
committer | 2015-06-19 15:38:19 +0200 | |
commit | 0c8b0e007b282139b4d3ab8e74f287c8e5109d69 (patch) | |
tree | ac16b08787bf23face06d0be6454bc8f923a57f7 /Eigen/src/Core/ProductEvaluators.h | |
parent | 3f6aa4cd5d03bd9e6e41d2f997fa7bd9b98bd68e (diff) |
Introduce a AliasFreeProduct option for Permutations and Transpositions
Diffstat (limited to 'Eigen/src/Core/ProductEvaluators.h')
-rw-r--r-- | Eigen/src/Core/ProductEvaluators.h | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/Eigen/src/Core/ProductEvaluators.h b/Eigen/src/Core/ProductEvaluators.h index 5765857ce..c12ebb5a0 100644 --- a/Eigen/src/Core/ProductEvaluators.h +++ b/Eigen/src/Core/ProductEvaluators.h @@ -90,13 +90,21 @@ struct evaluator_traits<Product<Lhs, Rhs, DefaultProduct> > enum { AssumeAliasing = 1 }; }; +template<typename Lhs, typename Rhs> +struct evaluator_traits<Product<Lhs, Rhs, AliasFreeProduct> > + : evaluator_traits_base<Product<Lhs, Rhs, AliasFreeProduct> > +{ + enum { AssumeAliasing = 0 }; +}; + // This is the default evaluator implementation for products: // It creates a temporary and call generic_product_impl -template<typename Lhs, typename Rhs, int ProductTag, typename LhsShape, typename RhsShape> -struct product_evaluator<Product<Lhs, Rhs, DefaultProduct>, ProductTag, LhsShape, RhsShape, typename traits<Lhs>::Scalar, typename traits<Rhs>::Scalar> - : public evaluator<typename Product<Lhs, Rhs, DefaultProduct>::PlainObject>::type +template<typename Lhs, typename Rhs, int Options, int ProductTag, typename LhsShape, typename RhsShape> +struct product_evaluator<Product<Lhs, Rhs, Options>, ProductTag, LhsShape, RhsShape, typename traits<Lhs>::Scalar, + typename enable_if<(Options==DefaultProduct || Options==AliasFreeProduct),typename traits<Rhs>::Scalar>::type> + : public evaluator<typename Product<Lhs, Rhs, Options>::PlainObject>::type { - typedef Product<Lhs, Rhs, DefaultProduct> XprType; + typedef Product<Lhs, Rhs, Options> XprType; typedef typename XprType::PlainObject PlainObject; typedef typename evaluator<PlainObject>::type Base; enum { @@ -128,10 +136,11 @@ protected: }; // Dense = Product -template< typename DstXprType, typename Lhs, typename Rhs, typename Scalar> -struct Assignment<DstXprType, Product<Lhs,Rhs,DefaultProduct>, internal::assign_op<Scalar>, Dense2Dense, Scalar> +template< typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar> +struct Assignment<DstXprType, Product<Lhs,Rhs,Options>, internal::assign_op<Scalar>, Dense2Dense, + typename enable_if<(Options==DefaultProduct || Options==AliasFreeProduct),Scalar>::type> { - typedef Product<Lhs,Rhs,DefaultProduct> SrcXprType; + typedef Product<Lhs,Rhs,Options> SrcXprType; static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar> &) { // FIXME shall we handle nested_eval here? @@ -140,10 +149,11 @@ struct Assignment<DstXprType, Product<Lhs,Rhs,DefaultProduct>, internal::assign_ }; // Dense += Product -template< typename DstXprType, typename Lhs, typename Rhs, typename Scalar> -struct Assignment<DstXprType, Product<Lhs,Rhs,DefaultProduct>, internal::add_assign_op<Scalar>, Dense2Dense, Scalar> +template< typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar> +struct Assignment<DstXprType, Product<Lhs,Rhs,Options>, internal::add_assign_op<Scalar>, Dense2Dense, + typename enable_if<(Options==DefaultProduct || Options==AliasFreeProduct),Scalar>::type> { - typedef Product<Lhs,Rhs,DefaultProduct> SrcXprType; + typedef Product<Lhs,Rhs,Options> SrcXprType; static void run(DstXprType &dst, const SrcXprType &src, const internal::add_assign_op<Scalar> &) { // FIXME shall we handle nested_eval here? @@ -152,10 +162,11 @@ struct Assignment<DstXprType, Product<Lhs,Rhs,DefaultProduct>, internal::add_ass }; // Dense -= Product -template< typename DstXprType, typename Lhs, typename Rhs, typename Scalar> -struct Assignment<DstXprType, Product<Lhs,Rhs,DefaultProduct>, internal::sub_assign_op<Scalar>, Dense2Dense, Scalar> +template< typename DstXprType, typename Lhs, typename Rhs, int Options, typename Scalar> +struct Assignment<DstXprType, Product<Lhs,Rhs,Options>, internal::sub_assign_op<Scalar>, Dense2Dense, + typename enable_if<(Options==DefaultProduct || Options==AliasFreeProduct),Scalar>::type> { - typedef Product<Lhs,Rhs,DefaultProduct> SrcXprType; + typedef Product<Lhs,Rhs,Options> SrcXprType; static void run(DstXprType &dst, const SrcXprType &src, const internal::sub_assign_op<Scalar> &) { // FIXME shall we handle nested_eval here? |