/*******************************************************************************
 *
 * TRIQS: a Toolbox for Research in Interacting Quantum Systems
 *
 * Copyright (C) 2011 by O. Parcollet
 *
 * TRIQS is free software: you can redistribute it and/or modify it under the
 * terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 *
 * TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * TRIQS. If not, see <http://www.gnu.org/licenses/>.
 *
 ******************************************************************************/
#include "./common.hpp"
#include "./src/array.hpp"
#include <iostream>

using std::cout; using std::endl;
using namespace triqs::arrays;

int main(int argc, char **argv) {
 

 array<long,2> A (2,3);

 // first print the index generator
 for (array<long,2>::indexmap_type::domain_type::generator it = A.indexmap().domain().begin(); it; ++it)
  std::cout<<"  "<<*it<<std::endl;

 std::cout<<std::endl;

 for (array<long,2>::indexmap_type::domain_type::gal_generator <permutations::permutation(0,1) >
   it(A.indexmap().domain()); it; ++it)
  std::cout<<"  "<<*it<<std::endl;

 std::cout<<std::endl;

 for (array<long,2>::indexmap_type::domain_type::gal_generator < permutations::permutation(1,0) >
   it(A.indexmap().domain()); it; ++it)
  std::cout<<"  "<<*it<<std::endl;

 std::cout<<std::endl;

 std::cout<<" C order : traversal"<<std::endl;

 for (array<long,2>::iterator it = A.begin(); it; ++it) { 
  *it =it.indices()[0] + 10 *it.indices()[1] ;
  std::cout<<" i,j = "<<it.indices()<<std::endl;
 }
 std::cout <<"A = i + 10*j"<<A<<std::endl;

 int u=0;
 for (array<long,2>::iterator it = A.begin(); it; ++it,++u) { 
  *it =u;
  std::cout<<" i,j = "<<it.indices()<<std::endl;
 }
 std::cout <<"A = order of visit "<<A<<std::endl;


 std::cout<<" F order : traversal"<<std::endl; 
 array<long,2,TRAVERSAL_ORDER_FORTRAN> Af (2,3);

 for (auto it = Af.begin(); it; ++it) { 
  *it =it.indices()[0] + 10 *it.indices()[1] ;
  std::cout<<" i,j = "<<it.indices()<<std::endl;
 }
 std::cout <<"A = i + 10*j"<<Af<<std::endl;

 u=0;
 for (auto it = Af.begin(); it; ++it,++u) { 
  *it = -u;
  std::cout<<" i,j = "<<it.indices()<<std::endl;
 }
 std::cout <<"Af = order of visit "<<Af<<std::endl;

 return 0;
}