* move cwise *= and /= to Core (like * and /) * tidy the StdVector module * fix warnings (especially a | instead of ||) in stdvector test
diff --git a/Eigen/StdVector b/Eigen/StdVector index 19be257..e8b5354 100644 --- a/Eigen/StdVector +++ b/Eigen/StdVector
@@ -1,28 +1,3 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. Eigen itself is part of the KDE project. -// -// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com> -// Copyright (C) 2009 Alex Stapleton <alex.stapleton@gmail.com> -// -// Eigen is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 3 of the License, or (at your option) any later version. -// -// Alternatively, you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of -// the License, or (at your option) any later version. -// -// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License and a copy of the GNU General Public License along with -// Eigen. If not, see <http://www.gnu.org/licenses/>. - #ifndef EIGEN_STDVECTOR_MODULE_H #define EIGEN_STDVECTOR_MODULE_H @@ -30,47 +5,11 @@ #include <vector> namespace Eigen { -template<typename aligned_type> class ei_unaligned_type; - -template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> -class ei_unaligned_type<Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > - : public Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> -{ - public: - typedef Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> aligned_base; - ei_unaligned_type() : aligned_base(ei_constructor_without_unaligned_array_assert()) {} - ei_unaligned_type(const aligned_base& other) - { - resize(other.rows(), other.cols()); - ei_assign_impl<ei_unaligned_type,aligned_base,NoVectorization>::run(*this, other); - } -}; +#include "src/StdVector/UnalignedType.h" } // namespace Eigen namespace std { - - template <typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols, typename _Alloc> - class vector<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols>, _Alloc> - : public vector<Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> >, - Eigen::aligned_allocator<Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > > > - { - public: - typedef Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > value_type; - typedef Eigen::aligned_allocator<value_type> allocator_type; - typedef vector<value_type, allocator_type > unaligned_base; - typedef typename unaligned_base::size_type size_type; - typedef typename unaligned_base::iterator iterator; - - explicit vector(const allocator_type& __a = allocator_type()) : unaligned_base(__a) {} - vector(const vector& c) : unaligned_base(c) {} - vector(size_type num, const value_type& val = value_type()) : unaligned_base(num, val) {} - vector(iterator start, iterator end) : unaligned_base(start, end) {} - vector& operator=(const vector& __x) { - unaligned_base::operator=(__x); - return *this; - } - }; - +#include "src/StdVector/StdVector.h" } // namespace std #endif // EIGEN_STDVECTOR_MODULE_H
diff --git a/Eigen/src/Array/CwiseOperators.h b/Eigen/src/Array/CwiseOperators.h index 81e51f8..4b6346d 100644 --- a/Eigen/src/Array/CwiseOperators.h +++ b/Eigen/src/Array/CwiseOperators.h
@@ -418,43 +418,6 @@ return m_matrix.const_cast_derived() = *this + scalar; } - -//============= - -/** \array_module - * - * Replaces this expression by its coefficient-wise product with \a other. - * - * Example: \include Cwise_times_equal.cpp - * Output: \verbinclude Cwise_times_equal.out - * - * \sa operator*(), operator/=() - */ -template<typename ExpressionType> -template<typename OtherDerived> -inline ExpressionType& Cwise<ExpressionType>::operator*=(const MatrixBase<OtherDerived> &other) -{ - return m_matrix.const_cast_derived() = *this * other; -} - -/** \array_module - * - * Replaces this expression by its coefficient-wise quotient with \a other. - * - * Example: \include Cwise_slash_equal.cpp - * Output: \verbinclude Cwise_slash_equal.out - * - * \sa operator/(), operator*=() - */ -template<typename ExpressionType> -template<typename OtherDerived> -inline ExpressionType& Cwise<ExpressionType>::operator/=(const MatrixBase<OtherDerived> &other) -{ - return m_matrix.const_cast_derived() = *this / other; -} - -//============= - /** \array_module * * \returns an expression of \c *this with each coeff decremented by the constant \a scalar
diff --git a/Eigen/src/Core/CwiseBinaryOp.h b/Eigen/src/Core/CwiseBinaryOp.h index 87d7123..c5bead9 100644 --- a/Eigen/src/Core/CwiseBinaryOp.h +++ b/Eigen/src/Core/CwiseBinaryOp.h
@@ -224,6 +224,34 @@ return EIGEN_CWISE_BINOP_RETURN_TYPE(ei_scalar_quotient_op)(_expression(), other.derived()); } +/** Replaces this expression by its coefficient-wise product with \a other. + * + * Example: \include Cwise_times_equal.cpp + * Output: \verbinclude Cwise_times_equal.out + * + * \sa operator*(), operator/=() + */ +template<typename ExpressionType> +template<typename OtherDerived> +inline ExpressionType& Cwise<ExpressionType>::operator*=(const MatrixBase<OtherDerived> &other) +{ + return m_matrix.const_cast_derived() = *this * other; +} + +/** Replaces this expression by its coefficient-wise quotient by \a other. + * + * Example: \include Cwise_slash_equal.cpp + * Output: \verbinclude Cwise_slash_equal.out + * + * \sa operator/(), operator*=() + */ +template<typename ExpressionType> +template<typename OtherDerived> +inline ExpressionType& Cwise<ExpressionType>::operator/=(const MatrixBase<OtherDerived> &other) +{ + return m_matrix.const_cast_derived() = *this / other; +} + /** \returns an expression of the coefficient-wise min of *this and \a other * * Example: \include Cwise_min.cpp
diff --git a/Eigen/src/StdVector/StdVector.h b/Eigen/src/StdVector/StdVector.h new file mode 100644 index 0000000..432582c --- /dev/null +++ b/Eigen/src/StdVector/StdVector.h
@@ -0,0 +1,51 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. Eigen itself is part of the KDE project. +// +// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com> +// Copyright (C) 2009 Alex Stapleton <alex.stapleton@gmail.com> +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see <http://www.gnu.org/licenses/>. + +#ifndef EIGEN_STDVECTOR_H +#define EIGEN_STDVECTOR_H + +template <typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols, typename _Alloc> +class vector<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols>, _Alloc> + : public vector<Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> >, + Eigen::aligned_allocator<Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > > > +{ +public: + typedef Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > value_type; + typedef Eigen::aligned_allocator<value_type> allocator_type; + typedef vector<value_type, allocator_type > unaligned_base; + typedef typename unaligned_base::size_type size_type; + typedef typename unaligned_base::iterator iterator; + + explicit vector(const allocator_type& __a = allocator_type()) : unaligned_base(__a) {} + vector(const vector& c) : unaligned_base(c) {} + vector(size_type num, const value_type& val = value_type()) : unaligned_base(num, val) {} + vector(iterator start, iterator end) : unaligned_base(start, end) {} + vector& operator=(const vector& __x) { + unaligned_base::operator=(__x); + return *this; + } +}; + +#endif // EIGEN_STDVECTOR_H
diff --git a/Eigen/src/StdVector/UnalignedType.h b/Eigen/src/StdVector/UnalignedType.h new file mode 100644 index 0000000..6ceeddd --- /dev/null +++ b/Eigen/src/StdVector/UnalignedType.h
@@ -0,0 +1,45 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. Eigen itself is part of the KDE project. +// +// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com> +// Copyright (C) 2009 Alex Stapleton <alex.stapleton@gmail.com> +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see <http://www.gnu.org/licenses/>. + +#ifndef EIGEN_UNALIGNEDTYPE_H +#define EIGEN_UNALIGNEDTYPE_H + +template<typename aligned_type> class ei_unaligned_type; + +template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> +class ei_unaligned_type<Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > + : public Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> +{ + public: + typedef Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> aligned_base; + ei_unaligned_type() : aligned_base(ei_constructor_without_unaligned_array_assert()) {} + ei_unaligned_type(const aligned_base& other) + { + resize(other.rows(), other.cols()); + ei_assign_impl<ei_unaligned_type,aligned_base,NoVectorization>::run(*this, other); + } +}; + +#endif // EIGEN_UNALIGNEDTYPE_H
diff --git a/test/stdvector.cpp b/test/stdvector.cpp index ea57c07..024f972 100644 --- a/test/stdvector.cpp +++ b/test/stdvector.cpp
@@ -53,9 +53,9 @@ // do a lot of push_back such that the vector gets internally resized // (with memory reallocation) MatrixType* ref = &w[0]; - for(int i=0; i<30 | ((ref==&w[0]) && i<300); ++i) + for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i) v.push_back(w[i%w.size()]); - for(int i=23; i<v.size(); ++i) + for(unsigned int i=23; i<v.size(); ++i) { VERIFY(v[i]==w[(i-23)%w.size()]); }