diff options
author | 2009-01-06 03:16:50 +0000 | |
---|---|---|
committer | 2009-01-06 03:16:50 +0000 | |
commit | 1c29d703123f876d75885a03b10c5deb3d36813f (patch) | |
tree | 72a4a68207e5cd25c5829e5655ff78c9e8d12b1d /Eigen | |
parent | e71de20f1667e9e10dc315108a34550fb3226270 (diff) |
* introduce macros to replace inheritance for operator new overloading
(former solution still available and tested)
This plays much better with classes that already have base classes --
don't force the user to mess with multiple inheritance, which gave
much trouble with MSVC.
* Expand the unaligned assert dox page
* Minor fixes in the lazy evaluation dox page
Diffstat (limited to 'Eigen')
-rw-r--r-- | Eigen/src/Core/Matrix.h | 26 | ||||
-rw-r--r-- | Eigen/src/Core/util/Memory.h | 47 | ||||
-rw-r--r-- | Eigen/src/Geometry/AlignedBox.h | 3 | ||||
-rw-r--r-- | Eigen/src/Geometry/Hyperplane.h | 3 | ||||
-rw-r--r-- | Eigen/src/Geometry/ParametrizedLine.h | 3 | ||||
-rw-r--r-- | Eigen/src/Geometry/Quaternion.h | 2 | ||||
-rw-r--r-- | Eigen/src/Geometry/Scaling.h | 2 | ||||
-rw-r--r-- | Eigen/src/Geometry/Transform.h | 3 | ||||
-rw-r--r-- | Eigen/src/Geometry/Translation.h | 2 |
9 files changed, 36 insertions, 55 deletions
diff --git a/Eigen/src/Core/Matrix.h b/Eigen/src/Core/Matrix.h index f990167c3..666d25cd9 100644 --- a/Eigen/src/Core/Matrix.h +++ b/Eigen/src/Core/Matrix.h @@ -135,31 +135,7 @@ class Matrix public: enum { NeedsToAlign = (Options&Matrix_AutoAlign) == Matrix_AutoAlign && SizeAtCompileTime!=Dynamic && ((sizeof(Scalar)*SizeAtCompileTime)%16)==0 }; - typedef typename ei_meta_if<NeedsToAlign, ei_byte_forcing_aligned_malloc, char>::ret ByteAlignedAsNeeded; - void *operator new(size_t size) throw() - { - return ei_aligned_malloc<ByteAlignedAsNeeded>(size); - } - - void *operator new(size_t, void *ptr) throw() - { - return ptr; - } - - void *operator new[](size_t size) throw() - { - return ei_aligned_malloc<ByteAlignedAsNeeded>(size); - } - - void *operator new[](size_t, void *ptr) throw() - { - return ptr; - } - - void operator delete(void * ptr) { ei_aligned_free(static_cast<ByteAlignedAsNeeded *>(ptr), 0); } - void operator delete[](void * ptr) { ei_aligned_free(static_cast<ByteAlignedAsNeeded *>(ptr), 0); } - - public: + EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign) EIGEN_STRONG_INLINE int rows() const { return m_storage.rows(); } EIGEN_STRONG_INLINE int cols() const { return m_storage.cols(); } diff --git a/Eigen/src/Core/util/Memory.h b/Eigen/src/Core/util/Memory.h index c8341dae4..12cb5a837 100644 --- a/Eigen/src/Core/util/Memory.h +++ b/Eigen/src/Core/util/Memory.h @@ -144,6 +144,33 @@ inline static int ei_alignmentOffset(const Scalar* ptr, int maxOffset) #define ei_aligned_stack_free(PTR,TYPE,SIZE) ei_aligned_free(PTR,SIZE) #endif +#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF__INTERNAL(NeedsToAlign, TYPENAME) \ + typedef TYPENAME Eigen::ei_meta_if<(NeedsToAlign), \ + Eigen::ei_byte_forcing_aligned_malloc, \ + char \ + >::ret Eigen_ByteAlignedAsNeeded; \ + void *operator new(size_t size) throw() { \ + return ei_aligned_malloc<Eigen_ByteAlignedAsNeeded>(size); \ + } \ + void *operator new(size_t, void *ptr) throw() { \ + return ptr; \ + } \ + void *operator new[](size_t size) throw() { \ + return ei_aligned_malloc<Eigen_ByteAlignedAsNeeded>(size); \ + } \ + void *operator new[](size_t, void *ptr) throw() { \ + return ptr; \ + } \ + void operator delete(void * ptr) { ei_aligned_free(static_cast<Eigen_ByteAlignedAsNeeded *>(ptr), 0); } \ + void operator delete[](void * ptr) { ei_aligned_free(static_cast<Eigen_ByteAlignedAsNeeded *>(ptr), 0); } +#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW \ + EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF__INTERNAL(true, ) +#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)\ + EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF__INTERNAL(NeedsToAlign, typename) +#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE(Type,Size)\ + EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(((Size)!=Eigen::Dynamic) && ((sizeof(Type)*(Size))%16==0)) + + /** \class WithAlignedOperatorNew * * \brief Enforces instances of inherited classes to be 16 bytes aligned when allocated with operator new @@ -185,27 +212,9 @@ inline static int ei_alignmentOffset(const Scalar* ptr, int maxOffset) */ struct WithAlignedOperatorNew { - void *operator new(size_t size) throw() - { - return ei_aligned_malloc<ei_byte_forcing_aligned_malloc>(size); - } - - void *operator new[](size_t size) throw() - { - return ei_aligned_malloc<ei_byte_forcing_aligned_malloc>(size); - } - - void operator delete(void * ptr) { ei_aligned_free(static_cast<ei_byte_forcing_aligned_malloc *>(ptr), 0); } - void operator delete[](void * ptr) { ei_aligned_free(static_cast<ei_byte_forcing_aligned_malloc *>(ptr), 0); } + EIGEN_MAKE_ALIGNED_OPERATOR_NEW }; -template<typename T, int SizeAtCompileTime, - bool NeedsToAlign = (SizeAtCompileTime!=Dynamic) && ((sizeof(T)*SizeAtCompileTime)%16==0)> -struct ei_with_aligned_operator_new : public WithAlignedOperatorNew {}; - -template<typename T, int SizeAtCompileTime> -struct ei_with_aligned_operator_new<T,SizeAtCompileTime,false> {}; - /** \class ei_new_allocator * * \brief stl compatible allocator to use with with fixed-size vector and matrix types diff --git a/Eigen/src/Geometry/AlignedBox.h b/Eigen/src/Geometry/AlignedBox.h index 1ff5774da..e0f820765 100644 --- a/Eigen/src/Geometry/AlignedBox.h +++ b/Eigen/src/Geometry/AlignedBox.h @@ -39,10 +39,9 @@ */ template <typename _Scalar, int _AmbientDim> class AlignedBox - : public ei_with_aligned_operator_new<_Scalar,_AmbientDim==Dynamic ? Dynamic : _AmbientDim+1> { public: - + EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE(_Scalar,_AmbientDim==Dynamic ? Dynamic : _AmbientDim+1) enum { AmbientDimAtCompileTime = _AmbientDim }; typedef _Scalar Scalar; typedef typename NumTraits<Scalar>::Real RealScalar; diff --git a/Eigen/src/Geometry/Hyperplane.h b/Eigen/src/Geometry/Hyperplane.h index 1ffdd2323..a3425f6cb 100644 --- a/Eigen/src/Geometry/Hyperplane.h +++ b/Eigen/src/Geometry/Hyperplane.h @@ -45,10 +45,9 @@ */ template <typename _Scalar, int _AmbientDim> class Hyperplane - : public ei_with_aligned_operator_new<_Scalar,_AmbientDim==Dynamic ? Dynamic : _AmbientDim+1> { public: - + EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE(_Scalar,_AmbientDim==Dynamic ? Dynamic : _AmbientDim+1) enum { AmbientDimAtCompileTime = _AmbientDim }; typedef _Scalar Scalar; typedef typename NumTraits<Scalar>::Real RealScalar; diff --git a/Eigen/src/Geometry/ParametrizedLine.h b/Eigen/src/Geometry/ParametrizedLine.h index f8b506c36..da30c8e82 100644 --- a/Eigen/src/Geometry/ParametrizedLine.h +++ b/Eigen/src/Geometry/ParametrizedLine.h @@ -41,10 +41,9 @@ */ template <typename _Scalar, int _AmbientDim> class ParametrizedLine - : public ei_with_aligned_operator_new<_Scalar,_AmbientDim> { public: - + EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE(_Scalar,_AmbientDim) enum { AmbientDimAtCompileTime = _AmbientDim }; typedef _Scalar Scalar; typedef typename NumTraits<Scalar>::Real RealScalar; diff --git a/Eigen/src/Geometry/Quaternion.h b/Eigen/src/Geometry/Quaternion.h index fc259645a..31ea9ef36 100644 --- a/Eigen/src/Geometry/Quaternion.h +++ b/Eigen/src/Geometry/Quaternion.h @@ -59,13 +59,13 @@ template<typename _Scalar> struct ei_traits<Quaternion<_Scalar> > template<typename _Scalar> class Quaternion : public RotationBase<Quaternion<_Scalar>,3> - , public ei_with_aligned_operator_new<_Scalar,4> { typedef RotationBase<Quaternion<_Scalar>,3> Base; typedef Matrix<_Scalar, 4, 1> Coefficients; Coefficients m_coeffs; public: + EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE(_Scalar,4) using Base::operator*; diff --git a/Eigen/src/Geometry/Scaling.h b/Eigen/src/Geometry/Scaling.h index 06c073502..d46296707 100644 --- a/Eigen/src/Geometry/Scaling.h +++ b/Eigen/src/Geometry/Scaling.h @@ -41,9 +41,9 @@ */ template<typename _Scalar, int _Dim> class Scaling - : public ei_with_aligned_operator_new<_Scalar,_Dim> { public: + EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE(_Scalar,_Dim) /** dimension of the space */ enum { Dim = _Dim }; /** the scalar type of the coefficients */ diff --git a/Eigen/src/Geometry/Transform.h b/Eigen/src/Geometry/Transform.h index aa8cd5766..fc7f5b002 100644 --- a/Eigen/src/Geometry/Transform.h +++ b/Eigen/src/Geometry/Transform.h @@ -61,10 +61,9 @@ struct ei_transform_product_impl; */ template<typename _Scalar, int _Dim> class Transform - : public ei_with_aligned_operator_new<_Scalar,_Dim==Dynamic ? Dynamic : (_Dim+1)*(_Dim+1)> { public: - + EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE(_Scalar,_Dim==Dynamic ? Dynamic : (_Dim+1)*(_Dim+1)) enum { Dim = _Dim, ///< space dimension in which the transformation holds HDim = _Dim+1 ///< size of a respective homogeneous vector diff --git a/Eigen/src/Geometry/Translation.h b/Eigen/src/Geometry/Translation.h index 577352635..ab8ce3899 100644 --- a/Eigen/src/Geometry/Translation.h +++ b/Eigen/src/Geometry/Translation.h @@ -41,9 +41,9 @@ */ template<typename _Scalar, int _Dim> class Translation - : public ei_with_aligned_operator_new<_Scalar,_Dim> { public: + EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE(_Scalar,_Dim) /** dimension of the space */ enum { Dim = _Dim }; /** the scalar type of the coefficients */ |