85class CwiseTernaryOp :
public CwiseTernaryOpImpl<TernaryOp, Arg1Type, Arg2Type, Arg3Type,
86 typename internal::traits<Arg1Type>::StorageKind>,
87 internal::no_assignment_operator {
89 using Arg1 = internal::remove_all_t<Arg1Type>;
90 using Arg2 = internal::remove_all_t<Arg2Type>;
91 using Arg3 = internal::remove_all_t<Arg3Type>;
94 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Arg1, Arg2)
95 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Arg1, Arg3)
98 EIGEN_STATIC_ASSERT((std::is_same<
typename internal::traits<Arg1Type>::StorageKind,
99 typename internal::traits<Arg2Type>::StorageKind>::value),
100 STORAGE_KIND_MUST_MATCH)
101 EIGEN_STATIC_ASSERT((std::is_same<
typename internal::traits<Arg1Type>::StorageKind,
102 typename internal::traits<Arg3Type>::StorageKind>::value),
103 STORAGE_KIND_MUST_MATCH)
105 using Base =
typename CwiseTernaryOpImpl<TernaryOp, Arg1Type, Arg2Type, Arg3Type,
106 typename internal::traits<Arg1Type>::StorageKind>::Base;
107 EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseTernaryOp)
109 using Arg1Nested =
typename internal::ref_selector<Arg1Type>::type;
110 using Arg2Nested =
typename internal::ref_selector<Arg2Type>::type;
111 using Arg3Nested =
typename internal::ref_selector<Arg3Type>::type;
112 using Arg1Nested_ = std::remove_reference_t<Arg1Nested>;
113 using Arg2Nested_ = std::remove_reference_t<Arg2Nested>;
114 using Arg3Nested_ = std::remove_reference_t<Arg3Nested>;
116 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CwiseTernaryOp(
const Arg1& a1,
const Arg2& a2,
const Arg3& a3,
117 const TernaryOp& func = TernaryOp())
118 : m_arg1(a1), m_arg2(a2), m_arg3(a3), m_functor(func) {
119 eigen_assert(a1.rows() == a2.rows() && a1.cols() == a2.cols() && a1.rows() == a3.rows() && a1.cols() == a3.cols());
122 EIGEN_DEVICE_FUNC
constexpr EIGEN_STRONG_INLINE Index rows()
const {
125 EIGEN_IF_CONSTEXPR (internal::traits<internal::remove_all_t<Arg1Nested>>::RowsAtCompileTime == Dynamic &&
126 internal::traits<internal::remove_all_t<Arg2Nested>>::RowsAtCompileTime == Dynamic) {
127 return m_arg3.rows();
128 }
else EIGEN_IF_CONSTEXPR (internal::traits<internal::remove_all_t<Arg1Nested>>::RowsAtCompileTime == Dynamic &&
129 internal::traits<internal::remove_all_t<Arg3Nested>>::RowsAtCompileTime == Dynamic) {
130 return m_arg2.rows();
132 return m_arg1.rows();
135 EIGEN_DEVICE_FUNC
constexpr EIGEN_STRONG_INLINE Index cols()
const {
138 EIGEN_IF_CONSTEXPR (internal::traits<internal::remove_all_t<Arg1Nested>>::ColsAtCompileTime == Dynamic &&
139 internal::traits<internal::remove_all_t<Arg2Nested>>::ColsAtCompileTime == Dynamic) {
140 return m_arg3.cols();
141 }
else EIGEN_IF_CONSTEXPR (internal::traits<internal::remove_all_t<Arg1Nested>>::ColsAtCompileTime == Dynamic &&
142 internal::traits<internal::remove_all_t<Arg3Nested>>::ColsAtCompileTime == Dynamic) {
143 return m_arg2.cols();
145 return m_arg1.cols();
150 EIGEN_DEVICE_FUNC
constexpr const Arg1Nested_&
arg1()
const {
return m_arg1; }
152 EIGEN_DEVICE_FUNC
constexpr const Arg2Nested_&
arg2()
const {
return m_arg2; }
154 EIGEN_DEVICE_FUNC
constexpr const Arg3Nested_&
arg3()
const {
return m_arg3; }
156 EIGEN_DEVICE_FUNC
constexpr const TernaryOp&
functor()
const {
return m_functor; }
162 const TernaryOp m_functor;