#include "FVTools.h"
#include <stdio.h>
#include <stdlib.h>
int comp_size_t(const void * elem1, const void * elem2) {
    int f = *((size_t *)elem1);
    int s = *((size_t *)elem2);
    if (f > s) return  1;
    if (f < s) return -1;
    return 0;
}    

A2B::A2B(const A2B & el) // copy constructor
{
labelA=el.labelA;codeA=el.codeA;layerA=el.layerA;
typeA=el.typeA;typeB=el.typeB;nb=el.nb;  
for(size_t i=0;i<nb;i++) labelB[i]=el.labelB[i]; 
}
A2B::~A2B(){;}

void A2B::addLabel(size_t i)
{
for(size_t k=0;k<nb;k++)
    if(labelB[k]==i) return;
// the i label does not exists, create it if possible
if(nb>=NB_CELL_PER_VERTEX_3D)
    std::cout<<"not enough memory in file "<<__FILE__<<", line "<<__LINE__<<std::endl;
else
    labelB[nb++]=i;
}
void A2B::delLabel(size_t i)
{
bool found=false;    
size_t kk=0;
for(size_t k=0;k<nb;k++)
    if(labelB[k]==i) {found=true; kk=k;}
if(found)
    {
    for(size_t l=kk;l<nb;l++) labelB[l]=labelB[l+1];
    labelB[nb--]=0;
    }
}
void A2B::changeLabel(size_t i, size_t j)
{
 
for(size_t k=0;k<nb;k++)
    if(labelB[k]==i) {labelB[k]=j;}
}
bool A2B::isEqual(A2B target)
{
if(nb!=target.nb) return(false);    
size_t sort_B[NB_CELL_PER_VERTEX_3D];
size_t sort_targetB[NB_CELL_PER_VERTEX_3D];
size_t diff=0;
for(size_t k=0;k<nb;k++){sort_B[k]=labelB[k];}
qsort(sort_B, sizeof(sort_B)/sizeof(*sort_B), sizeof(*sort_B),comp_size_t);
for(size_t k=0;k<target.nb;k++){sort_targetB[k]=labelB[k];}
qsort(sort_targetB, sizeof(sort_targetB)/sizeof(*sort_targetB), sizeof(*sort_targetB),comp_size_t);
for(size_t k=0;k<nb;k++)
    {
    diff+=(sort_targetB[k]-sort_B[k])*(sort_targetB[k]-sort_B[k]);
    }
return((bool)!diff);    
}

void strtos(char *ptr, char **endptr,char *auxString)
{
size_t pos,poss,strl;
strl=strlen(ptr);
pos=0;poss=0;
while((pos<strl) && ptr[pos]==32) pos++;
if (pos==strl){auxString[poss]='\0'; return;} // no string
// ok now I pointing on the first character
while(((pos+poss)<strl) &&  (ptr[pos+poss]!=32))
    {
    auxString[poss]=ptr[pos+poss];
    poss++;
    }
auxString[poss]='\0';
//std::cout <<((pos+poss)<strl) <<" " << (ptr[pos+poss]!=32)<<std::endl;
//std::cout<<"pos="<<pos<<" poss="<<poss<<" string="<<auxString<<std::endl;
*endptr=ptr+pos+poss;
}


void denseM2sparseM(FVDenseM<double> &DM,FVSparseM<double> &SM,double tol=0.)
{    
double val;
size_t nb_col=DM.getNbColumns(); 
size_t nb_row=DM.getNbRows();
SM.clean();
for(size_t i=0;i<nb_col;i++)
    for(size_t j=0;j<nb_row;j++)
        {
        val=DM.getValue(i,j);    
        if(fabs(val)>tol)
           { 
            SM.setValue(i,j,val);
           }
        }
}

