Page d'accueil Description du projet
/******************************************
 *
 *   Cedric Pradalier   2001
 *   mail : http://cedric.pradalier.free.fr/mail.html
 *
 *****************************************/


#include "Vector.h"
#include <stdio.h>
/******************************************

  Implementation des tables extensibles,
  Insertion/Suppression en O(1) -- Cout amorti

********************************************/


/* La suppression ne conserve pas l'ordre */
void Vector::deleteElement(int i)
{
    /* Suppression non valide */
    if ((i<0) || (i>=NbElem))
    {
        printf("Vector::deleteElement : element inexistant %i\n",i);
        exit(1);
    }
    /* L'element passe a la fin et est remplace par
       le dernier */
    tElems[i] = tElems[NbElem-1];
    NbElem -= 1;
    /* Si le tableau n'est plus assez rempli, on le reduit
       physiquement,et on recopie */
    if (NbElem < (Size / 4))
    {
        Object ** temp;
        Size /= 2; /* Taile / 2 */
        temp = new (Object*)[Size];
        for (int j=0;j<NbElem;j++)
            temp[j] = tElems[j];
        delete [] tElems;
        tElems = temp;
    }
}

/* On ajoute, si le tableau est plain,
   on l'agrandit physiquement et on recopie */
void Vector::addElement(Object * elem)
{
    if (NbElem == Size)
    {
        Object ** temp;
        Size *= 2;/* Taille * 2 */
        temp = new (Object*)[Size];
        for (int j=0;j<NbElem;j++)
            temp[j] = tElems[j];
        delete [] tElems;
        tElems = temp;
    }
    tElems[NbElem] = elem;
    NbElem += 1;
}

void Vector::setElement(int i,Object * elem)
{
    /* Modification non valide */
    if ((i<0) || (i>=NbElem))
    {
        printf("Vector::setElement : element inexistant %i\n",i);
        exit(1);
    }
    tElems[i] = elem;
}


void Vector::trimToSize()
{
    if ((NbElem==0) || (NbElem==Size))
        return;
    else
    {
        Object ** temp;
        Size = NbElem;
        temp = new (Object*)[Size];
        for (int j=0;j<NbElem;j++)
            temp[j] = tElems[j];
        delete [] tElems;
        tElems = temp;
    }
}   

/* Accede a un element */
Object * Vector::operator[](int i)
{
    if ((i<0) || (i>=NbElem))
    {
        printf("Vector::operator[] : element inexistant %i\n",i);
        exit(1);
    }
    return tElems[i];
};

/* Pareil mais plus facile a appele pour des pointeurs */
Object * Vector::elementAt(int i)
{
    if ((i<0) || (i>=NbElem))
    {
        printf("Vector::elementAt : element inexistant %i\n",i);
        exit(1);
    }
    return tElems[i];
};

void Vector::Print()
{
    printf("[|");
    for (int i=0;i<NbElem;i++)
    {
        tElems[i]->Print();
        printf(" ; ");
    }
    printf("\b|]");
}


// Fusionne 2 partie ordonnée du tableau T
void Fusionne(Object * T[],Object * Dest[],int i1, int j1,int i2,int j2)
{
    int k1 = i1;
    int k2 = i2;
    int k = i1;
    while ((k1 < j1) || (k2 < j2))
    {
        if (k2 == j2)
        {
            Dest[k] = T[k1];
            k += 1;
            k1 = (k1+1 > j1) ? j1 : (k1 + 1);
        } 
        else if ((T[k2]->Value() < T[k1]->Value()) || (k1 == j1))
        {
            Dest[k] = T[k2];
            k += 1;
            k2 = (k2+1 > j2) ? j2 : (k2 + 1);
        }
        else
        {
            Dest[k] = T[k1];
            k += 1;
            k1 = (k1+1 > j1) ? j1 : (k1 + 1);
        }
    }
    // Quand c'est trie on recopie
    for (k=i1;k<j2;k++)
        T[k] = Dest[k];
}
            


// Tri du tableau dont les indices sont k t.q.
//  i <= k < j
void TriPartition(Object * T[],Object * Dest[],int i,int j)
{
    if (i<j-1)
    {
        int milieu = (i + j) / 2;
        TriPartition(T,Dest,i,milieu);
        TriPartition(T,Dest,milieu,j);
        Fusionne(T,Dest,i,milieu,milieu,j);
    }
    else
        Dest[i] = T[i];
        
}
        




void Vector::sort()
{
    // Un petit tri fusion de derriere les fagots ...
    Object ** Dest = new (Object*)[NbElem];
    TriPartition(tElems,Dest,0,NbElem);
    delete [] Dest;
}

void Vector::deleteAll()
{
    int i;
    for(i=0;i<NbElem;i++)
        delete tElems[i];
    delete [] tElems;
    NbElem = 0;
    Size = 2 ; 
    tElems = new (Object *)[2];
}