alpar@994: #include <lemon/time_measure.h>
alpar@994: #include <vector>
alpar@994: 
alpar@994: template<class T>
alpar@994: class Matrix 
alpar@994: {
alpar@994: public:
alpar@994:   int m,n;
alpar@994:   std::vector<T> values;
alpar@994:   
alpar@994:   Matrix(int _m, int _n) : m(_m), n(_n), values(n*m) {}
alpar@994:   typename std::vector<T>::reference operator()(int i, int j)
alpar@994:   { return values[i*n+j];}
alpar@994: 
alpar@994:   class Row 
alpar@994:   {
alpar@994:   public:
alpar@994:     Matrix<T> &mat;
alpar@994:     int row;
alpar@994:     
alpar@994:     Row(Matrix<T> &_mat,int _row) : mat(_mat), row(_row) {}
alpar@994:     typename std::vector<T>::reference operator()(int j)
alpar@994:     { return mat.values[row*mat.n+j];}
alpar@994:   };
alpar@994:   class Column 
alpar@994:   {
alpar@994:   public:
alpar@994:     Matrix<T> &mat;
alpar@994:     int col;
alpar@994:     
alpar@994:     Column(Matrix<T> &_mat,int _col) : mat(_mat), col(_col) {}
alpar@994:     typename std::vector<T>::reference operator[](int i)
alpar@994:     { return mat.values[i*mat.n+col];}
alpar@994:   };
alpar@994:   
alpar@994:   Row operator[](int i) { return Row(*this,i); }
alpar@994:   Column operator()(int j) { return Column(*this,j); }
alpar@994: };
alpar@994: 
alpar@994: main() 
alpar@994: {
alpar@994:   const int COUNT=1000000;
alpar@994:   const int SIZE=100;
alpar@994:   
alpar@994:   Matrix<int> A(SIZE,SIZE);
alpar@994:   
alpar@994:   for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) A(i,j)=i+j;
alpar@994: 
alpar@994:   int s=0;
alpar@994:   lemon::Timer T;
alpar@994:   for(int c=0;c<COUNT;c++) {
alpar@994:     for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A[i](j);
alpar@994:   }
alpar@994:   std::cout << "A[i](j): " << T << ' ' << s <<'\n';
alpar@994:   s=0;
alpar@994:   T.reset();
alpar@994:   for(int c=0;c<COUNT;c++) {
alpar@994:     for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A(i,j);
alpar@994:   }
alpar@994:   std::cout << "A(i,j): " << T << ' ' << s << '\n';
alpar@994:   s=0;
alpar@994:   T.reset();
alpar@994:   for(int c=0;c<COUNT;c++) {
alpar@994:     for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A(j)[i];
alpar@994:   }
alpar@994:   std::cout << "A(j)[i]: " << T << ' ' << s << '\n';
alpar@994:   s=0;
alpar@994:   T.reset();
alpar@994:   for(int c=0;c<COUNT;c++) {
alpar@994:     for(int i=0;i<SIZE;i++) for(int j=0;j<SIZE;j++) s+=A(i,j);
alpar@994:   }
alpar@994:   std::cout << "A(j,i): " << T << ' ' << s << "\n\n";
alpar@994: 
alpar@994:   return 0;
alpar@994: }