⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zinflate_8cpp-source.html

📁 著名的密码库Crypto++的文档 C++语言的杰作。程序员必备。
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<a name="l00101"></a>00101         <span class="keywordflow">for</span> (i=2; i&lt;=m_maxCodeBits; i++)<a name="l00102"></a>00102         {<a name="l00103"></a>00103                 <span class="comment">// compute this while checking for overflow: code = (code + blCount[i-1]) &lt;&lt; 1</span><a name="l00104"></a>00104                 <span class="keywordflow">if</span> (code &gt; code + blCount[i-1])<a name="l00105"></a>00105                         <span class="keywordflow">throw</span> <a class="code" href="class_huffman_decoder_1_1_err.html">Err</a>(<span class="stringliteral">"codes oversubscribed"</span>);<a name="l00106"></a>00106                 code += blCount[i-1];<a name="l00107"></a>00107                 <span class="keywordflow">if</span> (code &gt; (code &lt;&lt; 1))<a name="l00108"></a>00108                         <span class="keywordflow">throw</span> <a class="code" href="class_huffman_decoder_1_1_err.html">Err</a>(<span class="stringliteral">"codes oversubscribed"</span>);<a name="l00109"></a>00109                 code &lt;&lt;= 1;<a name="l00110"></a>00110                 nextCode[i] = code;<a name="l00111"></a>00111         }<a name="l00112"></a>00112 <a name="l00113"></a>00113         <span class="keywordflow">if</span> (code &gt; (1 &lt;&lt; m_maxCodeBits) - blCount[m_maxCodeBits])<a name="l00114"></a>00114                 <span class="keywordflow">throw</span> <a class="code" href="class_huffman_decoder_1_1_err.html">Err</a>(<span class="stringliteral">"codes oversubscribed"</span>);<a name="l00115"></a>00115         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_maxCodeBits != 1 &amp;&amp; code &lt; (1 &lt;&lt; m_maxCodeBits) - blCount[m_maxCodeBits])<a name="l00116"></a>00116                 <span class="keywordflow">throw</span> <a class="code" href="class_huffman_decoder_1_1_err.html">Err</a>(<span class="stringliteral">"codes incomplete"</span>);<a name="l00117"></a>00117 <a name="l00118"></a>00118         <span class="comment">// compute a vector of &lt;code, length, value&gt; triples sorted by code</span><a name="l00119"></a>00119         m_codeToValue.resize(nCodes - blCount[0]);<a name="l00120"></a>00120         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j=0;<a name="l00121"></a>00121         <span class="keywordflow">for</span> (i=0; i&lt;nCodes; i++) <a name="l00122"></a>00122         {<a name="l00123"></a>00123                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = codeBits[i];<a name="l00124"></a>00124                 <span class="keywordflow">if</span> (len != 0)<a name="l00125"></a>00125                 {<a name="l00126"></a>00126                         code = NormalizeCode(nextCode[len]++, len);<a name="l00127"></a>00127                         m_codeToValue[j].code = code;<a name="l00128"></a>00128                         m_codeToValue[j].len = len;<a name="l00129"></a>00129                         m_codeToValue[j].value = i;<a name="l00130"></a>00130                         j++;<a name="l00131"></a>00131                 }<a name="l00132"></a>00132         }<a name="l00133"></a>00133         std::sort(m_codeToValue.begin(), m_codeToValue.end());<a name="l00134"></a>00134 <a name="l00135"></a>00135         <span class="comment">// initialize the decoding cache</span><a name="l00136"></a>00136         m_cacheBits = STDMIN(9U, m_maxCodeBits);<a name="l00137"></a>00137         m_cacheMask = (1 &lt;&lt; m_cacheBits) - 1;<a name="l00138"></a>00138         m_normalizedCacheMask = NormalizeCode(m_cacheMask, m_cacheBits);<a name="l00139"></a>00139         assert(m_normalizedCacheMask == BitReverse(m_cacheMask));<a name="l00140"></a>00140 <a name="l00141"></a>00141         <span class="keywordflow">if</span> (m_cache.size() != size_t(1) &lt;&lt; m_cacheBits)<a name="l00142"></a>00142                 m_cache.resize(1 &lt;&lt; m_cacheBits);<a name="l00143"></a>00143 <a name="l00144"></a>00144         <span class="keywordflow">for</span> (i=0; i&lt;m_cache.size(); i++)<a name="l00145"></a>00145                 m_cache[i].type = 0;<a name="l00146"></a>00146 }<a name="l00147"></a>00147 <a name="l00148"></a>00148 <span class="keywordtype">void</span> HuffmanDecoder::FillCacheEntry(LookupEntry &amp;entry, <a class="code" href="class_huffman_decoder.html#550cd665357c320af58916f992eb8756">code_t</a> normalizedCode)<span class="keyword"> const</span><a name="l00149"></a>00149 <span class="keyword"></span>{<a name="l00150"></a>00150         normalizedCode &amp;= m_normalizedCacheMask;<a name="l00151"></a>00151         <span class="keyword">const</span> CodeInfo &amp;codeInfo = *(std::upper_bound(m_codeToValue.begin(), m_codeToValue.end(), normalizedCode, <a class="code" href="class_huffman_decoder.html#c3bc64943c6ab90653d34b0eb5fc3985">CodeLessThan</a>())-1);<a name="l00152"></a>00152         <span class="keywordflow">if</span> (codeInfo.len &lt;= m_cacheBits)<a name="l00153"></a>00153         {<a name="l00154"></a>00154                 entry.type = 1;<a name="l00155"></a>00155                 entry.value = codeInfo.value;<a name="l00156"></a>00156                 entry.len = codeInfo.len;<a name="l00157"></a>00157         }<a name="l00158"></a>00158         <span class="keywordflow">else</span><a name="l00159"></a>00159         {<a name="l00160"></a>00160                 entry.begin = &amp;codeInfo;<a name="l00161"></a>00161                 <span class="keyword">const</span> CodeInfo *last = &amp; *(std::upper_bound(m_codeToValue.begin(), m_codeToValue.end(), normalizedCode + ~m_normalizedCacheMask, <a class="code" href="class_huffman_decoder.html#c3bc64943c6ab90653d34b0eb5fc3985">CodeLessThan</a>())-1);<a name="l00162"></a>00162                 <span class="keywordflow">if</span> (codeInfo.len == last-&gt;len)<a name="l00163"></a>00163                 {<a name="l00164"></a>00164                         entry.type = 2;<a name="l00165"></a>00165                         entry.len = codeInfo.len;<a name="l00166"></a>00166                 }<a name="l00167"></a>00167                 <span class="keywordflow">else</span><a name="l00168"></a>00168                 {<a name="l00169"></a>00169                         entry.type = 3;<a name="l00170"></a>00170                         entry.end = last+1;<a name="l00171"></a>00171                 }<a name="l00172"></a>00172         }<a name="l00173"></a>00173 }<a name="l00174"></a>00174 <a name="l00175"></a><a class="code" href="class_huffman_decoder.html#32c424a894a24ea4d0aae95c3d30e806">00175</a> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_huffman_decoder.html#32c424a894a24ea4d0aae95c3d30e806">HuffmanDecoder::Decode</a>(<a class="code" href="class_huffman_decoder.html#550cd665357c320af58916f992eb8756">code_t</a> code, <span class="comment">/* out */</span> <a class="code" href="class_huffman_decoder.html#ae2c1dc3110a39ae9d74fc00aee8a1ec">value_t</a> &amp;value)<span class="keyword"> const</span><a name="l00176"></a>00176 <span class="keyword"></span>{<a name="l00177"></a>00177         assert(m_codeToValue.size() &gt; 0);<a name="l00178"></a>00178         LookupEntry &amp;entry = m_cache[code &amp; m_cacheMask];<a name="l00179"></a>00179 <a name="l00180"></a>00180         <a class="code" href="class_huffman_decoder.html#550cd665357c320af58916f992eb8756">code_t</a> normalizedCode;<a name="l00181"></a>00181         <span class="keywordflow">if</span> (entry.type != 1)<a name="l00182"></a>00182                 normalizedCode = BitReverse(code);<a name="l00183"></a>00183 <a name="l00184"></a>00184         <span class="keywordflow">if</span> (entry.type == 0)<a name="l00185"></a>00185                 FillCacheEntry(entry, normalizedCode);<a name="l00186"></a>00186 <a name="l00187"></a>00187         <span class="keywordflow">if</span> (entry.type == 1)<a name="l00188"></a>00188         {<a name="l00189"></a>00189                 value = entry.value;<a name="l00190"></a>00190                 <span class="keywordflow">return</span> entry.len;<a name="l00191"></a>00191         }<a name="l00192"></a>00192         <span class="keywordflow">else</span><a name="l00193"></a>00193         {<a name="l00194"></a>00194                 <span class="keyword">const</span> CodeInfo &amp;codeInfo = (entry.type == 2)<a name="l00195"></a>00195                         ? entry.begin[(normalizedCode &lt;&lt; m_cacheBits) &gt;&gt; (<a class="code" href="class_huffman_decoder.html#444758e6ef809d2bf568e4e73cd560d7589d91f9fef801b8b978b95c9eef161b">MAX_CODE_BITS</a> - (entry.len - m_cacheBits))]<a name="l00196"></a>00196                         : *(std::upper_bound(entry.begin, entry.end, normalizedCode, <a class="code" href="struct_code_less_than.html">CodeLessThan</a>())-1);<a name="l00197"></a>00197                 value = codeInfo.value;<a name="l00198"></a>00198                 <span class="keywordflow">return</span> codeInfo.len;<a name="l00199"></a>00199         }<a name="l00200"></a>00200 }<a name="l00201"></a>00201 <a name="l00202"></a><a class="code" href="class_huffman_decoder.html#0ba809a0515ad70df30c6965fa6919a7">00202</a> <span class="keywordtype">bool</span> <a class="code" href="class_huffman_decoder.html#32c424a894a24ea4d0aae95c3d30e806">HuffmanDecoder::Decode</a>(<a class="code" href="class_low_first_bit_reader.html" title="_">LowFirstBitReader</a> &amp;reader, <a class="code" href="class_huffman_decoder.html#ae2c1dc3110a39ae9d74fc00aee8a1ec">value_t</a> &amp;value)<span class="keyword"> const</span><a name="l00203"></a>00203 <span class="keyword"></span>{<a name="l00204"></a>00204         reader.<a class="code" href="class_low_first_bit_reader.html#7c2250f093883488eefb6d498aa1c510">FillBuffer</a>(m_maxCodeBits);<a name="l00205"></a>00205         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> codeBits = <a class="code" href="class_huffman_decoder.html#32c424a894a24ea4d0aae95c3d30e806">Decode</a>(reader.<a class="code" href="class_low_first_bit_reader.html#e1da4869948bbe34ef63089b0e531bf3">PeekBuffer</a>(), value);<a name="l00206"></a>00206         <span class="keywordflow">if</span> (codeBits &gt; reader.<a class="code" href="class_low_first_bit_reader.html#62533059d5572cf7dfc5bcb7d308bec6">BitsBuffered</a>())<a name="l00207"></a>00207                 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00208"></a>00208         reader.<a class="code" href="class_low_first_bit_reader.html#7127a720aeefbc1d91dddefc694538c6">SkipBits</a>(codeBits);<a name="l00209"></a>00209         <span class="keywordflow">return</span> <span class="keyword">true</span>;<a name="l00210"></a>00210 }<a name="l00211"></a>00211 <a name="l00212"></a>00212 <span class="comment">// *************************************************************</span><a name="l00213"></a>00213 <a name="l00214"></a><a class="code" href="class_inflator.html#525a109323ed6dfb57be3a06e44fb93e">00214</a> <a class="code" href="class_inflator.html#525a109323ed6dfb57be3a06e44fb93e">Inflator::Inflator</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *attachment, <span class="keywordtype">bool</span> repeat, <span class="keywordtype">int</span> propagation)<a name="l00215"></a>00215         : <a class="code" href="class_auto_signaling.html" title="_">AutoSignaling</a>&lt;<a class="code" href="class_filter.html" title="provides an implementation of BufferedTransformation's attachment interface">Filter</a>&gt;(propagation)<a name="l00216"></a>00216         , m_state(PRE_STREAM), m_repeat(repeat), m_reader(m_inQueue)<a name="l00217"></a>00217 {<a name="l00218"></a>00218         <a class="code" href="class_filter.html#93817876b45172108fe0342de6442f75" title="delete the current attachment chain and replace it with newAttachment">Detach</a>(attachment);<a name="l00219"></a>00219 }<a name="l00220"></a>00220 <a name="l00221"></a><a class="code" href="class_inflator.html#498b0cb5eaf4f73715f2608c7f3c31ab">00221</a> <span class="keywordtype">void</span> <a class="code" href="class_inflator.html#498b0cb5eaf4f73715f2608c7f3c31ab">Inflator::IsolatedInitialize</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;parameters)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -