#include #include #include "vecteur_extensible.h" struct vex { void **vecteur; size_t nb_elements; size_t taille_min; size_t taille_reelle; size_t facteur_agrandissement; reallouer_f reallouer; }; vex vex_creer (size_t taille_min, size_t facteur_agrandissement, reallouer_f reallouer) { vex v; assert (taille_min > 0 && facteur_agrandissement > 1 && reallouer != NULL); v = (vex) reallouer (NULL, sizeof (struct vex)); v->vecteur = reallouer (NULL, taille_min * sizeof (void *)); v->nb_elements = 0; v->taille_reelle = v->taille_min = taille_min; v->facteur_agrandissement = facteur_agrandissement; v->reallouer = reallouer; return v; } void vex_detruire (vex v) { assert (v != NULL); v->reallouer (v->vecteur, 0); v->reallouer (v, 0); } void ** vex_vers_vecteur (vex v) { void **vect; assert (v != NULL); vect = v->reallouer (v->vecteur, v->nb_elements * sizeof (void *)); v->reallouer (v, 0); return vect; } size_t vex_cardinal (vex v) { assert (v != NULL); return v->nb_elements; } static void ** vex_element (vex v, size_t indice) { assert (v != NULL && indice < v->nb_elements); return v->vecteur + indice; } void * vex_valeur_element (vex v, size_t i) { return (void *) *vex_element (v, i); } void vex_affecter_element (vex v, size_t i, void *element) { *vex_element (v, i) = element; } void vex_ajouter_element (vex v, void *element) { assert (v != NULL); vex_inserer (v, v->nb_elements, 1); v->vecteur[v->nb_elements - 1] = element; } static void vex_retailler (vex v, size_t taille) { assert (v != NULL && v->nb_elements <= taille); v->vecteur = v->reallouer (v->vecteur, taille * sizeof (void *)); v->taille_reelle = taille; } void vex_inserer (vex v, size_t position, size_t count) { assert (v != NULL && position <= v->nb_elements); if (v->taille_reelle < v->nb_elements + count) { size_t t1 = count + v->nb_elements; size_t t2 = v->taille_reelle * v->facteur_agrandissement; vex_retailler (v, t1 > t2 ? t1 : t2); } memmove (v->vecteur + position + count, v->vecteur + position, (v->nb_elements - position) * sizeof (void *)); v->nb_elements += count; } void vex_supprimer (vex v, size_t position, size_t count) { assert (v != NULL && position <= v->nb_elements); memmove (v->vecteur + position, v->vecteur + position + count, (v->nb_elements + count - position) * sizeof (void *)); v->nb_elements -= count; { size_t t = v->taille_reelle / (v->facteur_agrandissement * v->facteur_agrandissement); if (t > v->nb_elements) vex_retailler (v, t); } }