84class CwiseTernaryOp :
public CwiseTernaryOpImpl<TernaryOp, Arg1Type, Arg2Type, Arg3Type,
85 typename internal::traits<Arg1Type>::StorageKind>,
86 internal::no_assignment_operator {
88 typedef internal::remove_all_t<Arg1Type> Arg1;
89 typedef internal::remove_all_t<Arg2Type> Arg2;
90 typedef internal::remove_all_t<Arg3Type> Arg3;
93 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Arg1, Arg2)
94 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Arg1, Arg3)
97 EIGEN_STATIC_ASSERT((internal::is_same<
typename internal::traits<Arg1Type>::StorageKind,
98 typename internal::traits<Arg2Type>::StorageKind>::value),
99 STORAGE_KIND_MUST_MATCH)
100 EIGEN_STATIC_ASSERT((internal::is_same<
typename internal::traits<Arg1Type>::StorageKind,
101 typename internal::traits<Arg3Type>::StorageKind>::value),
102 STORAGE_KIND_MUST_MATCH)
104 typedef typename CwiseTernaryOpImpl<TernaryOp, Arg1Type, Arg2Type, Arg3Type,
105 typename internal::traits<Arg1Type>::StorageKind>::Base Base;
108 typedef typename internal::ref_selector<Arg1Type>::type Arg1Nested;
109 typedef typename internal::ref_selector<Arg2Type>::type Arg2Nested;
110 typedef typename internal::ref_selector<Arg3Type>::type Arg3Nested;
111 typedef std::remove_reference_t<Arg1Nested> Arg1Nested_;
112 typedef std::remove_reference_t<Arg2Nested> Arg2Nested_;
113 typedef std::remove_reference_t<Arg3Nested> Arg3Nested_;
115 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
CwiseTernaryOp(
const Arg1& a1,
const Arg2& a2,
const Arg3& a3,
116 const TernaryOp& func = TernaryOp())
117 : m_arg1(a1), m_arg2(a2), m_arg3(a3), m_functor(func) {
118 eigen_assert(a1.rows() == a2.rows() && a1.cols() == a2.cols() && a1.rows() == a3.rows() && a1.cols() == a3.cols());
121 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Index rows()
const {
124 if (internal::traits<internal::remove_all_t<Arg1Nested>>::RowsAtCompileTime ==
Dynamic &&
125 internal::traits<internal::remove_all_t<Arg2Nested>>::RowsAtCompileTime ==
Dynamic)
126 return m_arg3.rows();
127 else if (internal::traits<internal::remove_all_t<Arg1Nested>>::RowsAtCompileTime ==
Dynamic &&
128 internal::traits<internal::remove_all_t<Arg3Nested>>::RowsAtCompileTime ==
Dynamic)
129 return m_arg2.rows();
131 return m_arg1.rows();
133 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Index cols()
const {
136 if (internal::traits<internal::remove_all_t<Arg1Nested>>::ColsAtCompileTime ==
Dynamic &&
137 internal::traits<internal::remove_all_t<Arg2Nested>>::ColsAtCompileTime ==
Dynamic)
138 return m_arg3.cols();
139 else if (internal::traits<internal::remove_all_t<Arg1Nested>>::ColsAtCompileTime ==
Dynamic &&
140 internal::traits<internal::remove_all_t<Arg3Nested>>::ColsAtCompileTime ==
Dynamic)
141 return m_arg2.cols();
143 return m_arg1.cols();
147 EIGEN_DEVICE_FUNC
const Arg1Nested_&
arg1()
const {
return m_arg1; }
149 EIGEN_DEVICE_FUNC
const Arg2Nested_&
arg2()
const {
return m_arg2; }
151 EIGEN_DEVICE_FUNC
const Arg3Nested_&
arg3()
const {
return m_arg3; }
153 EIGEN_DEVICE_FUNC
const TernaryOp&
functor()
const {
return m_functor; }
159 const TernaryOp m_functor;