From c4d22398dcbe45b428e6d7c149e0bc46bad30d79 Mon Sep 17 00:00:00 2001
From: Justin Carpentier <justin.carpentier@inria.fr>
Date: Thu, 18 Jul 2019 17:50:53 +0200
Subject: [PATCH] core: add fix for bug in boost::rvalue_from_python_data

---
 CMakeLists.txt                                |  1 +
 include/eigenpy/details.hpp                   |  1 +
 .../details/rvalue_from_python_data.hpp       | 55 +++++++++++++++++++
 3 files changed, 57 insertions(+)
 create mode 100644 include/eigenpy/details/rvalue_from_python_data.hpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5568d339..818699d1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -103,6 +103,7 @@ SET(${PROJECT_NAME}_HEADERS
   include/eigenpy/quaternion.hpp
   include/eigenpy/stride.hpp
   include/eigenpy/ref.hpp
+  include/eigenpy/details/rvalue_from_python_data.hpp
 )
 
 INCLUDE_DIRECTORIES(${${PROJECT_NAME}_BINARY_DIR}/include)
diff --git a/include/eigenpy/details.hpp b/include/eigenpy/details.hpp
index 5fa79557..47cb7a31 100644
--- a/include/eigenpy/details.hpp
+++ b/include/eigenpy/details.hpp
@@ -6,6 +6,7 @@
 #ifndef __eigenpy_details_hpp__
 #define __eigenpy_details_hpp__
 
+#include "eigenpy/details/rvalue_from_python_data.hpp"
 #include "eigenpy/fwd.hpp"
 
 #include <patchlevel.h> // For PY_MAJOR_VERSION
diff --git a/include/eigenpy/details/rvalue_from_python_data.hpp b/include/eigenpy/details/rvalue_from_python_data.hpp
new file mode 100644
index 00000000..3cd94e97
--- /dev/null
+++ b/include/eigenpy/details/rvalue_from_python_data.hpp
@@ -0,0 +1,55 @@
+#ifndef __eigenpy_details_rvalue_from_python_data_hpp__
+#define __eigenpy_details_rvalue_from_python_data_hpp__
+
+#include <boost/python/converter/rvalue_from_python_data.hpp>
+#include <Eigen/Core>
+
+namespace boost
+{
+  namespace python
+  {
+    namespace converter
+    {
+  
+      /// \brief Template specialization of rvalue_from_python_data
+      template<typename Derived>
+      struct rvalue_from_python_data<Eigen::MatrixBase<Derived> const & >
+      : rvalue_from_python_storage<Eigen::MatrixBase<Derived> const & >
+      {
+        typedef Eigen::MatrixBase<Derived> const & T;
+        
+# if (!defined(__MWERKS__) || __MWERKS__ >= 0x3000) \
+&& (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= 245) \
+&& (!defined(__DECCXX_VER) || __DECCXX_VER > 60590014) \
+&& !defined(BOOST_PYTHON_SYNOPSIS) /* Synopsis' OpenCXX has trouble parsing this */
+        // This must always be a POD struct with m_data its first member.
+        BOOST_STATIC_ASSERT(BOOST_PYTHON_OFFSETOF(rvalue_from_python_storage<T>,stage1) == 0);
+# endif
+        
+        // The usual constructor
+        rvalue_from_python_data(rvalue_from_python_stage1_data const & _stage1)
+        {
+          this->stage1 = _stage1;
+        }
+        
+        // This constructor just sets m_convertible -- used by
+        // implicitly_convertible<> to perform the final step of the
+        // conversion, where the construct() function is already known.
+        rvalue_from_python_data(void* convertible)
+        {
+          this->stage1.convertible = convertible;
+        }
+        
+        // Destroys any object constructed in the storage.
+        ~rvalue_from_python_data()
+        {
+          if (this->stage1.convertible == this->storage.bytes)
+            static_cast<Derived *>((void *)this->storage.bytes)->~Derived();
+        }
+      };
+      
+    }
+  }
+} // namespace boost::python::converter
+
+#endif // ifndef __eigenpy_details_rvalue_from_python_data_hpp__
-- 
GitLab