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
