3 #ifndef __COMPRESS_MTF8_H
\r
4 #define __COMPRESS_MTF8_H
\r
6 #include "../../../C/CpuArch.h"
\r
8 #include "../../Common/Types.h"
\r
10 namespace NCompress {
\r
16 int FindAndMove(Byte v)
\r
19 for (pos = 0; Buf[pos] != v; pos++);
\r
21 for (; pos >= 8; pos -= 8)
\r
23 Buf[pos] = Buf[pos - 1];
\r
24 Buf[pos - 1] = Buf[pos - 2];
\r
25 Buf[pos - 2] = Buf[pos - 3];
\r
26 Buf[pos - 3] = Buf[pos - 4];
\r
27 Buf[pos - 4] = Buf[pos - 5];
\r
28 Buf[pos - 5] = Buf[pos - 6];
\r
29 Buf[pos - 6] = Buf[pos - 7];
\r
30 Buf[pos - 7] = Buf[pos - 8];
\r
32 for (; pos > 0; pos--)
\r
33 Buf[pos] = Buf[pos - 1];
\r
45 Byte GetHead() const { return Buf[0]; }
\r
46 Byte GetAndMove(int pos)
\r
48 Byte res = Buf[pos];
\r
49 for (; pos >= 8; pos -= 8)
\r
51 Buf[pos] = Buf[pos - 1];
\r
52 Buf[pos - 1] = Buf[pos - 2];
\r
53 Buf[pos - 2] = Buf[pos - 3];
\r
54 Buf[pos - 3] = Buf[pos - 4];
\r
55 Buf[pos - 4] = Buf[pos - 5];
\r
56 Buf[pos - 5] = Buf[pos - 6];
\r
57 Buf[pos - 6] = Buf[pos - 7];
\r
58 Buf[pos - 7] = Buf[pos - 8];
\r
60 for (; pos > 0; pos--)
\r
61 Buf[pos] = Buf[pos - 1];
\r
69 typedef UInt64 CMtfVar;
\r
72 typedef UInt32 CMtfVar;
\r
76 #define MTF_MASK ((1 << MTF_MOVS) - 1)
\r
81 CMtfVar Buf[256 >> MTF_MOVS];
\r
83 void StartInit() { memset(Buf, 0, sizeof(Buf)); }
\r
84 void Add(unsigned int pos, Byte val) { Buf[pos >> MTF_MOVS] |= ((CMtfVar)val << ((pos & MTF_MASK) << 3)); }
\r
85 Byte GetHead() const { return (Byte)Buf[0]; }
\r
86 Byte GetAndMove(unsigned int pos)
\r
88 UInt32 lim = ((UInt32)pos >> MTF_MOVS);
\r
89 pos = (pos & MTF_MASK) << 3;
\r
90 CMtfVar prev = (Buf[lim] >> pos) & 0xFF;
\r
95 CMtfVar next = Buf[0];
\r
96 Buf[0] = (next << 8) | prev;
\r
97 prev = (next >> (MTF_MASK << 3));
\r
101 for (; i < lim; i += 2)
\r
103 CMtfVar n0 = Buf[i];
\r
104 CMtfVar n1 = Buf[i + 1];
\r
105 Buf[i ] = (n0 << 8) | prev;
\r
106 Buf[i + 1] = (n1 << 8) | (n0 >> (MTF_MASK << 3));
\r
107 prev = (n1 >> (MTF_MASK << 3));
\r
109 CMtfVar next = Buf[i];
\r
110 CMtfVar mask = (((CMtfVar)0x100 << pos) - 1);
\r
111 Buf[i] = (next & ~mask) | (((next << 8) | prev) & mask);
\r
112 return (Byte)Buf[0];
\r
117 const int kSmallSize = 64;
\r
120 Byte SmallBuffer[kSmallSize];
\r
127 Byte GetHead() const
\r
130 return SmallBuffer[kSmallSize - SmallSize];
\r
134 void Init(int size)
\r
138 for (int i = 0; i < 16; i++)
\r
140 Counts[i] = ((size >= 16) ? 16 : size);
\r
145 Byte GetAndMove(int pos)
\r
147 if (pos < SmallSize)
\r
149 Byte *p = SmallBuffer + kSmallSize - SmallSize;
\r
151 for (; pos > 0; pos--)
\r
152 p[pos] = p[pos - 1];
\r
153 SmallBuffer[kSmallSize - SmallSize] = res;
\r
156 if (SmallSize == kSmallSize)
\r
163 int offset = (g << 4);
\r
164 for (int t = Counts[g] - 1; t >= 0; t--, i--)
\r
165 Buf[i] = Buf[offset + t];
\r
169 for (i = kSmallSize - 1; i >= 0; i--)
\r
170 Buf[i] = SmallBuffer[i];
\r
175 for (g = 0; pos >= Counts[g]; g++)
\r
177 int offset = (g << 4);
\r
178 Byte res = Buf[offset + pos];
\r
179 for (pos; pos < 16 - 1; pos++)
\r
180 Buf[offset + pos] = Buf[offset + pos + 1];
\r
183 SmallBuffer[kSmallSize - SmallSize] = res;
\r