From 77d83f5b515f2ee4bde121a2b3eab0bb22ca86a2 Mon Sep 17 00:00:00 2001
From: Justin Carpentier <justin.carpentier@inria.fr>
Date: Tue, 25 Feb 2020 16:12:42 +0100
Subject: [PATCH] core: add is_aligned helper

---
 CMakeLists.txt                       |  1 +
 include/eigenpy/eigen-allocator.hpp  |  5 ++---
 include/eigenpy/utils/is-aligned.hpp | 16 ++++++++++++++++
 3 files changed, 19 insertions(+), 3 deletions(-)
 create mode 100644 include/eigenpy/utils/is-aligned.hpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index d65f9d58..ea73ef40 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -74,6 +74,7 @@ SEARCH_FOR_BOOST()
 SET(${PROJECT_NAME}_UTILS_HEADERS
   include/eigenpy/utils/scalar-name.hpp
   include/eigenpy/utils/is-approx.hpp
+  include/eigenpy/utils/is-aligned.hpp
   )
 
 SET(${PROJECT_NAME}_SOLVERS_HEADERS
diff --git a/include/eigenpy/eigen-allocator.hpp b/include/eigenpy/eigen-allocator.hpp
index d6fdf208..b5f92c69 100644
--- a/include/eigenpy/eigen-allocator.hpp
+++ b/include/eigenpy/eigen-allocator.hpp
@@ -8,8 +8,7 @@
 #include "eigenpy/fwd.hpp"
 #include "eigenpy/map.hpp"
 #include "eigenpy/scalar-conversion.hpp"
-
-#include <boost/align/is_aligned.hpp>
+#include "eigenpy/utils/is-aligned.hpp"
 
 namespace eigenpy
 {
@@ -233,7 +232,7 @@ namespace eigenpy
       if(Options != Eigen::Unaligned) // we need to check whether the memory is correctly aligned and composed of a continuous segment
       {
         void * data_ptr = PyArray_DATA(pyArray);
-        if(!PyArray_ISONESEGMENT(pyArray) || !boost::alignment::is_aligned(Options,data_ptr))
+        if(!PyArray_ISONESEGMENT(pyArray) || !is_aligned(data_ptr,Option))
           need_to_allocate |= true;
       }
       
diff --git a/include/eigenpy/utils/is-aligned.hpp b/include/eigenpy/utils/is-aligned.hpp
new file mode 100644
index 00000000..e8769115
--- /dev/null
+++ b/include/eigenpy/utils/is-aligned.hpp
@@ -0,0 +1,16 @@
+//
+// Copyright (c) 2020 INRIA
+//
+
+#ifndef __eigenpy_utils_is_aligned_hpp__
+#define __eigenpy_utils_is_aligned_hpp__
+
+namespace eigenpy
+{
+  inline bool is_aligned(void * ptr, std::size_t alignment)
+  {
+    return (reinterpret_cast<std::size_t>(ptr) & (alignment - 1)) == 0;
+  }
+}
+
+#endif
-- 
GitLab