Implémentation d'un séquence impérative sous forme de vecteur avec
trou
déplacer-intervalle(tableau t1, entier début, entier fin, tableau t2, entier pos)
si t1 = t2 et pos > début et pos < fin
alors
// on déplace de la fin vers le début
pour i allant de fin - début - 1 jusqu'à 0
t2[pos + i] <- t1[début + i]
sinon
pour i allant de 0 jusqu'à fin - début - 1
t2[pos + i] <- t1[début + i]
vider-intervalle(tableau t, entier début, entier fin)
pour i allant de 0 jusqu'à fin - début - 1
t[début + i] <- nil
déplacer-trou(tableau t, entier début, entier fin, entier position)
si position = début
alors // ne rien faire
sinon si position < début
alors
taille-trou <- fin - début
taille-intervalle <- début - position
déplacer-intervalle(t, position, début, t, position + taille-trou)
vider-intervalle(t, position, position + min(taille-trou, taille-intervalle))
sinon
taille-trou <- fin - début
taille-intervalle <- position - début
déplacer-intervalle(t, fin, fin + taille-intervalle, t, début)
vider-intervalle(t, début + max(taille-trou, taille-intervalle),
fin + taille-intervalle)
entier
taille(s)
renvoyer début-trou(s) + taille-tableau(s) - fin-trou(s)
positionner-trou(séquence s, entier position)
si début-trou(s) = position
alors
// ne rien faire
sinon
taille-trou <- fin-trou(s) - début-trou(s)
déplacer-trou(tableau(s), début-trou(s), fin-trou(s), position)
début-trou(s) <- position
fin-trou(s) <- position + taille-trou
insérer(objet obj, séquence s, entier position)
assert(position <= taille(s))
positionner-trou(s, position)
si fin-trou(s) = début-trou(s)
alors
t = créer-tableau(2 * taille-tableau(s))
déplacer-intervalle(tableau(s), 0, début-trou(s), t, 0)
déplacer-intervalle(tableau(s), fin-trou(s), taille-tableau(s),
t, début-trou(s) + taille-tableau(s))
fin-trou(s) <- début-trou(s) + taille-tableau(s)
tableau(s) <- t
taille-tableau(s) <- 2 * taille-tableau(s)
tableau(s)[debut-trou(s)] <- obj
début-trou(s) <- début-trou(s) + 1
supprimer(séquence s, entier position)
assert(position < taille(s))
positionner-trou(s, position)
tableau(s)[fin-trou(s)] <- nil
fin-trou(s) <- fin-trou(s) + 1