diff --git a/Eigen/src/Core/DenseBase.h b/Eigen/src/Core/DenseBase.h index 91cfe3171..aa045686b 100644 --- a/Eigen/src/Core/DenseBase.h +++ b/Eigen/src/Core/DenseBase.h @@ -569,24 +569,24 @@ template class DenseBase template inline EIGEN_DEVICE_FUNC - CwiseTernaryOp::Scalar, - typename DenseBase::Scalar>, - Derived, ThenDerived, ElseDerived> + CwiseTernaryOp::Scalar, + typename DenseBase::Scalar, Scalar>, + ThenDerived, ElseDerived, Derived> select(const DenseBase& thenMatrix, const DenseBase& elseMatrix) const; template inline EIGEN_DEVICE_FUNC - CwiseTernaryOp::Scalar, - typename DenseBase::Scalar>, - Derived, ThenDerived, typename DenseBase::ConstantReturnType> + CwiseTernaryOp::Scalar, + typename DenseBase::Scalar, Scalar>, + ThenDerived, typename DenseBase::ConstantReturnType, Derived> select(const DenseBase& thenMatrix, const typename DenseBase::Scalar& elseScalar) const; template inline EIGEN_DEVICE_FUNC - CwiseTernaryOp::Scalar, - typename DenseBase::Scalar>, - Derived, typename DenseBase::ConstantReturnType, ElseDerived> + CwiseTernaryOp::Scalar, + typename DenseBase::Scalar, Scalar>, + typename DenseBase::ConstantReturnType, ElseDerived, Derived> select(const typename DenseBase::Scalar& thenScalar, const DenseBase& elseMatrix) const; diff --git a/Eigen/src/Core/Select.h b/Eigen/src/Core/Select.h index 1fe388efc..fdc93c5cd 100644 --- a/Eigen/src/Core/Select.h +++ b/Eigen/src/Core/Select.h @@ -124,14 +124,17 @@ class Select : public internal::dense_xpr_base< Select template inline EIGEN_DEVICE_FUNC CwiseTernaryOp< - internal::scalar_boolean_select_op::Scalar, typename DenseBase::Scalar, - typename DenseBase::Scalar>, - Derived, ThenDerived, ElseDerived> -DenseBase::select(const DenseBase& thenMatrix, const DenseBase& elseMatrix) const { - using Op = internal::scalar_boolean_select_op::Scalar, - typename DenseBase::Scalar>; - return CwiseTernaryOp(derived(), thenMatrix.derived(), elseMatrix.derived(), - Op()); + internal::scalar_boolean_select_op::Scalar, + typename DenseBase::Scalar, + typename DenseBase::Scalar>, + ThenDerived, ElseDerived, Derived> +DenseBase::select(const DenseBase& thenMatrix, + const DenseBase& elseMatrix) const { + using Op = internal::scalar_boolean_select_op< + typename DenseBase::Scalar, + typename DenseBase::Scalar, Scalar>; + return CwiseTernaryOp( + thenMatrix.derived(), elseMatrix.derived(), derived(), Op()); } /** Version of DenseBase::select(const DenseBase&, const DenseBase&) with * the \em else expression being a scalar value. @@ -141,16 +144,21 @@ DenseBase::select(const DenseBase& thenMatrix, const Dense template template inline EIGEN_DEVICE_FUNC CwiseTernaryOp< - internal::scalar_boolean_select_op::Scalar, typename DenseBase::Scalar, - typename DenseBase::Scalar>, - Derived, ThenDerived, typename DenseBase::ConstantReturnType> -DenseBase::select(const DenseBase& thenMatrix, - const typename DenseBase::Scalar& elseScalar) const { - using ElseConstantType = typename DenseBase::ConstantReturnType; - using Op = internal::scalar_boolean_select_op::Scalar, - typename DenseBase::Scalar>; - return CwiseTernaryOp(derived(), thenMatrix.derived(), - ElseConstantType(rows(), cols(), elseScalar), Op()); + internal::scalar_boolean_select_op::Scalar, + typename DenseBase::Scalar, + typename DenseBase::Scalar>, + ThenDerived, typename DenseBase::ConstantReturnType, Derived> +DenseBase::select( + const DenseBase& thenMatrix, + const typename DenseBase::Scalar& elseScalar) const { + using ElseConstantType = + typename DenseBase::ConstantReturnType; + using Op = internal::scalar_boolean_select_op< + typename DenseBase::Scalar, + typename DenseBase::Scalar, Scalar>; + return CwiseTernaryOp( + thenMatrix.derived(), ElseConstantType(rows(), cols(), elseScalar), + derived(), Op()); } /** Version of DenseBase::select(const DenseBase&, const DenseBase&) with * the \em then expression being a scalar value. @@ -160,16 +168,22 @@ DenseBase::select(const DenseBase& thenMatrix, template template inline EIGEN_DEVICE_FUNC CwiseTernaryOp< - internal::scalar_boolean_select_op::Scalar, typename DenseBase::Scalar, - typename DenseBase::Scalar>, - Derived, typename DenseBase::ConstantReturnType, ElseDerived> -DenseBase::select(const typename DenseBase::Scalar& thenScalar, - const DenseBase& elseMatrix) const { - using ThenConstantType = typename DenseBase::ConstantReturnType; - using Op = internal::scalar_boolean_select_op::Scalar, - typename DenseBase::Scalar>; - return CwiseTernaryOp( - derived(), ThenConstantType(rows(), cols(), thenScalar), elseMatrix.derived(), Op()); + internal::scalar_boolean_select_op::Scalar, + typename DenseBase::Scalar, + typename DenseBase::Scalar>, + typename DenseBase::ConstantReturnType, ElseDerived, + Derived> +DenseBase::select( + const typename DenseBase::Scalar& thenScalar, + const DenseBase& elseMatrix) const { + using ThenConstantType = + typename DenseBase::ConstantReturnType; + using Op = internal::scalar_boolean_select_op< + typename DenseBase::Scalar, + typename DenseBase::Scalar, Scalar>; + return CwiseTernaryOp( + ThenConstantType(rows(), cols(), thenScalar), elseMatrix.derived(), + derived(), Op()); } } // end namespace Eigen diff --git a/Eigen/src/Core/functors/TernaryFunctors.h b/Eigen/src/Core/functors/TernaryFunctors.h index 9aadc271d..8f9492ba9 100644 --- a/Eigen/src/Core/functors/TernaryFunctors.h +++ b/Eigen/src/Core/functors/TernaryFunctors.h @@ -18,24 +18,23 @@ namespace internal { //---------- associative ternary functors ---------- -template +template struct scalar_boolean_select_op { static constexpr bool ThenElseAreSame = is_same::value; EIGEN_STATIC_ASSERT(ThenElseAreSame, THEN AND ELSE MUST BE SAME TYPE) using Scalar = ThenScalar; using result_type = Scalar; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const ConditionScalar& cond, const ThenScalar& a, - const ElseScalar& b) const { + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const ThenScalar& a, const ElseScalar& b, const ConditionScalar& cond) const { return cond == ConditionScalar(0) ? b : a; } template - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& cond, const Packet& a, const Packet& b) const { + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b, const Packet& cond) const { return pselect(pcmp_eq(cond, pzero(cond)), b, a); } }; -template -struct functor_traits> { +template + struct functor_traits> { using Scalar = ThenScalar; enum { Cost = 1,