* introduce ei_alignmentOffset(MatrixBase&,Integer)

couldnt put it in Memory.h as it needs the definition of MatrixBase
* make Redux use it
This commit is contained in:
Benoit Jacob
2009-12-16 08:53:14 -05:00
parent e0aa29121f
commit 5cb779e5e1
3 changed files with 38 additions and 5 deletions

View File

@@ -379,6 +379,38 @@ EIGEN_STRONG_INLINE void MatrixBase<Derived>::copyPacket(int index, const Matrix
other.derived().template packet<LoadMode>(index));
}
template<typename Derived, typename Integer, bool JustReturnZero>
struct ei_alignmentOffset_impl
{
inline static Integer run(const MatrixBase<Derived>&, Integer)
{ return 0; }
};
template<typename Derived, typename Integer>
struct ei_alignmentOffset_impl<Derived, Integer, false>
{
inline static Integer run(const MatrixBase<Derived>& m, Integer maxOffset)
{
return ei_alignmentOffset(&m.const_cast_derived().coeffRef(0,0), maxOffset);
}
};
/** \internal \returns the number of elements which have to be skipped, starting
* from the address of coeffRef(0,0), to find the first 16-byte aligned element.
*
* \note If the expression doesn't have the DirectAccessBit, this function returns 0.
*
* There is also the variant ei_alignmentOffset(const Scalar*, Integer) defined in Memory.h.
*/
template<typename Derived, typename Integer>
inline static Integer ei_alignmentOffset(const MatrixBase<Derived>& m, Integer maxOffset)
{
return ei_alignmentOffset_impl<Derived, Integer,
(Derived::Flags & AlignedBit) || !(Derived::Flags & DirectAccessBit)>
::run(m, maxOffset);
}
#endif
#endif // EIGEN_COEFFS_H