diff options
Diffstat (limited to 'Eigen/src/Core/Transpose.h')
-rw-r--r-- | Eigen/src/Core/Transpose.h | 96 |
1 files changed, 55 insertions, 41 deletions
diff --git a/Eigen/src/Core/Transpose.h b/Eigen/src/Core/Transpose.h index de8ae0a5b..a011f7df3 100644 --- a/Eigen/src/Core/Transpose.h +++ b/Eigen/src/Core/Transpose.h @@ -39,14 +39,16 @@ * * \sa MatrixBase::transpose(), MatrixBase::adjoint() */ + +namespace internal { template<typename MatrixType> -struct ei_traits<Transpose<MatrixType> > : ei_traits<MatrixType> +struct traits<Transpose<MatrixType> > : traits<MatrixType> { typedef typename MatrixType::Scalar Scalar; - typedef typename ei_nested<MatrixType>::type MatrixTypeNested; - typedef typename ei_unref<MatrixTypeNested>::type _MatrixTypeNested; - typedef typename ei_traits<MatrixType>::StorageKind StorageKind; - typedef typename ei_traits<MatrixType>::XprKind XprKind; + typedef typename nested<MatrixType>::type MatrixTypeNested; + typedef typename unref<MatrixTypeNested>::type _MatrixTypeNested; + typedef typename traits<MatrixType>::StorageKind StorageKind; + typedef typename traits<MatrixType>::XprKind XprKind; enum { RowsAtCompileTime = MatrixType::ColsAtCompileTime, ColsAtCompileTime = MatrixType::RowsAtCompileTime, @@ -54,19 +56,20 @@ struct ei_traits<Transpose<MatrixType> > : ei_traits<MatrixType> MaxColsAtCompileTime = MatrixType::MaxRowsAtCompileTime, Flags = int(_MatrixTypeNested::Flags & ~NestByRefBit) ^ RowMajorBit, CoeffReadCost = _MatrixTypeNested::CoeffReadCost, - InnerStrideAtCompileTime = ei_inner_stride_at_compile_time<MatrixType>::ret, - OuterStrideAtCompileTime = ei_outer_stride_at_compile_time<MatrixType>::ret + InnerStrideAtCompileTime = inner_stride_at_compile_time<MatrixType>::ret, + OuterStrideAtCompileTime = outer_stride_at_compile_time<MatrixType>::ret }; }; +} template<typename MatrixType, typename StorageKind> class TransposeImpl; template<typename MatrixType> class Transpose - : public TransposeImpl<MatrixType,typename ei_traits<MatrixType>::StorageKind> + : public TransposeImpl<MatrixType,typename internal::traits<MatrixType>::StorageKind> { public: - typedef typename TransposeImpl<MatrixType,typename ei_traits<MatrixType>::StorageKind>::Base Base; + typedef typename TransposeImpl<MatrixType,typename internal::traits<MatrixType>::StorageKind>::Base Base; EIGEN_GENERIC_PUBLIC_INTERFACE(Transpose) inline Transpose(const MatrixType& matrix) : m_matrix(matrix) {} @@ -77,35 +80,39 @@ template<typename MatrixType> class Transpose inline Index cols() const { return m_matrix.rows(); } /** \returns the nested expression */ - const typename ei_cleantype<typename MatrixType::Nested>::type& + const typename internal::cleantype<typename MatrixType::Nested>::type& nestedExpression() const { return m_matrix; } /** \returns the nested expression */ - typename ei_cleantype<typename MatrixType::Nested>::type& + typename internal::cleantype<typename MatrixType::Nested>::type& nestedExpression() { return m_matrix.const_cast_derived(); } protected: const typename MatrixType::Nested m_matrix; }; -template<typename MatrixType, bool HasDirectAccess = ei_has_direct_access<MatrixType>::ret> -struct ei_TransposeImpl_base +namespace internal { + +template<typename MatrixType, bool HasDirectAccess = has_direct_access<MatrixType>::ret> +struct TransposeImpl_base { - typedef typename ei_dense_xpr_base<Transpose<MatrixType> >::type type; + typedef typename dense_xpr_base<Transpose<MatrixType> >::type type; }; template<typename MatrixType> -struct ei_TransposeImpl_base<MatrixType, false> +struct TransposeImpl_base<MatrixType, false> { - typedef typename ei_dense_xpr_base<Transpose<MatrixType> >::type type; + typedef typename dense_xpr_base<Transpose<MatrixType> >::type type; }; +} // end namespace internal + template<typename MatrixType> class TransposeImpl<MatrixType,Dense> - : public ei_TransposeImpl_base<MatrixType>::type + : public internal::TransposeImpl_base<MatrixType>::type { public: - typedef typename ei_TransposeImpl_base<MatrixType>::type Base; + typedef typename internal::TransposeImpl_base<MatrixType>::type Base; EIGEN_DENSE_PUBLIC_INTERFACE(Transpose<MatrixType>) inline Index innerStride() const { return derived().nestedExpression().innerStride(); } @@ -214,7 +221,7 @@ DenseBase<Derived>::transpose() const * m = m.adjoint().eval(); * \endcode * - * \sa adjointInPlace(), transpose(), conjugate(), class Transpose, class ei_scalar_conjugate_op */ + * \sa adjointInPlace(), transpose(), conjugate(), class Transpose, class internal::scalar_conjugate_op */ template<typename Derived> inline const typename MatrixBase<Derived>::AdjointReturnType MatrixBase<Derived>::adjoint() const @@ -226,19 +233,21 @@ MatrixBase<Derived>::adjoint() const * "in place" transpose implementation ***************************************************************************/ +namespace internal { + template<typename MatrixType, bool IsSquare = (MatrixType::RowsAtCompileTime == MatrixType::ColsAtCompileTime) && MatrixType::RowsAtCompileTime!=Dynamic> -struct ei_inplace_transpose_selector; +struct inplace_transpose_selector; template<typename MatrixType> -struct ei_inplace_transpose_selector<MatrixType,true> { // square matrix +struct inplace_transpose_selector<MatrixType,true> { // square matrix static void run(MatrixType& m) { m.template triangularView<StrictlyUpper>().swap(m.transpose()); } }; template<typename MatrixType> -struct ei_inplace_transpose_selector<MatrixType,false> { // non square matrix +struct inplace_transpose_selector<MatrixType,false> { // non square matrix static void run(MatrixType& m) { if (m.rows()==m.cols()) m.template triangularView<StrictlyUpper>().swap(m.transpose()); @@ -247,6 +256,8 @@ struct ei_inplace_transpose_selector<MatrixType,false> { // non square matrix } }; +} // end namespace internal + /** This is the "in place" version of transpose(): it replaces \c *this by its own transpose. * Thus, doing * \code @@ -268,7 +279,7 @@ struct ei_inplace_transpose_selector<MatrixType,false> { // non square matrix template<typename Derived> inline void DenseBase<Derived>::transposeInPlace() { - ei_inplace_transpose_selector<Derived>::run(derived()); + internal::inplace_transpose_selector<Derived>::run(derived()); } /*************************************************************************** @@ -303,45 +314,47 @@ inline void MatrixBase<Derived>::adjointInPlace() // The following is to detect aliasing problems in most common cases. +namespace internal { + template<typename BinOp,typename NestedXpr,typename Rhs> -struct ei_blas_traits<SelfCwiseBinaryOp<BinOp,NestedXpr,Rhs> > - : ei_blas_traits<NestedXpr> +struct blas_traits<SelfCwiseBinaryOp<BinOp,NestedXpr,Rhs> > + : blas_traits<NestedXpr> { typedef SelfCwiseBinaryOp<BinOp,NestedXpr,Rhs> XprType; static inline const XprType extract(const XprType& x) { return x; } }; template<bool DestIsTransposed, typename OtherDerived> -struct ei_check_transpose_aliasing_compile_time_selector +struct check_transpose_aliasing_compile_time_selector { - enum { ret = ei_blas_traits<OtherDerived>::IsTransposed != DestIsTransposed + enum { ret = blas_traits<OtherDerived>::IsTransposed != DestIsTransposed }; }; template<bool DestIsTransposed, typename BinOp, typename DerivedA, typename DerivedB> -struct ei_check_transpose_aliasing_compile_time_selector<DestIsTransposed,CwiseBinaryOp<BinOp,DerivedA,DerivedB> > +struct check_transpose_aliasing_compile_time_selector<DestIsTransposed,CwiseBinaryOp<BinOp,DerivedA,DerivedB> > { - enum { ret = ei_blas_traits<DerivedA>::IsTransposed != DestIsTransposed - || ei_blas_traits<DerivedB>::IsTransposed != DestIsTransposed + enum { ret = blas_traits<DerivedA>::IsTransposed != DestIsTransposed + || blas_traits<DerivedB>::IsTransposed != DestIsTransposed }; }; template<typename Scalar, bool DestIsTransposed, typename OtherDerived> -struct ei_check_transpose_aliasing_run_time_selector +struct check_transpose_aliasing_run_time_selector { static bool run(const Scalar* dest, const OtherDerived& src) { - return (ei_blas_traits<OtherDerived>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(Scalar*)ei_extract_data(src)); + return (blas_traits<OtherDerived>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(Scalar*)extract_data(src)); } }; template<typename Scalar, bool DestIsTransposed, typename BinOp, typename DerivedA, typename DerivedB> -struct ei_check_transpose_aliasing_run_time_selector<Scalar,DestIsTransposed,CwiseBinaryOp<BinOp,DerivedA,DerivedB> > +struct check_transpose_aliasing_run_time_selector<Scalar,DestIsTransposed,CwiseBinaryOp<BinOp,DerivedA,DerivedB> > { static bool run(const Scalar* dest, const CwiseBinaryOp<BinOp,DerivedA,DerivedB>& src) { - return ((ei_blas_traits<DerivedA>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(Scalar*)ei_extract_data(src.lhs()))) - || ((ei_blas_traits<DerivedB>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(Scalar*)ei_extract_data(src.rhs()))); + return ((blas_traits<DerivedA>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(Scalar*)extract_data(src.lhs()))) + || ((blas_traits<DerivedB>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(Scalar*)extract_data(src.rhs()))); } }; @@ -353,16 +366,16 @@ struct ei_check_transpose_aliasing_run_time_selector<Scalar,DestIsTransposed,Cwi template<typename Derived, typename OtherDerived, bool MightHaveTransposeAliasing - = ei_check_transpose_aliasing_compile_time_selector - <ei_blas_traits<Derived>::IsTransposed,OtherDerived>::ret + = check_transpose_aliasing_compile_time_selector + <blas_traits<Derived>::IsTransposed,OtherDerived>::ret > struct checkTransposeAliasing_impl { static void run(const Derived& dst, const OtherDerived& other) { - ei_assert((!ei_check_transpose_aliasing_run_time_selector - <typename Derived::Scalar,ei_blas_traits<Derived>::IsTransposed,OtherDerived> - ::run(ei_extract_data(dst), other)) + eigen_assert((!check_transpose_aliasing_run_time_selector + <typename Derived::Scalar,blas_traits<Derived>::IsTransposed,OtherDerived> + ::run(extract_data(dst), other)) && "aliasing detected during tranposition, use transposeInPlace() " "or evaluate the rhs into a temporary using .eval()"); @@ -377,12 +390,13 @@ struct checkTransposeAliasing_impl<Derived, OtherDerived, false> } }; +} // end namespace internal template<typename Derived> template<typename OtherDerived> void DenseBase<Derived>::checkTransposeAliasing(const OtherDerived& other) const { - checkTransposeAliasing_impl<Derived, OtherDerived>::run(derived(), other); + internal::checkTransposeAliasing_impl<Derived, OtherDerived>::run(derived(), other); } #endif |