diff options
author | 2009-04-29 17:39:39 +0000 | |
---|---|---|
committer | 2009-04-29 17:39:39 +0000 | |
commit | 7029ed6b8830937d3674064a3945642c99cb658f (patch) | |
tree | 55337799e181f070df0d83a60802a21f645f9ba0 /Eigen/src/Core/DiagonalMatrix.h | |
parent | 428a12902a426ab90bb8888a4a9021781884b337 (diff) |
ok, this time cast should really work ; sorry for the noise
Diffstat (limited to 'Eigen/src/Core/DiagonalMatrix.h')
-rw-r--r-- | Eigen/src/Core/DiagonalMatrix.h | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/Eigen/src/Core/DiagonalMatrix.h b/Eigen/src/Core/DiagonalMatrix.h index a95a45eb3..57f92a968 100644 --- a/Eigen/src/Core/DiagonalMatrix.h +++ b/Eigen/src/Core/DiagonalMatrix.h @@ -70,6 +70,22 @@ class DiagonalMatrixBase : ei_no_assignment_operator, construct_from_expression<OtherDerived,OtherDerived::IsVectorAtCompileTime,(OtherDerived::Flags&Diagonal)==Diagonal> ::run(derived(),other.derived()); } + + template<typename NewType,int dummy=0> + struct cast_selector { + typedef const DiagonalMatrixWrapper<NestByValue<CwiseUnaryOp<ei_scalar_cast_op<Scalar, NewType>, _CoeffsVectorType> > > return_type; + inline static return_type run(const DiagonalMatrixBase& d) { + return d.m_coeffs.template cast<NewType>().nestByValue().asDiagonal(); + } + }; + + template<int dummy> + struct cast_selector<Scalar,dummy> { + typedef const Derived& return_type; + inline static return_type run(const DiagonalMatrixBase& d) { + return d.derived(); + } + }; public: @@ -80,9 +96,10 @@ class DiagonalMatrixBase : ei_no_assignment_operator, } template<typename NewType> - inline DiagonalMatrixWrapper<NestByValue<CwiseUnaryOp<ei_scalar_cast_op<Scalar, NewType>, _CoeffsVectorType> > > cast() const + inline typename cast_selector<NewType,0>::return_type + cast() const { - return m_coeffs.template cast<NewType>().nestByValue().asDiagonal(); + return cast_selector<NewType,0>::run(*this); } /** Assignment operator. |