Mercurial > vba-linux
diff src/win32/7zip/7z/CPP/7zip/Compress/Mtf8.h @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children |
line wrap: on
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/win32/7zip/7z/CPP/7zip/Compress/Mtf8.h Sat Mar 03 10:31:27 2012 -0600 1.3 @@ -0,0 +1,196 @@ 1.4 +// Mtf8.h 1.5 + 1.6 +#ifndef __COMPRESS_MTF8_H 1.7 +#define __COMPRESS_MTF8_H 1.8 + 1.9 +#include "../../Common/Types.h" 1.10 + 1.11 +namespace NCompress { 1.12 + 1.13 +struct CMtf8Encoder 1.14 +{ 1.15 + Byte Buf[256]; 1.16 + 1.17 + int FindAndMove(Byte v) 1.18 + { 1.19 + int pos; 1.20 + for (pos = 0; Buf[pos] != v; pos++); 1.21 + int resPos = pos; 1.22 + for (; pos >= 8; pos -= 8) 1.23 + { 1.24 + Buf[pos] = Buf[pos - 1]; 1.25 + Buf[pos - 1] = Buf[pos - 2]; 1.26 + Buf[pos - 2] = Buf[pos - 3]; 1.27 + Buf[pos - 3] = Buf[pos - 4]; 1.28 + Buf[pos - 4] = Buf[pos - 5]; 1.29 + Buf[pos - 5] = Buf[pos - 6]; 1.30 + Buf[pos - 6] = Buf[pos - 7]; 1.31 + Buf[pos - 7] = Buf[pos - 8]; 1.32 + } 1.33 + for (; pos > 0; pos--) 1.34 + Buf[pos] = Buf[pos - 1]; 1.35 + Buf[0] = v; 1.36 + return resPos; 1.37 + } 1.38 +}; 1.39 + 1.40 +/* 1.41 +struct CMtf8Decoder 1.42 +{ 1.43 + Byte Buf[256]; 1.44 + 1.45 + void Init(int) {}; 1.46 + Byte GetHead() const { return Buf[0]; } 1.47 + Byte GetAndMove(int pos) 1.48 + { 1.49 + Byte res = Buf[pos]; 1.50 + for (; pos >= 8; pos -= 8) 1.51 + { 1.52 + Buf[pos] = Buf[pos - 1]; 1.53 + Buf[pos - 1] = Buf[pos - 2]; 1.54 + Buf[pos - 2] = Buf[pos - 3]; 1.55 + Buf[pos - 3] = Buf[pos - 4]; 1.56 + Buf[pos - 4] = Buf[pos - 5]; 1.57 + Buf[pos - 5] = Buf[pos - 6]; 1.58 + Buf[pos - 6] = Buf[pos - 7]; 1.59 + Buf[pos - 7] = Buf[pos - 8]; 1.60 + } 1.61 + for (; pos > 0; pos--) 1.62 + Buf[pos] = Buf[pos - 1]; 1.63 + Buf[0] = res; 1.64 + return res; 1.65 + } 1.66 +}; 1.67 +*/ 1.68 + 1.69 +#ifdef _WIN64 1.70 +#define MODE_64BIT 1.71 +#endif 1.72 + 1.73 +#ifdef MODE_64BIT 1.74 +typedef UInt64 CMtfVar; 1.75 +#define MTF_MOVS 3 1.76 +#else 1.77 +typedef UInt32 CMtfVar; 1.78 +#define MTF_MOVS 2 1.79 +#endif 1.80 + 1.81 +#define MTF_MASK ((1 << MTF_MOVS) - 1) 1.82 + 1.83 + 1.84 +struct CMtf8Decoder 1.85 +{ 1.86 + CMtfVar Buf[256 >> MTF_MOVS]; 1.87 + 1.88 + void StartInit() { memset(Buf, 0, sizeof(Buf)); } 1.89 + void Add(unsigned int pos, Byte val) { Buf[pos >> MTF_MOVS] |= ((CMtfVar)val << ((pos & MTF_MASK) << 3)); } 1.90 + Byte GetHead() const { return (Byte)Buf[0]; } 1.91 + Byte GetAndMove(unsigned int pos) 1.92 + { 1.93 + UInt32 lim = ((UInt32)pos >> MTF_MOVS); 1.94 + pos = (pos & MTF_MASK) << 3; 1.95 + CMtfVar prev = (Buf[lim] >> pos) & 0xFF; 1.96 + 1.97 + UInt32 i = 0; 1.98 + if ((lim & 1) != 0) 1.99 + { 1.100 + CMtfVar next = Buf[0]; 1.101 + Buf[0] = (next << 8) | prev; 1.102 + prev = (next >> (MTF_MASK << 3)); 1.103 + i = 1; 1.104 + lim -= 1; 1.105 + } 1.106 + for (; i < lim; i += 2) 1.107 + { 1.108 + CMtfVar next = Buf[i]; 1.109 + Buf[i] = (next << 8) | prev; 1.110 + prev = (next >> (MTF_MASK << 3)); 1.111 + next = Buf[i + 1]; 1.112 + Buf[i + 1] = (next << 8) | prev; 1.113 + prev = (next >> (MTF_MASK << 3)); 1.114 + } 1.115 + CMtfVar next = Buf[i]; 1.116 + CMtfVar mask = (((CMtfVar)0x100 << pos) - 1); 1.117 + Buf[i] = (next & ~mask) | (((next << 8) | prev) & mask); 1.118 + return (Byte)Buf[0]; 1.119 + } 1.120 +}; 1.121 + 1.122 +/* 1.123 +const int kSmallSize = 64; 1.124 +class CMtf8Decoder 1.125 +{ 1.126 + Byte SmallBuffer[kSmallSize]; 1.127 + int SmallSize; 1.128 + Byte Counts[16]; 1.129 + int Size; 1.130 +public: 1.131 + Byte Buf[256]; 1.132 + 1.133 + Byte GetHead() const 1.134 + { 1.135 + if (SmallSize > 0) 1.136 + return SmallBuffer[kSmallSize - SmallSize]; 1.137 + return Buf[0]; 1.138 + } 1.139 + 1.140 + void Init(int size) 1.141 + { 1.142 + Size = size; 1.143 + SmallSize = 0; 1.144 + for (int i = 0; i < 16; i++) 1.145 + { 1.146 + Counts[i] = ((size >= 16) ? 16 : size); 1.147 + size -= Counts[i]; 1.148 + } 1.149 + } 1.150 + 1.151 + Byte GetAndMove(int pos) 1.152 + { 1.153 + if (pos < SmallSize) 1.154 + { 1.155 + Byte *p = SmallBuffer + kSmallSize - SmallSize; 1.156 + Byte res = p[pos]; 1.157 + for (; pos > 0; pos--) 1.158 + p[pos] = p[pos - 1]; 1.159 + SmallBuffer[kSmallSize - SmallSize] = res; 1.160 + return res; 1.161 + } 1.162 + if (SmallSize == kSmallSize) 1.163 + { 1.164 + int i = Size - 1; 1.165 + int g = 16; 1.166 + do 1.167 + { 1.168 + g--; 1.169 + int offset = (g << 4); 1.170 + for (int t = Counts[g] - 1; t >= 0; t--, i--) 1.171 + Buf[i] = Buf[offset + t]; 1.172 + } 1.173 + while(g != 0); 1.174 + 1.175 + for (i = kSmallSize - 1; i >= 0; i--) 1.176 + Buf[i] = SmallBuffer[i]; 1.177 + Init(Size); 1.178 + } 1.179 + pos -= SmallSize; 1.180 + int g; 1.181 + for (g = 0; pos >= Counts[g]; g++) 1.182 + pos -= Counts[g]; 1.183 + int offset = (g << 4); 1.184 + Byte res = Buf[offset + pos]; 1.185 + for (pos; pos < 16 - 1; pos++) 1.186 + Buf[offset + pos] = Buf[offset + pos + 1]; 1.187 + 1.188 + SmallSize++; 1.189 + SmallBuffer[kSmallSize - SmallSize] = res; 1.190 + 1.191 + Counts[g]--; 1.192 + return res; 1.193 + } 1.194 +}; 1.195 +*/ 1.196 + 1.197 +} 1.198 + 1.199 +#endif