// SPDX-FileCopyrightText: The Eigen Authors
// SPDX-License-Identifier: MPL-2.0

/** \returns an expression of the coefficient wise product of \c *this and \a other
 *
 * \sa MatrixBase::cwiseProduct
 */
template <typename OtherDerived>
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const EIGEN_CWISE_BINARY_RETURN_TYPE(Derived, OtherDerived,
                                                                                     internal::scalar_product_op)
operator*(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {
  return EIGEN_CWISE_BINARY_RETURN_TYPE(Derived, OtherDerived, internal::scalar_product_op)(derived(), other.derived());
}

/** \returns an expression of the coefficient wise quotient of \c *this and \a other
 *
 * \sa MatrixBase::cwiseQuotient
 */
template <typename OtherDerived>
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const CwiseBinaryOp<
    internal::scalar_quotient_op<Scalar, typename OtherDerived::Scalar>, const Derived, const OtherDerived>
operator/(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {
  return CwiseBinaryOp<internal::scalar_quotient_op<Scalar, typename OtherDerived::Scalar>, const Derived,
                       const OtherDerived>(derived(), other.derived());
}

/** \returns an expression of the coefficient-wise min of \c *this and \a other
 *
 * Example: \include Cwise_min.cpp
 * Output: \verbinclude Cwise_min.out
 *
 * \sa max()
 */
template <int NaNPropagation = PropagateFast, typename OtherDerived>
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const
    CwiseBinaryOp<internal::scalar_min_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>
#ifdef EIGEN_PARSED_BY_DOXYGEN
    min
#else
    (min)
#endif
    (const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {
  return CwiseBinaryOp<internal::scalar_min_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>(
      derived(), other.derived());
}

/** \returns an expression of the coefficient-wise min of \c *this and scalar \a other
 *
 * \sa max()
 */
template <int NaNPropagation = PropagateFast>
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const
    CwiseBinaryOp<internal::scalar_min_op<Scalar, Scalar, NaNPropagation>, const Derived,
                  const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
#ifdef EIGEN_PARSED_BY_DOXYGEN
    min
#else
    (min)
#endif
    (const Scalar &other) const {
  return (min<NaNPropagation>)(Derived::PlainObject::Constant(rows(), cols(), other));
}

/** \returns an expression of the coefficient-wise max of \c *this and \a other
 *
 * Example: \include Cwise_max.cpp
 * Output: \verbinclude Cwise_max.out
 *
 * \sa min()
 */
template <int NaNPropagation = PropagateFast, typename OtherDerived>
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const
    CwiseBinaryOp<internal::scalar_max_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>
#ifdef EIGEN_PARSED_BY_DOXYGEN
    max
#else
    (max)
#endif
    (const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {
  return CwiseBinaryOp<internal::scalar_max_op<Scalar, Scalar, NaNPropagation>, const Derived, const OtherDerived>(
      derived(), other.derived());
}

/** \returns an expression of the coefficient-wise max of \c *this and scalar \a other
 *
 * \sa min()
 */
template <int NaNPropagation = PropagateFast>
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const
    CwiseBinaryOp<internal::scalar_max_op<Scalar, Scalar, NaNPropagation>, const Derived,
                  const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
#ifdef EIGEN_PARSED_BY_DOXYGEN
    max
#else
    (max)
#endif
    (const Scalar &other) const {
  return (max<NaNPropagation>)(Derived::PlainObject::Constant(rows(), cols(), other));
}

/** \returns an expression of the coefficient-wise absdiff of \c *this and \a other
 *
 * \sa absolute_difference()
 */
EIGEN_MAKE_CWISE_BINARY_OP(absolute_difference, internal::scalar_absolute_difference_op)

/** \returns an expression of the coefficient-wise absolute_difference of \c *this and scalar \a other
 *
 * \sa absolute_difference()
 */
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const
    CwiseBinaryOp<internal::scalar_absolute_difference_op<Scalar, Scalar>, const Derived,
                  const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
#ifdef EIGEN_PARSED_BY_DOXYGEN
    absolute_difference
#else
    (absolute_difference)
#endif
    (const Scalar &other) const {
  return (absolute_difference)(Derived::PlainObject::Constant(rows(), cols(), other));
}

/** \returns an expression of the coefficient-wise power of \c *this to the given array of \a exponents.
 *
 * This function computes the coefficient-wise power.
 *
 * Example: \include Cwise_array_power_array.cpp
 * Output: \verbinclude Cwise_array_power_array.out
 */
EIGEN_MAKE_CWISE_BINARY_OP(pow, internal::scalar_pow_op)

/** \returns an expression of the coefficient-wise atan2(\c *this, \a y), where \a y is the given array argument.
 *
 * This function computes the coefficient-wise atan2.
 *
 */
EIGEN_MAKE_CWISE_BINARY_OP(atan2, internal::scalar_atan2_op)

// TODO: code generating macros could be moved to Macros.h and could include generation of documentation
#define EIGEN_MAKE_CWISE_COMP_OP(OP, COMPARATOR)                                                                     \
  template <typename OtherDerived>                                                                                   \
  EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const                                                              \
      CwiseBinaryOp<internal::scalar_cmp_op<Scalar, typename OtherDerived::Scalar, internal::cmp_##COMPARATOR>,      \
                    const Derived, const OtherDerived>                                                               \
      OP(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {                                        \
    return CwiseBinaryOp<internal::scalar_cmp_op<Scalar, typename OtherDerived::Scalar, internal::cmp_##COMPARATOR>, \
                         const Derived, const OtherDerived>(derived(), other.derived());                             \
  }                                                                                                                  \
  typedef CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_##COMPARATOR>, const Derived,          \
                        const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >                    \
      Cmp##COMPARATOR##ReturnType;                                                                                   \
  typedef CwiseBinaryOp<internal::scalar_cmp_op<Scalar, Scalar, internal::cmp_##COMPARATOR>,                         \
                        const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject>, const Derived>      \
      RCmp##COMPARATOR##ReturnType;                                                                                  \
  EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const Cmp##COMPARATOR##ReturnType OP(const Scalar &s) const {      \
    return this->OP(Derived::PlainObject::Constant(rows(), cols(), s));                                              \
  }                                                                                                                  \
  EIGEN_DEVICE_FUNC constexpr friend EIGEN_STRONG_INLINE const RCmp##COMPARATOR##ReturnType OP(                      \
      const Scalar &s, const EIGEN_CURRENT_STORAGE_BASE_CLASS<Derived> &d) {                                         \
    return Derived::PlainObject::Constant(d.rows(), d.cols(), s).OP(d);                                              \
  }

#define EIGEN_MAKE_CWISE_COMP_R_OP(OP, R_OP, RCOMPARATOR)                                                             \
  template <typename OtherDerived>                                                                                    \
  EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const                                                               \
      CwiseBinaryOp<internal::scalar_cmp_op<typename OtherDerived::Scalar, Scalar, internal::cmp_##RCOMPARATOR>,      \
                    const OtherDerived, const Derived>                                                                \
      OP(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const {                                         \
    return CwiseBinaryOp<internal::scalar_cmp_op<typename OtherDerived::Scalar, Scalar, internal::cmp_##RCOMPARATOR>, \
                         const OtherDerived, const Derived>(other.derived(), derived());                              \
  }                                                                                                                   \
  EIGEN_DEVICE_FUNC constexpr inline const RCmp##RCOMPARATOR##ReturnType OP(const Scalar &s) const {                  \
    return Derived::PlainObject::Constant(rows(), cols(), s).R_OP(*this);                                             \
  }                                                                                                                   \
  friend inline const Cmp##RCOMPARATOR##ReturnType OP(const Scalar &s, const Derived &d) {                            \
    return d.R_OP(Derived::PlainObject::Constant(d.rows(), d.cols(), s));                                             \
  }

/** \returns an expression of the coefficient-wise \< operator of *this and \a other
 *
 * Example: \include Cwise_less.cpp
 * Output: \verbinclude Cwise_less.out
 *
 * \sa all(), any(), operator>(), operator<=()
 */
EIGEN_MAKE_CWISE_COMP_OP(operator<, LT)

/** \returns an expression of the coefficient-wise \<= operator of *this and \a other
 *
 * Example: \include Cwise_less_equal.cpp
 * Output: \verbinclude Cwise_less_equal.out
 *
 * \sa all(), any(), operator>=(), operator<()
 */
EIGEN_MAKE_CWISE_COMP_OP(operator<=, LE)

/** \returns an expression of the coefficient-wise \> operator of *this and \a other
 *
 * Example: \include Cwise_greater.cpp
 * Output: \verbinclude Cwise_greater.out
 *
 * \sa all(), any(), operator>=(), operator<()
 */
EIGEN_MAKE_CWISE_COMP_R_OP(operator>, operator<, LT)

/** \returns an expression of the coefficient-wise \>= operator of *this and \a other
 *
 * Example: \include Cwise_greater_equal.cpp
 * Output: \verbinclude Cwise_greater_equal.out
 *
 * \sa all(), any(), operator>(), operator<=()
 */
EIGEN_MAKE_CWISE_COMP_R_OP(operator>=, operator<=, LE)

/** \returns an expression of the coefficient-wise == operator of *this and \a other
 *
 * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
 * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
 * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
 * isMuchSmallerThan().
 *
 * Example: \include Cwise_equal_equal.cpp
 * Output: \verbinclude Cwise_equal_equal.out
 *
 * \sa all(), any(), isApprox(), isMuchSmallerThan()
 */
EIGEN_MAKE_CWISE_COMP_OP(operator==, EQ)

/** \returns an expression of the coefficient-wise != operator of *this and \a other
 *
 * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
 * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
 * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
 * isMuchSmallerThan().
 *
 * Example: \include Cwise_not_equal.cpp
 * Output: \verbinclude Cwise_not_equal.out
 *
 * \sa all(), any(), isApprox(), isMuchSmallerThan()
 */
EIGEN_MAKE_CWISE_COMP_OP(operator!=, NEQ)

#undef EIGEN_MAKE_CWISE_COMP_OP
#undef EIGEN_MAKE_CWISE_COMP_R_OP

// scalar addition
#ifndef EIGEN_PARSED_BY_DOXYGEN
EIGEN_MAKE_SCALAR_BINARY_OP(operator+, internal::scalar_sum_op)
#else
/** \returns an expression of \c *this with each coeff incremented by the constant \a scalar
 *
 * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
 *
 * Example: \include Cwise_plus.cpp
 * Output: \verbinclude Cwise_plus.out
 *
 * \sa operator+=(), operator-()
 */
template <typename T>
const CwiseBinaryOp<internal::scalar_sum_op<Scalar, T>, Derived, Constant<T> > operator+(const T &scalar) const;
/** \returns an expression of \a expr with each coeff incremented by the constant \a scalar
 *
 * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
 */
template <typename T>
friend const CwiseBinaryOp<internal::scalar_sum_op<T, Scalar>, Constant<T>, Derived> operator+(
    const T &scalar, const StorageBaseType &expr);
#endif

#ifndef EIGEN_PARSED_BY_DOXYGEN
EIGEN_MAKE_SCALAR_BINARY_OP(operator-, internal::scalar_difference_op)
#else
/** \returns an expression of \c *this with each coeff decremented by the constant \a scalar
 *
 * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
 *
 * Example: \include Cwise_minus.cpp
 * Output: \verbinclude Cwise_minus.out
 *
 * \sa operator+=(), operator-()
 */
template <typename T>
const CwiseBinaryOp<internal::scalar_difference_op<Scalar, T>, Derived, Constant<T> > operator-(const T &scalar) const;
/** \returns an expression of the constant matrix of value \a scalar decremented by the coefficients of \a expr
 *
 * \tparam T is the scalar type of \a scalar. It must be compatible with the scalar type of the given expression.
 */
template <typename T>
friend const CwiseBinaryOp<internal::scalar_difference_op<T, Scalar>, Constant<T>, Derived> operator-(
    const T &scalar, const StorageBaseType &expr);
#endif

#ifndef EIGEN_PARSED_BY_DOXYGEN
EIGEN_MAKE_SCALAR_BINARY_OP_ONTHELEFT(operator/, internal::scalar_quotient_op)
#else
/**
 * \brief Component-wise division of the scalar \a s by array elements of \a a.
 *
 * \tparam T is the scalar type of \a s. It must be compatible with the scalar type of the given array expression
 * (\c Derived::Scalar).
 */
template <typename T>
friend inline const CwiseBinaryOp<internal::scalar_quotient_op<T, Scalar>, Constant<T>, Derived> operator/(
    const T &s, const StorageBaseType &a);
#endif

/** \returns an expression of the coefficient-wise zeta function.
 *
 * \specialfunctions_module
 *
 * It returns the Riemann zeta function of two arguments \c *this and \a q:
 *
 * \param q is the shift, it must be > 0
 *
 * \note *this is the exponent, it must be > 1.
 * \note This function supports only float and double scalar types. To support other scalar types, the user has
 * to provide implementations of zeta(T,T) for any scalar type T to be supported.
 *
 * This method is an alias for zeta(*this,q);
 *
 * \sa Eigen::zeta()
 */
template <typename DerivedQ>
inline const CwiseBinaryOp<internal::scalar_zeta_op<Scalar>, const Derived, const DerivedQ> zeta(
    const EIGEN_CURRENT_STORAGE_BASE_CLASS<DerivedQ> &q) const {
  return CwiseBinaryOp<internal::scalar_zeta_op<Scalar>, const Derived, const DerivedQ>(this->derived(), q.derived());
}
