#include "init.hpp"

//******************
//* Global objects *
//******************

Gomu::Type* type_PermutationA;
Gomu::Type* type_PermutationB;
Gomu::Type* type_PermutationD;
Gomu::Type* type_PermutationEnumeratorA;
Gomu::Type* type_PermutationEnumeratorB;
Gomu::Type* type_PermutationEnumeratorD;

//*************************
//* Extension inilisation *
//*************************

extern "C"{
  Gomu::Module::Type types[]={
    {"PermutationA",Permutations::dispPerm<CoxeterA>,Permutations::delPerm<CoxeterA>,Permutations::copyPerm<CoxeterA>,Permutations::cmpPerm<CoxeterA>,&type_PermutationA},
    {"PermutationB",Permutations::dispPerm<CoxeterB>,Permutations::delPerm<CoxeterB>,Permutations::copyPerm<CoxeterB>,Permutations::cmpPerm<CoxeterB>,&type_PermutationB},
    {"PermutationD",Permutations::dispPerm<CoxeterD>,Permutations::delPerm<CoxeterD>,Permutations::copyPerm<CoxeterD>,Permutations::cmpPerm<CoxeterD>,&type_PermutationD},
    {"PermutationEnumeratorA",Permutations::dispPermE<CoxeterA>,Permutations::delPermE<CoxeterA>,Permutations::copyPermE<CoxeterA>,Permutations::cmpPermE<CoxeterA>,&type_PermutationEnumeratorA},
    {"PermutationEnumeratorB",Permutations::dispPermE<CoxeterB>,Permutations::delPermE<CoxeterB>,Permutations::copyPermE<CoxeterB>,Permutations::cmpPermE<CoxeterB>,&type_PermutationEnumeratorB},
    {"PermutationEnumeratorD",Permutations::dispPermE<CoxeterD>,Permutations::delPermE<CoxeterD>,Permutations::copyPermE<CoxeterD>,Permutations::cmpPermE<CoxeterD>,&type_PermutationEnumeratorD},
   TYPE_SENTINEL
  };

  //--- Functions ---//
  Gomu::Module::Function functions[]={
    {"PermutationA","permutationA",{"Integer"},(void*)Permutations::intToPerm<CoxeterA>},
    {"PermutationB","permutationB",{"Integer"},(void*)Permutations::intToPerm<CoxeterB>},
    {"PermutationD","permutationD",{"Integer"},(void*)Permutations::intToPerm<CoxeterD>},
    {"PermutationEnumeratorA","permutationEnumeratorA",{"Integer"},(void*)Permutations::intToPermE<CoxeterA>},
    {"PermutationEnumeratorB","permutationEnumeratorB",{"Integer"},(void*)Permutations::intToPermE<CoxeterB>},
    {"PermutationEnumeratorD","permutationEnumeratorD",{"Integer"},(void*)Permutations::intToPermE<CoxeterD>},
    FUNC_SENTINEL
  };

  //--- Member functions ---//
  Gomu::Module::Function member_functions[]={
    //--- PermutationEnumertor ---//
    {"PermutationA","get",{"PermutationEnumeratorA"},(void*)Permutations::PE_get<CoxeterA>},
    {"PermutationB","get",{"PermutationEnumeratorB"},(void*)Permutations::PE_get<CoxeterB>},
    {"PermutationD","get",{"PermutationEnumeratorD"},(void*)Permutations::PE_get<CoxeterD>},
    {"Boolean","next",{"PermutationEnumeratorA"},(void*)Permutations::PE_next<CoxeterA>},
    {"Boolean","next",{"PermutationEnumeratorB"},(void*)Permutations::PE_next<CoxeterB>},
    {"Boolean","next",{"PermutationEnumeratorD"},(void*)Permutations::PE_next<CoxeterD>},
    {"Void","reset",{"PermutationEnumeratorA"},(void*)Permutations::PE_reset<CoxeterA>},
    {"Void","reset",{"PermutationEnumeratorB"},(void*)Permutations::PE_reset<CoxeterB>},
    {"Void","reset",{"PermutationEnumeratorD"},(void*)Permutations::PE_reset<CoxeterD>},
    {"Integer","size",{"PermutationEnumeratorA"},(void*)Permutations::PE_size<CoxeterA>},
    {"Integer","size",{"PermutationEnumeratorB"},(void*)Permutations::PE_size<CoxeterB>},
    {"Integer","size",{"PermutationEnumeratorD"},(void*)Permutations::PE_size<CoxeterD>},
    FUNC_SENTINEL
  };
}