a better bugfix in ei_matrix_operator_equals_packet_unroller

This commit is contained in:
Gael Guennebaud 2008-04-09 18:04:26 +00:00
parent d95d952e92
commit 8f957564ec

View File

@ -65,24 +65,24 @@ struct ei_matrix_operator_equals_unroller<Derived1, Derived2, Dynamic>
//---- //----
template<typename Derived1, typename Derived2, int UnrollCount> template<typename Derived1, typename Derived2, int Index>
struct ei_matrix_operator_equals_packet_unroller struct ei_matrix_operator_equals_packet_unroller
{ {
enum { enum {
index = UnrollCount-ei_packet_traits<typename Derived1::Scalar>::size, row = Derived1::Flags&RowMajorBit ? Index / Derived1::ColsAtCompileTime : Index % Derived1::RowsAtCompileTime,
row = Derived1::Flags&RowMajorBit ? index / Derived1::ColsAtCompileTime : index % Derived1::RowsAtCompileTime, col = Derived1::Flags&RowMajorBit ? Index % Derived1::ColsAtCompileTime : Index / Derived1::RowsAtCompileTime
col = Derived1::Flags&RowMajorBit ? index % Derived1::ColsAtCompileTime : index / Derived1::RowsAtCompileTime
}; };
static void run(Derived1 &dst, const Derived2 &src) static void run(Derived1 &dst, const Derived2 &src)
{ {
ei_matrix_operator_equals_packet_unroller<Derived1, Derived2, index>::run(dst, src); ei_matrix_operator_equals_packet_unroller<Derived1, Derived2,
Index-ei_packet_traits<typename Derived1::Scalar>::size>::run(dst, src);
dst.writePacketCoeff(row, col, src.packetCoeff(row, col)); dst.writePacketCoeff(row, col, src.packetCoeff(row, col));
} }
}; };
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2>
struct ei_matrix_operator_equals_packet_unroller<Derived1, Derived2, ei_packet_traits<typename Derived1::Scalar>::size > struct ei_matrix_operator_equals_packet_unroller<Derived1, Derived2, 0 >
{ {
static void run(Derived1 &dst, const Derived2 &src) static void run(Derived1 &dst, const Derived2 &src)
{ {
@ -90,13 +90,6 @@ struct ei_matrix_operator_equals_packet_unroller<Derived1, Derived2, ei_packet_t
} }
}; };
// prevent buggy user code from causing an infinite recursion
template<typename Derived1, typename Derived2>
struct ei_matrix_operator_equals_packet_unroller<Derived1, Derived2, 0>
{
static void run(Derived1 &, const Derived2 &) { ei_internal_assert(false && "ei_matrix_operator_equals_packet_unroller"); }
};
template<typename Derived1, typename Derived2> template<typename Derived1, typename Derived2>
struct ei_matrix_operator_equals_packet_unroller<Derived1, Derived2, Dynamic> struct ei_matrix_operator_equals_packet_unroller<Derived1, Derived2, Dynamic>
{ {
@ -228,8 +221,9 @@ struct ei_operator_equals_impl<Derived, OtherDerived, true>
{ {
ei_matrix_operator_equals_packet_unroller ei_matrix_operator_equals_packet_unroller
<Derived, OtherDerived, <Derived, OtherDerived,
unroll ? Derived::SizeAtCompileTime : Dynamic>::run unroll && int(Derived::SizeAtCompileTime)>=ei_packet_traits<typename Derived::Scalar>::size
(dst.const_cast_derived(), src.derived()); ? Derived::SizeAtCompileTime-ei_packet_traits<typename Derived::Scalar>::size
: Dynamic>::run(dst.const_cast_derived(), src.derived());
} }
else else
{ {