10#ifndef EIGEN_VISITOR_H
11#define EIGEN_VISITOR_H
17template<
typename Visitor,
typename Derived,
int UnrollCount>
21 col = (UnrollCount-1) / Derived::RowsAtCompileTime,
22 row = (UnrollCount-1) % Derived::RowsAtCompileTime
26 static inline void run(
const Derived &mat, Visitor& visitor)
28 visitor_impl<Visitor, Derived, UnrollCount-1>::run(mat, visitor);
29 visitor(mat.coeff(row, col), row, col);
33template<
typename Visitor,
typename Derived>
34struct visitor_impl<Visitor, Derived, 1>
37 static inline void run(
const Derived &mat, Visitor& visitor)
39 return visitor.init(mat.coeff(0, 0), 0, 0);
43template<
typename Visitor,
typename Derived>
44struct visitor_impl<Visitor, Derived,
Dynamic>
47 static inline void run(
const Derived& mat, Visitor& visitor)
49 visitor.init(mat.coeff(0,0), 0, 0);
50 for(
Index i = 1; i < mat.rows(); ++i)
51 visitor(mat.coeff(i, 0), i, 0);
52 for(
Index j = 1; j < mat.cols(); ++j)
53 for(
Index i = 0; i < mat.rows(); ++i)
54 visitor(mat.coeff(i, j), i, j);
59template<
typename XprType>
60class visitor_evaluator
64 explicit visitor_evaluator(
const XprType &xpr) : m_evaluator(xpr), m_xpr(xpr) {}
66 typedef typename XprType::Scalar Scalar;
67 typedef typename XprType::CoeffReturnType CoeffReturnType;
70 RowsAtCompileTime = XprType::RowsAtCompileTime,
71 CoeffReadCost = internal::evaluator<XprType>::CoeffReadCost
74 EIGEN_DEVICE_FUNC
Index rows()
const {
return m_xpr.rows(); }
75 EIGEN_DEVICE_FUNC
Index cols()
const {
return m_xpr.cols(); }
76 EIGEN_DEVICE_FUNC
Index size()
const {
return m_xpr.size(); }
78 EIGEN_DEVICE_FUNC CoeffReturnType coeff(
Index row,
Index col)
const
79 {
return m_evaluator.coeff(row, col); }
82 internal::evaluator<XprType> m_evaluator;
104template<
typename Derived>
105template<
typename Visitor>
109 typedef typename internal::visitor_evaluator<Derived> ThisEvaluator;
110 ThisEvaluator thisEval(derived());
113 unroll = SizeAtCompileTime !=
Dynamic
114 && SizeAtCompileTime * ThisEvaluator::CoeffReadCost + (SizeAtCompileTime-1) * internal::functor_traits<Visitor>::Cost <= EIGEN_UNROLLING_LIMIT
116 return internal::visitor_impl<Visitor, ThisEvaluator, unroll ? int(SizeAtCompileTime) :
Dynamic>::run(thisEval, visitor);
124template <
typename Derived>
127 typedef typename Derived::Scalar Scalar;
131 inline void init(
const Scalar& value,
Index i,
Index j)
144template <
typename Derived>
145struct min_coeff_visitor : coeff_visitor<Derived>
147 typedef typename Derived::Scalar Scalar;
149 void operator() (
const Scalar& value,
Index i,
Index j)
151 if(value < this->res)
160template<
typename Scalar>
161struct functor_traits<min_coeff_visitor<Scalar> > {
163 Cost = NumTraits<Scalar>::AddCost
172template <
typename Derived>
173struct max_coeff_visitor : coeff_visitor<Derived>
175 typedef typename Derived::Scalar Scalar;
177 void operator() (
const Scalar& value,
Index i,
Index j)
179 if(value > this->res)
188template<
typename Scalar>
189struct functor_traits<max_coeff_visitor<Scalar> > {
191 Cost = NumTraits<Scalar>::AddCost
202template<
typename Derived>
203template<
typename IndexType>
205typename internal::traits<Derived>::Scalar
208 internal::min_coeff_visitor<Derived> minVisitor;
209 this->visit(minVisitor);
210 *rowId = minVisitor.row;
211 if (colId) *colId = minVisitor.col;
212 return minVisitor.res;
220template<
typename Derived>
221template<
typename IndexType>
223typename internal::traits<Derived>::Scalar
226 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
227 internal::min_coeff_visitor<Derived> minVisitor;
228 this->visit(minVisitor);
229 *index = IndexType((RowsAtCompileTime==1) ? minVisitor.col : minVisitor.row);
230 return minVisitor.res;
238template<
typename Derived>
239template<
typename IndexType>
241typename internal::traits<Derived>::Scalar
244 internal::max_coeff_visitor<Derived> maxVisitor;
245 this->visit(maxVisitor);
246 *rowPtr = maxVisitor.row;
247 if (colPtr) *colPtr = maxVisitor.col;
248 return maxVisitor.res;
256template<
typename Derived>
257template<
typename IndexType>
259typename internal::traits<Derived>::Scalar
262 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
263 internal::max_coeff_visitor<Derived> maxVisitor;
264 this->visit(maxVisitor);
265 *index = (RowsAtCompileTime==1) ? maxVisitor.col : maxVisitor.row;
266 return maxVisitor.res;
Base class for all dense matrices, vectors, and arrays.
Definition: DenseBase.h:47
Namespace containing all symbols from the Eigen library.
Definition: Core:287
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:33
const int Dynamic
Definition: Constants.h:21