diff options
Diffstat (limited to 'Eigen/src/Core/Coeffs.h')
-rw-r--r-- | Eigen/src/Core/Coeffs.h | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/Eigen/src/Core/Coeffs.h b/Eigen/src/Core/Coeffs.h index c8bc9db85..b8af2531e 100644 --- a/Eigen/src/Core/Coeffs.h +++ b/Eigen/src/Core/Coeffs.h @@ -379,6 +379,38 @@ EIGEN_STRONG_INLINE void DenseBase<Derived>::copyPacket(int index, const DenseBa other.derived().template packet<LoadMode>(index)); } + +template<typename Derived, typename Integer, bool JustReturnZero> +struct ei_alignmentOffset_impl +{ + inline static Integer run(const DenseBase<Derived>&, Integer) + { return 0; } +}; + +template<typename Derived, typename Integer> +struct ei_alignmentOffset_impl<Derived, Integer, false> +{ + inline static Integer run(const DenseBase<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 DenseBase<Derived>& m, Integer maxOffset) +{ + return ei_alignmentOffset_impl<Derived, Integer, + (Derived::Flags & AlignedBit) || !(Derived::Flags & DirectAccessBit)> + ::run(m, maxOffset); +} + #endif #endif // EIGEN_COEFFS_H |