diff --git a/include/eigenpy/alignment.hpp b/include/eigenpy/alignment.hpp index b04a7d63a00fb90f43f192b0c1a86a13d1160814..4bca14d36954ab744cde25a23ba4cb55f3ea95da 100644 --- a/include/eigenpy/alignment.hpp +++ b/include/eigenpy/alignment.hpp @@ -9,6 +9,7 @@ #include <boost/python/converter/arg_from_python.hpp> #include <boost/python/converter/rvalue_from_python_data.hpp> #include <boost/type_traits/aligned_storage.hpp> +#include <eigenpy/utils/is-aligned.hpp> namespace eigenpy { @@ -29,6 +30,19 @@ struct aligned_instance { typename aligned_storage<sizeof(Data)>::type storage; }; +inline void *aligned_malloc( + std::size_t size, std::size_t alignment = EIGENPY_DEFAULT_ALIGN_BYTES) { + void *original = std::malloc(size + alignment); + if (original == 0) return 0; + if (is_aligned(original, alignment)) return original; + void *aligned = + reinterpret_cast<void *>((reinterpret_cast<std::size_t>(original) & + ~(std::size_t(alignment - 1))) + + alignment); + *(reinterpret_cast<void **>(aligned) - 1) = original; + return aligned; +} + } // namespace eigenpy namespace boost { diff --git a/include/eigenpy/fwd.hpp b/include/eigenpy/fwd.hpp index 7db101c7a1545d7efccba8753dab0809d4216c47..5794f5233ba449b70c64c60005e9c06b485688cb 100644 --- a/include/eigenpy/fwd.hpp +++ b/include/eigenpy/fwd.hpp @@ -13,6 +13,18 @@ #define EIGENPY_MSVC_COMPILER #endif +#if (__cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703)) +#define EIGENPY_WITH_CXX17_SUPPORT +#endif + +#if (__cplusplus >= 201402L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201403)) +#define EIGENPY_WITH_CXX14_SUPPORT +#endif + +#if (__cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) +#define EIGENPY_WITH_CXX11_SUPPORT +#endif + #define EIGENPY_STRING_LITERAL(string) #string #define EIGENPY_STRINGIZE(string) EIGENPY_STRING_LITERAL(string) #define _EIGENPY_PPCAT(A, B) A##B @@ -81,6 +93,14 @@ #include "eigenpy/expose.hpp" +#ifdef EIGENPY_WITH_CXX11_SUPPORT +#include <memory> +#define EIGENPY_SHARED_PTR_HOLDER_TYPE(T) ::std::shared_ptr<T> +#else +#include <boost/shared_ptr.hpp> +#define EIGENPY_SHARED_PTR_HOLDER_TYPE(T) ::boost::shared_ptr<T> +#endif + namespace eigenpy { template <typename MatType, typename Scalar = diff --git a/include/eigenpy/quaternion.hpp b/include/eigenpy/quaternion.hpp index 241eefec9e8021022ade16512525af9562539eb0..a1210137ab31fb706cbe1f0fc1d5838f330568d0 100644 --- a/include/eigenpy/quaternion.hpp +++ b/include/eigenpy/quaternion.hpp @@ -218,7 +218,6 @@ class QuaternionVisitor .def("__ne__", &QuaternionVisitor::__ne__) .def("__abs__", &Quaternion::norm) .def("__len__", &QuaternionVisitor::__len__) - .staticmethod("__len__") .def("__setitem__", &QuaternionVisitor::__setitem__) .def("__getitem__", &QuaternionVisitor::__getitem__) .def("assign", &assign<Quaternion>, bp::args("self", "quat"), @@ -351,15 +350,22 @@ class QuaternionVisitor public: static void expose() { - bp::class_<Quaternion>("Quaternion", - "Quaternion representing rotation.\n\n" - "Supported operations " - "('q is a Quaternion, 'v' is a Vector3): " - "'q*q' (rotation composition), " - "'q*=q', " - "'q*v' (rotating 'v' by 'q'), " - "'q==q', 'q!=q', 'q[0..3]'.", - bp::no_init) +#if BOOST_VERSION / 100 % 1000 < 71 + typedef EIGENPY_SHARED_PTR_HOLDER_TYPE(Quaternion) HolderType; +#else + typedef ::boost::python::detail::not_specified HolderType; +#endif + + bp::class_<Quaternion, HolderType>( + "Quaternion", + "Quaternion representing rotation.\n\n" + "Supported operations " + "('q is a Quaternion, 'v' is a Vector3): " + "'q*q' (rotation composition), " + "'q*=q', " + "'q*v' (rotating 'v' by 'q'), " + "'q==q', 'q!=q', 'q[0..3]'.", + bp::no_init) .def(QuaternionVisitor<Quaternion>()); // Cast to Eigen::QuaternionBase and vice-versa diff --git a/include/eigenpy/utils/is-aligned.hpp b/include/eigenpy/utils/is-aligned.hpp index 2f2e892b294cfd98aca4c01501020adc8ec442e3..cfc057f732f658a1a63dc183e123e3202687caeb 100644 --- a/include/eigenpy/utils/is-aligned.hpp +++ b/include/eigenpy/utils/is-aligned.hpp @@ -1,12 +1,12 @@ // -// Copyright (c) 2020 INRIA +// Copyright (c) 2020-2023 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) { +inline bool is_aligned(const void* ptr, std::size_t alignment) { return (reinterpret_cast<std::size_t>(ptr) & (alignment - 1)) == 0; } } // namespace eigenpy