|  | namespace Eigen { | 
|  | namespace internal { | 
|  | template <typename ArgType> | 
|  | struct evaluator<Circulant<ArgType> > : evaluator_base<Circulant<ArgType> > { | 
|  | typedef Circulant<ArgType> XprType; | 
|  | typedef typename nested_eval<ArgType, XprType::ColsAtCompileTime>::type ArgTypeNested; | 
|  | typedef remove_all_t<ArgTypeNested> ArgTypeNestedCleaned; | 
|  | typedef typename XprType::CoeffReturnType CoeffReturnType; | 
|  |  | 
|  | enum { CoeffReadCost = evaluator<ArgTypeNestedCleaned>::CoeffReadCost, Flags = Eigen::ColMajor }; | 
|  |  | 
|  | evaluator(const XprType& xpr) : m_argImpl(xpr.m_arg), m_rows(xpr.rows()) {} | 
|  |  | 
|  | CoeffReturnType coeff(Index row, Index col) const { | 
|  | Index index = row - col; | 
|  | if (index < 0) index += m_rows; | 
|  | return m_argImpl.coeff(index); | 
|  | } | 
|  |  | 
|  | evaluator<ArgTypeNestedCleaned> m_argImpl; | 
|  | const Index m_rows; | 
|  | }; | 
|  | }  // namespace internal | 
|  | }  // namespace Eigen |