// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2008-2010 Gael Guennebaud // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef EIGEN_SELECT_H #define EIGEN_SELECT_H // IWYU pragma: private #include "./InternalHeaderCheck.h" namespace Eigen { /** \typedef Select * \ingroup Core_Module * * \brief Expression of a coefficient wise version of the C++ ternary operator ?: * * \tparam ConditionMatrixType the type of the \em condition expression which must be a boolean matrix * \tparam ThenMatrixType the type of the \em then expression * \tparam ElseMatrixType the type of the \em else expression * * This type represents an expression of a coefficient wise version of the C++ ternary operator ?:. * It is the return type of DenseBase::select() and most of the time this is the only way it is used. * * \sa DenseBase::select(const DenseBase&, const DenseBase&) const */ template using Select = CwiseTernaryOp::Scalar, typename DenseBase::Scalar, typename DenseBase::Scalar>, ThenMatrixType, ElseMatrixType, ConditionMatrixType>; /** \returns a matrix where each coefficient (i,j) is equal to \a thenMatrix(i,j) * if \c *this(i,j) != Scalar(0), and \a elseMatrix(i,j) otherwise. * * Example: \include MatrixBase_select.cpp * Output: \verbinclude MatrixBase_select.out * * \sa typedef Select */ template template inline EIGEN_DEVICE_FUNC CwiseTernaryOp< internal::scalar_boolean_select_op::Scalar, typename DenseBase::Scalar, typename DenseBase::Scalar>, ThenDerived, ElseDerived, Derived> DenseBase::select(const DenseBase& thenMatrix, const DenseBase& elseMatrix) const { return Select(thenMatrix.derived(), elseMatrix.derived(), derived()); } /** Version of DenseBase::select(const DenseBase&, const DenseBase&) with * the \em else expression being a scalar value. * * \sa typedef Select */ template template inline EIGEN_DEVICE_FUNC CwiseTernaryOp< 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; return Select(thenMatrix.derived(), ElseConstantType(rows(), cols(), elseScalar), derived()); } /** Version of DenseBase::select(const DenseBase&, const DenseBase&) with * the \em then expression being a scalar value. * * \sa typedef Select */ template template inline EIGEN_DEVICE_FUNC CwiseTernaryOp< 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; return Select(ThenConstantType(rows(), cols(), thenScalar), elseMatrix.derived(), derived()); } } // end namespace Eigen #endif // EIGEN_SELECT_H