1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| //////////////////////////////
// Classe CTableauGenerique //
//////////////////////////////
CTableauGenerique::CTableauGenerique(const CGenerique& ModelePoubelle)
:m_Poubelle(NULL),m_Nombre(0),m_Tableau(NULL),m_TypeComparaison(-1)
{
m_Poubelle = ModelePoubelle.Cloner();
m_Poubelle->DefinirConteneur(this);
}
CTableauGenerique::CTableauGenerique(const CTableauGenerique& Source)
:m_Poubelle(NULL),m_Nombre(0),m_Tableau(NULL),m_TypeComparaison(-1)
{
m_Poubelle = Source.m_Poubelle->Cloner();
for (long n=0; n < Source.m_Nombre; n++) Ajouter(Source.Element(n));
}
CTableauGenerique::~CTableauGenerique()
{
Vider();
delete m_Poubelle;
}
CGenerique* CTableauGenerique::Cloner() const
{
return new CTableauGenerique(*this);
}
long CTableauGenerique::Nombre() const
{
return m_Nombre;
printf("m_Nombre vaut %ld",m_Nombre);
}
CGenerique& CTableauGenerique::Element(long Indice) const
{
return ((Indice >= 0) && (Indice < m_Nombre)) ? *(m_Tableau[Indice]) : *m_Poubelle;
}
long CTableauGenerique::Indice(const CGenerique& ModeleRecherche) const
{
if ( (m_Nombre == 0) || (!m_Poubelle->GereUnicite()) || (!ModeleRecherche.EstValide()) ) return -1;
const CGenerique* Recherche = &ModeleRecherche;
unsigned int n = m_Nombre;
((CTableauGenerique*)this)->m_TypeComparaison = ComparaisonPourUnicite;
CGenerique** Trouve = (CGenerique**)_lfind(&Recherche,m_Tableau,&n,sizeof(CGenerique*),Comparer);
((CTableauGenerique*)this)->m_TypeComparaison = -1;
return (Trouve != NULL) ? Trouve - m_Tableau : -1;
}
void CTableauGenerique::Vider()
{
if (m_Tableau != NULL)
{
for (long n=0; n < m_Nombre; n++) delete m_Tableau[n];
free(m_Tableau);
m_Tableau = NULL;
m_Nombre = 0;
}
}
bool CTableauGenerique::Ajouter(const CGenerique& ModeleAAjouter, bool RetourEnCasDeDoublon)
{
if (!ModeleAAjouter.EstValide()) return false;
if ( (m_Poubelle->GereUnicite()) && (Indice(ModeleAAjouter) >= 0) ) return RetourEnCasDeDoublon;
void* Nouveau = realloc(m_Tableau,(m_Nombre+1)*sizeof(CGenerique*));
if (Nouveau == NULL) return false;
m_Tableau = (CGenerique**)Nouveau;
CGenerique* AAjouter = ModeleAAjouter.Cloner();
if (!AAjouter->EstValide())
{
delete AAjouter;
return false;
}
m_Tableau[m_Nombre] = AAjouter;
m_Tableau[m_Nombre]->DefinirConteneur(this);
m_Nombre++;
return true;
}
bool CTableauGenerique::Supprimer(long Indice)
{
if ( (Indice < 0) || (Indice >= m_Nombre) ) return false;
delete m_Tableau[Indice];
if (Indice < (m_Nombre-1)) memmove(m_Tableau+Indice,m_Tableau+(Indice+1),(m_Nombre-1-Indice)*sizeof(CGenerique*));
realloc(m_Tableau,(m_Nombre-1)*sizeof(CGenerique*));
m_Nombre--;
return true;
}
void CTableauGenerique::Trier(long TypeComparaison)
{
if ( (m_Nombre >= 2) && (TypeComparaison >= 1) && (TypeComparaison <= m_Poubelle->NombreClesDeTri()) )
{
m_TypeComparaison = TypeComparaison;
qsort(m_Tableau,m_Nombre,sizeof(CGenerique*),Comparer);
m_TypeComparaison = -1;
}
}
/*static*/int CTableauGenerique::Comparer(const void* p1, const void* p2)
{
const CGenerique* o1 = *((const CGenerique**)p1);
const CGenerique* o2 = *((const CGenerique**)p2);
return o1->Comparer(*o2,o2->Conteneur()->m_TypeComparaison);
} |
Partager