aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Core/Coeffs.h
diff options
context:
space:
mode:
Diffstat (limited to 'Eigen/src/Core/Coeffs.h')
-rw-r--r--Eigen/src/Core/Coeffs.h32
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