12#ifndef EIGEN_CWISE_TERNARY_OP_H
13#define EIGEN_CWISE_TERNARY_OP_H
18template <
typename TernaryOp,
typename Arg1,
typename Arg2,
typename Arg3>
19struct traits<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> > {
22 typedef typename remove_all<Arg1>::type Ancestor;
23 typedef typename traits<Ancestor>::XprKind XprKind;
25 RowsAtCompileTime = traits<Ancestor>::RowsAtCompileTime,
26 ColsAtCompileTime = traits<Ancestor>::ColsAtCompileTime,
27 MaxRowsAtCompileTime = traits<Ancestor>::MaxRowsAtCompileTime,
28 MaxColsAtCompileTime = traits<Ancestor>::MaxColsAtCompileTime
34 typedef typename result_of<TernaryOp(
35 const typename Arg1::Scalar&,
const typename Arg2::Scalar&,
36 const typename Arg3::Scalar&)>::type Scalar;
38 typedef typename internal::traits<Arg1>::StorageKind StorageKind;
39 typedef typename internal::traits<Arg1>::StorageIndex StorageIndex;
41 typedef typename Arg1::Nested Arg1Nested;
42 typedef typename Arg2::Nested Arg2Nested;
43 typedef typename Arg3::Nested Arg3Nested;
44 typedef typename remove_reference<Arg1Nested>::type _Arg1Nested;
45 typedef typename remove_reference<Arg2Nested>::type _Arg2Nested;
46 typedef typename remove_reference<Arg3Nested>::type _Arg3Nested;
51template <
typename TernaryOp,
typename Arg1,
typename Arg2,
typename Arg3,
53class CwiseTernaryOpImpl;
82template <
typename TernaryOp,
typename Arg1Type,
typename Arg2Type,
85 TernaryOp, Arg1Type, Arg2Type, Arg3Type,
86 typename internal::traits<Arg1Type>::StorageKind>,
87 internal::no_assignment_operator
90 typedef typename internal::remove_all<Arg1Type>::type Arg1;
91 typedef typename internal::remove_all<Arg2Type>::type Arg2;
92 typedef typename internal::remove_all<Arg3Type>::type Arg3;
94 typedef typename CwiseTernaryOpImpl<
95 TernaryOp, Arg1Type, Arg2Type, Arg3Type,
96 typename internal::traits<Arg1Type>::StorageKind>::Base Base;
99 typedef typename internal::ref_selector<Arg1Type>::type Arg1Nested;
100 typedef typename internal::ref_selector<Arg2Type>::type Arg2Nested;
101 typedef typename internal::ref_selector<Arg3Type>::type Arg3Nested;
102 typedef typename internal::remove_reference<Arg1Nested>::type _Arg1Nested;
103 typedef typename internal::remove_reference<Arg2Nested>::type _Arg2Nested;
104 typedef typename internal::remove_reference<Arg3Nested>::type _Arg3Nested;
107 EIGEN_STRONG_INLINE
CwiseTernaryOp(
const Arg1& a1,
const Arg2& a2,
109 const TernaryOp& func = TernaryOp())
110 : m_arg1(a1), m_arg2(a2), m_arg3(a3), m_functor(func) {
112 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Arg1, Arg2)
113 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Arg1, Arg3)
116 EIGEN_STATIC_ASSERT((internal::is_same<
117 typename internal::traits<Arg1Type>::StorageKind,
118 typename internal::traits<Arg2Type>::StorageKind>::value),
119 STORAGE_KIND_MUST_MATCH)
120 EIGEN_STATIC_ASSERT((internal::is_same<
121 typename internal::traits<Arg1Type>::StorageKind,
122 typename internal::traits<Arg3Type>::StorageKind>::value),
123 STORAGE_KIND_MUST_MATCH)
125 eigen_assert(a1.rows() == a2.rows() && a1.cols() == a2.cols() &&
126 a1.rows() == a3.rows() && a1.cols() == a3.cols());
130 EIGEN_STRONG_INLINE
Index rows()
const {
133 if (internal::traits<
typename internal::remove_all<Arg1Nested>::type>::
134 RowsAtCompileTime ==
Dynamic &&
135 internal::traits<
typename internal::remove_all<Arg2Nested>::type>::
137 return m_arg3.rows();
138 else if (internal::traits<
typename internal::remove_all<Arg1Nested>::type>::
139 RowsAtCompileTime ==
Dynamic &&
140 internal::traits<
typename internal::remove_all<Arg3Nested>::type>::
142 return m_arg2.rows();
144 return m_arg1.rows();
147 EIGEN_STRONG_INLINE
Index cols()
const {
150 if (internal::traits<
typename internal::remove_all<Arg1Nested>::type>::
151 ColsAtCompileTime ==
Dynamic &&
152 internal::traits<
typename internal::remove_all<Arg2Nested>::type>::
154 return m_arg3.cols();
155 else if (internal::traits<
typename internal::remove_all<Arg1Nested>::type>::
156 ColsAtCompileTime ==
Dynamic &&
157 internal::traits<
typename internal::remove_all<Arg3Nested>::type>::
159 return m_arg2.cols();
161 return m_arg1.cols();
166 const _Arg1Nested&
arg1()
const {
return m_arg1; }
169 const _Arg2Nested&
arg2()
const {
return m_arg2; }
172 const _Arg3Nested&
arg3()
const {
return m_arg3; }
175 const TernaryOp&
functor()
const {
return m_functor; }
181 const TernaryOp m_functor;
185template <
typename TernaryOp,
typename Arg1,
typename Arg2,
typename Arg3,
186 typename StorageKind>
187class CwiseTernaryOpImpl
188 :
public internal::generic_xpr_base<
189 CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> >::type {
191 typedef typename internal::generic_xpr_base<
192 CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> >::type Base;
Generic expression where a coefficient-wise ternary operator is applied to two expressions.
Definition: CwiseTernaryOp.h:88
const _Arg1Nested & arg1() const
Definition: CwiseTernaryOp.h:166
const _Arg2Nested & arg2() const
Definition: CwiseTernaryOp.h:169
const _Arg3Nested & arg3() const
Definition: CwiseTernaryOp.h:172
const TernaryOp & functor() const
Definition: CwiseTernaryOp.h:175
const unsigned int RowMajorBit
Definition: Constants.h:66
Namespace containing all symbols from the Eigen library.
Definition: Core:141
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
const int Dynamic
Definition: Constants.h:22