11#ifndef EIGEN_TERNARY_FUNCTORS_H
12#define EIGEN_TERNARY_FUNCTORS_H
15#include "../InternalHeaderCheck.h"
23template <
typename ThenScalar,
typename ElseScalar,
typename ConditionScalar>
24struct scalar_boolean_select_op {
25 static constexpr bool ThenElseAreSame =
26 std::is_same<std::remove_const_t<ThenScalar>, std::remove_const_t<ElseScalar>>::value;
27 EIGEN_STATIC_ASSERT(ThenElseAreSame, THEN AND ELSE MUST BE SAME TYPE)
28 using Scalar = ThenScalar;
29 using result_type = Scalar;
30 EIGEN_DEVICE_FUNC
constexpr EIGEN_STRONG_INLINE Scalar operator()(
const ThenScalar& a,
const ElseScalar& b,
31 const ConditionScalar& cond)
const {
32 return cond == ConditionScalar(0) ? b : a;
34 template <
typename Packet>
35 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& a,
const Packet& b,
const Packet& cond)
const {
36 return pselect(pcmp_eq(cond, pzero(cond)), b, a);
40template <
typename ThenScalar,
typename ElseScalar,
typename ConditionScalar>
41struct functor_traits<scalar_boolean_select_op<ThenScalar, ElseScalar, ConditionScalar>> {
42 using Scalar = ThenScalar;
45 PacketAccess = std::is_same<ThenScalar, ElseScalar>::value && std::is_same<ConditionScalar, Scalar>::value &&
46 packet_traits<Scalar>::HasCmp