diff --git a/src/Core.h b/src/Core.h index 6d2424f13..aa679896e 100644 --- a/src/Core.h +++ b/src/Core.h @@ -8,6 +8,7 @@ namespace Eigen { #include "Core/NumTraits.h" #include "Core/MathFunctions.h" #include "Core/MatrixBase.h" +#include "Core/Coeffs.h" #include "Core/OperatorEquals.h" #include "Core/MatrixRef.h" #include "Core/MatrixStorage.h" diff --git a/src/Core/Coeffs.h b/src/Core/Coeffs.h new file mode 100644 index 000000000..d20da2a27 --- /dev/null +++ b/src/Core/Coeffs.h @@ -0,0 +1,130 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. Eigen itself is part of the KDE project. +// +// Copyright (C) 2006-2007 Benoit Jacob <jacob@math.jussieu.fr> +// +// Eigen is free software; 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 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 General Public License for more +// details. +// +// You should have received a copy of the GNU General Public License along +// with Eigen; if not, write to the Free Software Foundation, Inc., 51 +// Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. This exception does not invalidate any other reasons why a work +// based on this file might be covered by the GNU General Public License. + +#ifndef EIGEN_COEFFS_H +#define EIGEN_COEFFS_H + +template<typename Scalar, typename Derived> +Scalar MatrixBase<Scalar, Derived> + ::coeff(int row, int col, AssertLevel assertLevel = InternalDebugging) const +{ + eigen_assert(assertLevel, row >= 0 && row < rows() + && col >= 0 && col < cols()); + return static_cast<const Derived *>(this)->_coeff(row, col); +} + +template<typename Scalar, typename Derived> +Scalar MatrixBase<Scalar, Derived> + ::operator()(int row, int col) const { return coeff(row, col, UserDebugging); } + +template<typename Scalar, typename Derived> +Scalar& MatrixBase<Scalar, Derived> + ::coeffRef(int row, int col, AssertLevel assertLevel = InternalDebugging) +{ + eigen_assert(assertLevel, row >= 0 && row < rows() + && col >= 0 && col < cols()); + return static_cast<Derived *>(this)->_coeffRef(row, col); +} + +template<typename Scalar, typename Derived> +Scalar& MatrixBase<Scalar, Derived> + ::operator()(int row, int col) { return coeffRef(row, col, UserDebugging); } + +template<typename Scalar, typename Derived> +Scalar MatrixBase<Scalar, Derived> + ::coeff(int index, AssertLevel assertLevel = InternalDebugging) const +{ + eigen_assert(assertLevel, IsVector); + if(RowsAtCompileTime == 1) + { + eigen_assert(assertLevel, index >= 0 && index < cols()); + return coeff(0, index); + } + else + { + eigen_assert(assertLevel, index >= 0 && index < rows()); + return coeff(index, 0); + } +} + +template<typename Scalar, typename Derived> +Scalar MatrixBase<Scalar, Derived> + ::operator[](int index) const { return coeff(index, UserDebugging); } + +template<typename Scalar, typename Derived> +Scalar& MatrixBase<Scalar, Derived> + ::coeffRef(int index, AssertLevel assertLevel = InternalDebugging) +{ + eigen_assert(assertLevel, IsVector); + if(RowsAtCompileTime == 1) + { + eigen_assert(assertLevel, index >= 0 && index < cols()); + return coeffRef(0, index); + } + else + { + eigen_assert(assertLevel, index >= 0 && index < rows()); + return coeffRef(index, 0); + } +} + +template<typename Scalar, typename Derived> +Scalar& MatrixBase<Scalar, Derived> + ::operator[](int index) { return coeffRef(index, UserDebugging); } + +template<typename Scalar, typename Derived> +Scalar MatrixBase<Scalar, Derived> + ::x() const { return coeff(0, UserDebugging); } + +template<typename Scalar, typename Derived> +Scalar MatrixBase<Scalar, Derived> + ::y() const { return coeff(1, UserDebugging); } + +template<typename Scalar, typename Derived> +Scalar MatrixBase<Scalar, Derived> + ::z() const { return coeff(2, UserDebugging); } + +template<typename Scalar, typename Derived> +Scalar MatrixBase<Scalar, Derived> + ::w() const { return coeff(3, UserDebugging); } + +template<typename Scalar, typename Derived> +Scalar& MatrixBase<Scalar, Derived> + ::x() { return coeffRef(0, UserDebugging); } + +template<typename Scalar, typename Derived> +Scalar& MatrixBase<Scalar, Derived> + ::y() { return coeffRef(1, UserDebugging); } + +template<typename Scalar, typename Derived> +Scalar& MatrixBase<Scalar, Derived> + ::z() { return coeffRef(2, UserDebugging); } + +template<typename Scalar, typename Derived> +Scalar& MatrixBase<Scalar, Derived> + ::w() { return coeffRef(3, UserDebugging); } + + +#endif // EIGEN_COEFFS_H diff --git a/src/Core/MatrixBase.h b/src/Core/MatrixBase.h index b2eebe791..c37b098f8 100644 --- a/src/Core/MatrixBase.h +++ b/src/Core/MatrixBase.h @@ -139,62 +139,26 @@ template<typename Scalar, typename Derived> class MatrixBase Derived& operator/=(const std::complex<float>& other); Derived& operator/=(const std::complex<double>& other); - Scalar coeff(int row, int col, AssertLevel assertLevel = InternalDebugging) const - { - eigen_assert(assertLevel, row >= 0 && row < rows() - && col >= 0 && col < cols()); - return static_cast<const Derived *>(this)->_coeff(row, col); - } - Scalar operator()(int row, int col) const { return coeff(row, col, UserDebugging); } + Scalar coeff(int row, int col, AssertLevel assertLevel) const; + Scalar operator()(int row, int col) const; - Scalar& coeffRef(int row, int col, AssertLevel assertLevel = InternalDebugging) - { - eigen_assert(assertLevel, row >= 0 && row < rows() - && col >= 0 && col < cols()); - return static_cast<Derived *>(this)->_coeffRef(row, col); - } - Scalar& operator()(int row, int col) { return coeffRef(row, col, UserDebugging); } + Scalar& coeffRef(int row, int col, AssertLevel assertLevel); + Scalar& operator()(int row, int col); - Scalar coeff(int index, AssertLevel assertLevel = InternalDebugging) const - { - eigen_assert(assertLevel, IsVector); - if(RowsAtCompileTime == 1) - { - eigen_assert(assertLevel, index >= 0 && index < cols()); - return coeff(0, index); - } - else - { - eigen_assert(assertLevel, index >= 0 && index < rows()); - return coeff(index, 0); - } - } - Scalar operator[](int index) const { return coeff(index, UserDebugging); } + Scalar coeff(int index, AssertLevel assertLevel) const; + Scalar operator[](int index) const; - Scalar& coeffRef(int index, AssertLevel assertLevel = InternalDebugging) - { - eigen_assert(assertLevel, IsVector); - if(RowsAtCompileTime == 1) - { - eigen_assert(assertLevel, index >= 0 && index < cols()); - return coeffRef(0, index); - } - else - { - eigen_assert(assertLevel, index >= 0 && index < rows()); - return coeffRef(index, 0); - } - } - Scalar& operator[](int index) { return coeffRef(index, UserDebugging); } + Scalar& coeffRef(int index, AssertLevel assertLevel); + Scalar& operator[](int index); - Scalar x() const { return coeff(0, UserDebugging); } - Scalar y() const { return coeff(1, UserDebugging); } - Scalar z() const { return coeff(2, UserDebugging); } - Scalar w() const { return coeff(3, UserDebugging); } - Scalar& x() { return coeffRef(0, UserDebugging); } - Scalar& y() { return coeffRef(1, UserDebugging); } - Scalar& z() { return coeffRef(2, UserDebugging); } - Scalar& w() { return coeffRef(3, UserDebugging); } + Scalar x() const; + Scalar y() const; + Scalar z() const; + Scalar w() const; + Scalar& x(); + Scalar& y(); + Scalar& z(); + Scalar& w(); Eval<Derived> eval() const EIGEN_ALWAYS_INLINE; }; diff --git a/test/basicstuff.cpp b/test/basicstuff.cpp index a1723a429..04fefc25e 100644 --- a/test/basicstuff.cpp +++ b/test/basicstuff.cpp @@ -36,7 +36,7 @@ template<typename MatrixType> void basicStuff(const MatrixType& m) 2) Implicitly (the core stuff): MatrixBase.h Matrix.h MatrixStorage.h CopyHelper.h MatrixRef.h - NumTraits.h Util.h + NumTraits.h Util.h MathFunctions.h OperatorEquals.h Coeffs.h */ typedef typename MatrixType::Scalar Scalar;