aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen
diff options
context:
space:
mode:
authorGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2009-01-06 03:16:50 +0000
committerGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2009-01-06 03:16:50 +0000
commit1c29d703123f876d75885a03b10c5deb3d36813f (patch)
tree72a4a68207e5cd25c5829e5655ff78c9e8d12b1d /Eigen
parente71de20f1667e9e10dc315108a34550fb3226270 (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.h26
-rw-r--r--Eigen/src/Core/util/Memory.h47
-rw-r--r--Eigen/src/Geometry/AlignedBox.h3
-rw-r--r--Eigen/src/Geometry/Hyperplane.h3
-rw-r--r--Eigen/src/Geometry/ParametrizedLine.h3
-rw-r--r--Eigen/src/Geometry/Quaternion.h2
-rw-r--r--Eigen/src/Geometry/Scaling.h2
-rw-r--r--Eigen/src/Geometry/Transform.h3
-rw-r--r--Eigen/src/Geometry/Translation.h2
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 */