| 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; |
| }; |
| } |
| } |