|  | 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 typename remove_all<ArgTypeNested>::type 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); | 
|  | } | 
|  |  | 
|  | typename evaluator<ArgTypeNestedCleaned>::nestedType m_argImpl; | 
|  | const Index m_rows; | 
|  | }; | 
|  | } | 
|  | } |