Aller au contenu principal

3.1.1.5. Repeat Offsets (Décalages répétés)

Comme décrit ci-dessus, les trois premières valeurs définissent les décalages répétés; nous les appelons Repeated_Offset1, Repeated_Offset2 et Repeated_Offset3. Ils sont classés par ordre de récence, Repeated_Offset1 représentant "le plus récent".

Si offset_value est 1, le décalage utilisé est Repeated_Offset1, et ainsi de suite.

Il y a une exception: lorsque la literals_length de la séquence actuelle est 0, les décalages répétés sont décalés de 1, donc:

  • offset_value de 1 signifie Repeated_Offset2
  • offset_value de 2 signifie Repeated_Offset3
  • offset_value de 3 signifie Repeated_Offset1 - 1_byte

Initialisation

Pour le premier bloc, l'historique des décalages de départ est rempli avec les valeurs suivantes:

  • Repeated_Offset1 = 1
  • Repeated_Offset2 = 4
  • Repeated_Offset3 = 8

Sauf si un dictionnaire est utilisé, auquel cas ils proviennent du dictionnaire.

Ensuite, chaque bloc obtient son historique de décalages de départ à partir des valeurs de fin du Compressed_Block le plus récent. Notez que les blocs qui ne sont pas des Compressed_Blocks sont ignorés; ils n'affectent pas l'historique des décalages.

Règles de mise à jour

Pendant l'exécution des séquences d'un Compressed_Block, les valeurs des Repeated_Offsets sont maintenues à jour afin qu'elles représentent toujours les trois décalages les plus récemment utilisés. Pour y parvenir, ils sont mis à jour après l'exécution de chaque séquence de la manière suivante:

Cas 1: Décalage non répété

Lorsque l'offset_value de la séquence ne fait pas référence à l'un des Repeated_Offsets (lorsqu'il a une valeur supérieure à 3, ou lorsqu'il a la valeur 3 et que la literals_length de la séquence est zéro):

  • Les valeurs des Repeated_Offsets sont décalées d'un vers l'arrière
  • Repeated_Offset1 prend la valeur du décalage qui vient d'être utilisé

Formule de mise à jour:

Repeated_Offset3 = Repeated_Offset2
Repeated_Offset2 = Repeated_Offset1
Repeated_Offset1 = nouveau décalage

Cas 2: Décalage répété

Lorsque l'offset_value de la séquence fait référence à l'un des Repeated_Offsets (lorsqu'il a la valeur 1 ou 2, ou lorsqu'il a la valeur 3 et que la literals_length de la séquence est non nulle):

  • Les Repeated_Offsets sont réorganisés
  • Repeated_Offset1 prend la valeur du Repeated_Offset utilisé
  • Les valeurs existantes sont repoussées du premier Repeated_Offset vers le Repeated_Offset sélectionné par offset_value

Cela effectue efficacement une rotation d'enroulement en une étape de ces valeurs de décalage, de sorte que leur ordre reflète à nouveau leur récence d'utilisation.

Tableau d'exemple de mise à jour

Le tableau suivant montre les valeurs lors de l'application d'une série de séquences aux Repeated_Offsets:

offset_valueliterals_lengthRepeated_Offset1Repeated_Offset2Repeated_Offset3Comment (Commentaire)
--148Valeur de départ
111411111114Non-répétition
122111114Répétition1; pas de changement
222522222211111Non-répétition
1114111111122221111Non-répétition
333633333311112222Non-répétition
222111133332222Répétition2; échange 1 et 2
333222211113333Répétition3; rotation 3 vers 1
10222122221111Décalage analysé inséré
10222222213333Répétition2

Tableau 18: Repeated_Offsets

Traitement des cas particuliers

Cas literals_length = 0

Lorsque literals_length = 0, l'interprétation d'offset_value est décalée:

offset_valueDécalage réellement utilisé
1Repeated_Offset2
2Repeated_Offset3
3Repeated_Offset1 - 1

Ce traitement spécial est destiné à optimiser les opérations de copie de correspondance consécutives.


Points clés

  1. Principe de récence: Repeated_Offset1 est toujours le décalage le plus récemment utilisé
  2. Mise à jour automatique: L'historique des décalages est automatiquement mis à jour après chaque exécution de séquence
  3. Support de dictionnaire: Les valeurs initiales peuvent provenir du dictionnaire
  4. Décalage spécial: L'interprétation du décalage change lorsque literals_length=0