stdex/zlib_8hpp_source.html

273 lines
34 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.10.0"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>stdex: include/stdex/zlib.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">stdex
</div>
<div id="projectbrief">Additional custom or not Standard C++ covered algorithms</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.10.0 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() { codefold.init(0); });
/* @license-end */
</script>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li><li class="navelem"><a class="el" href="dir_fca3c47b2ea228727bd6729832f89576.html">stdex</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle"><div class="title">zlib.hpp</div></div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/*</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"> SPDX-License-Identifier: MIT</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment"> Copyright © 2016-2024 Amebis</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment">*/</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span> </div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="preprocessor">#pragma once</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span> </div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="preprocessor">#include &quot;compat.hpp&quot;</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="preprocessor">#include &quot;stream.hpp&quot;</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="preprocessor">#if _MSC_VER</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="preprocessor">#include &lt;CodeAnalysis/Warnings.h&gt;</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#pragma warning(push)</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#pragma warning(disable: ALL_CODE_ANALYSIS_WARNINGS)</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include &lt;zlib.h&gt;</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#if _MSC_VER</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#pragma warning(pop)</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &lt;memory&gt;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &lt;stdexcept&gt;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="keyword">namespace </span>stdex</div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span>{</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> throw_on_zlib_error(<span class="keywordtype">int</span> result)</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> {</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> <span class="keywordflow">if</span> (result &gt;= 0)</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> <span class="keywordflow">switch</span> (result) {</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> <span class="keywordflow">case</span> Z_ERRNO: <span class="keywordflow">throw</span> std::system_error(errno, std::system_category(), <span class="stringliteral">&quot;zlib failed with errno&quot;</span>);</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> <span class="keywordflow">case</span> Z_STREAM_ERROR: <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;zlib stream error&quot;</span>);</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> <span class="keywordflow">case</span> Z_DATA_ERROR: <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;zlib data error&quot;</span>);</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> <span class="keywordflow">case</span> Z_MEM_ERROR: <span class="keywordflow">throw</span> std::bad_alloc();</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> <span class="keywordflow">case</span> Z_BUF_ERROR: <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;zlib buffer error&quot;</span>);</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> <span class="keywordflow">case</span> Z_VERSION_ERROR: <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;zlib version error&quot;</span>);</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keywordflow">default</span>: <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;zlib unknown error&quot;</span>);</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> }</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> }</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> </div>
<div class="foldopen" id="foldopen00044" data-start="{" data-end="};">
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"><a class="line" href="classstdex_1_1zlib__writer.html"> 44</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1zlib__writer.html">zlib_writer</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">stdex::stream::converter</a></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> {</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <a class="code hl_class" href="classstdex_1_1zlib__writer.html">zlib_writer</a>(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">stdex::stream::basic</a>&amp; source, _In_ <span class="keywordtype">int</span> compression_level = Z_BEST_COMPRESSION, _In_ uInt block_size = 0x10000) :</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">stdex::stream::converter</a>(source),</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> m_block_size(block_size),</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> m_block(<span class="keyword">new</span> Byte[block_size])</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> {</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> memset(&amp;m_zlib, 0, <span class="keyword">sizeof</span>(m_zlib));</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> throw_on_zlib_error(deflateInit(&amp;m_zlib, compression_level));</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> }</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> </div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classstdex_1_1zlib__writer.html">~zlib_writer</a>()</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> {</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> m_zlib.avail_in = 0;</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> m_zlib.next_in = NULL;</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keywordflow">do</span> {</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> m_zlib.avail_out = m_block_size;</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> m_zlib.next_out = m_block.get();</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> throw_on_zlib_error(deflate(&amp;m_zlib, Z_FINISH));</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(m_block.get(), m_block_size - m_zlib.avail_out);</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="keywordflow">if</span> (!m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <span class="keywordflow">throw</span> std::system_error(sys_error(), std::system_category(), <span class="stringliteral">&quot;failed to flush compressed stream&quot;</span>); <span class="comment">// Data loss occured</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> } <span class="keywordflow">while</span> (m_zlib.avail_out == 0);</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="comment">// m_zlib.avail_out = m_block_size;</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <span class="comment">// m_zlib.next_out = m_block.get();</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="comment">// deflateReset(&amp;m_zlib);</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> deflateEnd(&amp;m_zlib);</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> }</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> </div>
<div class="foldopen" id="foldopen00074" data-start="{" data-end="}">
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"><a class="line" href="classstdex_1_1zlib__writer.html#a4adcd2265f851bf880ea404ff35026f3"> 74</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1zlib__writer.html#a4adcd2265f851bf880ea404ff35026f3">write</a>(</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> {</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> _Assume_(data || !length);</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keywordtype">size_t</span> num_written = 0;</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keywordflow">while</span> (length) {</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> uInt num_inflated = <span class="keyword">static_cast&lt;</span>uInt<span class="keyword">&gt;</span>(std::min&lt;size_t&gt;(length, UINT_MAX));</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> m_zlib.avail_in = num_inflated;</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> m_zlib.next_in = <span class="keyword">const_cast&lt;</span>Bytef*<span class="keyword">&gt;</span>(<span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>Bytef*<span class="keyword">&gt;</span>(data));</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <span class="keywordflow">do</span> {</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> m_zlib.avail_out = m_block_size;</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> m_zlib.next_out = m_block.get();</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> throw_on_zlib_error(deflate(&amp;m_zlib, Z_NO_FLUSH));</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> <span class="keywordtype">size_t</span> num_deflated = m_block_size - m_zlib.avail_out;</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> <span class="keywordflow">if</span> (num_deflated) {</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(m_block.get(), num_deflated);</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> <span class="keywordflow">if</span> (!m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) {</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <span class="keywordflow">return</span> num_written;</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> }</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> }</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> } <span class="keywordflow">while</span> (m_zlib.avail_out == 0);</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> num_written += num_inflated;</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>Bytef*&amp;<span class="keyword">&gt;</span>(data) += num_inflated;</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> length -= num_inflated;</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> }</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> m_state = stdex::stream::state_t::ok;</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <span class="keywordflow">return</span> num_written;</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> }</div>
</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> </div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> z_stream m_zlib;</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> uInt m_block_size;</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> std::unique_ptr&lt;Byte[]&gt; m_block;</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> };</div>
</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> </div>
<div class="foldopen" id="foldopen00113" data-start="{" data-end="};">
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"><a class="line" href="classstdex_1_1zlib__reader.html"> 113</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1zlib__reader.html">zlib_reader</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">stdex::stream::converter</a></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> {</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> <a class="code hl_class" href="classstdex_1_1zlib__reader.html">zlib_reader</a>(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">stdex::stream::basic</a>&amp; source, _In_ uInt block_size = 0x10000) :</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">stdex::stream::converter</a>(source),</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> m_block_size(block_size),</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> m_block(<span class="keyword">new</span> Byte[block_size])</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> {</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> memset(&amp;m_zlib, 0, <span class="keyword">sizeof</span>(m_zlib));</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> throw_on_zlib_error(inflateInit(&amp;m_zlib));</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> }</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> </div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classstdex_1_1zlib__reader.html">~zlib_reader</a>()</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> {</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> inflateEnd(&amp;m_zlib);</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> }</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> </div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span><span class="preprocessor">#pragma warning(suppress: 6101) </span><span class="comment">// See [1] below</span></div>
<div class="foldopen" id="foldopen00131" data-start="{" data-end="}">
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"><a class="line" href="classstdex_1_1zlib__reader.html#a39f8e0728d79a4e1c92f07bb386fef86"> 131</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t <a class="code hl_function" href="classstdex_1_1zlib__reader.html#a39f8e0728d79a4e1c92f07bb386fef86">read</a>(</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> {</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> _Assume_(data || !length);</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keywordtype">size_t</span> num_read = 0;</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <span class="keywordflow">while</span> (length) {</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> uInt num_deflated = <span class="keyword">static_cast&lt;</span>uInt<span class="keyword">&gt;</span>(std::min&lt;size_t&gt;(length, UINT_MAX));</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> m_zlib.avail_out = num_deflated;</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> m_zlib.next_out = <span class="keyword">reinterpret_cast&lt;</span>Bytef*<span class="keyword">&gt;</span>(data);</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="keywordflow">do</span> {</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <span class="keywordflow">if</span> (m_zlib.avail_in == 0) {</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> m_zlib.next_in = m_block.get();</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> m_zlib.avail_in = <span class="keyword">static_cast&lt;</span>uInt<span class="keyword">&gt;</span>(m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(m_block.get(), m_block_size));</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keywordflow">if</span> (!m_zlib.avail_in) {</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> num_read += num_deflated - m_zlib.avail_out; <span class="comment">// [1] Code analysis misses `num_deflated - m_zlib.avail_out` bytes were written to data in previous loop iterations.</span></div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="keywordflow">if</span> (num_read) {</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> m_state = stdex::stream::state_t::ok;</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="keywordflow">return</span> num_read;</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> }</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> }</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> }</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> throw_on_zlib_error(inflate(&amp;m_zlib, Z_NO_FLUSH));</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> } <span class="keywordflow">while</span> (m_zlib.avail_out);</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> num_read += num_deflated;</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="keyword">reinterpret_cast&lt;</span>Bytef*&amp;<span class="keyword">&gt;</span>(data) += num_deflated;</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> length -= num_deflated;</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> }</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> m_state = stdex::stream::state_t::ok;</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <span class="keywordflow">return</span> num_read;</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> }</div>
</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> </div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> z_stream m_zlib;</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> uInt m_block_size;</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> std::unique_ptr&lt;Byte[]&gt; m_block;</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> };</div>
</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span>}</div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html">stdex::stream::basic</a></div><div class="ttdoc">UTF-8 byte-order-mark</div><div class="ttdef"><b>Definition</b> stream.hpp:79</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a0295e4efe18eef2a8962680274957ac1"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">stdex::stream::basic::ok</a></div><div class="ttdeci">bool ok() const</div><div class="ttdoc">Returns true if the stream state is clean i.e. previous operation was succesful.</div><div class="ttdef"><b>Definition</b> stream.hpp:175</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a2aa36b007017c2052a0118c1df4910d0"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">stdex::stream::basic::state</a></div><div class="ttdeci">state_t state() const</div><div class="ttdoc">Returns stream state after last operation.</div><div class="ttdef"><b>Definition</b> stream.hpp:170</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_aa5d4693fd583cd7ef0ffa9b846136a5a"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">stdex::stream::basic::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:96</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_ad8af0444273509eb36ad81046ac92081"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">stdex::stream::basic::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:114</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1converter_html"><div class="ttname"><a href="classstdex_1_1stream_1_1converter.html">stdex::stream::converter</a></div><div class="ttdoc">Modifies data on the fly when reading from/writing to a source stream. Could also be used to modify r...</div><div class="ttdef"><b>Definition</b> stream.hpp:1012</div></div>
<div class="ttc" id="aclassstdex_1_1zlib__reader_html"><div class="ttname"><a href="classstdex_1_1zlib__reader.html">stdex::zlib_reader</a></div><div class="ttdoc">Decompresses data when reading from a stream.</div><div class="ttdef"><b>Definition</b> zlib.hpp:114</div></div>
<div class="ttc" id="aclassstdex_1_1zlib__reader_html_a39f8e0728d79a4e1c92f07bb386fef86"><div class="ttname"><a href="classstdex_1_1zlib__reader.html#a39f8e0728d79a4e1c92f07bb386fef86">stdex::zlib_reader::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> zlib.hpp:131</div></div>
<div class="ttc" id="aclassstdex_1_1zlib__writer_html"><div class="ttname"><a href="classstdex_1_1zlib__writer.html">stdex::zlib_writer</a></div><div class="ttdoc">Compresses data when writing to a stream.</div><div class="ttdef"><b>Definition</b> zlib.hpp:45</div></div>
<div class="ttc" id="aclassstdex_1_1zlib__writer_html_a4adcd2265f851bf880ea404ff35026f3"><div class="ttname"><a href="classstdex_1_1zlib__writer.html#a4adcd2265f851bf880ea404ff35026f3">stdex::zlib_writer::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> zlib.hpp:74</div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Tue Jan 16 2024 15:12:01 for stdex by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.10.0
</small></address>
</body>
</html>