add the possibility to specialize assign_impl and still call the default implementations.

(yes I know this change will be deprecated as soon as the evaluators will be in shape but I need this now)
This commit is contained in:
Gael Guennebaud 2011-08-18 10:19:25 +02:00
parent ca7d3dca79
commit 5734ee6df4
2 changed files with 33 additions and 25 deletions

View File

@ -251,21 +251,22 @@ struct assign_innervec_InnerUnrolling<Derived1, Derived2, Stop, Stop>
template<typename Derived1, typename Derived2, template<typename Derived1, typename Derived2,
int Traversal = assign_traits<Derived1, Derived2>::Traversal, int Traversal = assign_traits<Derived1, Derived2>::Traversal,
int Unrolling = assign_traits<Derived1, Derived2>::Unrolling> int Unrolling = assign_traits<Derived1, Derived2>::Unrolling,
int Version = Specialized>
struct assign_impl; struct assign_impl;
/************************ /************************
*** Default traversal *** *** Default traversal ***
************************/ ************************/
template<typename Derived1, typename Derived2, int Unrolling> template<typename Derived1, typename Derived2, int Unrolling, int Version>
struct assign_impl<Derived1, Derived2, InvalidTraversal, Unrolling> struct assign_impl<Derived1, Derived2, InvalidTraversal, Unrolling, Version>
{ {
inline static void run(Derived1 &, const Derived2 &) { } inline static void run(Derived1 &, const Derived2 &) { }
}; };
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2, int Version>
struct assign_impl<Derived1, Derived2, DefaultTraversal, NoUnrolling> struct assign_impl<Derived1, Derived2, DefaultTraversal, NoUnrolling, Version>
{ {
typedef typename Derived1::Index Index; typedef typename Derived1::Index Index;
inline static void run(Derived1 &dst, const Derived2 &src) inline static void run(Derived1 &dst, const Derived2 &src)
@ -278,8 +279,8 @@ struct assign_impl<Derived1, Derived2, DefaultTraversal, NoUnrolling>
} }
}; };
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2, int Version>
struct assign_impl<Derived1, Derived2, DefaultTraversal, CompleteUnrolling> struct assign_impl<Derived1, Derived2, DefaultTraversal, CompleteUnrolling, Version>
{ {
EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src) EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src)
{ {
@ -288,8 +289,8 @@ struct assign_impl<Derived1, Derived2, DefaultTraversal, CompleteUnrolling>
} }
}; };
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2, int Version>
struct assign_impl<Derived1, Derived2, DefaultTraversal, InnerUnrolling> struct assign_impl<Derived1, Derived2, DefaultTraversal, InnerUnrolling, Version>
{ {
typedef typename Derived1::Index Index; typedef typename Derived1::Index Index;
EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src) EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src)
@ -305,8 +306,8 @@ struct assign_impl<Derived1, Derived2, DefaultTraversal, InnerUnrolling>
*** Linear traversal *** *** Linear traversal ***
***********************/ ***********************/
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2, int Version>
struct assign_impl<Derived1, Derived2, LinearTraversal, NoUnrolling> struct assign_impl<Derived1, Derived2, LinearTraversal, NoUnrolling, Version>
{ {
typedef typename Derived1::Index Index; typedef typename Derived1::Index Index;
inline static void run(Derived1 &dst, const Derived2 &src) inline static void run(Derived1 &dst, const Derived2 &src)
@ -317,8 +318,8 @@ struct assign_impl<Derived1, Derived2, LinearTraversal, NoUnrolling>
} }
}; };
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2, int Version>
struct assign_impl<Derived1, Derived2, LinearTraversal, CompleteUnrolling> struct assign_impl<Derived1, Derived2, LinearTraversal, CompleteUnrolling, Version>
{ {
EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src) EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src)
{ {
@ -331,8 +332,8 @@ struct assign_impl<Derived1, Derived2, LinearTraversal, CompleteUnrolling>
*** Inner vectorization *** *** Inner vectorization ***
**************************/ **************************/
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2, int Version>
struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, NoUnrolling> struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, NoUnrolling, Version>
{ {
typedef typename Derived1::Index Index; typedef typename Derived1::Index Index;
inline static void run(Derived1 &dst, const Derived2 &src) inline static void run(Derived1 &dst, const Derived2 &src)
@ -346,8 +347,8 @@ struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, NoUnrolling>
} }
}; };
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2, int Version>
struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, CompleteUnrolling> struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, CompleteUnrolling, Version>
{ {
EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src) EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src)
{ {
@ -356,8 +357,8 @@ struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, CompleteUnrolli
} }
}; };
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2, int Version>
struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, InnerUnrolling> struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, InnerUnrolling, Version>
{ {
typedef typename Derived1::Index Index; typedef typename Derived1::Index Index;
EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src) EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src)
@ -398,8 +399,8 @@ struct unaligned_assign_impl<false>
} }
}; };
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2, int Version>
struct assign_impl<Derived1, Derived2, LinearVectorizedTraversal, NoUnrolling> struct assign_impl<Derived1, Derived2, LinearVectorizedTraversal, NoUnrolling, Version>
{ {
typedef typename Derived1::Index Index; typedef typename Derived1::Index Index;
EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src) EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src)
@ -426,8 +427,8 @@ struct assign_impl<Derived1, Derived2, LinearVectorizedTraversal, NoUnrolling>
} }
}; };
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2, int Version>
struct assign_impl<Derived1, Derived2, LinearVectorizedTraversal, CompleteUnrolling> struct assign_impl<Derived1, Derived2, LinearVectorizedTraversal, CompleteUnrolling, Version>
{ {
typedef typename Derived1::Index Index; typedef typename Derived1::Index Index;
EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src) EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src)
@ -445,8 +446,8 @@ struct assign_impl<Derived1, Derived2, LinearVectorizedTraversal, CompleteUnroll
*** Slice vectorization *** *** Slice vectorization ***
***************************/ ***************************/
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2, int Version>
struct assign_impl<Derived1, Derived2, SliceVectorizedTraversal, NoUnrolling> struct assign_impl<Derived1, Derived2, SliceVectorizedTraversal, NoUnrolling, Version>
{ {
typedef typename Derived1::Index Index; typedef typename Derived1::Index Index;
inline static void run(Derived1 &dst, const Derived2 &src) inline static void run(Derived1 &dst, const Derived2 &src)

View File

@ -253,6 +253,13 @@ enum {
CompleteUnrolling CompleteUnrolling
}; };
/** \internal \ingroup enums
* Enum to specify whether to use the default (built-in) implementation or the specialization. */
enum {
Specialized,
BuiltIn
};
/** \ingroup enums /** \ingroup enums
* Enum containing possible values for the \p _Options template parameter of * Enum containing possible values for the \p _Options template parameter of
* Matrix, Array and BandMatrix. */ * Matrix, Array and BandMatrix. */