Un tampon circulaire, aussi appelé tampon cyclique ou tampon en anneau, est une structure de données qui utilise un unique tampon de taille fixe comme s'il était relié de bout en bout.
Au départ, un tampon circulaire est vide et possède une longueur prédéfinie. Par exemple, voici un tampon de 7 éléments :
[ ][ ][ ][ ][ ][ ][ ]
Supposons qu'un 1 soit écrit au milieu du tampon (l'emplacement de départ exact n'a pas d'importance dans un tampon circulaire) :
[ ][ ][ ][1][ ][ ][ ]
Supposons ensuite que deux éléments supplémentaires, 2 et 3, soient ajoutés à la suite du 1 :
[ ][ ][ ][1][2][3][ ]
Si on retire ensuite deux éléments du tampon, ce sont les valeurs les plus anciennes qu'il contient qui sont retirées. Les deux éléments retirés, ici, sont 1 et 2, ce qui ne laisse dans le tampon qu'un 3 :
[ ][ ][ ][ ][ ][3][ ]
Si le tampon contient 7 éléments, il est alors complètement plein :
[5][6][7][8][9][3][4]
Quand le tampon est plein, une erreur est levée pour avertir le client que les écritures suivantes sont bloquées jusqu'à ce qu'un emplacement se libère.
Quand le tampon est plein, le client peut choisir d'écraser les données les plus anciennes au moyen d'une écriture forcée. Dans ce cas, deux éléments supplémentaires, A et B, sont ajoutés et écrasent le 3 et le 4 :
[5][6][7][8][9][A][B]
3 et 4 ont été remplacés par A et B, ce qui fait désormais de 5 la donnée la plus ancienne du tampon. Enfin, si on retire deux éléments, ce sont 5 et 6 qui sont renvoyés, ce qui donne le tampon suivant :
[ ][ ][7][8][9][A][B]
Comme de la place est disponible, si le client utilise à nouveau l'écrasement pour stocker C et D, c'est l'emplacement où 5 et 6 étaient stockés auparavant qui sera utilisé, et non celui de 7 et 8. 7 reste l'élément le plus ancien et le tampon est de nouveau plein.
[C][D][7][8][9][A][B]
Cet exercice introduit quelques concepts que tu n'as peut-être jamais rencontrés :
En 8th, chaque mot appartient à un espace de noms : par exemple, a:new fait référence au mot new de l'espace de noms a.
On peut aussi définir des espaces de noms personnalisés, ce que l'on fait en haut du fichier circular-buffer.8th :
ns: cb
Cela signifie que tous les mots de ce fichier sont accessibles via cb:<word>, ce qui est un excellent moyen de regrouper des fonctionnalités liées.
Pour plus d'informations, consulte la documentation sur les espaces de noms.
Les mots read et write doivent tous deux lever une exception lorsqu'ils sont appelés sur un tampon circulaire dont l'état est invalide.
Pour plus d'informations, consulte la documentation sur les exceptions et la gestion des erreurs.
Même si tu es libre d'implémenter le tampon circulaire comme tu le souhaites, tu pourrais envisager d'utiliser le support des objets de 8th.
Inscris-toi sur Exercism pour apprendre et maîtriser 8th avec 70 exercices, et un vrai mentorat humain, le tout gratuitement.
Dans cette vidéo, on s'intéresse au tampon circulaire : ce qu'il est, où il est utilisé et différentes implémentations, notamment les files, les tableaux statiques et dynamiques, les structures de données immuables et une implémentation amusante à base d'agents.