1template <class ArgType>
2class Circulant : public Eigen::MatrixBase<Circulant<ArgType> >
3{
4public:
5  Circulant(const ArgType& arg)
6    : m_arg(arg)
7  {
8    EIGEN_STATIC_ASSERT(ArgType::ColsAtCompileTime == 1,
9                        YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX);
10  }
11
12  typedef typename Eigen::internal::ref_selector<Circulant>::type Nested;
13
14  typedef Eigen::Index Index;
15  Index rows() const { return m_arg.rows(); }
16  Index cols() const { return m_arg.rows(); }
17
18  typedef typename Eigen::internal::ref_selector<ArgType>::type ArgTypeNested;
19  ArgTypeNested m_arg;
20};
21