From 8cd3f654a8b3f3e76c0baeb97090d8659a6c9aad Mon Sep 17 00:00:00 2001
From: Justin Carpentier <justin.carpentier@inria.fr>
Date: Fri, 6 Jan 2023 09:34:47 +0100
Subject: [PATCH] core: make generic alignment of struct

---
 include/eigenpy/memory.hpp | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/include/eigenpy/memory.hpp b/include/eigenpy/memory.hpp
index 447694e4..3e826ae3 100644
--- a/include/eigenpy/memory.hpp
+++ b/include/eigenpy/memory.hpp
@@ -15,6 +15,12 @@ static inline void _Py_SET_SIZE(PyVarObject* ob, Py_ssize_t size) {
 #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)
 #endif
 
+#if EIGEN_DEFAULT_ALIGN_BYTES > 16
+#define EIGENPY_DEFAULT_ALIGN_BYTES EIGEN_DEFAULT_ALIGN_BYTES
+#else
+#define EIGENPY_DEFAULT_ALIGN_BYTES 16
+#endif
+
 /**
  * This section contains a convenience MACRO which allows an easy specialization
  * of Boost Python Object allocator for struct data types containing Eigen
@@ -42,7 +48,7 @@ static inline void _Py_SET_SIZE(PyVarObject* ob, Py_ssize_t size) {
                                                                                \
     union {                                                                    \
       align_t align;                                                           \
-      char bytes[sizeof(Data) + 16];                                           \
+      char bytes[sizeof(Data) + EIGENPY_DEFAULT_ALIGN_BYTES];                  \
     } storage;                                                                 \
   };                                                                           \
                                                                                \
@@ -96,7 +102,9 @@ static inline void _Py_SET_SIZE(PyVarObject* ob, Py_ssize_t size) {
         void* storage, PyObject* instance,                                     \
         reference_wrapper<__VA_ARGS__ const> x) {                              \
       void* aligned_storage = reinterpret_cast<void*>(                         \
-          (reinterpret_cast<size_t>(storage) & ~(size_t(15))) + 16);           \
+          (reinterpret_cast<size_t>(storage) &                                 \
+           ~(size_t(EIGENPY_DEFAULT_ALIGN_BYTES - 1))) +                       \
+          EIGENPY_DEFAULT_ALIGN_BYTES);                                        \
       value_holder<__VA_ARGS__>* new_holder =                                  \
           new (aligned_storage) value_holder<__VA_ARGS__>(instance, x);        \
       return new_holder;                                                       \
-- 
GitLab