Adding large folders

This commit is contained in:
2026-02-26 12:00:21 -05:00
parent 5400d82acd
commit 49701c85ad
47332 changed files with 1942573 additions and 0 deletions

View File

@@ -0,0 +1,165 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zstd-0.13.3/src/bulk/compressor.rs`."><title>compressor.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="zstd" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">zstd/bulk/</div>compressor.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span><span class="kw">crate</span>::map_error_code;
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use </span>std::io;
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span>zstd_safe;
<a href=#5 id=5 data-nosnippet>5</a>
<a href=#6 id=6 data-nosnippet>6</a><span class="doccomment">/// Allows to compress independently multiple chunks of data.
<a href=#7 id=7 data-nosnippet>7</a>///
<a href=#8 id=8 data-nosnippet>8</a>/// Each job will be processed entirely in-memory without streaming, so this
<a href=#9 id=9 data-nosnippet>9</a>/// is most fitting for many small jobs. To compress larger volume that don't
<a href=#10 id=10 data-nosnippet>10</a>/// easily fit in memory, a streaming compression may be more appropriate.
<a href=#11 id=11 data-nosnippet>11</a>///
<a href=#12 id=12 data-nosnippet>12</a>/// It is more efficient than a streaming compressor for 2 reasons:
<a href=#13 id=13 data-nosnippet>13</a>/// * It re-uses the zstd context between jobs to avoid re-allocations
<a href=#14 id=14 data-nosnippet>14</a>/// * It avoids copying data from a `Read` into a temporary buffer before compression.
<a href=#15 id=15 data-nosnippet>15</a></span><span class="attr">#[derive(Default)]
<a href=#16 id=16 data-nosnippet>16</a></span><span class="kw">pub struct </span>Compressor&lt;<span class="lifetime">'a</span>&gt; {
<a href=#17 id=17 data-nosnippet>17</a> context: zstd_safe::CCtx&lt;<span class="lifetime">'a</span>&gt;,
<a href=#18 id=18 data-nosnippet>18</a>}
<a href=#19 id=19 data-nosnippet>19</a>
<a href=#20 id=20 data-nosnippet>20</a><span class="kw">impl </span>Compressor&lt;<span class="lifetime">'static</span>&gt; {
<a href=#21 id=21 data-nosnippet>21</a> <span class="doccomment">/// Creates a new zstd compressor
<a href=#22 id=22 data-nosnippet>22</a> </span><span class="kw">pub fn </span>new(level: i32) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#23 id=23 data-nosnippet>23</a> <span class="self">Self</span>::with_dictionary(level, <span class="kw-2">&amp;</span>[])
<a href=#24 id=24 data-nosnippet>24</a> }
<a href=#25 id=25 data-nosnippet>25</a>
<a href=#26 id=26 data-nosnippet>26</a> <span class="doccomment">/// Creates a new zstd compressor, using the given dictionary.
<a href=#27 id=27 data-nosnippet>27</a> ///
<a href=#28 id=28 data-nosnippet>28</a> /// Note that using a dictionary means that decompression will need to use
<a href=#29 id=29 data-nosnippet>29</a> /// the same dictionary.
<a href=#30 id=30 data-nosnippet>30</a> </span><span class="kw">pub fn </span>with_dictionary(level: i32, dictionary: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#31 id=31 data-nosnippet>31</a> <span class="kw">let </span><span class="kw-2">mut </span>compressor = <span class="self">Self</span>::default();
<a href=#32 id=32 data-nosnippet>32</a>
<a href=#33 id=33 data-nosnippet>33</a> compressor.set_dictionary(level, dictionary)<span class="question-mark">?</span>;
<a href=#34 id=34 data-nosnippet>34</a>
<a href=#35 id=35 data-nosnippet>35</a> <span class="prelude-val">Ok</span>(compressor)
<a href=#36 id=36 data-nosnippet>36</a> }
<a href=#37 id=37 data-nosnippet>37</a>}
<a href=#38 id=38 data-nosnippet>38</a>
<a href=#39 id=39 data-nosnippet>39</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; Compressor&lt;<span class="lifetime">'a</span>&gt; {
<a href=#40 id=40 data-nosnippet>40</a> <span class="doccomment">/// Creates a new compressor using an existing `EncoderDictionary`.
<a href=#41 id=41 data-nosnippet>41</a> ///
<a href=#42 id=42 data-nosnippet>42</a> /// The compression level will be the one specified when creating the dictionary.
<a href=#43 id=43 data-nosnippet>43</a> ///
<a href=#44 id=44 data-nosnippet>44</a> /// Note that using a dictionary means that decompression will need to use
<a href=#45 id=45 data-nosnippet>45</a> /// the same dictionary.
<a href=#46 id=46 data-nosnippet>46</a> </span><span class="kw">pub fn </span>with_prepared_dictionary&lt;<span class="lifetime">'b</span>&gt;(
<a href=#47 id=47 data-nosnippet>47</a> dictionary: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw">crate</span>::dict::EncoderDictionary&lt;<span class="lifetime">'b</span>&gt;,
<a href=#48 id=48 data-nosnippet>48</a> ) -&gt; io::Result&lt;<span class="self">Self</span>&gt;
<a href=#49 id=49 data-nosnippet>49</a> <span class="kw">where
<a href=#50 id=50 data-nosnippet>50</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#51 id=51 data-nosnippet>51</a> {
<a href=#52 id=52 data-nosnippet>52</a> <span class="kw">let </span><span class="kw-2">mut </span>compressor = <span class="self">Self</span>::default();
<a href=#53 id=53 data-nosnippet>53</a>
<a href=#54 id=54 data-nosnippet>54</a> compressor.set_prepared_dictionary(dictionary)<span class="question-mark">?</span>;
<a href=#55 id=55 data-nosnippet>55</a>
<a href=#56 id=56 data-nosnippet>56</a> <span class="prelude-val">Ok</span>(compressor)
<a href=#57 id=57 data-nosnippet>57</a> }
<a href=#58 id=58 data-nosnippet>58</a>
<a href=#59 id=59 data-nosnippet>59</a> <span class="doccomment">/// Changes the compression level used by this compressor.
<a href=#60 id=60 data-nosnippet>60</a> ///
<a href=#61 id=61 data-nosnippet>61</a> /// *This will clear any dictionary previously registered.*
<a href=#62 id=62 data-nosnippet>62</a> ///
<a href=#63 id=63 data-nosnippet>63</a> /// If you want to keep the existing dictionary, you will need to pass it again to
<a href=#64 id=64 data-nosnippet>64</a> /// `Self::set_dictionary` instead of using this method.
<a href=#65 id=65 data-nosnippet>65</a> </span><span class="kw">pub fn </span>set_compression_level(<span class="kw-2">&amp;mut </span><span class="self">self</span>, level: i32) -&gt; io::Result&lt;()&gt; {
<a href=#66 id=66 data-nosnippet>66</a> <span class="self">self</span>.set_dictionary(level, <span class="kw-2">&amp;</span>[])
<a href=#67 id=67 data-nosnippet>67</a> }
<a href=#68 id=68 data-nosnippet>68</a>
<a href=#69 id=69 data-nosnippet>69</a> <span class="doccomment">/// Changes the dictionary and compression level used by this compressor.
<a href=#70 id=70 data-nosnippet>70</a> ///
<a href=#71 id=71 data-nosnippet>71</a> /// Will affect future compression jobs.
<a href=#72 id=72 data-nosnippet>72</a> ///
<a href=#73 id=73 data-nosnippet>73</a> /// Note that using a dictionary means that decompression will need to use
<a href=#74 id=74 data-nosnippet>74</a> /// the same dictionary.
<a href=#75 id=75 data-nosnippet>75</a> </span><span class="kw">pub fn </span>set_dictionary(
<a href=#76 id=76 data-nosnippet>76</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#77 id=77 data-nosnippet>77</a> level: i32,
<a href=#78 id=78 data-nosnippet>78</a> dictionary: <span class="kw-2">&amp;</span>[u8],
<a href=#79 id=79 data-nosnippet>79</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#80 id=80 data-nosnippet>80</a> <span class="self">self</span>.context
<a href=#81 id=81 data-nosnippet>81</a> .set_parameter(zstd_safe::CParameter::CompressionLevel(level))
<a href=#82 id=82 data-nosnippet>82</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#83 id=83 data-nosnippet>83</a>
<a href=#84 id=84 data-nosnippet>84</a> <span class="self">self</span>.context
<a href=#85 id=85 data-nosnippet>85</a> .load_dictionary(dictionary)
<a href=#86 id=86 data-nosnippet>86</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#87 id=87 data-nosnippet>87</a>
<a href=#88 id=88 data-nosnippet>88</a> <span class="prelude-val">Ok</span>(())
<a href=#89 id=89 data-nosnippet>89</a> }
<a href=#90 id=90 data-nosnippet>90</a>
<a href=#91 id=91 data-nosnippet>91</a> <span class="doccomment">/// Changes the dictionary used by this compressor.
<a href=#92 id=92 data-nosnippet>92</a> ///
<a href=#93 id=93 data-nosnippet>93</a> /// The compression level used when preparing the dictionary will be used.
<a href=#94 id=94 data-nosnippet>94</a> ///
<a href=#95 id=95 data-nosnippet>95</a> /// Note that using a dictionary means that decompression will need to use
<a href=#96 id=96 data-nosnippet>96</a> /// the same dictionary.
<a href=#97 id=97 data-nosnippet>97</a> </span><span class="kw">pub fn </span>set_prepared_dictionary&lt;<span class="lifetime">'b</span>&gt;(
<a href=#98 id=98 data-nosnippet>98</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#99 id=99 data-nosnippet>99</a> dictionary: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw">crate</span>::dict::EncoderDictionary&lt;<span class="lifetime">'b</span>&gt;,
<a href=#100 id=100 data-nosnippet>100</a> ) -&gt; io::Result&lt;()&gt;
<a href=#101 id=101 data-nosnippet>101</a> <span class="kw">where
<a href=#102 id=102 data-nosnippet>102</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#103 id=103 data-nosnippet>103</a> {
<a href=#104 id=104 data-nosnippet>104</a> <span class="self">self</span>.context
<a href=#105 id=105 data-nosnippet>105</a> .ref_cdict(dictionary.as_cdict())
<a href=#106 id=106 data-nosnippet>106</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#107 id=107 data-nosnippet>107</a>
<a href=#108 id=108 data-nosnippet>108</a> <span class="prelude-val">Ok</span>(())
<a href=#109 id=109 data-nosnippet>109</a> }
<a href=#110 id=110 data-nosnippet>110</a>
<a href=#111 id=111 data-nosnippet>111</a> <span class="doccomment">/// Compress a single block of data to the given destination buffer.
<a href=#112 id=112 data-nosnippet>112</a> ///
<a href=#113 id=113 data-nosnippet>113</a> /// Returns the number of bytes written, or an error if something happened
<a href=#114 id=114 data-nosnippet>114</a> /// (for instance if the destination buffer was too small).
<a href=#115 id=115 data-nosnippet>115</a> ///
<a href=#116 id=116 data-nosnippet>116</a> /// A level of `0` uses zstd's default (currently `3`).
<a href=#117 id=117 data-nosnippet>117</a> </span><span class="kw">pub fn </span>compress_to_buffer&lt;C: zstd_safe::WriteBuf + <span class="question-mark">?</span>Sized&gt;(
<a href=#118 id=118 data-nosnippet>118</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#119 id=119 data-nosnippet>119</a> source: <span class="kw-2">&amp;</span>[u8],
<a href=#120 id=120 data-nosnippet>120</a> destination: <span class="kw-2">&amp;mut </span>C,
<a href=#121 id=121 data-nosnippet>121</a> ) -&gt; io::Result&lt;usize&gt; {
<a href=#122 id=122 data-nosnippet>122</a> <span class="self">self</span>.context
<a href=#123 id=123 data-nosnippet>123</a> .compress2(destination, source)
<a href=#124 id=124 data-nosnippet>124</a> .map_err(map_error_code)
<a href=#125 id=125 data-nosnippet>125</a> }
<a href=#126 id=126 data-nosnippet>126</a>
<a href=#127 id=127 data-nosnippet>127</a> <span class="doccomment">/// Compresses a block of data and returns the compressed result.
<a href=#128 id=128 data-nosnippet>128</a> ///
<a href=#129 id=129 data-nosnippet>129</a> /// A level of `0` uses zstd's default (currently `3`).
<a href=#130 id=130 data-nosnippet>130</a> </span><span class="kw">pub fn </span>compress(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;Vec&lt;u8&gt;&gt; {
<a href=#131 id=131 data-nosnippet>131</a> <span class="comment">// We allocate a big buffer, slightly larger than the input data.
<a href=#132 id=132 data-nosnippet>132</a> </span><span class="kw">let </span>buffer_len = zstd_safe::compress_bound(data.len());
<a href=#133 id=133 data-nosnippet>133</a> <span class="kw">let </span><span class="kw-2">mut </span>buffer = Vec::with_capacity(buffer_len);
<a href=#134 id=134 data-nosnippet>134</a>
<a href=#135 id=135 data-nosnippet>135</a> <span class="self">self</span>.compress_to_buffer(data, <span class="kw-2">&amp;mut </span>buffer)<span class="question-mark">?</span>;
<a href=#136 id=136 data-nosnippet>136</a>
<a href=#137 id=137 data-nosnippet>137</a> <span class="comment">// Should we shrink the vec? Meh, let the user do it if he wants.
<a href=#138 id=138 data-nosnippet>138</a> </span><span class="prelude-val">Ok</span>(buffer)
<a href=#139 id=139 data-nosnippet>139</a> }
<a href=#140 id=140 data-nosnippet>140</a>
<a href=#141 id=141 data-nosnippet>141</a> <span class="doccomment">/// Gives mutable access to the internal context.
<a href=#142 id=142 data-nosnippet>142</a> </span><span class="kw">pub fn </span>context_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>zstd_safe::CCtx&lt;<span class="lifetime">'a</span>&gt; {
<a href=#143 id=143 data-nosnippet>143</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.context
<a href=#144 id=144 data-nosnippet>144</a> }
<a href=#145 id=145 data-nosnippet>145</a>
<a href=#146 id=146 data-nosnippet>146</a> <span class="doccomment">/// Sets a compression parameter for this compressor.
<a href=#147 id=147 data-nosnippet>147</a> </span><span class="kw">pub fn </span>set_parameter(
<a href=#148 id=148 data-nosnippet>148</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#149 id=149 data-nosnippet>149</a> parameter: zstd_safe::CParameter,
<a href=#150 id=150 data-nosnippet>150</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#151 id=151 data-nosnippet>151</a> <span class="self">self</span>.context
<a href=#152 id=152 data-nosnippet>152</a> .set_parameter(parameter)
<a href=#153 id=153 data-nosnippet>153</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#154 id=154 data-nosnippet>154</a> <span class="prelude-val">Ok</span>(())
<a href=#155 id=155 data-nosnippet>155</a> }
<a href=#156 id=156 data-nosnippet>156</a>
<a href=#157 id=157 data-nosnippet>157</a> <span class="macro">crate::encoder_parameters!</span>();
<a href=#158 id=158 data-nosnippet>158</a>}
<a href=#159 id=159 data-nosnippet>159</a>
<a href=#160 id=160 data-nosnippet>160</a><span class="kw">fn </span>_assert_traits() {
<a href=#161 id=161 data-nosnippet>161</a> <span class="kw">fn </span>_assert_send&lt;T: Send&gt;(<span class="kw">_</span>: T) {}
<a href=#162 id=162 data-nosnippet>162</a>
<a href=#163 id=163 data-nosnippet>163</a> _assert_send(Compressor::new(<span class="number">0</span>));
<a href=#164 id=164 data-nosnippet>164</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,152 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zstd-0.13.3/src/bulk/decompressor.rs`."><title>decompressor.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="zstd" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">zstd/bulk/</div>decompressor.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span><span class="kw">crate</span>::map_error_code;
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a><span class="attr">#[cfg(feature = <span class="string">"experimental"</span>)]
<a href=#4 id=4 data-nosnippet>4</a></span><span class="kw">use </span>std::convert::TryInto;
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span>std::io;
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span>zstd_safe;
<a href=#7 id=7 data-nosnippet>7</a>
<a href=#8 id=8 data-nosnippet>8</a><span class="doccomment">/// Allows to decompress independently multiple blocks of data.
<a href=#9 id=9 data-nosnippet>9</a>///
<a href=#10 id=10 data-nosnippet>10</a>/// This reduces memory usage compared to calling `decompress` multiple times.
<a href=#11 id=11 data-nosnippet>11</a></span><span class="attr">#[derive(Default)]
<a href=#12 id=12 data-nosnippet>12</a></span><span class="kw">pub struct </span>Decompressor&lt;<span class="lifetime">'a</span>&gt; {
<a href=#13 id=13 data-nosnippet>13</a> context: zstd_safe::DCtx&lt;<span class="lifetime">'a</span>&gt;,
<a href=#14 id=14 data-nosnippet>14</a>}
<a href=#15 id=15 data-nosnippet>15</a>
<a href=#16 id=16 data-nosnippet>16</a><span class="kw">impl </span>Decompressor&lt;<span class="lifetime">'static</span>&gt; {
<a href=#17 id=17 data-nosnippet>17</a> <span class="doccomment">/// Creates a new zstd decompressor.
<a href=#18 id=18 data-nosnippet>18</a> </span><span class="kw">pub fn </span>new() -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#19 id=19 data-nosnippet>19</a> <span class="self">Self</span>::with_dictionary(<span class="kw-2">&amp;</span>[])
<a href=#20 id=20 data-nosnippet>20</a> }
<a href=#21 id=21 data-nosnippet>21</a>
<a href=#22 id=22 data-nosnippet>22</a> <span class="doccomment">/// Creates a new zstd decompressor, using the given dictionary.
<a href=#23 id=23 data-nosnippet>23</a> </span><span class="kw">pub fn </span>with_dictionary(dictionary: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#24 id=24 data-nosnippet>24</a> <span class="kw">let </span><span class="kw-2">mut </span>decompressor = <span class="self">Self</span>::default();
<a href=#25 id=25 data-nosnippet>25</a>
<a href=#26 id=26 data-nosnippet>26</a> decompressor.set_dictionary(dictionary)<span class="question-mark">?</span>;
<a href=#27 id=27 data-nosnippet>27</a>
<a href=#28 id=28 data-nosnippet>28</a> <span class="prelude-val">Ok</span>(decompressor)
<a href=#29 id=29 data-nosnippet>29</a> }
<a href=#30 id=30 data-nosnippet>30</a>}
<a href=#31 id=31 data-nosnippet>31</a>
<a href=#32 id=32 data-nosnippet>32</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; Decompressor&lt;<span class="lifetime">'a</span>&gt; {
<a href=#33 id=33 data-nosnippet>33</a> <span class="doccomment">/// Creates a new decompressor using an existing `DecoderDictionary`.
<a href=#34 id=34 data-nosnippet>34</a> ///
<a href=#35 id=35 data-nosnippet>35</a> /// Note that using a dictionary means that compression will need to use
<a href=#36 id=36 data-nosnippet>36</a> /// the same dictionary.
<a href=#37 id=37 data-nosnippet>37</a> </span><span class="kw">pub fn </span>with_prepared_dictionary&lt;<span class="lifetime">'b</span>&gt;(
<a href=#38 id=38 data-nosnippet>38</a> dictionary: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw">crate</span>::dict::DecoderDictionary&lt;<span class="lifetime">'b</span>&gt;,
<a href=#39 id=39 data-nosnippet>39</a> ) -&gt; io::Result&lt;<span class="self">Self</span>&gt;
<a href=#40 id=40 data-nosnippet>40</a> <span class="kw">where
<a href=#41 id=41 data-nosnippet>41</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#42 id=42 data-nosnippet>42</a> {
<a href=#43 id=43 data-nosnippet>43</a> <span class="kw">let </span><span class="kw-2">mut </span>decompressor = <span class="self">Self</span>::default();
<a href=#44 id=44 data-nosnippet>44</a>
<a href=#45 id=45 data-nosnippet>45</a> decompressor.set_prepared_dictionary(dictionary)<span class="question-mark">?</span>;
<a href=#46 id=46 data-nosnippet>46</a>
<a href=#47 id=47 data-nosnippet>47</a> <span class="prelude-val">Ok</span>(decompressor)
<a href=#48 id=48 data-nosnippet>48</a> }
<a href=#49 id=49 data-nosnippet>49</a>
<a href=#50 id=50 data-nosnippet>50</a> <span class="doccomment">/// Changes the dictionary used by this decompressor.
<a href=#51 id=51 data-nosnippet>51</a> ///
<a href=#52 id=52 data-nosnippet>52</a> /// Will affect future compression jobs.
<a href=#53 id=53 data-nosnippet>53</a> ///
<a href=#54 id=54 data-nosnippet>54</a> /// Note that using a dictionary means that compression will need to use
<a href=#55 id=55 data-nosnippet>55</a> /// the same dictionary.
<a href=#56 id=56 data-nosnippet>56</a> </span><span class="kw">pub fn </span>set_dictionary(<span class="kw-2">&amp;mut </span><span class="self">self</span>, dictionary: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;()&gt; {
<a href=#57 id=57 data-nosnippet>57</a> <span class="self">self</span>.context
<a href=#58 id=58 data-nosnippet>58</a> .load_dictionary(dictionary)
<a href=#59 id=59 data-nosnippet>59</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#60 id=60 data-nosnippet>60</a>
<a href=#61 id=61 data-nosnippet>61</a> <span class="prelude-val">Ok</span>(())
<a href=#62 id=62 data-nosnippet>62</a> }
<a href=#63 id=63 data-nosnippet>63</a>
<a href=#64 id=64 data-nosnippet>64</a> <span class="doccomment">/// Changes the dictionary used by this decompressor.
<a href=#65 id=65 data-nosnippet>65</a> ///
<a href=#66 id=66 data-nosnippet>66</a> /// Note that using a dictionary means that compression will need to use
<a href=#67 id=67 data-nosnippet>67</a> /// the same dictionary.
<a href=#68 id=68 data-nosnippet>68</a> </span><span class="kw">pub fn </span>set_prepared_dictionary&lt;<span class="lifetime">'b</span>&gt;(
<a href=#69 id=69 data-nosnippet>69</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#70 id=70 data-nosnippet>70</a> dictionary: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw">crate</span>::dict::DecoderDictionary&lt;<span class="lifetime">'b</span>&gt;,
<a href=#71 id=71 data-nosnippet>71</a> ) -&gt; io::Result&lt;()&gt;
<a href=#72 id=72 data-nosnippet>72</a> <span class="kw">where
<a href=#73 id=73 data-nosnippet>73</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#74 id=74 data-nosnippet>74</a> {
<a href=#75 id=75 data-nosnippet>75</a> <span class="self">self</span>.context
<a href=#76 id=76 data-nosnippet>76</a> .ref_ddict(dictionary.as_ddict())
<a href=#77 id=77 data-nosnippet>77</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#78 id=78 data-nosnippet>78</a>
<a href=#79 id=79 data-nosnippet>79</a> <span class="prelude-val">Ok</span>(())
<a href=#80 id=80 data-nosnippet>80</a> }
<a href=#81 id=81 data-nosnippet>81</a>
<a href=#82 id=82 data-nosnippet>82</a> <span class="doccomment">/// Deompress a single block of data to the given destination buffer.
<a href=#83 id=83 data-nosnippet>83</a> ///
<a href=#84 id=84 data-nosnippet>84</a> /// Returns the number of bytes written, or an error if something happened
<a href=#85 id=85 data-nosnippet>85</a> /// (for instance if the destination buffer was too small).
<a href=#86 id=86 data-nosnippet>86</a> </span><span class="kw">pub fn </span>decompress_to_buffer&lt;C: zstd_safe::WriteBuf + <span class="question-mark">?</span>Sized&gt;(
<a href=#87 id=87 data-nosnippet>87</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#88 id=88 data-nosnippet>88</a> source: <span class="kw-2">&amp;</span>[u8],
<a href=#89 id=89 data-nosnippet>89</a> destination: <span class="kw-2">&amp;mut </span>C,
<a href=#90 id=90 data-nosnippet>90</a> ) -&gt; io::Result&lt;usize&gt; {
<a href=#91 id=91 data-nosnippet>91</a> <span class="self">self</span>.context
<a href=#92 id=92 data-nosnippet>92</a> .decompress(destination, source)
<a href=#93 id=93 data-nosnippet>93</a> .map_err(map_error_code)
<a href=#94 id=94 data-nosnippet>94</a> }
<a href=#95 id=95 data-nosnippet>95</a>
<a href=#96 id=96 data-nosnippet>96</a> <span class="doccomment">/// Decompress a block of data, and return the result in a `Vec&lt;u8&gt;`.
<a href=#97 id=97 data-nosnippet>97</a> ///
<a href=#98 id=98 data-nosnippet>98</a> /// The decompressed data should be at most `capacity` bytes,
<a href=#99 id=99 data-nosnippet>99</a> /// or an error will be returned.
<a href=#100 id=100 data-nosnippet>100</a> </span><span class="kw">pub fn </span>decompress(
<a href=#101 id=101 data-nosnippet>101</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#102 id=102 data-nosnippet>102</a> data: <span class="kw-2">&amp;</span>[u8],
<a href=#103 id=103 data-nosnippet>103</a> capacity: usize,
<a href=#104 id=104 data-nosnippet>104</a> ) -&gt; io::Result&lt;Vec&lt;u8&gt;&gt; {
<a href=#105 id=105 data-nosnippet>105</a> <span class="kw">let </span>capacity =
<a href=#106 id=106 data-nosnippet>106</a> <span class="self">Self</span>::upper_bound(data).unwrap_or(capacity).min(capacity);
<a href=#107 id=107 data-nosnippet>107</a> <span class="kw">let </span><span class="kw-2">mut </span>buffer = Vec::with_capacity(capacity);
<a href=#108 id=108 data-nosnippet>108</a> <span class="self">self</span>.decompress_to_buffer(data, <span class="kw-2">&amp;mut </span>buffer)<span class="question-mark">?</span>;
<a href=#109 id=109 data-nosnippet>109</a> <span class="prelude-val">Ok</span>(buffer)
<a href=#110 id=110 data-nosnippet>110</a> }
<a href=#111 id=111 data-nosnippet>111</a>
<a href=#112 id=112 data-nosnippet>112</a> <span class="doccomment">/// Sets a decompression parameter for this decompressor.
<a href=#113 id=113 data-nosnippet>113</a> </span><span class="kw">pub fn </span>set_parameter(
<a href=#114 id=114 data-nosnippet>114</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#115 id=115 data-nosnippet>115</a> parameter: zstd_safe::DParameter,
<a href=#116 id=116 data-nosnippet>116</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#117 id=117 data-nosnippet>117</a> <span class="self">self</span>.context
<a href=#118 id=118 data-nosnippet>118</a> .set_parameter(parameter)
<a href=#119 id=119 data-nosnippet>119</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#120 id=120 data-nosnippet>120</a> <span class="prelude-val">Ok</span>(())
<a href=#121 id=121 data-nosnippet>121</a> }
<a href=#122 id=122 data-nosnippet>122</a>
<a href=#123 id=123 data-nosnippet>123</a> <span class="macro">crate::decoder_parameters!</span>();
<a href=#124 id=124 data-nosnippet>124</a>
<a href=#125 id=125 data-nosnippet>125</a> <span class="doccomment">/// Get an upper bound on the decompressed size of data, if available
<a href=#126 id=126 data-nosnippet>126</a> ///
<a href=#127 id=127 data-nosnippet>127</a> /// This can be used to pre-allocate enough capacity for `decompress_to_buffer`
<a href=#128 id=128 data-nosnippet>128</a> /// and is used by `decompress` to ensure that it does not over-allocate if
<a href=#129 id=129 data-nosnippet>129</a> /// you supply a large `capacity`.
<a href=#130 id=130 data-nosnippet>130</a> ///
<a href=#131 id=131 data-nosnippet>131</a> /// Will return `None` if the upper bound cannot be determined or is larger than `usize::MAX`
<a href=#132 id=132 data-nosnippet>132</a> ///
<a href=#133 id=133 data-nosnippet>133</a> /// Note that unless the `experimental` feature is enabled, this will always return `None`.
<a href=#134 id=134 data-nosnippet>134</a> </span><span class="kw">pub fn </span>upper_bound(_data: <span class="kw-2">&amp;</span>[u8]) -&gt; <span class="prelude-ty">Option</span>&lt;usize&gt; {
<a href=#135 id=135 data-nosnippet>135</a> <span class="attr">#[cfg(feature = <span class="string">"experimental"</span>)]
<a href=#136 id=136 data-nosnippet>136</a> </span>{
<a href=#137 id=137 data-nosnippet>137</a> <span class="kw">let </span>bound = zstd_safe::decompress_bound(_data).ok()<span class="question-mark">?</span>;
<a href=#138 id=138 data-nosnippet>138</a> bound.try_into().ok()
<a href=#139 id=139 data-nosnippet>139</a> }
<a href=#140 id=140 data-nosnippet>140</a> <span class="attr">#[cfg(not(feature = <span class="string">"experimental"</span>))]
<a href=#141 id=141 data-nosnippet>141</a> </span>{
<a href=#142 id=142 data-nosnippet>142</a> <span class="prelude-val">None
<a href=#143 id=143 data-nosnippet>143</a> </span>}
<a href=#144 id=144 data-nosnippet>144</a> }
<a href=#145 id=145 data-nosnippet>145</a>}
<a href=#146 id=146 data-nosnippet>146</a>
<a href=#147 id=147 data-nosnippet>147</a><span class="kw">fn </span>_assert_traits() {
<a href=#148 id=148 data-nosnippet>148</a> <span class="kw">fn </span>_assert_send&lt;T: Send&gt;(<span class="kw">_</span>: T) {}
<a href=#149 id=149 data-nosnippet>149</a>
<a href=#150 id=150 data-nosnippet>150</a> _assert_send(Decompressor::new());
<a href=#151 id=151 data-nosnippet>151</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,57 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zstd-0.13.3/src/bulk/mod.rs`."><title>mod.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="zstd" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">zstd/bulk/</div>mod.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-2"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! Compress and decompress data in bulk.
<a href=#2 id=2 data-nosnippet>2</a>//!
<a href=#3 id=3 data-nosnippet>3</a>//! These methods process all the input data at once.
<a href=#4 id=4 data-nosnippet>4</a>//! It is therefore best used with relatively small blocks
<a href=#5 id=5 data-nosnippet>5</a>//! (like small network packets).
<a href=#6 id=6 data-nosnippet>6</a>
<a href=#7 id=7 data-nosnippet>7</a></span><span class="kw">mod </span>compressor;
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">mod </span>decompressor;
<a href=#9 id=9 data-nosnippet>9</a>
<a href=#10 id=10 data-nosnippet>10</a><span class="attr">#[cfg(test)]
<a href=#11 id=11 data-nosnippet>11</a></span><span class="kw">mod </span>tests;
<a href=#12 id=12 data-nosnippet>12</a>
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">pub use </span><span class="self">self</span>::compressor::Compressor;
<a href=#14 id=14 data-nosnippet>14</a><span class="kw">pub use </span><span class="self">self</span>::decompressor::Decompressor;
<a href=#15 id=15 data-nosnippet>15</a>
<a href=#16 id=16 data-nosnippet>16</a><span class="kw">use </span>std::io;
<a href=#17 id=17 data-nosnippet>17</a>
<a href=#18 id=18 data-nosnippet>18</a><span class="doccomment">/// Compresses a single block of data to the given destination buffer.
<a href=#19 id=19 data-nosnippet>19</a>///
<a href=#20 id=20 data-nosnippet>20</a>/// Returns the number of bytes written, or an error if something happened
<a href=#21 id=21 data-nosnippet>21</a>/// (for instance if the destination buffer was too small).
<a href=#22 id=22 data-nosnippet>22</a>///
<a href=#23 id=23 data-nosnippet>23</a>/// A level of `0` uses zstd's default (currently `3`).
<a href=#24 id=24 data-nosnippet>24</a></span><span class="kw">pub fn </span>compress_to_buffer(
<a href=#25 id=25 data-nosnippet>25</a> source: <span class="kw-2">&amp;</span>[u8],
<a href=#26 id=26 data-nosnippet>26</a> destination: <span class="kw-2">&amp;mut </span>[u8],
<a href=#27 id=27 data-nosnippet>27</a> level: i32,
<a href=#28 id=28 data-nosnippet>28</a>) -&gt; io::Result&lt;usize&gt; {
<a href=#29 id=29 data-nosnippet>29</a> Compressor::new(level)<span class="question-mark">?</span>.compress_to_buffer(source, destination)
<a href=#30 id=30 data-nosnippet>30</a>}
<a href=#31 id=31 data-nosnippet>31</a>
<a href=#32 id=32 data-nosnippet>32</a><span class="doccomment">/// Compresses a block of data and returns the compressed result.
<a href=#33 id=33 data-nosnippet>33</a>///
<a href=#34 id=34 data-nosnippet>34</a>/// A level of `0` uses zstd's default (currently `3`).
<a href=#35 id=35 data-nosnippet>35</a></span><span class="kw">pub fn </span>compress(data: <span class="kw-2">&amp;</span>[u8], level: i32) -&gt; io::Result&lt;Vec&lt;u8&gt;&gt; {
<a href=#36 id=36 data-nosnippet>36</a> Compressor::new(level)<span class="question-mark">?</span>.compress(data)
<a href=#37 id=37 data-nosnippet>37</a>}
<a href=#38 id=38 data-nosnippet>38</a>
<a href=#39 id=39 data-nosnippet>39</a><span class="doccomment">/// Deompress a single block of data to the given destination buffer.
<a href=#40 id=40 data-nosnippet>40</a>///
<a href=#41 id=41 data-nosnippet>41</a>/// Returns the number of bytes written, or an error if something happened
<a href=#42 id=42 data-nosnippet>42</a>/// (for instance if the destination buffer was too small).
<a href=#43 id=43 data-nosnippet>43</a></span><span class="kw">pub fn </span>decompress_to_buffer(
<a href=#44 id=44 data-nosnippet>44</a> source: <span class="kw-2">&amp;</span>[u8],
<a href=#45 id=45 data-nosnippet>45</a> destination: <span class="kw-2">&amp;mut </span>[u8],
<a href=#46 id=46 data-nosnippet>46</a>) -&gt; io::Result&lt;usize&gt; {
<a href=#47 id=47 data-nosnippet>47</a> Decompressor::new()<span class="question-mark">?</span>.decompress_to_buffer(source, destination)
<a href=#48 id=48 data-nosnippet>48</a>}
<a href=#49 id=49 data-nosnippet>49</a>
<a href=#50 id=50 data-nosnippet>50</a><span class="doccomment">/// Decompresses a block of data and returns the decompressed result.
<a href=#51 id=51 data-nosnippet>51</a>///
<a href=#52 id=52 data-nosnippet>52</a>/// The decompressed data should be at most `capacity` bytes,
<a href=#53 id=53 data-nosnippet>53</a>/// or an error will be returned.
<a href=#54 id=54 data-nosnippet>54</a></span><span class="kw">pub fn </span>decompress(data: <span class="kw-2">&amp;</span>[u8], capacity: usize) -&gt; io::Result&lt;Vec&lt;u8&gt;&gt; {
<a href=#55 id=55 data-nosnippet>55</a> Decompressor::new()<span class="question-mark">?</span>.decompress(data, capacity)
<a href=#56 id=56 data-nosnippet>56</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,297 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zstd-0.13.3/src/dict.rs`."><title>dict.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="zstd" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../../static.files/src-script-813739b1.js"></script><script defer src="../../src-files.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">zstd/</div>dict.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! Train a dictionary from various sources.
<a href=#2 id=2 data-nosnippet>2</a>//!
<a href=#3 id=3 data-nosnippet>3</a>//! A dictionary can help improve the compression of small files.
<a href=#4 id=4 data-nosnippet>4</a>//! The dictionary must be present during decompression,
<a href=#5 id=5 data-nosnippet>5</a>//! but can be shared across multiple "similar" files.
<a href=#6 id=6 data-nosnippet>6</a>//!
<a href=#7 id=7 data-nosnippet>7</a>//! Creating a dictionary using the `zstd` C library,
<a href=#8 id=8 data-nosnippet>8</a>//! using the `zstd` command-line interface, using this library,
<a href=#9 id=9 data-nosnippet>9</a>//! or using the `train` binary provided, should give the same result,
<a href=#10 id=10 data-nosnippet>10</a>//! and are therefore completely compatible.
<a href=#11 id=11 data-nosnippet>11</a>//!
<a href=#12 id=12 data-nosnippet>12</a>//! To use, see [`Encoder::with_dictionary`] or [`Decoder::with_dictionary`].
<a href=#13 id=13 data-nosnippet>13</a>//!
<a href=#14 id=14 data-nosnippet>14</a>//! [`Encoder::with_dictionary`]: ../struct.Encoder.html#method.with_dictionary
<a href=#15 id=15 data-nosnippet>15</a>//! [`Decoder::with_dictionary`]: ../struct.Decoder.html#method.with_dictionary
<a href=#16 id=16 data-nosnippet>16</a>
<a href=#17 id=17 data-nosnippet>17</a></span><span class="attr">#[cfg(feature = <span class="string">"zdict_builder"</span>)]
<a href=#18 id=18 data-nosnippet>18</a></span><span class="kw">use </span>std::io::{<span class="self">self</span>, Read};
<a href=#19 id=19 data-nosnippet>19</a>
<a href=#20 id=20 data-nosnippet>20</a><span class="kw">pub use </span>zstd_safe::{CDict, DDict};
<a href=#21 id=21 data-nosnippet>21</a>
<a href=#22 id=22 data-nosnippet>22</a><span class="doccomment">/// Prepared dictionary for compression
<a href=#23 id=23 data-nosnippet>23</a>///
<a href=#24 id=24 data-nosnippet>24</a>/// A dictionary can include its own copy of the data (if it is `'static`), or it can merely point
<a href=#25 id=25 data-nosnippet>25</a>/// to a separate buffer (if it has another lifetime).
<a href=#26 id=26 data-nosnippet>26</a></span><span class="kw">pub struct </span>EncoderDictionary&lt;<span class="lifetime">'a</span>&gt; {
<a href=#27 id=27 data-nosnippet>27</a> cdict: CDict&lt;<span class="lifetime">'a</span>&gt;,
<a href=#28 id=28 data-nosnippet>28</a>}
<a href=#29 id=29 data-nosnippet>29</a>
<a href=#30 id=30 data-nosnippet>30</a><span class="kw">impl </span>EncoderDictionary&lt;<span class="lifetime">'static</span>&gt; {
<a href=#31 id=31 data-nosnippet>31</a> <span class="doccomment">/// Creates a prepared dictionary for compression.
<a href=#32 id=32 data-nosnippet>32</a> ///
<a href=#33 id=33 data-nosnippet>33</a> /// This will copy the dictionary internally.
<a href=#34 id=34 data-nosnippet>34</a> </span><span class="kw">pub fn </span>copy(dictionary: <span class="kw-2">&amp;</span>[u8], level: i32) -&gt; <span class="self">Self </span>{
<a href=#35 id=35 data-nosnippet>35</a> <span class="self">Self </span>{
<a href=#36 id=36 data-nosnippet>36</a> cdict: zstd_safe::create_cdict(dictionary, level),
<a href=#37 id=37 data-nosnippet>37</a> }
<a href=#38 id=38 data-nosnippet>38</a> }
<a href=#39 id=39 data-nosnippet>39</a>}
<a href=#40 id=40 data-nosnippet>40</a>
<a href=#41 id=41 data-nosnippet>41</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; EncoderDictionary&lt;<span class="lifetime">'a</span>&gt; {
<a href=#42 id=42 data-nosnippet>42</a> <span class="attr">#[cfg(feature = <span class="string">"experimental"</span>)]
<a href=#43 id=43 data-nosnippet>43</a> #[cfg_attr(feature = <span class="string">"doc-cfg"</span>, doc(cfg(feature = <span class="string">"experimental"</span>)))]
<a href=#44 id=44 data-nosnippet>44</a> </span><span class="doccomment">/// Create prepared dictionary for compression
<a href=#45 id=45 data-nosnippet>45</a> ///
<a href=#46 id=46 data-nosnippet>46</a> /// A level of `0` uses zstd's default (currently `3`).
<a href=#47 id=47 data-nosnippet>47</a> ///
<a href=#48 id=48 data-nosnippet>48</a> /// Only available with the `experimental` feature. Use `EncoderDictionary::copy` otherwise.
<a href=#49 id=49 data-nosnippet>49</a> </span><span class="kw">pub fn </span>new(dictionary: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>[u8], level: i32) -&gt; <span class="self">Self </span>{
<a href=#50 id=50 data-nosnippet>50</a> <span class="self">Self </span>{
<a href=#51 id=51 data-nosnippet>51</a> cdict: zstd_safe::CDict::create_by_reference(dictionary, level),
<a href=#52 id=52 data-nosnippet>52</a> }
<a href=#53 id=53 data-nosnippet>53</a> }
<a href=#54 id=54 data-nosnippet>54</a>
<a href=#55 id=55 data-nosnippet>55</a> <span class="doccomment">/// Returns reference to `CDict` inner object
<a href=#56 id=56 data-nosnippet>56</a> </span><span class="kw">pub fn </span>as_cdict(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>CDict&lt;<span class="lifetime">'a</span>&gt; {
<a href=#57 id=57 data-nosnippet>57</a> <span class="kw-2">&amp;</span><span class="self">self</span>.cdict
<a href=#58 id=58 data-nosnippet>58</a> }
<a href=#59 id=59 data-nosnippet>59</a>}
<a href=#60 id=60 data-nosnippet>60</a>
<a href=#61 id=61 data-nosnippet>61</a><span class="doccomment">/// Prepared dictionary for decompression
<a href=#62 id=62 data-nosnippet>62</a></span><span class="kw">pub struct </span>DecoderDictionary&lt;<span class="lifetime">'a</span>&gt; {
<a href=#63 id=63 data-nosnippet>63</a> ddict: DDict&lt;<span class="lifetime">'a</span>&gt;,
<a href=#64 id=64 data-nosnippet>64</a>}
<a href=#65 id=65 data-nosnippet>65</a>
<a href=#66 id=66 data-nosnippet>66</a><span class="kw">impl </span>DecoderDictionary&lt;<span class="lifetime">'static</span>&gt; {
<a href=#67 id=67 data-nosnippet>67</a> <span class="doccomment">/// Create a prepared dictionary for decompression.
<a href=#68 id=68 data-nosnippet>68</a> ///
<a href=#69 id=69 data-nosnippet>69</a> /// This will copy the dictionary internally.
<a href=#70 id=70 data-nosnippet>70</a> </span><span class="kw">pub fn </span>copy(dictionary: <span class="kw-2">&amp;</span>[u8]) -&gt; <span class="self">Self </span>{
<a href=#71 id=71 data-nosnippet>71</a> <span class="self">Self </span>{
<a href=#72 id=72 data-nosnippet>72</a> ddict: zstd_safe::DDict::create(dictionary),
<a href=#73 id=73 data-nosnippet>73</a> }
<a href=#74 id=74 data-nosnippet>74</a> }
<a href=#75 id=75 data-nosnippet>75</a>}
<a href=#76 id=76 data-nosnippet>76</a>
<a href=#77 id=77 data-nosnippet>77</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; DecoderDictionary&lt;<span class="lifetime">'a</span>&gt; {
<a href=#78 id=78 data-nosnippet>78</a> <span class="attr">#[cfg(feature = <span class="string">"experimental"</span>)]
<a href=#79 id=79 data-nosnippet>79</a> #[cfg_attr(feature = <span class="string">"doc-cfg"</span>, doc(cfg(feature = <span class="string">"experimental"</span>)))]
<a href=#80 id=80 data-nosnippet>80</a> </span><span class="doccomment">/// Create prepared dictionary for decompression
<a href=#81 id=81 data-nosnippet>81</a> ///
<a href=#82 id=82 data-nosnippet>82</a> /// Only available with the `experimental` feature. Use `DecoderDictionary::copy` otherwise.
<a href=#83 id=83 data-nosnippet>83</a> </span><span class="kw">pub fn </span>new(dict: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>[u8]) -&gt; <span class="self">Self </span>{
<a href=#84 id=84 data-nosnippet>84</a> <span class="self">Self </span>{
<a href=#85 id=85 data-nosnippet>85</a> ddict: zstd_safe::DDict::create_by_reference(dict),
<a href=#86 id=86 data-nosnippet>86</a> }
<a href=#87 id=87 data-nosnippet>87</a> }
<a href=#88 id=88 data-nosnippet>88</a>
<a href=#89 id=89 data-nosnippet>89</a> <span class="doccomment">/// Returns reference to `DDict` inner object
<a href=#90 id=90 data-nosnippet>90</a> </span><span class="kw">pub fn </span>as_ddict(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>DDict&lt;<span class="lifetime">'a</span>&gt; {
<a href=#91 id=91 data-nosnippet>91</a> <span class="kw-2">&amp;</span><span class="self">self</span>.ddict
<a href=#92 id=92 data-nosnippet>92</a> }
<a href=#93 id=93 data-nosnippet>93</a>}
<a href=#94 id=94 data-nosnippet>94</a>
<a href=#95 id=95 data-nosnippet>95</a><span class="doccomment">/// Train a dictionary from a big continuous chunk of data, with all samples
<a href=#96 id=96 data-nosnippet>96</a>/// contiguous in memory.
<a href=#97 id=97 data-nosnippet>97</a>///
<a href=#98 id=98 data-nosnippet>98</a>/// This is the most efficient way to train a dictionary,
<a href=#99 id=99 data-nosnippet>99</a>/// since this is directly fed into `zstd`.
<a href=#100 id=100 data-nosnippet>100</a>///
<a href=#101 id=101 data-nosnippet>101</a>/// * `sample_data` is the concatenation of all sample data.
<a href=#102 id=102 data-nosnippet>102</a>/// * `sample_sizes` is the size of each sample in `sample_data`.
<a href=#103 id=103 data-nosnippet>103</a>/// The sum of all `sample_sizes` should equal the length of `sample_data`.
<a href=#104 id=104 data-nosnippet>104</a>/// * `max_size` is the maximum size of the dictionary to generate.
<a href=#105 id=105 data-nosnippet>105</a>///
<a href=#106 id=106 data-nosnippet>106</a>/// The result is the dictionary data. You can, for example, feed it to [`CDict::create`].
<a href=#107 id=107 data-nosnippet>107</a></span><span class="attr">#[cfg(feature = <span class="string">"zdict_builder"</span>)]
<a href=#108 id=108 data-nosnippet>108</a>#[cfg_attr(feature = <span class="string">"doc-cfg"</span>, doc(cfg(feature = <span class="string">"zdict_builder"</span>)))]
<a href=#109 id=109 data-nosnippet>109</a></span><span class="kw">pub fn </span>from_continuous(
<a href=#110 id=110 data-nosnippet>110</a> sample_data: <span class="kw-2">&amp;</span>[u8],
<a href=#111 id=111 data-nosnippet>111</a> sample_sizes: <span class="kw-2">&amp;</span>[usize],
<a href=#112 id=112 data-nosnippet>112</a> max_size: usize,
<a href=#113 id=113 data-nosnippet>113</a>) -&gt; io::Result&lt;Vec&lt;u8&gt;&gt; {
<a href=#114 id=114 data-nosnippet>114</a> <span class="kw">use </span><span class="kw">crate</span>::map_error_code;
<a href=#115 id=115 data-nosnippet>115</a>
<a href=#116 id=116 data-nosnippet>116</a> <span class="comment">// Complain if the lengths don't add up to the entire data.
<a href=#117 id=117 data-nosnippet>117</a> </span><span class="kw">if </span>sample_sizes.iter().sum::&lt;usize&gt;() != sample_data.len() {
<a href=#118 id=118 data-nosnippet>118</a> <span class="kw">return </span><span class="prelude-val">Err</span>(io::Error::new(
<a href=#119 id=119 data-nosnippet>119</a> io::ErrorKind::Other,
<a href=#120 id=120 data-nosnippet>120</a> <span class="string">"sample sizes don't add up"</span>.to_string(),
<a href=#121 id=121 data-nosnippet>121</a> ));
<a href=#122 id=122 data-nosnippet>122</a> }
<a href=#123 id=123 data-nosnippet>123</a>
<a href=#124 id=124 data-nosnippet>124</a> <span class="kw">let </span><span class="kw-2">mut </span>result = Vec::with_capacity(max_size);
<a href=#125 id=125 data-nosnippet>125</a> zstd_safe::train_from_buffer(<span class="kw-2">&amp;mut </span>result, sample_data, sample_sizes)
<a href=#126 id=126 data-nosnippet>126</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#127 id=127 data-nosnippet>127</a> <span class="prelude-val">Ok</span>(result)
<a href=#128 id=128 data-nosnippet>128</a>}
<a href=#129 id=129 data-nosnippet>129</a>
<a href=#130 id=130 data-nosnippet>130</a><span class="doccomment">/// Train a dictionary from multiple samples.
<a href=#131 id=131 data-nosnippet>131</a>///
<a href=#132 id=132 data-nosnippet>132</a>/// The samples will internally be copied to a single continuous buffer,
<a href=#133 id=133 data-nosnippet>133</a>/// so make sure you have enough memory available.
<a href=#134 id=134 data-nosnippet>134</a>///
<a href=#135 id=135 data-nosnippet>135</a>/// If you need to stretch your system's limits,
<a href=#136 id=136 data-nosnippet>136</a>/// [`from_continuous`] directly uses the given slice.
<a href=#137 id=137 data-nosnippet>137</a>///
<a href=#138 id=138 data-nosnippet>138</a>/// [`from_continuous`]: ./fn.from_continuous.html
<a href=#139 id=139 data-nosnippet>139</a>///
<a href=#140 id=140 data-nosnippet>140</a>/// * `samples` is a list of individual samples to train on.
<a href=#141 id=141 data-nosnippet>141</a>/// * `max_size` is the maximum size of the dictionary to generate.
<a href=#142 id=142 data-nosnippet>142</a>///
<a href=#143 id=143 data-nosnippet>143</a>/// The result is the dictionary data. You can, for example, feed it to [`CDict::create`].
<a href=#144 id=144 data-nosnippet>144</a></span><span class="attr">#[cfg(feature = <span class="string">"zdict_builder"</span>)]
<a href=#145 id=145 data-nosnippet>145</a>#[cfg_attr(feature = <span class="string">"doc-cfg"</span>, doc(cfg(feature = <span class="string">"zdict_builder"</span>)))]
<a href=#146 id=146 data-nosnippet>146</a></span><span class="kw">pub fn </span>from_samples&lt;S: AsRef&lt;[u8]&gt;&gt;(
<a href=#147 id=147 data-nosnippet>147</a> samples: <span class="kw-2">&amp;</span>[S],
<a href=#148 id=148 data-nosnippet>148</a> max_size: usize,
<a href=#149 id=149 data-nosnippet>149</a>) -&gt; io::Result&lt;Vec&lt;u8&gt;&gt; {
<a href=#150 id=150 data-nosnippet>150</a> <span class="comment">// Pre-allocate the entire required size.
<a href=#151 id=151 data-nosnippet>151</a> </span><span class="kw">let </span>total_length: usize =
<a href=#152 id=152 data-nosnippet>152</a> samples.iter().map(|sample| sample.as_ref().len()).sum();
<a href=#153 id=153 data-nosnippet>153</a>
<a href=#154 id=154 data-nosnippet>154</a> <span class="kw">let </span><span class="kw-2">mut </span>data = Vec::with_capacity(total_length);
<a href=#155 id=155 data-nosnippet>155</a>
<a href=#156 id=156 data-nosnippet>156</a> <span class="comment">// Copy every sample to a big chunk of memory
<a href=#157 id=157 data-nosnippet>157</a> </span>data.extend(samples.iter().flat_map(|s| s.as_ref()).cloned());
<a href=#158 id=158 data-nosnippet>158</a>
<a href=#159 id=159 data-nosnippet>159</a> <span class="kw">let </span>sizes: Vec&lt;<span class="kw">_</span>&gt; = samples.iter().map(|s| s.as_ref().len()).collect();
<a href=#160 id=160 data-nosnippet>160</a>
<a href=#161 id=161 data-nosnippet>161</a> from_continuous(<span class="kw-2">&amp;</span>data, <span class="kw-2">&amp;</span>sizes, max_size)
<a href=#162 id=162 data-nosnippet>162</a>}
<a href=#163 id=163 data-nosnippet>163</a>
<a href=#164 id=164 data-nosnippet>164</a><span class="doccomment">/// Train a dictionary from multiple samples.
<a href=#165 id=165 data-nosnippet>165</a>///
<a href=#166 id=166 data-nosnippet>166</a>/// Unlike [`from_samples`], this does not require having a list of all samples.
<a href=#167 id=167 data-nosnippet>167</a>/// It also allows running into an error when iterating through the samples.
<a href=#168 id=168 data-nosnippet>168</a>///
<a href=#169 id=169 data-nosnippet>169</a>/// They will still be copied to a continuous array and fed to [`from_continuous`].
<a href=#170 id=170 data-nosnippet>170</a>///
<a href=#171 id=171 data-nosnippet>171</a>/// * `samples` is an iterator of individual samples to train on.
<a href=#172 id=172 data-nosnippet>172</a>/// * `max_size` is the maximum size of the dictionary to generate.
<a href=#173 id=173 data-nosnippet>173</a>///
<a href=#174 id=174 data-nosnippet>174</a>/// The result is the dictionary data. You can, for example, feed it to [`CDict::create`].
<a href=#175 id=175 data-nosnippet>175</a>///
<a href=#176 id=176 data-nosnippet>176</a>/// # Examples
<a href=#177 id=177 data-nosnippet>177</a>///
<a href=#178 id=178 data-nosnippet>178</a>/// ```rust,no_run
<a href=#179 id=179 data-nosnippet>179</a>/// // Train from a couple of json files.
<a href=#180 id=180 data-nosnippet>180</a>/// let dict_buffer = zstd::dict::from_sample_iterator(
<a href=#181 id=181 data-nosnippet>181</a>/// ["file_a.json", "file_b.json"]
<a href=#182 id=182 data-nosnippet>182</a>/// .into_iter()
<a href=#183 id=183 data-nosnippet>183</a>/// .map(|filename| std::fs::File::open(filename)),
<a href=#184 id=184 data-nosnippet>184</a>/// 10_000, // 10kB dictionary
<a href=#185 id=185 data-nosnippet>185</a>/// ).unwrap();
<a href=#186 id=186 data-nosnippet>186</a>/// ```
<a href=#187 id=187 data-nosnippet>187</a>///
<a href=#188 id=188 data-nosnippet>188</a>/// ```rust,no_run
<a href=#189 id=189 data-nosnippet>189</a>/// use std::io::BufRead as _;
<a href=#190 id=190 data-nosnippet>190</a>/// // Treat each line from stdin as a separate sample.
<a href=#191 id=191 data-nosnippet>191</a>/// let dict_buffer = zstd::dict::from_sample_iterator(
<a href=#192 id=192 data-nosnippet>192</a>/// std::io::stdin().lock().lines().map(|line: std::io::Result&lt;String&gt;| {
<a href=#193 id=193 data-nosnippet>193</a>/// // Transform each line into a `Cursor&lt;Vec&lt;u8&gt;&gt;` so they implement Read.
<a href=#194 id=194 data-nosnippet>194</a>/// line.map(String::into_bytes)
<a href=#195 id=195 data-nosnippet>195</a>/// .map(std::io::Cursor::new)
<a href=#196 id=196 data-nosnippet>196</a>/// }),
<a href=#197 id=197 data-nosnippet>197</a>/// 10_000, // 10kB dictionary
<a href=#198 id=198 data-nosnippet>198</a>/// ).unwrap();
<a href=#199 id=199 data-nosnippet>199</a>/// ```
<a href=#200 id=200 data-nosnippet>200</a></span><span class="attr">#[cfg(feature = <span class="string">"zdict_builder"</span>)]
<a href=#201 id=201 data-nosnippet>201</a>#[cfg_attr(feature = <span class="string">"doc-cfg"</span>, doc(cfg(feature = <span class="string">"zdict_builder"</span>)))]
<a href=#202 id=202 data-nosnippet>202</a></span><span class="kw">pub fn </span>from_sample_iterator&lt;I, R&gt;(
<a href=#203 id=203 data-nosnippet>203</a> samples: I,
<a href=#204 id=204 data-nosnippet>204</a> max_size: usize,
<a href=#205 id=205 data-nosnippet>205</a>) -&gt; io::Result&lt;Vec&lt;u8&gt;&gt;
<a href=#206 id=206 data-nosnippet>206</a><span class="kw">where
<a href=#207 id=207 data-nosnippet>207</a> </span>I: IntoIterator&lt;Item = io::Result&lt;R&gt;&gt;,
<a href=#208 id=208 data-nosnippet>208</a> R: Read,
<a href=#209 id=209 data-nosnippet>209</a>{
<a href=#210 id=210 data-nosnippet>210</a> <span class="kw">let </span><span class="kw-2">mut </span>data = Vec::new();
<a href=#211 id=211 data-nosnippet>211</a> <span class="kw">let </span><span class="kw-2">mut </span>sizes = Vec::new();
<a href=#212 id=212 data-nosnippet>212</a>
<a href=#213 id=213 data-nosnippet>213</a> <span class="kw">for </span>sample <span class="kw">in </span>samples {
<a href=#214 id=214 data-nosnippet>214</a> <span class="kw">let </span><span class="kw-2">mut </span>sample = sample<span class="question-mark">?</span>;
<a href=#215 id=215 data-nosnippet>215</a> <span class="kw">let </span>len = sample.read_to_end(<span class="kw-2">&amp;mut </span>data)<span class="question-mark">?</span>;
<a href=#216 id=216 data-nosnippet>216</a> sizes.push(len);
<a href=#217 id=217 data-nosnippet>217</a> }
<a href=#218 id=218 data-nosnippet>218</a>
<a href=#219 id=219 data-nosnippet>219</a> from_continuous(<span class="kw-2">&amp;</span>data, <span class="kw-2">&amp;</span>sizes, max_size)
<a href=#220 id=220 data-nosnippet>220</a>}
<a href=#221 id=221 data-nosnippet>221</a>
<a href=#222 id=222 data-nosnippet>222</a><span class="doccomment">/// Train a dict from a list of files.
<a href=#223 id=223 data-nosnippet>223</a>///
<a href=#224 id=224 data-nosnippet>224</a>/// * `filenames` is an iterator of files to load. Each file will be treated as an individual
<a href=#225 id=225 data-nosnippet>225</a>/// sample.
<a href=#226 id=226 data-nosnippet>226</a>/// * `max_size` is the maximum size of the dictionary to generate.
<a href=#227 id=227 data-nosnippet>227</a>///
<a href=#228 id=228 data-nosnippet>228</a>/// The result is the dictionary data. You can, for example, feed it to [`CDict::create`].
<a href=#229 id=229 data-nosnippet>229</a></span><span class="attr">#[cfg(feature = <span class="string">"zdict_builder"</span>)]
<a href=#230 id=230 data-nosnippet>230</a>#[cfg_attr(feature = <span class="string">"doc-cfg"</span>, doc(cfg(feature = <span class="string">"zdict_builder"</span>)))]
<a href=#231 id=231 data-nosnippet>231</a></span><span class="kw">pub fn </span>from_files&lt;I, P&gt;(filenames: I, max_size: usize) -&gt; io::Result&lt;Vec&lt;u8&gt;&gt;
<a href=#232 id=232 data-nosnippet>232</a><span class="kw">where
<a href=#233 id=233 data-nosnippet>233</a> </span>P: AsRef&lt;std::path::Path&gt;,
<a href=#234 id=234 data-nosnippet>234</a> I: IntoIterator&lt;Item = P&gt;,
<a href=#235 id=235 data-nosnippet>235</a>{
<a href=#236 id=236 data-nosnippet>236</a> from_sample_iterator(
<a href=#237 id=237 data-nosnippet>237</a> filenames
<a href=#238 id=238 data-nosnippet>238</a> .into_iter()
<a href=#239 id=239 data-nosnippet>239</a> .map(|filename| std::fs::File::open(filename)),
<a href=#240 id=240 data-nosnippet>240</a> max_size,
<a href=#241 id=241 data-nosnippet>241</a> )
<a href=#242 id=242 data-nosnippet>242</a>}
<a href=#243 id=243 data-nosnippet>243</a>
<a href=#244 id=244 data-nosnippet>244</a><span class="attr">#[cfg(test)]
<a href=#245 id=245 data-nosnippet>245</a>#[cfg(feature = <span class="string">"zdict_builder"</span>)]
<a href=#246 id=246 data-nosnippet>246</a></span><span class="kw">mod </span>tests {
<a href=#247 id=247 data-nosnippet>247</a> <span class="kw">use </span>std::fs;
<a href=#248 id=248 data-nosnippet>248</a> <span class="kw">use </span>std::io;
<a href=#249 id=249 data-nosnippet>249</a> <span class="kw">use </span>std::io::Read;
<a href=#250 id=250 data-nosnippet>250</a>
<a href=#251 id=251 data-nosnippet>251</a> <span class="kw">use </span>walkdir;
<a href=#252 id=252 data-nosnippet>252</a>
<a href=#253 id=253 data-nosnippet>253</a> <span class="attr">#[test]
<a href=#254 id=254 data-nosnippet>254</a> </span><span class="kw">fn </span>test_dict_training() {
<a href=#255 id=255 data-nosnippet>255</a> <span class="comment">// Train a dictionary
<a href=#256 id=256 data-nosnippet>256</a> </span><span class="kw">let </span>paths: Vec&lt;<span class="kw">_</span>&gt; = walkdir::WalkDir::new(<span class="string">"src"</span>)
<a href=#257 id=257 data-nosnippet>257</a> .into_iter()
<a href=#258 id=258 data-nosnippet>258</a> .map(|entry| entry.unwrap())
<a href=#259 id=259 data-nosnippet>259</a> .map(|entry| entry.into_path())
<a href=#260 id=260 data-nosnippet>260</a> .filter(|path| path.to_str().unwrap().ends_with(<span class="string">".rs"</span>))
<a href=#261 id=261 data-nosnippet>261</a> .collect();
<a href=#262 id=262 data-nosnippet>262</a>
<a href=#263 id=263 data-nosnippet>263</a> <span class="kw">let </span>dict = <span class="kw">super</span>::from_files(<span class="kw-2">&amp;</span>paths, <span class="number">4000</span>).unwrap();
<a href=#264 id=264 data-nosnippet>264</a>
<a href=#265 id=265 data-nosnippet>265</a> <span class="kw">for </span>path <span class="kw">in </span>paths {
<a href=#266 id=266 data-nosnippet>266</a> <span class="kw">let </span><span class="kw-2">mut </span>buffer = Vec::new();
<a href=#267 id=267 data-nosnippet>267</a> <span class="kw">let </span><span class="kw-2">mut </span>file = fs::File::open(path).unwrap();
<a href=#268 id=268 data-nosnippet>268</a> <span class="kw">let </span><span class="kw-2">mut </span>content = Vec::new();
<a href=#269 id=269 data-nosnippet>269</a> file.read_to_end(<span class="kw-2">&amp;mut </span>content).unwrap();
<a href=#270 id=270 data-nosnippet>270</a> io::copy(
<a href=#271 id=271 data-nosnippet>271</a> <span class="kw-2">&amp;mut &amp;</span>content[..],
<a href=#272 id=272 data-nosnippet>272</a> <span class="kw-2">&amp;mut </span><span class="kw">crate</span>::stream::Encoder::with_dictionary(
<a href=#273 id=273 data-nosnippet>273</a> <span class="kw-2">&amp;mut </span>buffer,
<a href=#274 id=274 data-nosnippet>274</a> <span class="number">1</span>,
<a href=#275 id=275 data-nosnippet>275</a> <span class="kw-2">&amp;</span>dict,
<a href=#276 id=276 data-nosnippet>276</a> )
<a href=#277 id=277 data-nosnippet>277</a> .unwrap()
<a href=#278 id=278 data-nosnippet>278</a> .auto_finish(),
<a href=#279 id=279 data-nosnippet>279</a> )
<a href=#280 id=280 data-nosnippet>280</a> .unwrap();
<a href=#281 id=281 data-nosnippet>281</a>
<a href=#282 id=282 data-nosnippet>282</a> <span class="kw">let </span><span class="kw-2">mut </span>result = Vec::new();
<a href=#283 id=283 data-nosnippet>283</a> io::copy(
<a href=#284 id=284 data-nosnippet>284</a> <span class="kw-2">&amp;mut </span><span class="kw">crate</span>::stream::Decoder::with_dictionary(
<a href=#285 id=285 data-nosnippet>285</a> <span class="kw-2">&amp;</span>buffer[..],
<a href=#286 id=286 data-nosnippet>286</a> <span class="kw-2">&amp;</span>dict[..],
<a href=#287 id=287 data-nosnippet>287</a> )
<a href=#288 id=288 data-nosnippet>288</a> .unwrap(),
<a href=#289 id=289 data-nosnippet>289</a> <span class="kw-2">&amp;mut </span>result,
<a href=#290 id=290 data-nosnippet>290</a> )
<a href=#291 id=291 data-nosnippet>291</a> .unwrap();
<a href=#292 id=292 data-nosnippet>292</a>
<a href=#293 id=293 data-nosnippet>293</a> <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>content, <span class="kw-2">&amp;</span>result);
<a href=#294 id=294 data-nosnippet>294</a> }
<a href=#295 id=295 data-nosnippet>295</a> }
<a href=#296 id=296 data-nosnippet>296</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,79 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zstd-0.13.3/src/lib.rs`."><title>lib.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="zstd" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../../static.files/src-script-813739b1.js"></script><script defer src="../../src-files.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">zstd/</div>lib.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-2"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! Rust binding to the [zstd library][zstd].
<a href=#2 id=2 data-nosnippet>2</a>//!
<a href=#3 id=3 data-nosnippet>3</a>//! This crate provides:
<a href=#4 id=4 data-nosnippet>4</a>//!
<a href=#5 id=5 data-nosnippet>5</a>//! * An [encoder](stream/write/struct.Encoder.html) to compress data using zstd
<a href=#6 id=6 data-nosnippet>6</a>//! and send the output to another write.
<a href=#7 id=7 data-nosnippet>7</a>//! * A [decoder](stream/read/struct.Decoder.html) to read input data from a `Read`
<a href=#8 id=8 data-nosnippet>8</a>//! and decompress it.
<a href=#9 id=9 data-nosnippet>9</a>//! * Convenient functions for common tasks.
<a href=#10 id=10 data-nosnippet>10</a>//!
<a href=#11 id=11 data-nosnippet>11</a>//! # Example
<a href=#12 id=12 data-nosnippet>12</a>//!
<a href=#13 id=13 data-nosnippet>13</a>//! ```no_run
<a href=#14 id=14 data-nosnippet>14</a>//! use std::io;
<a href=#15 id=15 data-nosnippet>15</a>//!
<a href=#16 id=16 data-nosnippet>16</a>//! // Uncompress input and print the result.
<a href=#17 id=17 data-nosnippet>17</a>//! zstd::stream::copy_decode(io::stdin(), io::stdout()).unwrap();
<a href=#18 id=18 data-nosnippet>18</a>//! ```
<a href=#19 id=19 data-nosnippet>19</a>//!
<a href=#20 id=20 data-nosnippet>20</a>//! [zstd]: https://github.com/facebook/zstd
<a href=#21 id=21 data-nosnippet>21</a></span><span class="attr">#![deny(missing_docs)]
<a href=#22 id=22 data-nosnippet>22</a>#![cfg_attr(feature = <span class="string">"doc-cfg"</span>, feature(doc_cfg))]
<a href=#23 id=23 data-nosnippet>23</a>
<a href=#24 id=24 data-nosnippet>24</a></span><span class="comment">// Re-export the zstd-safe crate.
<a href=#25 id=25 data-nosnippet>25</a></span><span class="kw">pub use </span>zstd_safe;
<a href=#26 id=26 data-nosnippet>26</a>
<a href=#27 id=27 data-nosnippet>27</a><span class="kw">pub mod </span>bulk;
<a href=#28 id=28 data-nosnippet>28</a><span class="kw">pub mod </span>dict;
<a href=#29 id=29 data-nosnippet>29</a>
<a href=#30 id=30 data-nosnippet>30</a><span class="attr">#[macro_use]
<a href=#31 id=31 data-nosnippet>31</a></span><span class="kw">pub mod </span>stream;
<a href=#32 id=32 data-nosnippet>32</a>
<a href=#33 id=33 data-nosnippet>33</a><span class="kw">use </span>std::io;
<a href=#34 id=34 data-nosnippet>34</a>
<a href=#35 id=35 data-nosnippet>35</a><span class="doccomment">/// Default compression level.
<a href=#36 id=36 data-nosnippet>36</a></span><span class="kw">pub use </span>zstd_safe::CLEVEL_DEFAULT <span class="kw">as </span>DEFAULT_COMPRESSION_LEVEL;
<a href=#37 id=37 data-nosnippet>37</a>
<a href=#38 id=38 data-nosnippet>38</a><span class="doccomment">/// The accepted range of compression levels.
<a href=#39 id=39 data-nosnippet>39</a></span><span class="kw">pub fn </span>compression_level_range(
<a href=#40 id=40 data-nosnippet>40</a>) -&gt; std::ops::RangeInclusive&lt;zstd_safe::CompressionLevel&gt; {
<a href=#41 id=41 data-nosnippet>41</a> zstd_safe::min_c_level()..=zstd_safe::max_c_level()
<a href=#42 id=42 data-nosnippet>42</a>}
<a href=#43 id=43 data-nosnippet>43</a>
<a href=#44 id=44 data-nosnippet>44</a><span class="attr">#[doc(no_inline)]
<a href=#45 id=45 data-nosnippet>45</a></span><span class="kw">pub use </span><span class="kw">crate</span>::stream::{decode_all, encode_all, Decoder, Encoder};
<a href=#46 id=46 data-nosnippet>46</a>
<a href=#47 id=47 data-nosnippet>47</a><span class="doccomment">/// Returns the error message as io::Error based on error_code.
<a href=#48 id=48 data-nosnippet>48</a></span><span class="kw">fn </span>map_error_code(code: usize) -&gt; io::Error {
<a href=#49 id=49 data-nosnippet>49</a> <span class="kw">let </span>msg = zstd_safe::get_error_name(code);
<a href=#50 id=50 data-nosnippet>50</a> io::Error::new(io::ErrorKind::Other, msg.to_string())
<a href=#51 id=51 data-nosnippet>51</a>}
<a href=#52 id=52 data-nosnippet>52</a>
<a href=#53 id=53 data-nosnippet>53</a><span class="comment">// Some helper functions to write full-cycle tests.
<a href=#54 id=54 data-nosnippet>54</a>
<a href=#55 id=55 data-nosnippet>55</a></span><span class="attr">#[cfg(test)]
<a href=#56 id=56 data-nosnippet>56</a></span><span class="kw">fn </span>test_cycle&lt;F, G&gt;(data: <span class="kw-2">&amp;</span>[u8], f: F, g: G)
<a href=#57 id=57 data-nosnippet>57</a><span class="kw">where
<a href=#58 id=58 data-nosnippet>58</a> </span>F: Fn(<span class="kw-2">&amp;</span>[u8]) -&gt; Vec&lt;u8&gt;,
<a href=#59 id=59 data-nosnippet>59</a> G: Fn(<span class="kw-2">&amp;</span>[u8]) -&gt; Vec&lt;u8&gt;,
<a href=#60 id=60 data-nosnippet>60</a>{
<a href=#61 id=61 data-nosnippet>61</a> <span class="kw">let </span>mid = f(data);
<a href=#62 id=62 data-nosnippet>62</a> <span class="kw">let </span>end = g(<span class="kw-2">&amp;</span>mid);
<a href=#63 id=63 data-nosnippet>63</a> <span class="macro">assert_eq!</span>(data, <span class="kw-2">&amp;</span>end[..]);
<a href=#64 id=64 data-nosnippet>64</a>}
<a href=#65 id=65 data-nosnippet>65</a>
<a href=#66 id=66 data-nosnippet>66</a><span class="attr">#[cfg(test)]
<a href=#67 id=67 data-nosnippet>67</a></span><span class="kw">fn </span>test_cycle_unwrap&lt;F, G&gt;(data: <span class="kw-2">&amp;</span>[u8], f: F, g: G)
<a href=#68 id=68 data-nosnippet>68</a><span class="kw">where
<a href=#69 id=69 data-nosnippet>69</a> </span>F: Fn(<span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;Vec&lt;u8&gt;&gt;,
<a href=#70 id=70 data-nosnippet>70</a> G: Fn(<span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;Vec&lt;u8&gt;&gt;,
<a href=#71 id=71 data-nosnippet>71</a>{
<a href=#72 id=72 data-nosnippet>72</a> test_cycle(data, |data| f(data).unwrap(), |data| g(data).unwrap())
<a href=#73 id=73 data-nosnippet>73</a>}
<a href=#74 id=74 data-nosnippet>74</a>
<a href=#75 id=75 data-nosnippet>75</a><span class="attr">#[test]
<a href=#76 id=76 data-nosnippet>76</a></span><span class="kw">fn </span>default_compression_level_in_range() {
<a href=#77 id=77 data-nosnippet>77</a> <span class="macro">assert!</span>(compression_level_range().contains(<span class="kw-2">&amp;</span>DEFAULT_COMPRESSION_LEVEL));
<a href=#78 id=78 data-nosnippet>78</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,60 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zstd-0.13.3/src/stream/functions.rs`."><title>functions.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="zstd" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">zstd/stream/</div>functions.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-2"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>std::io;
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use super</span>::{Decoder, Encoder};
<a href=#4 id=4 data-nosnippet>4</a>
<a href=#5 id=5 data-nosnippet>5</a><span class="doccomment">/// Decompress from the given source as if using a `Decoder`.
<a href=#6 id=6 data-nosnippet>6</a>///
<a href=#7 id=7 data-nosnippet>7</a>/// The input data must be in the zstd frame format.
<a href=#8 id=8 data-nosnippet>8</a></span><span class="kw">pub fn </span>decode_all&lt;R: io::Read&gt;(source: R) -&gt; io::Result&lt;Vec&lt;u8&gt;&gt; {
<a href=#9 id=9 data-nosnippet>9</a> <span class="kw">let </span><span class="kw-2">mut </span>result = Vec::new();
<a href=#10 id=10 data-nosnippet>10</a> copy_decode(source, <span class="kw-2">&amp;mut </span>result)<span class="question-mark">?</span>;
<a href=#11 id=11 data-nosnippet>11</a> <span class="prelude-val">Ok</span>(result)
<a href=#12 id=12 data-nosnippet>12</a>}
<a href=#13 id=13 data-nosnippet>13</a>
<a href=#14 id=14 data-nosnippet>14</a><span class="doccomment">/// Decompress from the given source as if using a `Decoder`.
<a href=#15 id=15 data-nosnippet>15</a>///
<a href=#16 id=16 data-nosnippet>16</a>/// Decompressed data will be appended to `destination`.
<a href=#17 id=17 data-nosnippet>17</a></span><span class="kw">pub fn </span>copy_decode&lt;R, W&gt;(source: R, <span class="kw-2">mut </span>destination: W) -&gt; io::Result&lt;()&gt;
<a href=#18 id=18 data-nosnippet>18</a><span class="kw">where
<a href=#19 id=19 data-nosnippet>19</a> </span>R: io::Read,
<a href=#20 id=20 data-nosnippet>20</a> W: io::Write,
<a href=#21 id=21 data-nosnippet>21</a>{
<a href=#22 id=22 data-nosnippet>22</a> <span class="kw">let </span><span class="kw-2">mut </span>decoder = Decoder::new(source)<span class="question-mark">?</span>;
<a href=#23 id=23 data-nosnippet>23</a> io::copy(<span class="kw-2">&amp;mut </span>decoder, <span class="kw-2">&amp;mut </span>destination)<span class="question-mark">?</span>;
<a href=#24 id=24 data-nosnippet>24</a> <span class="prelude-val">Ok</span>(())
<a href=#25 id=25 data-nosnippet>25</a>}
<a href=#26 id=26 data-nosnippet>26</a>
<a href=#27 id=27 data-nosnippet>27</a><span class="doccomment">/// Compress all data from the given source as if using an `Encoder`.
<a href=#28 id=28 data-nosnippet>28</a>///
<a href=#29 id=29 data-nosnippet>29</a>/// Result will be in the zstd frame format.
<a href=#30 id=30 data-nosnippet>30</a>///
<a href=#31 id=31 data-nosnippet>31</a>/// A level of `0` uses zstd's default (currently `3`).
<a href=#32 id=32 data-nosnippet>32</a></span><span class="kw">pub fn </span>encode_all&lt;R: io::Read&gt;(source: R, level: i32) -&gt; io::Result&lt;Vec&lt;u8&gt;&gt; {
<a href=#33 id=33 data-nosnippet>33</a> <span class="kw">let </span><span class="kw-2">mut </span>result = Vec::&lt;u8&gt;::new();
<a href=#34 id=34 data-nosnippet>34</a> copy_encode(source, <span class="kw-2">&amp;mut </span>result, level)<span class="question-mark">?</span>;
<a href=#35 id=35 data-nosnippet>35</a> <span class="prelude-val">Ok</span>(result)
<a href=#36 id=36 data-nosnippet>36</a>}
<a href=#37 id=37 data-nosnippet>37</a>
<a href=#38 id=38 data-nosnippet>38</a><span class="doccomment">/// Compress all data from the given source as if using an `Encoder`.
<a href=#39 id=39 data-nosnippet>39</a>///
<a href=#40 id=40 data-nosnippet>40</a>/// Compressed data will be appended to `destination`.
<a href=#41 id=41 data-nosnippet>41</a>///
<a href=#42 id=42 data-nosnippet>42</a>/// A level of `0` uses zstd's default (currently `3`).
<a href=#43 id=43 data-nosnippet>43</a></span><span class="kw">pub fn </span>copy_encode&lt;R, W&gt;(
<a href=#44 id=44 data-nosnippet>44</a> <span class="kw-2">mut </span>source: R,
<a href=#45 id=45 data-nosnippet>45</a> destination: W,
<a href=#46 id=46 data-nosnippet>46</a> level: i32,
<a href=#47 id=47 data-nosnippet>47</a>) -&gt; io::Result&lt;()&gt;
<a href=#48 id=48 data-nosnippet>48</a><span class="kw">where
<a href=#49 id=49 data-nosnippet>49</a> </span>R: io::Read,
<a href=#50 id=50 data-nosnippet>50</a> W: io::Write,
<a href=#51 id=51 data-nosnippet>51</a>{
<a href=#52 id=52 data-nosnippet>52</a> <span class="kw">let </span><span class="kw-2">mut </span>encoder = Encoder::new(destination, level)<span class="question-mark">?</span>;
<a href=#53 id=53 data-nosnippet>53</a> io::copy(<span class="kw-2">&amp;mut </span>source, <span class="kw-2">&amp;mut </span>encoder)<span class="question-mark">?</span>;
<a href=#54 id=54 data-nosnippet>54</a> encoder.finish()<span class="question-mark">?</span>;
<a href=#55 id=55 data-nosnippet>55</a> <span class="prelude-val">Ok</span>(())
<a href=#56 id=56 data-nosnippet>56</a>}
<a href=#57 id=57 data-nosnippet>57</a>
<a href=#58 id=58 data-nosnippet>58</a><span class="attr">#[cfg(test)]
<a href=#59 id=59 data-nosnippet>59</a></span><span class="kw">mod </span>tests {}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,228 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zstd-0.13.3/src/stream/mod.rs`."><title>mod.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="zstd" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">zstd/stream/</div>mod.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! Compress and decompress Zstd streams.
<a href=#2 id=2 data-nosnippet>2</a>//!
<a href=#3 id=3 data-nosnippet>3</a>//! Zstd streams are the main way to compress and decompress data.
<a href=#4 id=4 data-nosnippet>4</a>//! They are compatible with the `zstd` command-line tool.
<a href=#5 id=5 data-nosnippet>5</a>//!
<a href=#6 id=6 data-nosnippet>6</a>//! This module provides both `Read` and `Write` interfaces to compressing and
<a href=#7 id=7 data-nosnippet>7</a>//! decompressing.
<a href=#8 id=8 data-nosnippet>8</a>
<a href=#9 id=9 data-nosnippet>9</a></span><span class="kw">pub mod </span>read;
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">pub mod </span>write;
<a href=#11 id=11 data-nosnippet>11</a>
<a href=#12 id=12 data-nosnippet>12</a><span class="kw">mod </span>functions;
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">pub mod </span>zio;
<a href=#14 id=14 data-nosnippet>14</a>
<a href=#15 id=15 data-nosnippet>15</a><span class="attr">#[cfg(test)]
<a href=#16 id=16 data-nosnippet>16</a></span><span class="kw">mod </span>tests;
<a href=#17 id=17 data-nosnippet>17</a>
<a href=#18 id=18 data-nosnippet>18</a><span class="kw">pub mod </span>raw;
<a href=#19 id=19 data-nosnippet>19</a>
<a href=#20 id=20 data-nosnippet>20</a><span class="kw">pub use </span><span class="self">self</span>::functions::{copy_decode, copy_encode, decode_all, encode_all};
<a href=#21 id=21 data-nosnippet>21</a><span class="kw">pub use </span><span class="self">self</span>::read::Decoder;
<a href=#22 id=22 data-nosnippet>22</a><span class="kw">pub use </span><span class="self">self</span>::write::{AutoFinishEncoder, Encoder};
<a href=#23 id=23 data-nosnippet>23</a>
<a href=#24 id=24 data-nosnippet>24</a><span class="attr">#[doc(hidden)]
<a href=#25 id=25 data-nosnippet>25</a>#[macro_export]
<a href=#26 id=26 data-nosnippet>26</a></span><span class="doccomment">/// Common functions for the decoder, both in read and write mode.
<a href=#27 id=27 data-nosnippet>27</a></span><span class="macro">macro_rules!</span> decoder_parameters {
<a href=#28 id=28 data-nosnippet>28</a> () =&gt; {
<a href=#29 id=29 data-nosnippet>29</a> <span class="doccomment">/// Sets the maximum back-reference distance.
<a href=#30 id=30 data-nosnippet>30</a> ///
<a href=#31 id=31 data-nosnippet>31</a> /// The actual maximum distance is going to be `2^log_distance`.
<a href=#32 id=32 data-nosnippet>32</a> ///
<a href=#33 id=33 data-nosnippet>33</a> /// This will need to at least match the value set when compressing.
<a href=#34 id=34 data-nosnippet>34</a> </span><span class="kw">pub fn </span>window_log_max(<span class="kw-2">&amp;mut </span><span class="self">self</span>, log_distance: u32) -&gt; io::Result&lt;()&gt; {
<a href=#35 id=35 data-nosnippet>35</a> <span class="self">self</span>.set_parameter(zstd_safe::DParameter::WindowLogMax(
<a href=#36 id=36 data-nosnippet>36</a> log_distance,
<a href=#37 id=37 data-nosnippet>37</a> ))
<a href=#38 id=38 data-nosnippet>38</a> }
<a href=#39 id=39 data-nosnippet>39</a>
<a href=#40 id=40 data-nosnippet>40</a> <span class="attr">#[cfg(feature = <span class="string">"experimental"</span>)]
<a href=#41 id=41 data-nosnippet>41</a> #[cfg_attr(feature = <span class="string">"doc-cfg"</span>, doc(cfg(feature = <span class="string">"experimental"</span>)))]
<a href=#42 id=42 data-nosnippet>42</a> </span><span class="doccomment">/// Enables or disabled expecting the 4-byte magic header
<a href=#43 id=43 data-nosnippet>43</a> ///
<a href=#44 id=44 data-nosnippet>44</a> /// Only available with the `experimental` feature.
<a href=#45 id=45 data-nosnippet>45</a> ///
<a href=#46 id=46 data-nosnippet>46</a> /// This will need to match the settings used when compressing.
<a href=#47 id=47 data-nosnippet>47</a> </span><span class="kw">pub fn </span>include_magicbytes(
<a href=#48 id=48 data-nosnippet>48</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#49 id=49 data-nosnippet>49</a> include_magicbytes: bool,
<a href=#50 id=50 data-nosnippet>50</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#51 id=51 data-nosnippet>51</a> <span class="self">self</span>.set_parameter(zstd_safe::DParameter::Format(
<a href=#52 id=52 data-nosnippet>52</a> <span class="kw">if </span>include_magicbytes {
<a href=#53 id=53 data-nosnippet>53</a> zstd_safe::FrameFormat::One
<a href=#54 id=54 data-nosnippet>54</a> } <span class="kw">else </span>{
<a href=#55 id=55 data-nosnippet>55</a> zstd_safe::FrameFormat::Magicless
<a href=#56 id=56 data-nosnippet>56</a> },
<a href=#57 id=57 data-nosnippet>57</a> ))
<a href=#58 id=58 data-nosnippet>58</a> }
<a href=#59 id=59 data-nosnippet>59</a> };
<a href=#60 id=60 data-nosnippet>60</a>}
<a href=#61 id=61 data-nosnippet>61</a>
<a href=#62 id=62 data-nosnippet>62</a><span class="attr">#[doc(hidden)]
<a href=#63 id=63 data-nosnippet>63</a>#[macro_export]
<a href=#64 id=64 data-nosnippet>64</a></span><span class="doccomment">/// Common functions for the decoder, both in read and write mode.
<a href=#65 id=65 data-nosnippet>65</a></span><span class="macro">macro_rules!</span> decoder_common {
<a href=#66 id=66 data-nosnippet>66</a> (<span class="macro-nonterminal">$readwrite</span>:ident) =&gt; {
<a href=#67 id=67 data-nosnippet>67</a> <span class="doccomment">/// Sets a decompression parameter on the decompression stream.
<a href=#68 id=68 data-nosnippet>68</a> </span><span class="kw">pub fn </span>set_parameter(
<a href=#69 id=69 data-nosnippet>69</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#70 id=70 data-nosnippet>70</a> parameter: zstd_safe::DParameter,
<a href=#71 id=71 data-nosnippet>71</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#72 id=72 data-nosnippet>72</a> <span class="self">self</span>.<span class="macro-nonterminal">$readwrite</span>.operation_mut().set_parameter(parameter)
<a href=#73 id=73 data-nosnippet>73</a> }
<a href=#74 id=74 data-nosnippet>74</a>
<a href=#75 id=75 data-nosnippet>75</a> <span class="macro-nonterminal">$crate::decoder_parameters</span>!();
<a href=#76 id=76 data-nosnippet>76</a> };
<a href=#77 id=77 data-nosnippet>77</a>}
<a href=#78 id=78 data-nosnippet>78</a>
<a href=#79 id=79 data-nosnippet>79</a><span class="attr">#[doc(hidden)]
<a href=#80 id=80 data-nosnippet>80</a>#[macro_export]
<a href=#81 id=81 data-nosnippet>81</a></span><span class="doccomment">/// Parameter-setters for the encoder. Relies on a `set_parameter` method.
<a href=#82 id=82 data-nosnippet>82</a></span><span class="macro">macro_rules!</span> encoder_parameters {
<a href=#83 id=83 data-nosnippet>83</a> () =&gt; {
<a href=#84 id=84 data-nosnippet>84</a> <span class="doccomment">/// Controls whether zstd should include a content checksum at the end
<a href=#85 id=85 data-nosnippet>85</a> /// of each frame.
<a href=#86 id=86 data-nosnippet>86</a> </span><span class="kw">pub fn </span>include_checksum(
<a href=#87 id=87 data-nosnippet>87</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#88 id=88 data-nosnippet>88</a> include_checksum: bool,
<a href=#89 id=89 data-nosnippet>89</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#90 id=90 data-nosnippet>90</a> <span class="self">self</span>.set_parameter(zstd_safe::CParameter::ChecksumFlag(
<a href=#91 id=91 data-nosnippet>91</a> include_checksum,
<a href=#92 id=92 data-nosnippet>92</a> ))
<a href=#93 id=93 data-nosnippet>93</a> }
<a href=#94 id=94 data-nosnippet>94</a>
<a href=#95 id=95 data-nosnippet>95</a> <span class="doccomment">/// Enables multithreaded compression
<a href=#96 id=96 data-nosnippet>96</a> ///
<a href=#97 id=97 data-nosnippet>97</a> /// * If `n_workers == 0` (default), then multithreaded will be
<a href=#98 id=98 data-nosnippet>98</a> /// disabled.
<a href=#99 id=99 data-nosnippet>99</a> /// * If `n_workers &gt;= 1`, then compression will be done in separate
<a href=#100 id=100 data-nosnippet>100</a> /// threads.
<a href=#101 id=101 data-nosnippet>101</a> ///
<a href=#102 id=102 data-nosnippet>102</a> /// So even `n_workers = 1` may increase performance by separating
<a href=#103 id=103 data-nosnippet>103</a> /// IO and compression.
<a href=#104 id=104 data-nosnippet>104</a> ///
<a href=#105 id=105 data-nosnippet>105</a> /// Note: This is only available if the `zstdmt` cargo feature is activated.
<a href=#106 id=106 data-nosnippet>106</a> </span><span class="attr">#[cfg(feature = <span class="string">"zstdmt"</span>)]
<a href=#107 id=107 data-nosnippet>107</a> #[cfg_attr(feature = <span class="string">"doc-cfg"</span>, doc(cfg(feature = <span class="string">"zstdmt"</span>)))]
<a href=#108 id=108 data-nosnippet>108</a> </span><span class="kw">pub fn </span>multithread(<span class="kw-2">&amp;mut </span><span class="self">self</span>, n_workers: u32) -&gt; io::Result&lt;()&gt; {
<a href=#109 id=109 data-nosnippet>109</a> <span class="self">self</span>.set_parameter(zstd_safe::CParameter::NbWorkers(n_workers))
<a href=#110 id=110 data-nosnippet>110</a> }
<a href=#111 id=111 data-nosnippet>111</a>
<a href=#112 id=112 data-nosnippet>112</a> <span class="doccomment">/// Enables or disables storing of the dict id.
<a href=#113 id=113 data-nosnippet>113</a> ///
<a href=#114 id=114 data-nosnippet>114</a> /// Defaults to true. If false, the behaviour of decoding with a wrong
<a href=#115 id=115 data-nosnippet>115</a> /// dictionary is undefined.
<a href=#116 id=116 data-nosnippet>116</a> </span><span class="kw">pub fn </span>include_dictid(
<a href=#117 id=117 data-nosnippet>117</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#118 id=118 data-nosnippet>118</a> include_dictid: bool,
<a href=#119 id=119 data-nosnippet>119</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#120 id=120 data-nosnippet>120</a> <span class="self">self</span>.set_parameter(zstd_safe::CParameter::DictIdFlag(
<a href=#121 id=121 data-nosnippet>121</a> include_dictid,
<a href=#122 id=122 data-nosnippet>122</a> ))
<a href=#123 id=123 data-nosnippet>123</a> }
<a href=#124 id=124 data-nosnippet>124</a>
<a href=#125 id=125 data-nosnippet>125</a> <span class="doccomment">/// Enables or disabled storing of the contentsize.
<a href=#126 id=126 data-nosnippet>126</a> ///
<a href=#127 id=127 data-nosnippet>127</a> /// Note that this only has an effect if the size is given with `set_pledged_src_size`.
<a href=#128 id=128 data-nosnippet>128</a> </span><span class="kw">pub fn </span>include_contentsize(
<a href=#129 id=129 data-nosnippet>129</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#130 id=130 data-nosnippet>130</a> include_contentsize: bool,
<a href=#131 id=131 data-nosnippet>131</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#132 id=132 data-nosnippet>132</a> <span class="self">self</span>.set_parameter(zstd_safe::CParameter::ContentSizeFlag(
<a href=#133 id=133 data-nosnippet>133</a> include_contentsize,
<a href=#134 id=134 data-nosnippet>134</a> ))
<a href=#135 id=135 data-nosnippet>135</a> }
<a href=#136 id=136 data-nosnippet>136</a> <span class="doccomment">/// Enables or disables long-distance matching
<a href=#137 id=137 data-nosnippet>137</a> </span><span class="kw">pub fn </span>long_distance_matching(
<a href=#138 id=138 data-nosnippet>138</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#139 id=139 data-nosnippet>139</a> long_distance_matching: bool,
<a href=#140 id=140 data-nosnippet>140</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#141 id=141 data-nosnippet>141</a> <span class="self">self</span>.set_parameter(
<a href=#142 id=142 data-nosnippet>142</a> zstd_safe::CParameter::EnableLongDistanceMatching(
<a href=#143 id=143 data-nosnippet>143</a> long_distance_matching,
<a href=#144 id=144 data-nosnippet>144</a> ),
<a href=#145 id=145 data-nosnippet>145</a> )
<a href=#146 id=146 data-nosnippet>146</a> }
<a href=#147 id=147 data-nosnippet>147</a>
<a href=#148 id=148 data-nosnippet>148</a> <span class="doccomment">/// Sets the target size for compressed blocks.
<a href=#149 id=149 data-nosnippet>149</a> ///
<a href=#150 id=150 data-nosnippet>150</a> /// A lower block size may result in slightly lower speed (~2%) and compression ratio
<a href=#151 id=151 data-nosnippet>151</a> /// (~0.1%), but may decrease end-to-end latency in low-bandwidth environments (time to
<a href=#152 id=152 data-nosnippet>152</a> /// first decompressed byte).
<a href=#153 id=153 data-nosnippet>153</a> ///
<a href=#154 id=154 data-nosnippet>154</a> /// No value, or a value of zero, results in no contraint for the block sizes.
<a href=#155 id=155 data-nosnippet>155</a> </span><span class="kw">pub fn </span>set_target_cblock_size(
<a href=#156 id=156 data-nosnippet>156</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#157 id=157 data-nosnippet>157</a> target_size: <span class="prelude-ty">Option</span>&lt;u32&gt;,
<a href=#158 id=158 data-nosnippet>158</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#159 id=159 data-nosnippet>159</a> <span class="self">self</span>.set_parameter(zstd_safe::CParameter::TargetCBlockSize(
<a href=#160 id=160 data-nosnippet>160</a> target_size.unwrap_or(<span class="number">0</span>),
<a href=#161 id=161 data-nosnippet>161</a> ))
<a href=#162 id=162 data-nosnippet>162</a> }
<a href=#163 id=163 data-nosnippet>163</a>
<a href=#164 id=164 data-nosnippet>164</a> <span class="doccomment">/// Sets the maximum back-reference distance.
<a href=#165 id=165 data-nosnippet>165</a> ///
<a href=#166 id=166 data-nosnippet>166</a> /// The actual maximum distance is going to be `2^log_distance`.
<a href=#167 id=167 data-nosnippet>167</a> ///
<a href=#168 id=168 data-nosnippet>168</a> /// Note that decompression will need to use at least the same setting.
<a href=#169 id=169 data-nosnippet>169</a> </span><span class="kw">pub fn </span>window_log(<span class="kw-2">&amp;mut </span><span class="self">self</span>, log_distance: u32) -&gt; io::Result&lt;()&gt; {
<a href=#170 id=170 data-nosnippet>170</a> <span class="self">self</span>.set_parameter(zstd_safe::CParameter::WindowLog(log_distance))
<a href=#171 id=171 data-nosnippet>171</a> }
<a href=#172 id=172 data-nosnippet>172</a>
<a href=#173 id=173 data-nosnippet>173</a> <span class="attr">#[cfg(feature = <span class="string">"experimental"</span>)]
<a href=#174 id=174 data-nosnippet>174</a> #[cfg_attr(feature = <span class="string">"doc-cfg"</span>, doc(cfg(feature = <span class="string">"experimental"</span>)))]
<a href=#175 id=175 data-nosnippet>175</a> </span><span class="doccomment">/// Enables or disable the magic bytes at the beginning of each frame.
<a href=#176 id=176 data-nosnippet>176</a> ///
<a href=#177 id=177 data-nosnippet>177</a> /// If disabled, include_magicbytes must also be called on the decoder.
<a href=#178 id=178 data-nosnippet>178</a> ///
<a href=#179 id=179 data-nosnippet>179</a> /// Only available with the `experimental` feature.
<a href=#180 id=180 data-nosnippet>180</a> ///
<a href=#181 id=181 data-nosnippet>181</a> /// Note that decompression will need to use the same setting.
<a href=#182 id=182 data-nosnippet>182</a> </span><span class="kw">pub fn </span>include_magicbytes(
<a href=#183 id=183 data-nosnippet>183</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#184 id=184 data-nosnippet>184</a> include_magicbytes: bool,
<a href=#185 id=185 data-nosnippet>185</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#186 id=186 data-nosnippet>186</a> <span class="self">self</span>.set_parameter(zstd_safe::CParameter::Format(
<a href=#187 id=187 data-nosnippet>187</a> <span class="kw">if </span>include_magicbytes {
<a href=#188 id=188 data-nosnippet>188</a> zstd_safe::FrameFormat::One
<a href=#189 id=189 data-nosnippet>189</a> } <span class="kw">else </span>{
<a href=#190 id=190 data-nosnippet>190</a> zstd_safe::FrameFormat::Magicless
<a href=#191 id=191 data-nosnippet>191</a> },
<a href=#192 id=192 data-nosnippet>192</a> ))
<a href=#193 id=193 data-nosnippet>193</a> }
<a href=#194 id=194 data-nosnippet>194</a> };
<a href=#195 id=195 data-nosnippet>195</a>}
<a href=#196 id=196 data-nosnippet>196</a>
<a href=#197 id=197 data-nosnippet>197</a><span class="attr">#[doc(hidden)]
<a href=#198 id=198 data-nosnippet>198</a>#[macro_export]
<a href=#199 id=199 data-nosnippet>199</a></span><span class="doccomment">/// Common functions for the encoder, both in read and write mode.
<a href=#200 id=200 data-nosnippet>200</a></span><span class="macro">macro_rules!</span> encoder_common {
<a href=#201 id=201 data-nosnippet>201</a> (<span class="macro-nonterminal">$readwrite</span>:ident) =&gt; {
<a href=#202 id=202 data-nosnippet>202</a> <span class="doccomment">/// Sets the given zstd compression parameter.
<a href=#203 id=203 data-nosnippet>203</a> </span><span class="kw">pub fn </span>set_parameter(
<a href=#204 id=204 data-nosnippet>204</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#205 id=205 data-nosnippet>205</a> parameter: zstd_safe::CParameter,
<a href=#206 id=206 data-nosnippet>206</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#207 id=207 data-nosnippet>207</a> <span class="self">self</span>.<span class="macro-nonterminal">$readwrite</span>.operation_mut().set_parameter(parameter)
<a href=#208 id=208 data-nosnippet>208</a> }
<a href=#209 id=209 data-nosnippet>209</a>
<a href=#210 id=210 data-nosnippet>210</a> <span class="doccomment">/// Sets the expected size of the input.
<a href=#211 id=211 data-nosnippet>211</a> ///
<a href=#212 id=212 data-nosnippet>212</a> /// This affects the compression effectiveness.
<a href=#213 id=213 data-nosnippet>213</a> ///
<a href=#214 id=214 data-nosnippet>214</a> /// It is an error to give an incorrect size (an error will be returned when closing the
<a href=#215 id=215 data-nosnippet>215</a> /// stream if the size does not match what was pledged).
<a href=#216 id=216 data-nosnippet>216</a> ///
<a href=#217 id=217 data-nosnippet>217</a> /// Giving a `None` size means the size is unknown (this is the default).
<a href=#218 id=218 data-nosnippet>218</a> </span><span class="kw">pub fn </span>set_pledged_src_size(
<a href=#219 id=219 data-nosnippet>219</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#220 id=220 data-nosnippet>220</a> size: <span class="prelude-ty">Option</span>&lt;u64&gt;,
<a href=#221 id=221 data-nosnippet>221</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#222 id=222 data-nosnippet>222</a> <span class="self">self</span>.<span class="macro-nonterminal">$readwrite</span>.operation_mut().set_pledged_src_size(size)
<a href=#223 id=223 data-nosnippet>223</a> }
<a href=#224 id=224 data-nosnippet>224</a>
<a href=#225 id=225 data-nosnippet>225</a> <span class="macro-nonterminal">$crate::encoder_parameters</span>!();
<a href=#226 id=226 data-nosnippet>226</a> };
<a href=#227 id=227 data-nosnippet>227</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,477 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zstd-0.13.3/src/stream/raw.rs`."><title>raw.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="zstd" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">zstd/stream/</div>raw.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! Raw in-memory stream compression/decompression.
<a href=#2 id=2 data-nosnippet>2</a>//!
<a href=#3 id=3 data-nosnippet>3</a>//! This module defines a `Decoder` and an `Encoder` to decode/encode streams
<a href=#4 id=4 data-nosnippet>4</a>//! of data using buffers.
<a href=#5 id=5 data-nosnippet>5</a>//!
<a href=#6 id=6 data-nosnippet>6</a>//! They are mostly thin wrappers around `zstd_safe::{DCtx, CCtx}`.
<a href=#7 id=7 data-nosnippet>7</a></span><span class="kw">use </span>std::io;
<a href=#8 id=8 data-nosnippet>8</a>
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">pub use </span>zstd_safe::{CParameter, DParameter, InBuffer, OutBuffer, WriteBuf};
<a href=#10 id=10 data-nosnippet>10</a>
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">use </span><span class="kw">crate</span>::dict::{DecoderDictionary, EncoderDictionary};
<a href=#12 id=12 data-nosnippet>12</a><span class="kw">use </span><span class="kw">crate</span>::map_error_code;
<a href=#13 id=13 data-nosnippet>13</a>
<a href=#14 id=14 data-nosnippet>14</a><span class="doccomment">/// Represents an abstract compression/decompression operation.
<a href=#15 id=15 data-nosnippet>15</a>///
<a href=#16 id=16 data-nosnippet>16</a>/// This trait covers both `Encoder` and `Decoder`.
<a href=#17 id=17 data-nosnippet>17</a></span><span class="kw">pub trait </span>Operation {
<a href=#18 id=18 data-nosnippet>18</a> <span class="doccomment">/// Performs a single step of this operation.
<a href=#19 id=19 data-nosnippet>19</a> ///
<a href=#20 id=20 data-nosnippet>20</a> /// Should return a hint for the next input size.
<a href=#21 id=21 data-nosnippet>21</a> ///
<a href=#22 id=22 data-nosnippet>22</a> /// If the result is `Ok(0)`, it may indicate that a frame was just
<a href=#23 id=23 data-nosnippet>23</a> /// finished.
<a href=#24 id=24 data-nosnippet>24</a> </span><span class="kw">fn </span>run&lt;C: WriteBuf + <span class="question-mark">?</span>Sized&gt;(
<a href=#25 id=25 data-nosnippet>25</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#26 id=26 data-nosnippet>26</a> input: <span class="kw-2">&amp;mut </span>InBuffer&lt;<span class="lifetime">'_</span>&gt;,
<a href=#27 id=27 data-nosnippet>27</a> output: <span class="kw-2">&amp;mut </span>OutBuffer&lt;<span class="lifetime">'_</span>, C&gt;,
<a href=#28 id=28 data-nosnippet>28</a> ) -&gt; io::Result&lt;usize&gt;;
<a href=#29 id=29 data-nosnippet>29</a>
<a href=#30 id=30 data-nosnippet>30</a> <span class="doccomment">/// Performs a single step of this operation.
<a href=#31 id=31 data-nosnippet>31</a> ///
<a href=#32 id=32 data-nosnippet>32</a> /// This is a comvenience wrapper around `Operation::run` if you don't
<a href=#33 id=33 data-nosnippet>33</a> /// want to deal with `InBuffer`/`OutBuffer`.
<a href=#34 id=34 data-nosnippet>34</a> </span><span class="kw">fn </span>run_on_buffers(
<a href=#35 id=35 data-nosnippet>35</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#36 id=36 data-nosnippet>36</a> input: <span class="kw-2">&amp;</span>[u8],
<a href=#37 id=37 data-nosnippet>37</a> output: <span class="kw-2">&amp;mut </span>[u8],
<a href=#38 id=38 data-nosnippet>38</a> ) -&gt; io::Result&lt;Status&gt; {
<a href=#39 id=39 data-nosnippet>39</a> <span class="kw">let </span><span class="kw-2">mut </span>input = InBuffer::around(input);
<a href=#40 id=40 data-nosnippet>40</a> <span class="kw">let </span><span class="kw-2">mut </span>output = OutBuffer::around(output);
<a href=#41 id=41 data-nosnippet>41</a>
<a href=#42 id=42 data-nosnippet>42</a> <span class="kw">let </span>remaining = <span class="self">self</span>.run(<span class="kw-2">&amp;mut </span>input, <span class="kw-2">&amp;mut </span>output)<span class="question-mark">?</span>;
<a href=#43 id=43 data-nosnippet>43</a>
<a href=#44 id=44 data-nosnippet>44</a> <span class="prelude-val">Ok</span>(Status {
<a href=#45 id=45 data-nosnippet>45</a> remaining,
<a href=#46 id=46 data-nosnippet>46</a> bytes_read: input.pos(),
<a href=#47 id=47 data-nosnippet>47</a> bytes_written: output.pos(),
<a href=#48 id=48 data-nosnippet>48</a> })
<a href=#49 id=49 data-nosnippet>49</a> }
<a href=#50 id=50 data-nosnippet>50</a>
<a href=#51 id=51 data-nosnippet>51</a> <span class="doccomment">/// Flushes any internal buffer, if any.
<a href=#52 id=52 data-nosnippet>52</a> ///
<a href=#53 id=53 data-nosnippet>53</a> /// Returns the number of bytes still in the buffer.
<a href=#54 id=54 data-nosnippet>54</a> /// To flush entirely, keep calling until it returns `Ok(0)`.
<a href=#55 id=55 data-nosnippet>55</a> </span><span class="kw">fn </span>flush&lt;C: WriteBuf + <span class="question-mark">?</span>Sized&gt;(
<a href=#56 id=56 data-nosnippet>56</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#57 id=57 data-nosnippet>57</a> output: <span class="kw-2">&amp;mut </span>OutBuffer&lt;<span class="lifetime">'_</span>, C&gt;,
<a href=#58 id=58 data-nosnippet>58</a> ) -&gt; io::Result&lt;usize&gt; {
<a href=#59 id=59 data-nosnippet>59</a> <span class="kw">let _ </span>= output;
<a href=#60 id=60 data-nosnippet>60</a> <span class="prelude-val">Ok</span>(<span class="number">0</span>)
<a href=#61 id=61 data-nosnippet>61</a> }
<a href=#62 id=62 data-nosnippet>62</a>
<a href=#63 id=63 data-nosnippet>63</a> <span class="doccomment">/// Prepares the operation for a new frame.
<a href=#64 id=64 data-nosnippet>64</a> ///
<a href=#65 id=65 data-nosnippet>65</a> /// This is hopefully cheaper than creating a new operation.
<a href=#66 id=66 data-nosnippet>66</a> </span><span class="kw">fn </span>reinit(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; io::Result&lt;()&gt; {
<a href=#67 id=67 data-nosnippet>67</a> <span class="prelude-val">Ok</span>(())
<a href=#68 id=68 data-nosnippet>68</a> }
<a href=#69 id=69 data-nosnippet>69</a>
<a href=#70 id=70 data-nosnippet>70</a> <span class="doccomment">/// Finishes the operation, writing any footer if necessary.
<a href=#71 id=71 data-nosnippet>71</a> ///
<a href=#72 id=72 data-nosnippet>72</a> /// Returns the number of bytes still to write.
<a href=#73 id=73 data-nosnippet>73</a> ///
<a href=#74 id=74 data-nosnippet>74</a> /// Keep calling this method until it returns `Ok(0)`,
<a href=#75 id=75 data-nosnippet>75</a> /// and then don't ever call this method.
<a href=#76 id=76 data-nosnippet>76</a> </span><span class="kw">fn </span>finish&lt;C: WriteBuf + <span class="question-mark">?</span>Sized&gt;(
<a href=#77 id=77 data-nosnippet>77</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#78 id=78 data-nosnippet>78</a> output: <span class="kw-2">&amp;mut </span>OutBuffer&lt;<span class="lifetime">'_</span>, C&gt;,
<a href=#79 id=79 data-nosnippet>79</a> finished_frame: bool,
<a href=#80 id=80 data-nosnippet>80</a> ) -&gt; io::Result&lt;usize&gt; {
<a href=#81 id=81 data-nosnippet>81</a> <span class="kw">let _ </span>= output;
<a href=#82 id=82 data-nosnippet>82</a> <span class="kw">let _ </span>= finished_frame;
<a href=#83 id=83 data-nosnippet>83</a> <span class="prelude-val">Ok</span>(<span class="number">0</span>)
<a href=#84 id=84 data-nosnippet>84</a> }
<a href=#85 id=85 data-nosnippet>85</a>}
<a href=#86 id=86 data-nosnippet>86</a>
<a href=#87 id=87 data-nosnippet>87</a><span class="doccomment">/// Dummy operation that just copies its input to the output.
<a href=#88 id=88 data-nosnippet>88</a></span><span class="kw">pub struct </span>NoOp;
<a href=#89 id=89 data-nosnippet>89</a>
<a href=#90 id=90 data-nosnippet>90</a><span class="kw">impl </span>Operation <span class="kw">for </span>NoOp {
<a href=#91 id=91 data-nosnippet>91</a> <span class="kw">fn </span>run&lt;C: WriteBuf + <span class="question-mark">?</span>Sized&gt;(
<a href=#92 id=92 data-nosnippet>92</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#93 id=93 data-nosnippet>93</a> input: <span class="kw-2">&amp;mut </span>InBuffer&lt;<span class="lifetime">'_</span>&gt;,
<a href=#94 id=94 data-nosnippet>94</a> output: <span class="kw-2">&amp;mut </span>OutBuffer&lt;<span class="lifetime">'_</span>, C&gt;,
<a href=#95 id=95 data-nosnippet>95</a> ) -&gt; io::Result&lt;usize&gt; {
<a href=#96 id=96 data-nosnippet>96</a> <span class="comment">// Skip the prelude
<a href=#97 id=97 data-nosnippet>97</a> </span><span class="kw">let </span>src = <span class="kw-2">&amp;</span>input.src[input.pos..];
<a href=#98 id=98 data-nosnippet>98</a> <span class="comment">// Safe because `output.pos() &lt;= output.capacity()`.
<a href=#99 id=99 data-nosnippet>99</a> </span><span class="kw">let </span>output_pos = output.pos();
<a href=#100 id=100 data-nosnippet>100</a> <span class="kw">let </span>dst = <span class="kw">unsafe </span>{ output.as_mut_ptr().add(output_pos) };
<a href=#101 id=101 data-nosnippet>101</a>
<a href=#102 id=102 data-nosnippet>102</a> <span class="comment">// Ignore anything past the end
<a href=#103 id=103 data-nosnippet>103</a> </span><span class="kw">let </span>len = usize::min(src.len(), output.capacity() - output_pos);
<a href=#104 id=104 data-nosnippet>104</a> <span class="kw">let </span>src = <span class="kw-2">&amp;</span>src[..len];
<a href=#105 id=105 data-nosnippet>105</a>
<a href=#106 id=106 data-nosnippet>106</a> <span class="comment">// Safe because:
<a href=#107 id=107 data-nosnippet>107</a> // * `len` is less than either of the two lengths
<a href=#108 id=108 data-nosnippet>108</a> // * `src` and `dst` do not overlap because we have `&amp;mut` to each.
<a href=#109 id=109 data-nosnippet>109</a> </span><span class="kw">unsafe </span>{ std::ptr::copy_nonoverlapping(src.as_ptr(), dst, len) };
<a href=#110 id=110 data-nosnippet>110</a> input.set_pos(input.pos() + len);
<a href=#111 id=111 data-nosnippet>111</a> <span class="kw">unsafe </span>{ output.set_pos(output_pos + len) };
<a href=#112 id=112 data-nosnippet>112</a>
<a href=#113 id=113 data-nosnippet>113</a> <span class="prelude-val">Ok</span>(<span class="number">0</span>)
<a href=#114 id=114 data-nosnippet>114</a> }
<a href=#115 id=115 data-nosnippet>115</a>}
<a href=#116 id=116 data-nosnippet>116</a>
<a href=#117 id=117 data-nosnippet>117</a><span class="doccomment">/// Describes the result of an operation.
<a href=#118 id=118 data-nosnippet>118</a></span><span class="kw">pub struct </span>Status {
<a href=#119 id=119 data-nosnippet>119</a> <span class="doccomment">/// Number of bytes expected for next input.
<a href=#120 id=120 data-nosnippet>120</a> ///
<a href=#121 id=121 data-nosnippet>121</a> /// * If `remaining = 0`, then we are at the end of a frame.
<a href=#122 id=122 data-nosnippet>122</a> /// * If `remaining &gt; 0`, then it's just a hint for how much there is still
<a href=#123 id=123 data-nosnippet>123</a> /// to read.
<a href=#124 id=124 data-nosnippet>124</a> </span><span class="kw">pub </span>remaining: usize,
<a href=#125 id=125 data-nosnippet>125</a>
<a href=#126 id=126 data-nosnippet>126</a> <span class="doccomment">/// Number of bytes read from the input.
<a href=#127 id=127 data-nosnippet>127</a> </span><span class="kw">pub </span>bytes_read: usize,
<a href=#128 id=128 data-nosnippet>128</a>
<a href=#129 id=129 data-nosnippet>129</a> <span class="doccomment">/// Number of bytes written to the output.
<a href=#130 id=130 data-nosnippet>130</a> </span><span class="kw">pub </span>bytes_written: usize,
<a href=#131 id=131 data-nosnippet>131</a>}
<a href=#132 id=132 data-nosnippet>132</a>
<a href=#133 id=133 data-nosnippet>133</a><span class="doccomment">/// An in-memory decoder for streams of data.
<a href=#134 id=134 data-nosnippet>134</a></span><span class="kw">pub struct </span>Decoder&lt;<span class="lifetime">'a</span>&gt; {
<a href=#135 id=135 data-nosnippet>135</a> context: MaybeOwnedDCtx&lt;<span class="lifetime">'a</span>&gt;,
<a href=#136 id=136 data-nosnippet>136</a>}
<a href=#137 id=137 data-nosnippet>137</a>
<a href=#138 id=138 data-nosnippet>138</a><span class="kw">impl </span>Decoder&lt;<span class="lifetime">'static</span>&gt; {
<a href=#139 id=139 data-nosnippet>139</a> <span class="doccomment">/// Creates a new decoder.
<a href=#140 id=140 data-nosnippet>140</a> </span><span class="kw">pub fn </span>new() -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#141 id=141 data-nosnippet>141</a> <span class="self">Self</span>::with_dictionary(<span class="kw-2">&amp;</span>[])
<a href=#142 id=142 data-nosnippet>142</a> }
<a href=#143 id=143 data-nosnippet>143</a>
<a href=#144 id=144 data-nosnippet>144</a> <span class="doccomment">/// Creates a new decoder initialized with the given dictionary.
<a href=#145 id=145 data-nosnippet>145</a> </span><span class="kw">pub fn </span>with_dictionary(dictionary: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#146 id=146 data-nosnippet>146</a> <span class="kw">let </span><span class="kw-2">mut </span>context = zstd_safe::DCtx::create();
<a href=#147 id=147 data-nosnippet>147</a> context.init().map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#148 id=148 data-nosnippet>148</a> context
<a href=#149 id=149 data-nosnippet>149</a> .load_dictionary(dictionary)
<a href=#150 id=150 data-nosnippet>150</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#151 id=151 data-nosnippet>151</a> <span class="prelude-val">Ok</span>(Decoder {
<a href=#152 id=152 data-nosnippet>152</a> context: MaybeOwnedDCtx::Owned(context),
<a href=#153 id=153 data-nosnippet>153</a> })
<a href=#154 id=154 data-nosnippet>154</a> }
<a href=#155 id=155 data-nosnippet>155</a>}
<a href=#156 id=156 data-nosnippet>156</a>
<a href=#157 id=157 data-nosnippet>157</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; Decoder&lt;<span class="lifetime">'a</span>&gt; {
<a href=#158 id=158 data-nosnippet>158</a> <span class="doccomment">/// Creates a new decoder which employs the provided context for deserialization.
<a href=#159 id=159 data-nosnippet>159</a> </span><span class="kw">pub fn </span>with_context(context: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>zstd_safe::DCtx&lt;<span class="lifetime">'static</span>&gt;) -&gt; <span class="self">Self </span>{
<a href=#160 id=160 data-nosnippet>160</a> <span class="self">Self </span>{
<a href=#161 id=161 data-nosnippet>161</a> context: MaybeOwnedDCtx::Borrowed(context),
<a href=#162 id=162 data-nosnippet>162</a> }
<a href=#163 id=163 data-nosnippet>163</a> }
<a href=#164 id=164 data-nosnippet>164</a>
<a href=#165 id=165 data-nosnippet>165</a> <span class="doccomment">/// Creates a new decoder, using an existing `DecoderDictionary`.
<a href=#166 id=166 data-nosnippet>166</a> </span><span class="kw">pub fn </span>with_prepared_dictionary&lt;<span class="lifetime">'b</span>&gt;(
<a href=#167 id=167 data-nosnippet>167</a> dictionary: <span class="kw-2">&amp;</span>DecoderDictionary&lt;<span class="lifetime">'b</span>&gt;,
<a href=#168 id=168 data-nosnippet>168</a> ) -&gt; io::Result&lt;<span class="self">Self</span>&gt;
<a href=#169 id=169 data-nosnippet>169</a> <span class="kw">where
<a href=#170 id=170 data-nosnippet>170</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#171 id=171 data-nosnippet>171</a> {
<a href=#172 id=172 data-nosnippet>172</a> <span class="kw">let </span><span class="kw-2">mut </span>context = zstd_safe::DCtx::create();
<a href=#173 id=173 data-nosnippet>173</a> context
<a href=#174 id=174 data-nosnippet>174</a> .ref_ddict(dictionary.as_ddict())
<a href=#175 id=175 data-nosnippet>175</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#176 id=176 data-nosnippet>176</a> <span class="prelude-val">Ok</span>(Decoder {
<a href=#177 id=177 data-nosnippet>177</a> context: MaybeOwnedDCtx::Owned(context),
<a href=#178 id=178 data-nosnippet>178</a> })
<a href=#179 id=179 data-nosnippet>179</a> }
<a href=#180 id=180 data-nosnippet>180</a>
<a href=#181 id=181 data-nosnippet>181</a> <span class="doccomment">/// Creates a new decoder, using a ref prefix
<a href=#182 id=182 data-nosnippet>182</a> </span><span class="kw">pub fn </span>with_ref_prefix&lt;<span class="lifetime">'b</span>&gt;(ref_prefix: <span class="kw-2">&amp;</span><span class="lifetime">'b </span>[u8]) -&gt; io::Result&lt;<span class="self">Self</span>&gt;
<a href=#183 id=183 data-nosnippet>183</a> <span class="kw">where
<a href=#184 id=184 data-nosnippet>184</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#185 id=185 data-nosnippet>185</a> {
<a href=#186 id=186 data-nosnippet>186</a> <span class="kw">let </span><span class="kw-2">mut </span>context = zstd_safe::DCtx::create();
<a href=#187 id=187 data-nosnippet>187</a> context.ref_prefix(ref_prefix).map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#188 id=188 data-nosnippet>188</a> <span class="prelude-val">Ok</span>(Decoder {
<a href=#189 id=189 data-nosnippet>189</a> context: MaybeOwnedDCtx::Owned(context),
<a href=#190 id=190 data-nosnippet>190</a> })
<a href=#191 id=191 data-nosnippet>191</a> }
<a href=#192 id=192 data-nosnippet>192</a>
<a href=#193 id=193 data-nosnippet>193</a> <span class="doccomment">/// Sets a decompression parameter for this decoder.
<a href=#194 id=194 data-nosnippet>194</a> </span><span class="kw">pub fn </span>set_parameter(<span class="kw-2">&amp;mut </span><span class="self">self</span>, parameter: DParameter) -&gt; io::Result&lt;()&gt; {
<a href=#195 id=195 data-nosnippet>195</a> <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.context {
<a href=#196 id=196 data-nosnippet>196</a> MaybeOwnedDCtx::Owned(x) =&gt; x.set_parameter(parameter),
<a href=#197 id=197 data-nosnippet>197</a> MaybeOwnedDCtx::Borrowed(x) =&gt; x.set_parameter(parameter),
<a href=#198 id=198 data-nosnippet>198</a> }
<a href=#199 id=199 data-nosnippet>199</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#200 id=200 data-nosnippet>200</a> <span class="prelude-val">Ok</span>(())
<a href=#201 id=201 data-nosnippet>201</a> }
<a href=#202 id=202 data-nosnippet>202</a>}
<a href=#203 id=203 data-nosnippet>203</a>
<a href=#204 id=204 data-nosnippet>204</a><span class="kw">impl </span>Operation <span class="kw">for </span>Decoder&lt;<span class="lifetime">'_</span>&gt; {
<a href=#205 id=205 data-nosnippet>205</a> <span class="kw">fn </span>run&lt;C: WriteBuf + <span class="question-mark">?</span>Sized&gt;(
<a href=#206 id=206 data-nosnippet>206</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#207 id=207 data-nosnippet>207</a> input: <span class="kw-2">&amp;mut </span>InBuffer&lt;<span class="lifetime">'_</span>&gt;,
<a href=#208 id=208 data-nosnippet>208</a> output: <span class="kw-2">&amp;mut </span>OutBuffer&lt;<span class="lifetime">'_</span>, C&gt;,
<a href=#209 id=209 data-nosnippet>209</a> ) -&gt; io::Result&lt;usize&gt; {
<a href=#210 id=210 data-nosnippet>210</a> <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.context {
<a href=#211 id=211 data-nosnippet>211</a> MaybeOwnedDCtx::Owned(x) =&gt; x.decompress_stream(output, input),
<a href=#212 id=212 data-nosnippet>212</a> MaybeOwnedDCtx::Borrowed(x) =&gt; x.decompress_stream(output, input),
<a href=#213 id=213 data-nosnippet>213</a> }
<a href=#214 id=214 data-nosnippet>214</a> .map_err(map_error_code)
<a href=#215 id=215 data-nosnippet>215</a> }
<a href=#216 id=216 data-nosnippet>216</a>
<a href=#217 id=217 data-nosnippet>217</a> <span class="kw">fn </span>flush&lt;C: WriteBuf + <span class="question-mark">?</span>Sized&gt;(
<a href=#218 id=218 data-nosnippet>218</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#219 id=219 data-nosnippet>219</a> output: <span class="kw-2">&amp;mut </span>OutBuffer&lt;<span class="lifetime">'_</span>, C&gt;,
<a href=#220 id=220 data-nosnippet>220</a> ) -&gt; io::Result&lt;usize&gt; {
<a href=#221 id=221 data-nosnippet>221</a> <span class="comment">// To flush, we just offer no additional input.
<a href=#222 id=222 data-nosnippet>222</a> </span><span class="self">self</span>.run(<span class="kw-2">&amp;mut </span>InBuffer::around(<span class="kw-2">&amp;</span>[]), output)<span class="question-mark">?</span>;
<a href=#223 id=223 data-nosnippet>223</a>
<a href=#224 id=224 data-nosnippet>224</a> <span class="comment">// We don't _know_ how much (decompressed data) there is still in buffer.
<a href=#225 id=225 data-nosnippet>225</a> </span><span class="kw">if </span>output.pos() &lt; output.capacity() {
<a href=#226 id=226 data-nosnippet>226</a> <span class="comment">// We only know when there's none (the output buffer is not full).
<a href=#227 id=227 data-nosnippet>227</a> </span><span class="prelude-val">Ok</span>(<span class="number">0</span>)
<a href=#228 id=228 data-nosnippet>228</a> } <span class="kw">else </span>{
<a href=#229 id=229 data-nosnippet>229</a> <span class="comment">// Otherwise, pretend there's still "1 byte" remaining.
<a href=#230 id=230 data-nosnippet>230</a> </span><span class="prelude-val">Ok</span>(<span class="number">1</span>)
<a href=#231 id=231 data-nosnippet>231</a> }
<a href=#232 id=232 data-nosnippet>232</a> }
<a href=#233 id=233 data-nosnippet>233</a>
<a href=#234 id=234 data-nosnippet>234</a> <span class="kw">fn </span>reinit(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; io::Result&lt;()&gt; {
<a href=#235 id=235 data-nosnippet>235</a> <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.context {
<a href=#236 id=236 data-nosnippet>236</a> MaybeOwnedDCtx::Owned(x) =&gt; {
<a href=#237 id=237 data-nosnippet>237</a> x.reset(zstd_safe::ResetDirective::SessionOnly)
<a href=#238 id=238 data-nosnippet>238</a> }
<a href=#239 id=239 data-nosnippet>239</a> MaybeOwnedDCtx::Borrowed(x) =&gt; {
<a href=#240 id=240 data-nosnippet>240</a> x.reset(zstd_safe::ResetDirective::SessionOnly)
<a href=#241 id=241 data-nosnippet>241</a> }
<a href=#242 id=242 data-nosnippet>242</a> }
<a href=#243 id=243 data-nosnippet>243</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#244 id=244 data-nosnippet>244</a> <span class="prelude-val">Ok</span>(())
<a href=#245 id=245 data-nosnippet>245</a> }
<a href=#246 id=246 data-nosnippet>246</a>
<a href=#247 id=247 data-nosnippet>247</a> <span class="kw">fn </span>finish&lt;C: WriteBuf + <span class="question-mark">?</span>Sized&gt;(
<a href=#248 id=248 data-nosnippet>248</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#249 id=249 data-nosnippet>249</a> _output: <span class="kw-2">&amp;mut </span>OutBuffer&lt;<span class="lifetime">'_</span>, C&gt;,
<a href=#250 id=250 data-nosnippet>250</a> finished_frame: bool,
<a href=#251 id=251 data-nosnippet>251</a> ) -&gt; io::Result&lt;usize&gt; {
<a href=#252 id=252 data-nosnippet>252</a> <span class="kw">if </span>finished_frame {
<a href=#253 id=253 data-nosnippet>253</a> <span class="prelude-val">Ok</span>(<span class="number">0</span>)
<a href=#254 id=254 data-nosnippet>254</a> } <span class="kw">else </span>{
<a href=#255 id=255 data-nosnippet>255</a> <span class="prelude-val">Err</span>(io::Error::new(
<a href=#256 id=256 data-nosnippet>256</a> io::ErrorKind::UnexpectedEof,
<a href=#257 id=257 data-nosnippet>257</a> <span class="string">"incomplete frame"</span>,
<a href=#258 id=258 data-nosnippet>258</a> ))
<a href=#259 id=259 data-nosnippet>259</a> }
<a href=#260 id=260 data-nosnippet>260</a> }
<a href=#261 id=261 data-nosnippet>261</a>}
<a href=#262 id=262 data-nosnippet>262</a>
<a href=#263 id=263 data-nosnippet>263</a><span class="doccomment">/// An in-memory encoder for streams of data.
<a href=#264 id=264 data-nosnippet>264</a></span><span class="kw">pub struct </span>Encoder&lt;<span class="lifetime">'a</span>&gt; {
<a href=#265 id=265 data-nosnippet>265</a> context: MaybeOwnedCCtx&lt;<span class="lifetime">'a</span>&gt;,
<a href=#266 id=266 data-nosnippet>266</a>}
<a href=#267 id=267 data-nosnippet>267</a>
<a href=#268 id=268 data-nosnippet>268</a><span class="kw">impl </span>Encoder&lt;<span class="lifetime">'static</span>&gt; {
<a href=#269 id=269 data-nosnippet>269</a> <span class="doccomment">/// Creates a new encoder.
<a href=#270 id=270 data-nosnippet>270</a> </span><span class="kw">pub fn </span>new(level: i32) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#271 id=271 data-nosnippet>271</a> <span class="self">Self</span>::with_dictionary(level, <span class="kw-2">&amp;</span>[])
<a href=#272 id=272 data-nosnippet>272</a> }
<a href=#273 id=273 data-nosnippet>273</a>
<a href=#274 id=274 data-nosnippet>274</a> <span class="doccomment">/// Creates a new encoder initialized with the given dictionary.
<a href=#275 id=275 data-nosnippet>275</a> </span><span class="kw">pub fn </span>with_dictionary(level: i32, dictionary: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#276 id=276 data-nosnippet>276</a> <span class="kw">let </span><span class="kw-2">mut </span>context = zstd_safe::CCtx::create();
<a href=#277 id=277 data-nosnippet>277</a>
<a href=#278 id=278 data-nosnippet>278</a> context
<a href=#279 id=279 data-nosnippet>279</a> .set_parameter(CParameter::CompressionLevel(level))
<a href=#280 id=280 data-nosnippet>280</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#281 id=281 data-nosnippet>281</a>
<a href=#282 id=282 data-nosnippet>282</a> context
<a href=#283 id=283 data-nosnippet>283</a> .load_dictionary(dictionary)
<a href=#284 id=284 data-nosnippet>284</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#285 id=285 data-nosnippet>285</a>
<a href=#286 id=286 data-nosnippet>286</a> <span class="prelude-val">Ok</span>(Encoder {
<a href=#287 id=287 data-nosnippet>287</a> context: MaybeOwnedCCtx::Owned(context),
<a href=#288 id=288 data-nosnippet>288</a> })
<a href=#289 id=289 data-nosnippet>289</a> }
<a href=#290 id=290 data-nosnippet>290</a>}
<a href=#291 id=291 data-nosnippet>291</a>
<a href=#292 id=292 data-nosnippet>292</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; Encoder&lt;<span class="lifetime">'a</span>&gt; {
<a href=#293 id=293 data-nosnippet>293</a> <span class="doccomment">/// Creates a new encoder that uses the provided context for serialization.
<a href=#294 id=294 data-nosnippet>294</a> </span><span class="kw">pub fn </span>with_context(context: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>zstd_safe::CCtx&lt;<span class="lifetime">'static</span>&gt;) -&gt; <span class="self">Self </span>{
<a href=#295 id=295 data-nosnippet>295</a> <span class="self">Self </span>{
<a href=#296 id=296 data-nosnippet>296</a> context: MaybeOwnedCCtx::Borrowed(context),
<a href=#297 id=297 data-nosnippet>297</a> }
<a href=#298 id=298 data-nosnippet>298</a> }
<a href=#299 id=299 data-nosnippet>299</a>
<a href=#300 id=300 data-nosnippet>300</a> <span class="doccomment">/// Creates a new encoder using an existing `EncoderDictionary`.
<a href=#301 id=301 data-nosnippet>301</a> </span><span class="kw">pub fn </span>with_prepared_dictionary&lt;<span class="lifetime">'b</span>&gt;(
<a href=#302 id=302 data-nosnippet>302</a> dictionary: <span class="kw-2">&amp;</span>EncoderDictionary&lt;<span class="lifetime">'b</span>&gt;,
<a href=#303 id=303 data-nosnippet>303</a> ) -&gt; io::Result&lt;<span class="self">Self</span>&gt;
<a href=#304 id=304 data-nosnippet>304</a> <span class="kw">where
<a href=#305 id=305 data-nosnippet>305</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#306 id=306 data-nosnippet>306</a> {
<a href=#307 id=307 data-nosnippet>307</a> <span class="kw">let </span><span class="kw-2">mut </span>context = zstd_safe::CCtx::create();
<a href=#308 id=308 data-nosnippet>308</a> context
<a href=#309 id=309 data-nosnippet>309</a> .ref_cdict(dictionary.as_cdict())
<a href=#310 id=310 data-nosnippet>310</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#311 id=311 data-nosnippet>311</a> <span class="prelude-val">Ok</span>(Encoder {
<a href=#312 id=312 data-nosnippet>312</a> context: MaybeOwnedCCtx::Owned(context),
<a href=#313 id=313 data-nosnippet>313</a> })
<a href=#314 id=314 data-nosnippet>314</a> }
<a href=#315 id=315 data-nosnippet>315</a>
<a href=#316 id=316 data-nosnippet>316</a> <span class="doccomment">/// Creates a new encoder initialized with the given ref prefix.
<a href=#317 id=317 data-nosnippet>317</a> </span><span class="kw">pub fn </span>with_ref_prefix&lt;<span class="lifetime">'b</span>&gt;(
<a href=#318 id=318 data-nosnippet>318</a> level: i32,
<a href=#319 id=319 data-nosnippet>319</a> ref_prefix: <span class="kw-2">&amp;</span><span class="lifetime">'b </span>[u8],
<a href=#320 id=320 data-nosnippet>320</a> ) -&gt; io::Result&lt;<span class="self">Self</span>&gt;
<a href=#321 id=321 data-nosnippet>321</a> <span class="kw">where
<a href=#322 id=322 data-nosnippet>322</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#323 id=323 data-nosnippet>323</a> {
<a href=#324 id=324 data-nosnippet>324</a> <span class="kw">let </span><span class="kw-2">mut </span>context = zstd_safe::CCtx::create();
<a href=#325 id=325 data-nosnippet>325</a>
<a href=#326 id=326 data-nosnippet>326</a> context
<a href=#327 id=327 data-nosnippet>327</a> .set_parameter(CParameter::CompressionLevel(level))
<a href=#328 id=328 data-nosnippet>328</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#329 id=329 data-nosnippet>329</a>
<a href=#330 id=330 data-nosnippet>330</a> context.ref_prefix(ref_prefix).map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#331 id=331 data-nosnippet>331</a>
<a href=#332 id=332 data-nosnippet>332</a> <span class="prelude-val">Ok</span>(Encoder {
<a href=#333 id=333 data-nosnippet>333</a> context: MaybeOwnedCCtx::Owned(context),
<a href=#334 id=334 data-nosnippet>334</a> })
<a href=#335 id=335 data-nosnippet>335</a> }
<a href=#336 id=336 data-nosnippet>336</a>
<a href=#337 id=337 data-nosnippet>337</a> <span class="doccomment">/// Sets a compression parameter for this encoder.
<a href=#338 id=338 data-nosnippet>338</a> </span><span class="kw">pub fn </span>set_parameter(<span class="kw-2">&amp;mut </span><span class="self">self</span>, parameter: CParameter) -&gt; io::Result&lt;()&gt; {
<a href=#339 id=339 data-nosnippet>339</a> <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.context {
<a href=#340 id=340 data-nosnippet>340</a> MaybeOwnedCCtx::Owned(x) =&gt; x.set_parameter(parameter),
<a href=#341 id=341 data-nosnippet>341</a> MaybeOwnedCCtx::Borrowed(x) =&gt; x.set_parameter(parameter),
<a href=#342 id=342 data-nosnippet>342</a> }
<a href=#343 id=343 data-nosnippet>343</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#344 id=344 data-nosnippet>344</a> <span class="prelude-val">Ok</span>(())
<a href=#345 id=345 data-nosnippet>345</a> }
<a href=#346 id=346 data-nosnippet>346</a>
<a href=#347 id=347 data-nosnippet>347</a> <span class="doccomment">/// Sets the size of the input expected by zstd.
<a href=#348 id=348 data-nosnippet>348</a> ///
<a href=#349 id=349 data-nosnippet>349</a> /// May affect compression ratio.
<a href=#350 id=350 data-nosnippet>350</a> ///
<a href=#351 id=351 data-nosnippet>351</a> /// It is an error to give an incorrect size (an error _will_ be returned when closing the
<a href=#352 id=352 data-nosnippet>352</a> /// stream).
<a href=#353 id=353 data-nosnippet>353</a> ///
<a href=#354 id=354 data-nosnippet>354</a> /// If `None` is given, it assume the size is not known (default behaviour).
<a href=#355 id=355 data-nosnippet>355</a> </span><span class="kw">pub fn </span>set_pledged_src_size(
<a href=#356 id=356 data-nosnippet>356</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#357 id=357 data-nosnippet>357</a> pledged_src_size: <span class="prelude-ty">Option</span>&lt;u64&gt;,
<a href=#358 id=358 data-nosnippet>358</a> ) -&gt; io::Result&lt;()&gt; {
<a href=#359 id=359 data-nosnippet>359</a> <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.context {
<a href=#360 id=360 data-nosnippet>360</a> MaybeOwnedCCtx::Owned(x) =&gt; {
<a href=#361 id=361 data-nosnippet>361</a> x.set_pledged_src_size(pledged_src_size)
<a href=#362 id=362 data-nosnippet>362</a> }
<a href=#363 id=363 data-nosnippet>363</a> MaybeOwnedCCtx::Borrowed(x) =&gt; {
<a href=#364 id=364 data-nosnippet>364</a> x.set_pledged_src_size(pledged_src_size)
<a href=#365 id=365 data-nosnippet>365</a> }
<a href=#366 id=366 data-nosnippet>366</a> }
<a href=#367 id=367 data-nosnippet>367</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#368 id=368 data-nosnippet>368</a> <span class="prelude-val">Ok</span>(())
<a href=#369 id=369 data-nosnippet>369</a> }
<a href=#370 id=370 data-nosnippet>370</a>}
<a href=#371 id=371 data-nosnippet>371</a>
<a href=#372 id=372 data-nosnippet>372</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; Operation <span class="kw">for </span>Encoder&lt;<span class="lifetime">'a</span>&gt; {
<a href=#373 id=373 data-nosnippet>373</a> <span class="kw">fn </span>run&lt;C: WriteBuf + <span class="question-mark">?</span>Sized&gt;(
<a href=#374 id=374 data-nosnippet>374</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#375 id=375 data-nosnippet>375</a> input: <span class="kw-2">&amp;mut </span>InBuffer&lt;<span class="lifetime">'_</span>&gt;,
<a href=#376 id=376 data-nosnippet>376</a> output: <span class="kw-2">&amp;mut </span>OutBuffer&lt;<span class="lifetime">'_</span>, C&gt;,
<a href=#377 id=377 data-nosnippet>377</a> ) -&gt; io::Result&lt;usize&gt; {
<a href=#378 id=378 data-nosnippet>378</a> <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.context {
<a href=#379 id=379 data-nosnippet>379</a> MaybeOwnedCCtx::Owned(x) =&gt; x.compress_stream(output, input),
<a href=#380 id=380 data-nosnippet>380</a> MaybeOwnedCCtx::Borrowed(x) =&gt; x.compress_stream(output, input),
<a href=#381 id=381 data-nosnippet>381</a> }
<a href=#382 id=382 data-nosnippet>382</a> .map_err(map_error_code)
<a href=#383 id=383 data-nosnippet>383</a> }
<a href=#384 id=384 data-nosnippet>384</a>
<a href=#385 id=385 data-nosnippet>385</a> <span class="kw">fn </span>flush&lt;C: WriteBuf + <span class="question-mark">?</span>Sized&gt;(
<a href=#386 id=386 data-nosnippet>386</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#387 id=387 data-nosnippet>387</a> output: <span class="kw-2">&amp;mut </span>OutBuffer&lt;<span class="lifetime">'_</span>, C&gt;,
<a href=#388 id=388 data-nosnippet>388</a> ) -&gt; io::Result&lt;usize&gt; {
<a href=#389 id=389 data-nosnippet>389</a> <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.context {
<a href=#390 id=390 data-nosnippet>390</a> MaybeOwnedCCtx::Owned(x) =&gt; x.flush_stream(output),
<a href=#391 id=391 data-nosnippet>391</a> MaybeOwnedCCtx::Borrowed(x) =&gt; x.flush_stream(output),
<a href=#392 id=392 data-nosnippet>392</a> }
<a href=#393 id=393 data-nosnippet>393</a> .map_err(map_error_code)
<a href=#394 id=394 data-nosnippet>394</a> }
<a href=#395 id=395 data-nosnippet>395</a>
<a href=#396 id=396 data-nosnippet>396</a> <span class="kw">fn </span>finish&lt;C: WriteBuf + <span class="question-mark">?</span>Sized&gt;(
<a href=#397 id=397 data-nosnippet>397</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#398 id=398 data-nosnippet>398</a> output: <span class="kw-2">&amp;mut </span>OutBuffer&lt;<span class="lifetime">'_</span>, C&gt;,
<a href=#399 id=399 data-nosnippet>399</a> _finished_frame: bool,
<a href=#400 id=400 data-nosnippet>400</a> ) -&gt; io::Result&lt;usize&gt; {
<a href=#401 id=401 data-nosnippet>401</a> <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.context {
<a href=#402 id=402 data-nosnippet>402</a> MaybeOwnedCCtx::Owned(x) =&gt; x.end_stream(output),
<a href=#403 id=403 data-nosnippet>403</a> MaybeOwnedCCtx::Borrowed(x) =&gt; x.end_stream(output),
<a href=#404 id=404 data-nosnippet>404</a> }
<a href=#405 id=405 data-nosnippet>405</a> .map_err(map_error_code)
<a href=#406 id=406 data-nosnippet>406</a> }
<a href=#407 id=407 data-nosnippet>407</a>
<a href=#408 id=408 data-nosnippet>408</a> <span class="kw">fn </span>reinit(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; io::Result&lt;()&gt; {
<a href=#409 id=409 data-nosnippet>409</a> <span class="kw">match </span><span class="kw-2">&amp;mut </span><span class="self">self</span>.context {
<a href=#410 id=410 data-nosnippet>410</a> MaybeOwnedCCtx::Owned(x) =&gt; {
<a href=#411 id=411 data-nosnippet>411</a> x.reset(zstd_safe::ResetDirective::SessionOnly)
<a href=#412 id=412 data-nosnippet>412</a> }
<a href=#413 id=413 data-nosnippet>413</a> MaybeOwnedCCtx::Borrowed(x) =&gt; {
<a href=#414 id=414 data-nosnippet>414</a> x.reset(zstd_safe::ResetDirective::SessionOnly)
<a href=#415 id=415 data-nosnippet>415</a> }
<a href=#416 id=416 data-nosnippet>416</a> }
<a href=#417 id=417 data-nosnippet>417</a> .map_err(map_error_code)<span class="question-mark">?</span>;
<a href=#418 id=418 data-nosnippet>418</a> <span class="prelude-val">Ok</span>(())
<a href=#419 id=419 data-nosnippet>419</a> }
<a href=#420 id=420 data-nosnippet>420</a>}
<a href=#421 id=421 data-nosnippet>421</a>
<a href=#422 id=422 data-nosnippet>422</a><span class="kw">enum </span>MaybeOwnedCCtx&lt;<span class="lifetime">'a</span>&gt; {
<a href=#423 id=423 data-nosnippet>423</a> Owned(zstd_safe::CCtx&lt;<span class="lifetime">'a</span>&gt;),
<a href=#424 id=424 data-nosnippet>424</a> Borrowed(<span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>zstd_safe::CCtx&lt;<span class="lifetime">'static</span>&gt;),
<a href=#425 id=425 data-nosnippet>425</a>}
<a href=#426 id=426 data-nosnippet>426</a>
<a href=#427 id=427 data-nosnippet>427</a><span class="kw">enum </span>MaybeOwnedDCtx&lt;<span class="lifetime">'a</span>&gt; {
<a href=#428 id=428 data-nosnippet>428</a> Owned(zstd_safe::DCtx&lt;<span class="lifetime">'a</span>&gt;),
<a href=#429 id=429 data-nosnippet>429</a> Borrowed(<span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>zstd_safe::DCtx&lt;<span class="lifetime">'static</span>&gt;),
<a href=#430 id=430 data-nosnippet>430</a>}
<a href=#431 id=431 data-nosnippet>431</a>
<a href=#432 id=432 data-nosnippet>432</a><span class="attr">#[cfg(test)]
<a href=#433 id=433 data-nosnippet>433</a></span><span class="kw">mod </span>tests {
<a href=#434 id=434 data-nosnippet>434</a>
<a href=#435 id=435 data-nosnippet>435</a> <span class="comment">// This requires impl for [u8; N] which is currently behind a feature.
<a href=#436 id=436 data-nosnippet>436</a> </span><span class="attr">#[cfg(feature = <span class="string">"arrays"</span>)]
<a href=#437 id=437 data-nosnippet>437</a> #[test]
<a href=#438 id=438 data-nosnippet>438</a> </span><span class="kw">fn </span>test_cycle() {
<a href=#439 id=439 data-nosnippet>439</a> <span class="kw">use super</span>::{Decoder, Encoder, InBuffer, Operation, OutBuffer};
<a href=#440 id=440 data-nosnippet>440</a>
<a href=#441 id=441 data-nosnippet>441</a> <span class="kw">let </span><span class="kw-2">mut </span>encoder = Encoder::new(<span class="number">1</span>).unwrap();
<a href=#442 id=442 data-nosnippet>442</a> <span class="kw">let </span><span class="kw-2">mut </span>decoder = Decoder::new().unwrap();
<a href=#443 id=443 data-nosnippet>443</a>
<a href=#444 id=444 data-nosnippet>444</a> <span class="comment">// Step 1: compress
<a href=#445 id=445 data-nosnippet>445</a> </span><span class="kw">let </span><span class="kw-2">mut </span>input = InBuffer::around(<span class="string">b"AbcdefAbcdefabcdef"</span>);
<a href=#446 id=446 data-nosnippet>446</a>
<a href=#447 id=447 data-nosnippet>447</a> <span class="kw">let </span><span class="kw-2">mut </span>output = [<span class="number">0u8</span>; <span class="number">128</span>];
<a href=#448 id=448 data-nosnippet>448</a> <span class="kw">let </span><span class="kw-2">mut </span>output = OutBuffer::around(<span class="kw-2">&amp;mut </span>output);
<a href=#449 id=449 data-nosnippet>449</a>
<a href=#450 id=450 data-nosnippet>450</a> <span class="kw">loop </span>{
<a href=#451 id=451 data-nosnippet>451</a> encoder.run(<span class="kw-2">&amp;mut </span>input, <span class="kw-2">&amp;mut </span>output).unwrap();
<a href=#452 id=452 data-nosnippet>452</a>
<a href=#453 id=453 data-nosnippet>453</a> <span class="kw">if </span>input.pos == input.src.len() {
<a href=#454 id=454 data-nosnippet>454</a> <span class="kw">break</span>;
<a href=#455 id=455 data-nosnippet>455</a> }
<a href=#456 id=456 data-nosnippet>456</a> }
<a href=#457 id=457 data-nosnippet>457</a> encoder.finish(<span class="kw-2">&amp;mut </span>output, <span class="bool-val">true</span>).unwrap();
<a href=#458 id=458 data-nosnippet>458</a>
<a href=#459 id=459 data-nosnippet>459</a> <span class="kw">let </span>initial_data = input.src;
<a href=#460 id=460 data-nosnippet>460</a>
<a href=#461 id=461 data-nosnippet>461</a> <span class="comment">// Step 2: decompress
<a href=#462 id=462 data-nosnippet>462</a> </span><span class="kw">let </span><span class="kw-2">mut </span>input = InBuffer::around(output.as_slice());
<a href=#463 id=463 data-nosnippet>463</a> <span class="kw">let </span><span class="kw-2">mut </span>output = [<span class="number">0u8</span>; <span class="number">128</span>];
<a href=#464 id=464 data-nosnippet>464</a> <span class="kw">let </span><span class="kw-2">mut </span>output = OutBuffer::around(<span class="kw-2">&amp;mut </span>output);
<a href=#465 id=465 data-nosnippet>465</a>
<a href=#466 id=466 data-nosnippet>466</a> <span class="kw">loop </span>{
<a href=#467 id=467 data-nosnippet>467</a> decoder.run(<span class="kw-2">&amp;mut </span>input, <span class="kw-2">&amp;mut </span>output).unwrap();
<a href=#468 id=468 data-nosnippet>468</a>
<a href=#469 id=469 data-nosnippet>469</a> <span class="kw">if </span>input.pos == input.src.len() {
<a href=#470 id=470 data-nosnippet>470</a> <span class="kw">break</span>;
<a href=#471 id=471 data-nosnippet>471</a> }
<a href=#472 id=472 data-nosnippet>472</a> }
<a href=#473 id=473 data-nosnippet>473</a>
<a href=#474 id=474 data-nosnippet>474</a> <span class="macro">assert_eq!</span>(initial_data, output.as_slice());
<a href=#475 id=475 data-nosnippet>475</a> }
<a href=#476 id=476 data-nosnippet>476</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,241 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zstd-0.13.3/src/stream/read/mod.rs`."><title>mod.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../../" data-static-root-path="../../../../static.files/" data-current-crate="zstd" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../../static.files/src-script-813739b1.js"></script><script defer src="../../../../src-files.js"></script><script defer src="../../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">zstd/stream/read/</div>mod.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! Implement pull-based [`Read`] trait for both compressing and decompressing.
<a href=#2 id=2 data-nosnippet>2</a></span><span class="kw">use </span>std::io::{<span class="self">self</span>, BufRead, BufReader, Read};
<a href=#3 id=3 data-nosnippet>3</a>
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span><span class="kw">crate</span>::dict::{DecoderDictionary, EncoderDictionary};
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span><span class="kw">crate</span>::stream::{raw, zio};
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span>zstd_safe;
<a href=#7 id=7 data-nosnippet>7</a>
<a href=#8 id=8 data-nosnippet>8</a><span class="attr">#[cfg(test)]
<a href=#9 id=9 data-nosnippet>9</a></span><span class="kw">mod </span>tests;
<a href=#10 id=10 data-nosnippet>10</a>
<a href=#11 id=11 data-nosnippet>11</a><span class="doccomment">/// A decoder that decompress input data from another `Read`.
<a href=#12 id=12 data-nosnippet>12</a>///
<a href=#13 id=13 data-nosnippet>13</a>/// This allows to read a stream of compressed data
<a href=#14 id=14 data-nosnippet>14</a>/// (good for files or heavy network stream).
<a href=#15 id=15 data-nosnippet>15</a></span><span class="kw">pub struct </span>Decoder&lt;<span class="lifetime">'a</span>, R&gt; {
<a href=#16 id=16 data-nosnippet>16</a> reader: zio::Reader&lt;R, raw::Decoder&lt;<span class="lifetime">'a</span>&gt;&gt;,
<a href=#17 id=17 data-nosnippet>17</a>}
<a href=#18 id=18 data-nosnippet>18</a>
<a href=#19 id=19 data-nosnippet>19</a><span class="doccomment">/// An encoder that compress input data from another `Read`.
<a href=#20 id=20 data-nosnippet>20</a></span><span class="kw">pub struct </span>Encoder&lt;<span class="lifetime">'a</span>, R&gt; {
<a href=#21 id=21 data-nosnippet>21</a> reader: zio::Reader&lt;R, raw::Encoder&lt;<span class="lifetime">'a</span>&gt;&gt;,
<a href=#22 id=22 data-nosnippet>22</a>}
<a href=#23 id=23 data-nosnippet>23</a>
<a href=#24 id=24 data-nosnippet>24</a><span class="kw">impl</span>&lt;R: Read&gt; Decoder&lt;<span class="lifetime">'static</span>, BufReader&lt;R&gt;&gt; {
<a href=#25 id=25 data-nosnippet>25</a> <span class="doccomment">/// Creates a new decoder.
<a href=#26 id=26 data-nosnippet>26</a> </span><span class="kw">pub fn </span>new(reader: R) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#27 id=27 data-nosnippet>27</a> <span class="kw">let </span>buffer_size = zstd_safe::DCtx::in_size();
<a href=#28 id=28 data-nosnippet>28</a>
<a href=#29 id=29 data-nosnippet>29</a> <span class="self">Self</span>::with_buffer(BufReader::with_capacity(buffer_size, reader))
<a href=#30 id=30 data-nosnippet>30</a> }
<a href=#31 id=31 data-nosnippet>31</a>}
<a href=#32 id=32 data-nosnippet>32</a>
<a href=#33 id=33 data-nosnippet>33</a><span class="kw">impl</span>&lt;R: BufRead&gt; Decoder&lt;<span class="lifetime">'static</span>, R&gt; {
<a href=#34 id=34 data-nosnippet>34</a> <span class="doccomment">/// Creates a new decoder around a `BufRead`.
<a href=#35 id=35 data-nosnippet>35</a> </span><span class="kw">pub fn </span>with_buffer(reader: R) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#36 id=36 data-nosnippet>36</a> <span class="self">Self</span>::with_dictionary(reader, <span class="kw-2">&amp;</span>[])
<a href=#37 id=37 data-nosnippet>37</a> }
<a href=#38 id=38 data-nosnippet>38</a> <span class="doccomment">/// Creates a new decoder, using an existing dictionary.
<a href=#39 id=39 data-nosnippet>39</a> ///
<a href=#40 id=40 data-nosnippet>40</a> /// The dictionary must be the same as the one used during compression.
<a href=#41 id=41 data-nosnippet>41</a> </span><span class="kw">pub fn </span>with_dictionary(reader: R, dictionary: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#42 id=42 data-nosnippet>42</a> <span class="kw">let </span>decoder = raw::Decoder::with_dictionary(dictionary)<span class="question-mark">?</span>;
<a href=#43 id=43 data-nosnippet>43</a> <span class="kw">let </span>reader = zio::Reader::new(reader, decoder);
<a href=#44 id=44 data-nosnippet>44</a>
<a href=#45 id=45 data-nosnippet>45</a> <span class="prelude-val">Ok</span>(Decoder { reader })
<a href=#46 id=46 data-nosnippet>46</a> }
<a href=#47 id=47 data-nosnippet>47</a>}
<a href=#48 id=48 data-nosnippet>48</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, R: BufRead&gt; Decoder&lt;<span class="lifetime">'a</span>, R&gt; {
<a href=#49 id=49 data-nosnippet>49</a> <span class="doccomment">/// Creates a new decoder which employs the provided context for deserialization.
<a href=#50 id=50 data-nosnippet>50</a> </span><span class="kw">pub fn </span>with_context(
<a href=#51 id=51 data-nosnippet>51</a> reader: R,
<a href=#52 id=52 data-nosnippet>52</a> context: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>zstd_safe::DCtx&lt;<span class="lifetime">'static</span>&gt;,
<a href=#53 id=53 data-nosnippet>53</a> ) -&gt; <span class="self">Self </span>{
<a href=#54 id=54 data-nosnippet>54</a> <span class="self">Self </span>{
<a href=#55 id=55 data-nosnippet>55</a> reader: zio::Reader::new(
<a href=#56 id=56 data-nosnippet>56</a> reader,
<a href=#57 id=57 data-nosnippet>57</a> raw::Decoder::with_context(context),
<a href=#58 id=58 data-nosnippet>58</a> ),
<a href=#59 id=59 data-nosnippet>59</a> }
<a href=#60 id=60 data-nosnippet>60</a> }
<a href=#61 id=61 data-nosnippet>61</a>
<a href=#62 id=62 data-nosnippet>62</a> <span class="doccomment">/// Sets this `Decoder` to stop after the first frame.
<a href=#63 id=63 data-nosnippet>63</a> ///
<a href=#64 id=64 data-nosnippet>64</a> /// By default, it keeps concatenating frames until EOF is reached.
<a href=#65 id=65 data-nosnippet>65</a> </span><span class="attr">#[must_use]
<a href=#66 id=66 data-nosnippet>66</a> </span><span class="kw">pub fn </span>single_frame(<span class="kw-2">mut </span><span class="self">self</span>) -&gt; <span class="self">Self </span>{
<a href=#67 id=67 data-nosnippet>67</a> <span class="self">self</span>.reader.set_single_frame();
<a href=#68 id=68 data-nosnippet>68</a> <span class="self">self
<a href=#69 id=69 data-nosnippet>69</a> </span>}
<a href=#70 id=70 data-nosnippet>70</a>
<a href=#71 id=71 data-nosnippet>71</a> <span class="doccomment">/// Creates a new decoder, using an existing `DecoderDictionary`.
<a href=#72 id=72 data-nosnippet>72</a> ///
<a href=#73 id=73 data-nosnippet>73</a> /// The dictionary must be the same as the one used during compression.
<a href=#74 id=74 data-nosnippet>74</a> </span><span class="kw">pub fn </span>with_prepared_dictionary&lt;<span class="lifetime">'b</span>&gt;(
<a href=#75 id=75 data-nosnippet>75</a> reader: R,
<a href=#76 id=76 data-nosnippet>76</a> dictionary: <span class="kw-2">&amp;</span>DecoderDictionary&lt;<span class="lifetime">'b</span>&gt;,
<a href=#77 id=77 data-nosnippet>77</a> ) -&gt; io::Result&lt;<span class="self">Self</span>&gt;
<a href=#78 id=78 data-nosnippet>78</a> <span class="kw">where
<a href=#79 id=79 data-nosnippet>79</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#80 id=80 data-nosnippet>80</a> {
<a href=#81 id=81 data-nosnippet>81</a> <span class="kw">let </span>decoder = raw::Decoder::with_prepared_dictionary(dictionary)<span class="question-mark">?</span>;
<a href=#82 id=82 data-nosnippet>82</a> <span class="kw">let </span>reader = zio::Reader::new(reader, decoder);
<a href=#83 id=83 data-nosnippet>83</a>
<a href=#84 id=84 data-nosnippet>84</a> <span class="prelude-val">Ok</span>(Decoder { reader })
<a href=#85 id=85 data-nosnippet>85</a> }
<a href=#86 id=86 data-nosnippet>86</a>
<a href=#87 id=87 data-nosnippet>87</a> <span class="doccomment">/// Creates a new decoder, using a ref prefix.
<a href=#88 id=88 data-nosnippet>88</a> ///
<a href=#89 id=89 data-nosnippet>89</a> /// The prefix must be the same as the one used during compression.
<a href=#90 id=90 data-nosnippet>90</a> </span><span class="kw">pub fn </span>with_ref_prefix&lt;<span class="lifetime">'b</span>&gt;(
<a href=#91 id=91 data-nosnippet>91</a> reader: R,
<a href=#92 id=92 data-nosnippet>92</a> ref_prefix: <span class="kw-2">&amp;</span><span class="lifetime">'b </span>[u8],
<a href=#93 id=93 data-nosnippet>93</a> ) -&gt; io::Result&lt;<span class="self">Self</span>&gt;
<a href=#94 id=94 data-nosnippet>94</a> <span class="kw">where
<a href=#95 id=95 data-nosnippet>95</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#96 id=96 data-nosnippet>96</a> {
<a href=#97 id=97 data-nosnippet>97</a> <span class="kw">let </span>decoder = raw::Decoder::with_ref_prefix(ref_prefix)<span class="question-mark">?</span>;
<a href=#98 id=98 data-nosnippet>98</a> <span class="kw">let </span>reader = zio::Reader::new(reader, decoder);
<a href=#99 id=99 data-nosnippet>99</a>
<a href=#100 id=100 data-nosnippet>100</a> <span class="prelude-val">Ok</span>(Decoder { reader })
<a href=#101 id=101 data-nosnippet>101</a> }
<a href=#102 id=102 data-nosnippet>102</a>
<a href=#103 id=103 data-nosnippet>103</a> <span class="doccomment">/// Recommendation for the size of the output buffer.
<a href=#104 id=104 data-nosnippet>104</a> </span><span class="kw">pub fn </span>recommended_output_size() -&gt; usize {
<a href=#105 id=105 data-nosnippet>105</a> zstd_safe::DCtx::out_size()
<a href=#106 id=106 data-nosnippet>106</a> }
<a href=#107 id=107 data-nosnippet>107</a>
<a href=#108 id=108 data-nosnippet>108</a> <span class="doccomment">/// Acquire a reference to the underlying reader.
<a href=#109 id=109 data-nosnippet>109</a> </span><span class="kw">pub fn </span>get_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>R {
<a href=#110 id=110 data-nosnippet>110</a> <span class="self">self</span>.reader.reader()
<a href=#111 id=111 data-nosnippet>111</a> }
<a href=#112 id=112 data-nosnippet>112</a>
<a href=#113 id=113 data-nosnippet>113</a> <span class="doccomment">/// Acquire a mutable reference to the underlying reader.
<a href=#114 id=114 data-nosnippet>114</a> ///
<a href=#115 id=115 data-nosnippet>115</a> /// Note that mutation of the reader may result in surprising results if
<a href=#116 id=116 data-nosnippet>116</a> /// this decoder is continued to be used.
<a href=#117 id=117 data-nosnippet>117</a> </span><span class="kw">pub fn </span>get_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>R {
<a href=#118 id=118 data-nosnippet>118</a> <span class="self">self</span>.reader.reader_mut()
<a href=#119 id=119 data-nosnippet>119</a> }
<a href=#120 id=120 data-nosnippet>120</a>
<a href=#121 id=121 data-nosnippet>121</a> <span class="doccomment">/// Return the inner `Read`.
<a href=#122 id=122 data-nosnippet>122</a> ///
<a href=#123 id=123 data-nosnippet>123</a> /// Calling `finish()` is not *required* after reading a stream -
<a href=#124 id=124 data-nosnippet>124</a> /// just use it if you need to get the `Read` back.
<a href=#125 id=125 data-nosnippet>125</a> </span><span class="kw">pub fn </span>finish(<span class="self">self</span>) -&gt; R {
<a href=#126 id=126 data-nosnippet>126</a> <span class="self">self</span>.reader.into_inner()
<a href=#127 id=127 data-nosnippet>127</a> }
<a href=#128 id=128 data-nosnippet>128</a>
<a href=#129 id=129 data-nosnippet>129</a> <span class="macro">crate::decoder_common!</span>(reader);
<a href=#130 id=130 data-nosnippet>130</a>}
<a href=#131 id=131 data-nosnippet>131</a>
<a href=#132 id=132 data-nosnippet>132</a><span class="kw">impl</span>&lt;R: BufRead&gt; Read <span class="kw">for </span>Decoder&lt;<span class="lifetime">'_</span>, R&gt; {
<a href=#133 id=133 data-nosnippet>133</a> <span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; io::Result&lt;usize&gt; {
<a href=#134 id=134 data-nosnippet>134</a> <span class="self">self</span>.reader.read(buf)
<a href=#135 id=135 data-nosnippet>135</a> }
<a href=#136 id=136 data-nosnippet>136</a>}
<a href=#137 id=137 data-nosnippet>137</a>
<a href=#138 id=138 data-nosnippet>138</a><span class="kw">impl</span>&lt;R: Read&gt; Encoder&lt;<span class="lifetime">'static</span>, BufReader&lt;R&gt;&gt; {
<a href=#139 id=139 data-nosnippet>139</a> <span class="doccomment">/// Creates a new encoder.
<a href=#140 id=140 data-nosnippet>140</a> </span><span class="kw">pub fn </span>new(reader: R, level: i32) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#141 id=141 data-nosnippet>141</a> <span class="kw">let </span>buffer_size = zstd_safe::CCtx::in_size();
<a href=#142 id=142 data-nosnippet>142</a>
<a href=#143 id=143 data-nosnippet>143</a> <span class="self">Self</span>::with_buffer(BufReader::with_capacity(buffer_size, reader), level)
<a href=#144 id=144 data-nosnippet>144</a> }
<a href=#145 id=145 data-nosnippet>145</a>}
<a href=#146 id=146 data-nosnippet>146</a>
<a href=#147 id=147 data-nosnippet>147</a><span class="kw">impl</span>&lt;R: BufRead&gt; Encoder&lt;<span class="lifetime">'static</span>, R&gt; {
<a href=#148 id=148 data-nosnippet>148</a> <span class="doccomment">/// Creates a new encoder around a `BufRead`.
<a href=#149 id=149 data-nosnippet>149</a> </span><span class="kw">pub fn </span>with_buffer(reader: R, level: i32) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#150 id=150 data-nosnippet>150</a> <span class="self">Self</span>::with_dictionary(reader, level, <span class="kw-2">&amp;</span>[])
<a href=#151 id=151 data-nosnippet>151</a> }
<a href=#152 id=152 data-nosnippet>152</a>
<a href=#153 id=153 data-nosnippet>153</a> <span class="doccomment">/// Creates a new encoder, using an existing dictionary.
<a href=#154 id=154 data-nosnippet>154</a> ///
<a href=#155 id=155 data-nosnippet>155</a> /// The dictionary must be the same as the one used during compression.
<a href=#156 id=156 data-nosnippet>156</a> </span><span class="kw">pub fn </span>with_dictionary(
<a href=#157 id=157 data-nosnippet>157</a> reader: R,
<a href=#158 id=158 data-nosnippet>158</a> level: i32,
<a href=#159 id=159 data-nosnippet>159</a> dictionary: <span class="kw-2">&amp;</span>[u8],
<a href=#160 id=160 data-nosnippet>160</a> ) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#161 id=161 data-nosnippet>161</a> <span class="kw">let </span>encoder = raw::Encoder::with_dictionary(level, dictionary)<span class="question-mark">?</span>;
<a href=#162 id=162 data-nosnippet>162</a> <span class="kw">let </span>reader = zio::Reader::new(reader, encoder);
<a href=#163 id=163 data-nosnippet>163</a>
<a href=#164 id=164 data-nosnippet>164</a> <span class="prelude-val">Ok</span>(Encoder { reader })
<a href=#165 id=165 data-nosnippet>165</a> }
<a href=#166 id=166 data-nosnippet>166</a>}
<a href=#167 id=167 data-nosnippet>167</a>
<a href=#168 id=168 data-nosnippet>168</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, R: BufRead&gt; Encoder&lt;<span class="lifetime">'a</span>, R&gt; {
<a href=#169 id=169 data-nosnippet>169</a> <span class="doccomment">/// Creates a new encoder, using an existing `EncoderDictionary`.
<a href=#170 id=170 data-nosnippet>170</a> ///
<a href=#171 id=171 data-nosnippet>171</a> /// The dictionary must be the same as the one used during compression.
<a href=#172 id=172 data-nosnippet>172</a> </span><span class="kw">pub fn </span>with_prepared_dictionary&lt;<span class="lifetime">'b</span>&gt;(
<a href=#173 id=173 data-nosnippet>173</a> reader: R,
<a href=#174 id=174 data-nosnippet>174</a> dictionary: <span class="kw-2">&amp;</span>EncoderDictionary&lt;<span class="lifetime">'b</span>&gt;,
<a href=#175 id=175 data-nosnippet>175</a> ) -&gt; io::Result&lt;<span class="self">Self</span>&gt;
<a href=#176 id=176 data-nosnippet>176</a> <span class="kw">where
<a href=#177 id=177 data-nosnippet>177</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#178 id=178 data-nosnippet>178</a> {
<a href=#179 id=179 data-nosnippet>179</a> <span class="kw">let </span>encoder = raw::Encoder::with_prepared_dictionary(dictionary)<span class="question-mark">?</span>;
<a href=#180 id=180 data-nosnippet>180</a> <span class="kw">let </span>reader = zio::Reader::new(reader, encoder);
<a href=#181 id=181 data-nosnippet>181</a>
<a href=#182 id=182 data-nosnippet>182</a> <span class="prelude-val">Ok</span>(Encoder { reader })
<a href=#183 id=183 data-nosnippet>183</a> }
<a href=#184 id=184 data-nosnippet>184</a>
<a href=#185 id=185 data-nosnippet>185</a> <span class="doccomment">/// Recommendation for the size of the output buffer.
<a href=#186 id=186 data-nosnippet>186</a> </span><span class="kw">pub fn </span>recommended_output_size() -&gt; usize {
<a href=#187 id=187 data-nosnippet>187</a> zstd_safe::CCtx::out_size()
<a href=#188 id=188 data-nosnippet>188</a> }
<a href=#189 id=189 data-nosnippet>189</a>
<a href=#190 id=190 data-nosnippet>190</a> <span class="doccomment">/// Acquire a reference to the underlying reader.
<a href=#191 id=191 data-nosnippet>191</a> </span><span class="kw">pub fn </span>get_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>R {
<a href=#192 id=192 data-nosnippet>192</a> <span class="self">self</span>.reader.reader()
<a href=#193 id=193 data-nosnippet>193</a> }
<a href=#194 id=194 data-nosnippet>194</a>
<a href=#195 id=195 data-nosnippet>195</a> <span class="doccomment">/// Acquire a mutable reference to the underlying reader.
<a href=#196 id=196 data-nosnippet>196</a> ///
<a href=#197 id=197 data-nosnippet>197</a> /// Note that mutation of the reader may result in surprising results if
<a href=#198 id=198 data-nosnippet>198</a> /// this encoder is continued to be used.
<a href=#199 id=199 data-nosnippet>199</a> </span><span class="kw">pub fn </span>get_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>R {
<a href=#200 id=200 data-nosnippet>200</a> <span class="self">self</span>.reader.reader_mut()
<a href=#201 id=201 data-nosnippet>201</a> }
<a href=#202 id=202 data-nosnippet>202</a>
<a href=#203 id=203 data-nosnippet>203</a> <span class="doccomment">/// Flush any internal buffer.
<a href=#204 id=204 data-nosnippet>204</a> ///
<a href=#205 id=205 data-nosnippet>205</a> /// This ensures all input consumed so far is compressed.
<a href=#206 id=206 data-nosnippet>206</a> ///
<a href=#207 id=207 data-nosnippet>207</a> /// Since it prevents bundling currently buffered data with future input,
<a href=#208 id=208 data-nosnippet>208</a> /// it may affect compression ratio.
<a href=#209 id=209 data-nosnippet>209</a> ///
<a href=#210 id=210 data-nosnippet>210</a> /// * Returns the number of bytes written to `out`.
<a href=#211 id=211 data-nosnippet>211</a> /// * Returns `Ok(0)` when everything has been flushed.
<a href=#212 id=212 data-nosnippet>212</a> </span><span class="kw">pub fn </span>flush(<span class="kw-2">&amp;mut </span><span class="self">self</span>, out: <span class="kw-2">&amp;mut </span>[u8]) -&gt; io::Result&lt;usize&gt; {
<a href=#213 id=213 data-nosnippet>213</a> <span class="self">self</span>.reader.flush(out)
<a href=#214 id=214 data-nosnippet>214</a> }
<a href=#215 id=215 data-nosnippet>215</a>
<a href=#216 id=216 data-nosnippet>216</a> <span class="doccomment">/// Return the inner `Read`.
<a href=#217 id=217 data-nosnippet>217</a> ///
<a href=#218 id=218 data-nosnippet>218</a> /// Calling `finish()` is not *required* after reading a stream -
<a href=#219 id=219 data-nosnippet>219</a> /// just use it if you need to get the `Read` back.
<a href=#220 id=220 data-nosnippet>220</a> </span><span class="kw">pub fn </span>finish(<span class="self">self</span>) -&gt; R {
<a href=#221 id=221 data-nosnippet>221</a> <span class="self">self</span>.reader.into_inner()
<a href=#222 id=222 data-nosnippet>222</a> }
<a href=#223 id=223 data-nosnippet>223</a>
<a href=#224 id=224 data-nosnippet>224</a> <span class="macro">crate::encoder_common!</span>(reader);
<a href=#225 id=225 data-nosnippet>225</a>}
<a href=#226 id=226 data-nosnippet>226</a>
<a href=#227 id=227 data-nosnippet>227</a><span class="kw">impl</span>&lt;R: BufRead&gt; Read <span class="kw">for </span>Encoder&lt;<span class="lifetime">'_</span>, R&gt; {
<a href=#228 id=228 data-nosnippet>228</a> <span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; io::Result&lt;usize&gt; {
<a href=#229 id=229 data-nosnippet>229</a> <span class="self">self</span>.reader.read(buf)
<a href=#230 id=230 data-nosnippet>230</a> }
<a href=#231 id=231 data-nosnippet>231</a>}
<a href=#232 id=232 data-nosnippet>232</a>
<a href=#233 id=233 data-nosnippet>233</a><span class="kw">fn </span>_assert_traits() {
<a href=#234 id=234 data-nosnippet>234</a> <span class="kw">use </span>std::io::Cursor;
<a href=#235 id=235 data-nosnippet>235</a>
<a href=#236 id=236 data-nosnippet>236</a> <span class="kw">fn </span>_assert_send&lt;T: Send&gt;(<span class="kw">_</span>: T) {}
<a href=#237 id=237 data-nosnippet>237</a>
<a href=#238 id=238 data-nosnippet>238</a> _assert_send(Decoder::new(Cursor::new(Vec::new())));
<a href=#239 id=239 data-nosnippet>239</a> _assert_send(Encoder::new(Cursor::new(Vec::new()), <span class="number">1</span>));
<a href=#240 id=240 data-nosnippet>240</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,451 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zstd-0.13.3/src/stream/write/mod.rs`."><title>mod.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../../" data-static-root-path="../../../../static.files/" data-current-crate="zstd" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../../static.files/src-script-813739b1.js"></script><script defer src="../../../../src-files.js"></script><script defer src="../../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">zstd/stream/write/</div>mod.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! Implement push-based [`Write`] trait for both compressing and decompressing.
<a href=#2 id=2 data-nosnippet>2</a></span><span class="kw">use </span>std::io::{<span class="self">self</span>, Write};
<a href=#3 id=3 data-nosnippet>3</a>
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span>zstd_safe;
<a href=#5 id=5 data-nosnippet>5</a>
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span><span class="kw">crate</span>::dict::{DecoderDictionary, EncoderDictionary};
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span><span class="kw">crate</span>::stream::{raw, zio};
<a href=#8 id=8 data-nosnippet>8</a>
<a href=#9 id=9 data-nosnippet>9</a><span class="attr">#[cfg(test)]
<a href=#10 id=10 data-nosnippet>10</a></span><span class="kw">mod </span>tests;
<a href=#11 id=11 data-nosnippet>11</a>
<a href=#12 id=12 data-nosnippet>12</a><span class="doccomment">/// An encoder that compress and forward data to another writer.
<a href=#13 id=13 data-nosnippet>13</a>///
<a href=#14 id=14 data-nosnippet>14</a>/// This allows to compress a stream of data
<a href=#15 id=15 data-nosnippet>15</a>/// (good for files or heavy network stream).
<a href=#16 id=16 data-nosnippet>16</a>///
<a href=#17 id=17 data-nosnippet>17</a>/// Don't forget to call [`finish()`] before dropping it!
<a href=#18 id=18 data-nosnippet>18</a>///
<a href=#19 id=19 data-nosnippet>19</a>/// Alternatively, you can call [`auto_finish()`] to use an
<a href=#20 id=20 data-nosnippet>20</a>/// [`AutoFinishEncoder`] that will finish on drop.
<a href=#21 id=21 data-nosnippet>21</a>///
<a href=#22 id=22 data-nosnippet>22</a>/// Note: The zstd library has its own internal input buffer (~128kb).
<a href=#23 id=23 data-nosnippet>23</a>///
<a href=#24 id=24 data-nosnippet>24</a>/// [`finish()`]: #method.finish
<a href=#25 id=25 data-nosnippet>25</a>/// [`auto_finish()`]: #method.auto_finish
<a href=#26 id=26 data-nosnippet>26</a>/// [`AutoFinishEncoder`]: AutoFinishEncoder
<a href=#27 id=27 data-nosnippet>27</a></span><span class="kw">pub struct </span>Encoder&lt;<span class="lifetime">'a</span>, W: Write&gt; {
<a href=#28 id=28 data-nosnippet>28</a> <span class="comment">// output writer (compressed data)
<a href=#29 id=29 data-nosnippet>29</a> </span>writer: zio::Writer&lt;W, raw::Encoder&lt;<span class="lifetime">'a</span>&gt;&gt;,
<a href=#30 id=30 data-nosnippet>30</a>}
<a href=#31 id=31 data-nosnippet>31</a>
<a href=#32 id=32 data-nosnippet>32</a><span class="doccomment">/// A decoder that decompress and forward data to another writer.
<a href=#33 id=33 data-nosnippet>33</a>///
<a href=#34 id=34 data-nosnippet>34</a>/// Note that you probably want to `flush()` after writing your stream content.
<a href=#35 id=35 data-nosnippet>35</a>/// You can use [`auto_flush()`] to automatically flush the writer on drop.
<a href=#36 id=36 data-nosnippet>36</a>///
<a href=#37 id=37 data-nosnippet>37</a>/// [`auto_flush()`]: Decoder::auto_flush
<a href=#38 id=38 data-nosnippet>38</a></span><span class="kw">pub struct </span>Decoder&lt;<span class="lifetime">'a</span>, W: Write&gt; {
<a href=#39 id=39 data-nosnippet>39</a> <span class="comment">// output writer (decompressed data)
<a href=#40 id=40 data-nosnippet>40</a> </span>writer: zio::Writer&lt;W, raw::Decoder&lt;<span class="lifetime">'a</span>&gt;&gt;,
<a href=#41 id=41 data-nosnippet>41</a>}
<a href=#42 id=42 data-nosnippet>42</a>
<a href=#43 id=43 data-nosnippet>43</a><span class="doccomment">/// A wrapper around an `Encoder&lt;W&gt;` that finishes the stream on drop.
<a href=#44 id=44 data-nosnippet>44</a>///
<a href=#45 id=45 data-nosnippet>45</a>/// This can be created by the [`auto_finish()`] method on the [`Encoder`].
<a href=#46 id=46 data-nosnippet>46</a>///
<a href=#47 id=47 data-nosnippet>47</a>/// [`auto_finish()`]: Encoder::auto_finish
<a href=#48 id=48 data-nosnippet>48</a>/// [`Encoder`]: Encoder
<a href=#49 id=49 data-nosnippet>49</a></span><span class="kw">pub struct </span>AutoFinishEncoder&lt;
<a href=#50 id=50 data-nosnippet>50</a> <span class="lifetime">'a</span>,
<a href=#51 id=51 data-nosnippet>51</a> W: Write,
<a href=#52 id=52 data-nosnippet>52</a> F: FnMut(io::Result&lt;W&gt;) = Box&lt;<span class="kw">dyn </span>Send + FnMut(io::Result&lt;W&gt;)&gt;,
<a href=#53 id=53 data-nosnippet>53</a>&gt; {
<a href=#54 id=54 data-nosnippet>54</a> <span class="comment">// We wrap this in an option to take it during drop.
<a href=#55 id=55 data-nosnippet>55</a> </span>encoder: <span class="prelude-ty">Option</span>&lt;Encoder&lt;<span class="lifetime">'a</span>, W&gt;&gt;,
<a href=#56 id=56 data-nosnippet>56</a>
<a href=#57 id=57 data-nosnippet>57</a> on_finish: <span class="prelude-ty">Option</span>&lt;F&gt;,
<a href=#58 id=58 data-nosnippet>58</a>}
<a href=#59 id=59 data-nosnippet>59</a>
<a href=#60 id=60 data-nosnippet>60</a><span class="doccomment">/// A wrapper around a `Decoder&lt;W&gt;` that flushes the stream on drop.
<a href=#61 id=61 data-nosnippet>61</a>///
<a href=#62 id=62 data-nosnippet>62</a>/// This can be created by the [`auto_flush()`] method on the [`Decoder`].
<a href=#63 id=63 data-nosnippet>63</a>///
<a href=#64 id=64 data-nosnippet>64</a>/// [`auto_flush()`]: Decoder::auto_flush
<a href=#65 id=65 data-nosnippet>65</a>/// [`Decoder`]: Decoder
<a href=#66 id=66 data-nosnippet>66</a></span><span class="kw">pub struct </span>AutoFlushDecoder&lt;
<a href=#67 id=67 data-nosnippet>67</a> <span class="lifetime">'a</span>,
<a href=#68 id=68 data-nosnippet>68</a> W: Write,
<a href=#69 id=69 data-nosnippet>69</a> F: FnMut(io::Result&lt;()&gt;) = Box&lt;<span class="kw">dyn </span>Send + FnMut(io::Result&lt;()&gt;)&gt;,
<a href=#70 id=70 data-nosnippet>70</a>&gt; {
<a href=#71 id=71 data-nosnippet>71</a> <span class="comment">// We wrap this in an option to take it during drop.
<a href=#72 id=72 data-nosnippet>72</a> </span>decoder: <span class="prelude-ty">Option</span>&lt;Decoder&lt;<span class="lifetime">'a</span>, W&gt;&gt;,
<a href=#73 id=73 data-nosnippet>73</a>
<a href=#74 id=74 data-nosnippet>74</a> on_flush: <span class="prelude-ty">Option</span>&lt;F&gt;,
<a href=#75 id=75 data-nosnippet>75</a>}
<a href=#76 id=76 data-nosnippet>76</a>
<a href=#77 id=77 data-nosnippet>77</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, W: Write, F: FnMut(io::Result&lt;()&gt;)&gt; AutoFlushDecoder&lt;<span class="lifetime">'a</span>, W, F&gt; {
<a href=#78 id=78 data-nosnippet>78</a> <span class="kw">fn </span>new(decoder: Decoder&lt;<span class="lifetime">'a</span>, W&gt;, on_flush: F) -&gt; <span class="self">Self </span>{
<a href=#79 id=79 data-nosnippet>79</a> AutoFlushDecoder {
<a href=#80 id=80 data-nosnippet>80</a> decoder: <span class="prelude-val">Some</span>(decoder),
<a href=#81 id=81 data-nosnippet>81</a> on_flush: <span class="prelude-val">Some</span>(on_flush),
<a href=#82 id=82 data-nosnippet>82</a> }
<a href=#83 id=83 data-nosnippet>83</a> }
<a href=#84 id=84 data-nosnippet>84</a>
<a href=#85 id=85 data-nosnippet>85</a> <span class="doccomment">/// Acquires a reference to the underlying writer.
<a href=#86 id=86 data-nosnippet>86</a> </span><span class="kw">pub fn </span>get_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>W {
<a href=#87 id=87 data-nosnippet>87</a> <span class="self">self</span>.decoder.as_ref().unwrap().get_ref()
<a href=#88 id=88 data-nosnippet>88</a> }
<a href=#89 id=89 data-nosnippet>89</a>
<a href=#90 id=90 data-nosnippet>90</a> <span class="doccomment">/// Acquires a mutable reference to the underlying writer.
<a href=#91 id=91 data-nosnippet>91</a> ///
<a href=#92 id=92 data-nosnippet>92</a> /// Note that mutation of the writer may result in surprising results if
<a href=#93 id=93 data-nosnippet>93</a> /// this decoder is continued to be used.
<a href=#94 id=94 data-nosnippet>94</a> ///
<a href=#95 id=95 data-nosnippet>95</a> /// Mostly used for testing purposes.
<a href=#96 id=96 data-nosnippet>96</a> </span><span class="kw">pub fn </span>get_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>W {
<a href=#97 id=97 data-nosnippet>97</a> <span class="self">self</span>.decoder.as_mut().unwrap().get_mut()
<a href=#98 id=98 data-nosnippet>98</a> }
<a href=#99 id=99 data-nosnippet>99</a>}
<a href=#100 id=100 data-nosnippet>100</a>
<a href=#101 id=101 data-nosnippet>101</a><span class="kw">impl</span>&lt;W, F&gt; Drop <span class="kw">for </span>AutoFlushDecoder&lt;<span class="lifetime">'_</span>, W, F&gt;
<a href=#102 id=102 data-nosnippet>102</a><span class="kw">where
<a href=#103 id=103 data-nosnippet>103</a> </span>W: Write,
<a href=#104 id=104 data-nosnippet>104</a> F: FnMut(io::Result&lt;()&gt;),
<a href=#105 id=105 data-nosnippet>105</a>{
<a href=#106 id=106 data-nosnippet>106</a> <span class="kw">fn </span>drop(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<a href=#107 id=107 data-nosnippet>107</a> <span class="kw">let </span><span class="kw-2">mut </span>decoder = <span class="self">self</span>.decoder.take().unwrap();
<a href=#108 id=108 data-nosnippet>108</a> <span class="kw">let </span>result = decoder.flush();
<a href=#109 id=109 data-nosnippet>109</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(<span class="kw-2">mut </span>on_finish) = <span class="self">self</span>.on_flush.take() {
<a href=#110 id=110 data-nosnippet>110</a> on_finish(result);
<a href=#111 id=111 data-nosnippet>111</a> }
<a href=#112 id=112 data-nosnippet>112</a> }
<a href=#113 id=113 data-nosnippet>113</a>}
<a href=#114 id=114 data-nosnippet>114</a>
<a href=#115 id=115 data-nosnippet>115</a><span class="kw">impl</span>&lt;W: Write, F: FnMut(io::Result&lt;()&gt;)&gt; Write <span class="kw">for </span>AutoFlushDecoder&lt;<span class="lifetime">'_</span>, W, F&gt; {
<a href=#116 id=116 data-nosnippet>116</a> <span class="kw">fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;usize&gt; {
<a href=#117 id=117 data-nosnippet>117</a> <span class="self">self</span>.decoder.as_mut().unwrap().write(buf)
<a href=#118 id=118 data-nosnippet>118</a> }
<a href=#119 id=119 data-nosnippet>119</a>
<a href=#120 id=120 data-nosnippet>120</a> <span class="kw">fn </span>flush(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; io::Result&lt;()&gt; {
<a href=#121 id=121 data-nosnippet>121</a> <span class="self">self</span>.decoder.as_mut().unwrap().flush()
<a href=#122 id=122 data-nosnippet>122</a> }
<a href=#123 id=123 data-nosnippet>123</a>}
<a href=#124 id=124 data-nosnippet>124</a>
<a href=#125 id=125 data-nosnippet>125</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, W: Write, F: FnMut(io::Result&lt;W&gt;)&gt; AutoFinishEncoder&lt;<span class="lifetime">'a</span>, W, F&gt; {
<a href=#126 id=126 data-nosnippet>126</a> <span class="kw">fn </span>new(encoder: Encoder&lt;<span class="lifetime">'a</span>, W&gt;, on_finish: F) -&gt; <span class="self">Self </span>{
<a href=#127 id=127 data-nosnippet>127</a> AutoFinishEncoder {
<a href=#128 id=128 data-nosnippet>128</a> encoder: <span class="prelude-val">Some</span>(encoder),
<a href=#129 id=129 data-nosnippet>129</a> on_finish: <span class="prelude-val">Some</span>(on_finish),
<a href=#130 id=130 data-nosnippet>130</a> }
<a href=#131 id=131 data-nosnippet>131</a> }
<a href=#132 id=132 data-nosnippet>132</a>
<a href=#133 id=133 data-nosnippet>133</a> <span class="doccomment">/// Acquires a reference to the underlying writer.
<a href=#134 id=134 data-nosnippet>134</a> </span><span class="kw">pub fn </span>get_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>W {
<a href=#135 id=135 data-nosnippet>135</a> <span class="self">self</span>.encoder.as_ref().unwrap().get_ref()
<a href=#136 id=136 data-nosnippet>136</a> }
<a href=#137 id=137 data-nosnippet>137</a>
<a href=#138 id=138 data-nosnippet>138</a> <span class="doccomment">/// Acquires a mutable reference to the underlying writer.
<a href=#139 id=139 data-nosnippet>139</a> ///
<a href=#140 id=140 data-nosnippet>140</a> /// Note that mutation of the writer may result in surprising results if
<a href=#141 id=141 data-nosnippet>141</a> /// this encoder is continued to be used.
<a href=#142 id=142 data-nosnippet>142</a> ///
<a href=#143 id=143 data-nosnippet>143</a> /// Mostly used for testing purposes.
<a href=#144 id=144 data-nosnippet>144</a> </span><span class="kw">pub fn </span>get_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>W {
<a href=#145 id=145 data-nosnippet>145</a> <span class="self">self</span>.encoder.as_mut().unwrap().get_mut()
<a href=#146 id=146 data-nosnippet>146</a> }
<a href=#147 id=147 data-nosnippet>147</a>}
<a href=#148 id=148 data-nosnippet>148</a>
<a href=#149 id=149 data-nosnippet>149</a><span class="kw">impl</span>&lt;W: Write, F: FnMut(io::Result&lt;W&gt;)&gt; Drop <span class="kw">for </span>AutoFinishEncoder&lt;<span class="lifetime">'_</span>, W, F&gt; {
<a href=#150 id=150 data-nosnippet>150</a> <span class="kw">fn </span>drop(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<a href=#151 id=151 data-nosnippet>151</a> <span class="kw">let </span>result = <span class="self">self</span>.encoder.take().unwrap().finish();
<a href=#152 id=152 data-nosnippet>152</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(<span class="kw-2">mut </span>on_finish) = <span class="self">self</span>.on_finish.take() {
<a href=#153 id=153 data-nosnippet>153</a> on_finish(result);
<a href=#154 id=154 data-nosnippet>154</a> }
<a href=#155 id=155 data-nosnippet>155</a> }
<a href=#156 id=156 data-nosnippet>156</a>}
<a href=#157 id=157 data-nosnippet>157</a>
<a href=#158 id=158 data-nosnippet>158</a><span class="kw">impl</span>&lt;W: Write, F: FnMut(io::Result&lt;W&gt;)&gt; Write <span class="kw">for </span>AutoFinishEncoder&lt;<span class="lifetime">'_</span>, W, F&gt; {
<a href=#159 id=159 data-nosnippet>159</a> <span class="kw">fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;usize&gt; {
<a href=#160 id=160 data-nosnippet>160</a> <span class="self">self</span>.encoder.as_mut().unwrap().write(buf)
<a href=#161 id=161 data-nosnippet>161</a> }
<a href=#162 id=162 data-nosnippet>162</a>
<a href=#163 id=163 data-nosnippet>163</a> <span class="kw">fn </span>flush(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; io::Result&lt;()&gt; {
<a href=#164 id=164 data-nosnippet>164</a> <span class="self">self</span>.encoder.as_mut().unwrap().flush()
<a href=#165 id=165 data-nosnippet>165</a> }
<a href=#166 id=166 data-nosnippet>166</a>}
<a href=#167 id=167 data-nosnippet>167</a>
<a href=#168 id=168 data-nosnippet>168</a><span class="kw">impl</span>&lt;W: Write&gt; Encoder&lt;<span class="lifetime">'static</span>, W&gt; {
<a href=#169 id=169 data-nosnippet>169</a> <span class="doccomment">/// Creates a new encoder.
<a href=#170 id=170 data-nosnippet>170</a> ///
<a href=#171 id=171 data-nosnippet>171</a> /// `level`: compression level (1-22).
<a href=#172 id=172 data-nosnippet>172</a> ///
<a href=#173 id=173 data-nosnippet>173</a> /// A level of `0` uses zstd's default (currently `3`).
<a href=#174 id=174 data-nosnippet>174</a> </span><span class="kw">pub fn </span>new(writer: W, level: i32) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#175 id=175 data-nosnippet>175</a> <span class="self">Self</span>::with_dictionary(writer, level, <span class="kw-2">&amp;</span>[])
<a href=#176 id=176 data-nosnippet>176</a> }
<a href=#177 id=177 data-nosnippet>177</a>
<a href=#178 id=178 data-nosnippet>178</a> <span class="doccomment">/// Creates a new encoder, using an existing dictionary.
<a href=#179 id=179 data-nosnippet>179</a> ///
<a href=#180 id=180 data-nosnippet>180</a> /// (Provides better compression ratio for small files,
<a href=#181 id=181 data-nosnippet>181</a> /// but requires the dictionary to be present during decompression.)
<a href=#182 id=182 data-nosnippet>182</a> ///
<a href=#183 id=183 data-nosnippet>183</a> /// A level of `0` uses zstd's default (currently `3`).
<a href=#184 id=184 data-nosnippet>184</a> </span><span class="kw">pub fn </span>with_dictionary(
<a href=#185 id=185 data-nosnippet>185</a> writer: W,
<a href=#186 id=186 data-nosnippet>186</a> level: i32,
<a href=#187 id=187 data-nosnippet>187</a> dictionary: <span class="kw-2">&amp;</span>[u8],
<a href=#188 id=188 data-nosnippet>188</a> ) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#189 id=189 data-nosnippet>189</a> <span class="kw">let </span>encoder = raw::Encoder::with_dictionary(level, dictionary)<span class="question-mark">?</span>;
<a href=#190 id=190 data-nosnippet>190</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::with_encoder(writer, encoder))
<a href=#191 id=191 data-nosnippet>191</a> }
<a href=#192 id=192 data-nosnippet>192</a>}
<a href=#193 id=193 data-nosnippet>193</a>
<a href=#194 id=194 data-nosnippet>194</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, W: Write&gt; Encoder&lt;<span class="lifetime">'a</span>, W&gt; {
<a href=#195 id=195 data-nosnippet>195</a> <span class="doccomment">/// Creates a new encoder from a prepared zio writer.
<a href=#196 id=196 data-nosnippet>196</a> </span><span class="kw">pub fn </span>with_writer(writer: zio::Writer&lt;W, raw::Encoder&lt;<span class="lifetime">'a</span>&gt;&gt;) -&gt; <span class="self">Self </span>{
<a href=#197 id=197 data-nosnippet>197</a> <span class="self">Self </span>{ writer }
<a href=#198 id=198 data-nosnippet>198</a> }
<a href=#199 id=199 data-nosnippet>199</a>
<a href=#200 id=200 data-nosnippet>200</a> <span class="doccomment">/// Creates a new encoder from the given `Write` and raw encoder.
<a href=#201 id=201 data-nosnippet>201</a> </span><span class="kw">pub fn </span>with_encoder(writer: W, encoder: raw::Encoder&lt;<span class="lifetime">'a</span>&gt;) -&gt; <span class="self">Self </span>{
<a href=#202 id=202 data-nosnippet>202</a> <span class="kw">let </span>writer = zio::Writer::new(writer, encoder);
<a href=#203 id=203 data-nosnippet>203</a> <span class="self">Self</span>::with_writer(writer)
<a href=#204 id=204 data-nosnippet>204</a> }
<a href=#205 id=205 data-nosnippet>205</a>
<a href=#206 id=206 data-nosnippet>206</a> <span class="doccomment">/// Creates an encoder that uses the provided context to compress a stream.
<a href=#207 id=207 data-nosnippet>207</a> </span><span class="kw">pub fn </span>with_context(
<a href=#208 id=208 data-nosnippet>208</a> writer: W,
<a href=#209 id=209 data-nosnippet>209</a> context: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>zstd_safe::CCtx&lt;<span class="lifetime">'static</span>&gt;,
<a href=#210 id=210 data-nosnippet>210</a> ) -&gt; <span class="self">Self </span>{
<a href=#211 id=211 data-nosnippet>211</a> <span class="kw">let </span>encoder = raw::Encoder::with_context(context);
<a href=#212 id=212 data-nosnippet>212</a> <span class="self">Self</span>::with_encoder(writer, encoder)
<a href=#213 id=213 data-nosnippet>213</a> }
<a href=#214 id=214 data-nosnippet>214</a>
<a href=#215 id=215 data-nosnippet>215</a> <span class="doccomment">/// Creates a new encoder, using an existing prepared `EncoderDictionary`.
<a href=#216 id=216 data-nosnippet>216</a> ///
<a href=#217 id=217 data-nosnippet>217</a> /// (Provides better compression ratio for small files,
<a href=#218 id=218 data-nosnippet>218</a> /// but requires the dictionary to be present during decompression.)
<a href=#219 id=219 data-nosnippet>219</a> </span><span class="kw">pub fn </span>with_prepared_dictionary&lt;<span class="lifetime">'b</span>&gt;(
<a href=#220 id=220 data-nosnippet>220</a> writer: W,
<a href=#221 id=221 data-nosnippet>221</a> dictionary: <span class="kw-2">&amp;</span>EncoderDictionary&lt;<span class="lifetime">'b</span>&gt;,
<a href=#222 id=222 data-nosnippet>222</a> ) -&gt; io::Result&lt;<span class="self">Self</span>&gt;
<a href=#223 id=223 data-nosnippet>223</a> <span class="kw">where
<a href=#224 id=224 data-nosnippet>224</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#225 id=225 data-nosnippet>225</a> {
<a href=#226 id=226 data-nosnippet>226</a> <span class="kw">let </span>encoder = raw::Encoder::with_prepared_dictionary(dictionary)<span class="question-mark">?</span>;
<a href=#227 id=227 data-nosnippet>227</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::with_encoder(writer, encoder))
<a href=#228 id=228 data-nosnippet>228</a> }
<a href=#229 id=229 data-nosnippet>229</a>
<a href=#230 id=230 data-nosnippet>230</a> <span class="doccomment">/// Creates a new encoder, using a ref prefix
<a href=#231 id=231 data-nosnippet>231</a> </span><span class="kw">pub fn </span>with_ref_prefix&lt;<span class="lifetime">'b</span>&gt;(
<a href=#232 id=232 data-nosnippet>232</a> writer: W,
<a href=#233 id=233 data-nosnippet>233</a> level: i32,
<a href=#234 id=234 data-nosnippet>234</a> ref_prefix: <span class="kw-2">&amp;</span><span class="lifetime">'b </span>[u8],
<a href=#235 id=235 data-nosnippet>235</a> ) -&gt; io::Result&lt;<span class="self">Self</span>&gt;
<a href=#236 id=236 data-nosnippet>236</a> <span class="kw">where
<a href=#237 id=237 data-nosnippet>237</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#238 id=238 data-nosnippet>238</a> {
<a href=#239 id=239 data-nosnippet>239</a> <span class="kw">let </span>encoder = raw::Encoder::with_ref_prefix(level, ref_prefix)<span class="question-mark">?</span>;
<a href=#240 id=240 data-nosnippet>240</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::with_encoder(writer, encoder))
<a href=#241 id=241 data-nosnippet>241</a> }
<a href=#242 id=242 data-nosnippet>242</a>
<a href=#243 id=243 data-nosnippet>243</a> <span class="doccomment">/// Returns a wrapper around `self` that will finish the stream on drop.
<a href=#244 id=244 data-nosnippet>244</a> </span><span class="kw">pub fn </span>auto_finish(<span class="self">self</span>) -&gt; AutoFinishEncoder&lt;<span class="lifetime">'a</span>, W&gt; {
<a href=#245 id=245 data-nosnippet>245</a> AutoFinishEncoder {
<a href=#246 id=246 data-nosnippet>246</a> encoder: <span class="prelude-val">Some</span>(<span class="self">self</span>),
<a href=#247 id=247 data-nosnippet>247</a> on_finish: <span class="prelude-val">None</span>,
<a href=#248 id=248 data-nosnippet>248</a> }
<a href=#249 id=249 data-nosnippet>249</a> }
<a href=#250 id=250 data-nosnippet>250</a>
<a href=#251 id=251 data-nosnippet>251</a> <span class="doccomment">/// Returns an encoder that will finish the stream on drop.
<a href=#252 id=252 data-nosnippet>252</a> ///
<a href=#253 id=253 data-nosnippet>253</a> /// Calls the given callback with the result from `finish()`. This runs during drop so it's
<a href=#254 id=254 data-nosnippet>254</a> /// important that the provided callback doesn't panic.
<a href=#255 id=255 data-nosnippet>255</a> </span><span class="kw">pub fn </span>on_finish&lt;F: FnMut(io::Result&lt;W&gt;)&gt;(
<a href=#256 id=256 data-nosnippet>256</a> <span class="self">self</span>,
<a href=#257 id=257 data-nosnippet>257</a> f: F,
<a href=#258 id=258 data-nosnippet>258</a> ) -&gt; AutoFinishEncoder&lt;<span class="lifetime">'a</span>, W, F&gt; {
<a href=#259 id=259 data-nosnippet>259</a> AutoFinishEncoder::new(<span class="self">self</span>, f)
<a href=#260 id=260 data-nosnippet>260</a> }
<a href=#261 id=261 data-nosnippet>261</a>
<a href=#262 id=262 data-nosnippet>262</a> <span class="doccomment">/// Acquires a reference to the underlying writer.
<a href=#263 id=263 data-nosnippet>263</a> </span><span class="kw">pub fn </span>get_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>W {
<a href=#264 id=264 data-nosnippet>264</a> <span class="self">self</span>.writer.writer()
<a href=#265 id=265 data-nosnippet>265</a> }
<a href=#266 id=266 data-nosnippet>266</a>
<a href=#267 id=267 data-nosnippet>267</a> <span class="doccomment">/// Acquires a mutable reference to the underlying writer.
<a href=#268 id=268 data-nosnippet>268</a> ///
<a href=#269 id=269 data-nosnippet>269</a> /// Note that mutation of the writer may result in surprising results if
<a href=#270 id=270 data-nosnippet>270</a> /// this encoder is continued to be used.
<a href=#271 id=271 data-nosnippet>271</a> </span><span class="kw">pub fn </span>get_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>W {
<a href=#272 id=272 data-nosnippet>272</a> <span class="self">self</span>.writer.writer_mut()
<a href=#273 id=273 data-nosnippet>273</a> }
<a href=#274 id=274 data-nosnippet>274</a>
<a href=#275 id=275 data-nosnippet>275</a> <span class="doccomment">/// **Required**: Finishes the stream.
<a href=#276 id=276 data-nosnippet>276</a> ///
<a href=#277 id=277 data-nosnippet>277</a> /// You *need* to finish the stream when you're done writing, either with
<a href=#278 id=278 data-nosnippet>278</a> /// this method or with [`try_finish(self)`](#method.try_finish).
<a href=#279 id=279 data-nosnippet>279</a> ///
<a href=#280 id=280 data-nosnippet>280</a> /// This returns the inner writer in case you need it.
<a href=#281 id=281 data-nosnippet>281</a> ///
<a href=#282 id=282 data-nosnippet>282</a> /// To get back `self` in case an error happened, use `try_finish`.
<a href=#283 id=283 data-nosnippet>283</a> ///
<a href=#284 id=284 data-nosnippet>284</a> /// **Note**: If you don't want (or can't) call `finish()` manually after
<a href=#285 id=285 data-nosnippet>285</a> /// writing your data, consider using `auto_finish()` to get an
<a href=#286 id=286 data-nosnippet>286</a> /// `AutoFinishEncoder`.
<a href=#287 id=287 data-nosnippet>287</a> </span><span class="kw">pub fn </span>finish(<span class="self">self</span>) -&gt; io::Result&lt;W&gt; {
<a href=#288 id=288 data-nosnippet>288</a> <span class="self">self</span>.try_finish().map_err(|(<span class="kw">_</span>, err)| err)
<a href=#289 id=289 data-nosnippet>289</a> }
<a href=#290 id=290 data-nosnippet>290</a>
<a href=#291 id=291 data-nosnippet>291</a> <span class="doccomment">/// **Required**: Attempts to finish the stream.
<a href=#292 id=292 data-nosnippet>292</a> ///
<a href=#293 id=293 data-nosnippet>293</a> /// You *need* to finish the stream when you're done writing, either with
<a href=#294 id=294 data-nosnippet>294</a> /// this method or with [`finish(self)`](#method.finish).
<a href=#295 id=295 data-nosnippet>295</a> ///
<a href=#296 id=296 data-nosnippet>296</a> /// This returns the inner writer if the finish was successful, or the
<a href=#297 id=297 data-nosnippet>297</a> /// object plus an error if it wasn't.
<a href=#298 id=298 data-nosnippet>298</a> ///
<a href=#299 id=299 data-nosnippet>299</a> /// `write` on this object will panic after `try_finish` has been called,
<a href=#300 id=300 data-nosnippet>300</a> /// even if it fails.
<a href=#301 id=301 data-nosnippet>301</a> </span><span class="kw">pub fn </span>try_finish(<span class="kw-2">mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;W, (<span class="self">Self</span>, io::Error)&gt; {
<a href=#302 id=302 data-nosnippet>302</a> <span class="kw">match </span><span class="self">self</span>.writer.finish() {
<a href=#303 id=303 data-nosnippet>303</a> <span class="comment">// Return the writer, because why not
<a href=#304 id=304 data-nosnippet>304</a> </span><span class="prelude-val">Ok</span>(()) =&gt; <span class="prelude-val">Ok</span>(<span class="self">self</span>.writer.into_inner().<span class="number">0</span>),
<a href=#305 id=305 data-nosnippet>305</a> <span class="prelude-val">Err</span>(e) =&gt; <span class="prelude-val">Err</span>((<span class="self">self</span>, e)),
<a href=#306 id=306 data-nosnippet>306</a> }
<a href=#307 id=307 data-nosnippet>307</a> }
<a href=#308 id=308 data-nosnippet>308</a>
<a href=#309 id=309 data-nosnippet>309</a> <span class="doccomment">/// Attempts to finish the stream.
<a href=#310 id=310 data-nosnippet>310</a> ///
<a href=#311 id=311 data-nosnippet>311</a> /// You *need* to finish the stream when you're done writing, either with
<a href=#312 id=312 data-nosnippet>312</a> /// this method or with [`finish(self)`](#method.finish).
<a href=#313 id=313 data-nosnippet>313</a> </span><span class="kw">pub fn </span>do_finish(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; io::Result&lt;()&gt; {
<a href=#314 id=314 data-nosnippet>314</a> <span class="self">self</span>.writer.finish()
<a href=#315 id=315 data-nosnippet>315</a> }
<a href=#316 id=316 data-nosnippet>316</a>
<a href=#317 id=317 data-nosnippet>317</a> <span class="doccomment">/// Return a recommendation for the size of data to write at once.
<a href=#318 id=318 data-nosnippet>318</a> </span><span class="kw">pub fn </span>recommended_input_size() -&gt; usize {
<a href=#319 id=319 data-nosnippet>319</a> zstd_safe::CCtx::in_size()
<a href=#320 id=320 data-nosnippet>320</a> }
<a href=#321 id=321 data-nosnippet>321</a>
<a href=#322 id=322 data-nosnippet>322</a> <span class="macro">crate::encoder_common!</span>(writer);
<a href=#323 id=323 data-nosnippet>323</a>}
<a href=#324 id=324 data-nosnippet>324</a>
<a href=#325 id=325 data-nosnippet>325</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, W: Write&gt; Write <span class="kw">for </span>Encoder&lt;<span class="lifetime">'a</span>, W&gt; {
<a href=#326 id=326 data-nosnippet>326</a> <span class="kw">fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;usize&gt; {
<a href=#327 id=327 data-nosnippet>327</a> <span class="self">self</span>.writer.write(buf)
<a href=#328 id=328 data-nosnippet>328</a> }
<a href=#329 id=329 data-nosnippet>329</a>
<a href=#330 id=330 data-nosnippet>330</a> <span class="kw">fn </span>flush(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; io::Result&lt;()&gt; {
<a href=#331 id=331 data-nosnippet>331</a> <span class="self">self</span>.writer.flush()
<a href=#332 id=332 data-nosnippet>332</a> }
<a href=#333 id=333 data-nosnippet>333</a>}
<a href=#334 id=334 data-nosnippet>334</a>
<a href=#335 id=335 data-nosnippet>335</a><span class="kw">impl</span>&lt;W: Write&gt; Decoder&lt;<span class="lifetime">'static</span>, W&gt; {
<a href=#336 id=336 data-nosnippet>336</a> <span class="doccomment">/// Creates a new decoder.
<a href=#337 id=337 data-nosnippet>337</a> </span><span class="kw">pub fn </span>new(writer: W) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#338 id=338 data-nosnippet>338</a> <span class="self">Self</span>::with_dictionary(writer, <span class="kw-2">&amp;</span>[])
<a href=#339 id=339 data-nosnippet>339</a> }
<a href=#340 id=340 data-nosnippet>340</a>
<a href=#341 id=341 data-nosnippet>341</a> <span class="doccomment">/// Creates a new decoder, using an existing dictionary.
<a href=#342 id=342 data-nosnippet>342</a> ///
<a href=#343 id=343 data-nosnippet>343</a> /// (Provides better compression ratio for small files,
<a href=#344 id=344 data-nosnippet>344</a> /// but requires the dictionary to be present during decompression.)
<a href=#345 id=345 data-nosnippet>345</a> </span><span class="kw">pub fn </span>with_dictionary(writer: W, dictionary: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;<span class="self">Self</span>&gt; {
<a href=#346 id=346 data-nosnippet>346</a> <span class="kw">let </span>decoder = raw::Decoder::with_dictionary(dictionary)<span class="question-mark">?</span>;
<a href=#347 id=347 data-nosnippet>347</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::with_decoder(writer, decoder))
<a href=#348 id=348 data-nosnippet>348</a> }
<a href=#349 id=349 data-nosnippet>349</a>}
<a href=#350 id=350 data-nosnippet>350</a>
<a href=#351 id=351 data-nosnippet>351</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, W: Write&gt; Decoder&lt;<span class="lifetime">'a</span>, W&gt; {
<a href=#352 id=352 data-nosnippet>352</a> <span class="doccomment">/// Creates a new decoder around the given prepared zio writer.
<a href=#353 id=353 data-nosnippet>353</a> ///
<a href=#354 id=354 data-nosnippet>354</a> /// # Examples
<a href=#355 id=355 data-nosnippet>355</a> ///
<a href=#356 id=356 data-nosnippet>356</a> /// ```rust
<a href=#357 id=357 data-nosnippet>357</a> /// fn wrap&lt;W: std::io::Write&gt;(writer: W) -&gt; zstd::stream::write::Decoder&lt;'static, W&gt; {
<a href=#358 id=358 data-nosnippet>358</a> /// let decoder = zstd::stream::raw::Decoder::new().unwrap();
<a href=#359 id=359 data-nosnippet>359</a> /// let writer = zstd::stream::zio::Writer::new(writer, decoder);
<a href=#360 id=360 data-nosnippet>360</a> /// zstd::stream::write::Decoder::with_writer(writer)
<a href=#361 id=361 data-nosnippet>361</a> /// }
<a href=#362 id=362 data-nosnippet>362</a> /// ```
<a href=#363 id=363 data-nosnippet>363</a> </span><span class="kw">pub fn </span>with_writer(writer: zio::Writer&lt;W, raw::Decoder&lt;<span class="lifetime">'a</span>&gt;&gt;) -&gt; <span class="self">Self </span>{
<a href=#364 id=364 data-nosnippet>364</a> Decoder { writer }
<a href=#365 id=365 data-nosnippet>365</a> }
<a href=#366 id=366 data-nosnippet>366</a>
<a href=#367 id=367 data-nosnippet>367</a> <span class="doccomment">/// Creates a new decoder around the given `Write` and raw decoder.
<a href=#368 id=368 data-nosnippet>368</a> </span><span class="kw">pub fn </span>with_decoder(writer: W, decoder: raw::Decoder&lt;<span class="lifetime">'a</span>&gt;) -&gt; <span class="self">Self </span>{
<a href=#369 id=369 data-nosnippet>369</a> <span class="kw">let </span>writer = zio::Writer::new(writer, decoder);
<a href=#370 id=370 data-nosnippet>370</a> Decoder { writer }
<a href=#371 id=371 data-nosnippet>371</a> }
<a href=#372 id=372 data-nosnippet>372</a>
<a href=#373 id=373 data-nosnippet>373</a> <span class="doccomment">/// Creates a new decoder, using an existing prepared `DecoderDictionary`.
<a href=#374 id=374 data-nosnippet>374</a> ///
<a href=#375 id=375 data-nosnippet>375</a> /// (Provides better compression ratio for small files,
<a href=#376 id=376 data-nosnippet>376</a> /// but requires the dictionary to be present during decompression.)
<a href=#377 id=377 data-nosnippet>377</a> </span><span class="kw">pub fn </span>with_prepared_dictionary&lt;<span class="lifetime">'b</span>&gt;(
<a href=#378 id=378 data-nosnippet>378</a> writer: W,
<a href=#379 id=379 data-nosnippet>379</a> dictionary: <span class="kw-2">&amp;</span>DecoderDictionary&lt;<span class="lifetime">'b</span>&gt;,
<a href=#380 id=380 data-nosnippet>380</a> ) -&gt; io::Result&lt;<span class="self">Self</span>&gt;
<a href=#381 id=381 data-nosnippet>381</a> <span class="kw">where
<a href=#382 id=382 data-nosnippet>382</a> </span><span class="lifetime">'b</span>: <span class="lifetime">'a</span>,
<a href=#383 id=383 data-nosnippet>383</a> {
<a href=#384 id=384 data-nosnippet>384</a> <span class="kw">let </span>decoder = raw::Decoder::with_prepared_dictionary(dictionary)<span class="question-mark">?</span>;
<a href=#385 id=385 data-nosnippet>385</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::with_decoder(writer, decoder))
<a href=#386 id=386 data-nosnippet>386</a> }
<a href=#387 id=387 data-nosnippet>387</a>
<a href=#388 id=388 data-nosnippet>388</a> <span class="doccomment">/// Acquires a reference to the underlying writer.
<a href=#389 id=389 data-nosnippet>389</a> </span><span class="kw">pub fn </span>get_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>W {
<a href=#390 id=390 data-nosnippet>390</a> <span class="self">self</span>.writer.writer()
<a href=#391 id=391 data-nosnippet>391</a> }
<a href=#392 id=392 data-nosnippet>392</a>
<a href=#393 id=393 data-nosnippet>393</a> <span class="doccomment">/// Acquires a mutable reference to the underlying writer.
<a href=#394 id=394 data-nosnippet>394</a> ///
<a href=#395 id=395 data-nosnippet>395</a> /// Note that mutation of the writer may result in surprising results if
<a href=#396 id=396 data-nosnippet>396</a> /// this decoder is continued to be used.
<a href=#397 id=397 data-nosnippet>397</a> </span><span class="kw">pub fn </span>get_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>W {
<a href=#398 id=398 data-nosnippet>398</a> <span class="self">self</span>.writer.writer_mut()
<a href=#399 id=399 data-nosnippet>399</a> }
<a href=#400 id=400 data-nosnippet>400</a>
<a href=#401 id=401 data-nosnippet>401</a> <span class="doccomment">/// Returns the inner `Write`.
<a href=#402 id=402 data-nosnippet>402</a> </span><span class="kw">pub fn </span>into_inner(<span class="self">self</span>) -&gt; W {
<a href=#403 id=403 data-nosnippet>403</a> <span class="self">self</span>.writer.into_inner().<span class="number">0
<a href=#404 id=404 data-nosnippet>404</a> </span>}
<a href=#405 id=405 data-nosnippet>405</a>
<a href=#406 id=406 data-nosnippet>406</a> <span class="doccomment">/// Return a recommendation for the size of data to write at once.
<a href=#407 id=407 data-nosnippet>407</a> </span><span class="kw">pub fn </span>recommended_input_size() -&gt; usize {
<a href=#408 id=408 data-nosnippet>408</a> zstd_safe::DCtx::in_size()
<a href=#409 id=409 data-nosnippet>409</a> }
<a href=#410 id=410 data-nosnippet>410</a>
<a href=#411 id=411 data-nosnippet>411</a> <span class="doccomment">/// Returns a wrapper around `self` that will flush the stream on drop.
<a href=#412 id=412 data-nosnippet>412</a> </span><span class="kw">pub fn </span>auto_flush(<span class="self">self</span>) -&gt; AutoFlushDecoder&lt;<span class="lifetime">'a</span>, W&gt; {
<a href=#413 id=413 data-nosnippet>413</a> AutoFlushDecoder {
<a href=#414 id=414 data-nosnippet>414</a> decoder: <span class="prelude-val">Some</span>(<span class="self">self</span>),
<a href=#415 id=415 data-nosnippet>415</a> on_flush: <span class="prelude-val">None</span>,
<a href=#416 id=416 data-nosnippet>416</a> }
<a href=#417 id=417 data-nosnippet>417</a> }
<a href=#418 id=418 data-nosnippet>418</a>
<a href=#419 id=419 data-nosnippet>419</a> <span class="doccomment">/// Returns a decoder that will flush the stream on drop.
<a href=#420 id=420 data-nosnippet>420</a> ///
<a href=#421 id=421 data-nosnippet>421</a> /// Calls the given callback with the result from `flush()`. This runs during drop so it's
<a href=#422 id=422 data-nosnippet>422</a> /// important that the provided callback doesn't panic.
<a href=#423 id=423 data-nosnippet>423</a> </span><span class="kw">pub fn </span>on_flush&lt;F: FnMut(io::Result&lt;()&gt;)&gt;(
<a href=#424 id=424 data-nosnippet>424</a> <span class="self">self</span>,
<a href=#425 id=425 data-nosnippet>425</a> f: F,
<a href=#426 id=426 data-nosnippet>426</a> ) -&gt; AutoFlushDecoder&lt;<span class="lifetime">'a</span>, W, F&gt; {
<a href=#427 id=427 data-nosnippet>427</a> AutoFlushDecoder::new(<span class="self">self</span>, f)
<a href=#428 id=428 data-nosnippet>428</a> }
<a href=#429 id=429 data-nosnippet>429</a>
<a href=#430 id=430 data-nosnippet>430</a> <span class="macro">crate::decoder_common!</span>(writer);
<a href=#431 id=431 data-nosnippet>431</a>}
<a href=#432 id=432 data-nosnippet>432</a>
<a href=#433 id=433 data-nosnippet>433</a><span class="kw">impl</span>&lt;W: Write&gt; Write <span class="kw">for </span>Decoder&lt;<span class="lifetime">'_</span>, W&gt; {
<a href=#434 id=434 data-nosnippet>434</a> <span class="kw">fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;usize&gt; {
<a href=#435 id=435 data-nosnippet>435</a> <span class="self">self</span>.writer.write(buf)
<a href=#436 id=436 data-nosnippet>436</a> }
<a href=#437 id=437 data-nosnippet>437</a>
<a href=#438 id=438 data-nosnippet>438</a> <span class="kw">fn </span>flush(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; io::Result&lt;()&gt; {
<a href=#439 id=439 data-nosnippet>439</a> <span class="self">self</span>.writer.flush()
<a href=#440 id=440 data-nosnippet>440</a> }
<a href=#441 id=441 data-nosnippet>441</a>}
<a href=#442 id=442 data-nosnippet>442</a>
<a href=#443 id=443 data-nosnippet>443</a><span class="kw">fn </span>_assert_traits() {
<a href=#444 id=444 data-nosnippet>444</a> <span class="kw">fn </span>_assert_send&lt;T: Send&gt;(<span class="kw">_</span>: T) {}
<a href=#445 id=445 data-nosnippet>445</a>
<a href=#446 id=446 data-nosnippet>446</a> _assert_send(Decoder::new(Vec::new()));
<a href=#447 id=447 data-nosnippet>447</a> _assert_send(Encoder::new(Vec::new(), <span class="number">1</span>));
<a href=#448 id=448 data-nosnippet>448</a> _assert_send(Decoder::new(Vec::new()).unwrap().auto_flush());
<a href=#449 id=449 data-nosnippet>449</a> _assert_send(Encoder::new(Vec::new(), <span class="number">1</span>).unwrap().auto_finish());
<a href=#450 id=450 data-nosnippet>450</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,8 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zstd-0.13.3/src/stream/zio/mod.rs`."><title>mod.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../../" data-static-root-path="../../../../static.files/" data-current-crate="zstd" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../../static.files/src-script-813739b1.js"></script><script defer src="../../../../src-files.js"></script><script defer src="../../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">zstd/stream/zio/</div>mod.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-1"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! Wrappers around raw operations implementing `std::io::{Read, Write}`.
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a></span><span class="kw">mod </span>reader;
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">mod </span>writer;
<a href=#5 id=5 data-nosnippet>5</a>
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">pub use </span><span class="self">self</span>::reader::Reader;
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">pub use </span><span class="self">self</span>::writer::Writer;
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,242 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zstd-0.13.3/src/stream/zio/reader.rs`."><title>reader.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../../" data-static-root-path="../../../../static.files/" data-current-crate="zstd" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../../static.files/src-script-813739b1.js"></script><script defer src="../../../../src-files.js"></script><script defer src="../../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">zstd/stream/zio/</div>reader.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>std::io::{<span class="self">self</span>, BufRead, Read};
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use </span><span class="kw">crate</span>::stream::raw::{InBuffer, Operation, OutBuffer};
<a href=#4 id=4 data-nosnippet>4</a>
<a href=#5 id=5 data-nosnippet>5</a><span class="comment">// [ reader -&gt; zstd ] -&gt; output
<a href=#6 id=6 data-nosnippet>6</a></span><span class="doccomment">/// Implements the [`Read`] API around an [`Operation`].
<a href=#7 id=7 data-nosnippet>7</a>///
<a href=#8 id=8 data-nosnippet>8</a>/// This can be used to wrap a raw in-memory operation in a read-focused API.
<a href=#9 id=9 data-nosnippet>9</a>///
<a href=#10 id=10 data-nosnippet>10</a>/// It can wrap either a compression or decompression operation, and pulls
<a href=#11 id=11 data-nosnippet>11</a>/// input data from a wrapped `Read`.
<a href=#12 id=12 data-nosnippet>12</a></span><span class="kw">pub struct </span>Reader&lt;R, D&gt; {
<a href=#13 id=13 data-nosnippet>13</a> reader: R,
<a href=#14 id=14 data-nosnippet>14</a> operation: D,
<a href=#15 id=15 data-nosnippet>15</a>
<a href=#16 id=16 data-nosnippet>16</a> state: State,
<a href=#17 id=17 data-nosnippet>17</a>
<a href=#18 id=18 data-nosnippet>18</a> single_frame: bool,
<a href=#19 id=19 data-nosnippet>19</a> finished_frame: bool,
<a href=#20 id=20 data-nosnippet>20</a>}
<a href=#21 id=21 data-nosnippet>21</a>
<a href=#22 id=22 data-nosnippet>22</a><span class="kw">enum </span>State {
<a href=#23 id=23 data-nosnippet>23</a> <span class="comment">// Still actively reading from the inner `Read`
<a href=#24 id=24 data-nosnippet>24</a> </span>Reading,
<a href=#25 id=25 data-nosnippet>25</a> <span class="comment">// We reached EOF from the inner `Read`, now flushing.
<a href=#26 id=26 data-nosnippet>26</a> </span>PastEof,
<a href=#27 id=27 data-nosnippet>27</a> <span class="comment">// We are fully done, nothing can be read.
<a href=#28 id=28 data-nosnippet>28</a> </span>Finished,
<a href=#29 id=29 data-nosnippet>29</a>}
<a href=#30 id=30 data-nosnippet>30</a>
<a href=#31 id=31 data-nosnippet>31</a><span class="kw">impl</span>&lt;R, D&gt; Reader&lt;R, D&gt; {
<a href=#32 id=32 data-nosnippet>32</a> <span class="doccomment">/// Creates a new `Reader`.
<a href=#33 id=33 data-nosnippet>33</a> ///
<a href=#34 id=34 data-nosnippet>34</a> /// `reader` will be used to pull input data for the given operation.
<a href=#35 id=35 data-nosnippet>35</a> </span><span class="kw">pub fn </span>new(reader: R, operation: D) -&gt; <span class="self">Self </span>{
<a href=#36 id=36 data-nosnippet>36</a> Reader {
<a href=#37 id=37 data-nosnippet>37</a> reader,
<a href=#38 id=38 data-nosnippet>38</a> operation,
<a href=#39 id=39 data-nosnippet>39</a> state: State::Reading,
<a href=#40 id=40 data-nosnippet>40</a> single_frame: <span class="bool-val">false</span>,
<a href=#41 id=41 data-nosnippet>41</a> finished_frame: <span class="bool-val">false</span>,
<a href=#42 id=42 data-nosnippet>42</a> }
<a href=#43 id=43 data-nosnippet>43</a> }
<a href=#44 id=44 data-nosnippet>44</a>
<a href=#45 id=45 data-nosnippet>45</a> <span class="doccomment">/// Sets `self` to stop after the first decoded frame.
<a href=#46 id=46 data-nosnippet>46</a> </span><span class="kw">pub fn </span>set_single_frame(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<a href=#47 id=47 data-nosnippet>47</a> <span class="self">self</span>.single_frame = <span class="bool-val">true</span>;
<a href=#48 id=48 data-nosnippet>48</a> }
<a href=#49 id=49 data-nosnippet>49</a>
<a href=#50 id=50 data-nosnippet>50</a> <span class="doccomment">/// Returns a mutable reference to the underlying operation.
<a href=#51 id=51 data-nosnippet>51</a> </span><span class="kw">pub fn </span>operation_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>D {
<a href=#52 id=52 data-nosnippet>52</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.operation
<a href=#53 id=53 data-nosnippet>53</a> }
<a href=#54 id=54 data-nosnippet>54</a>
<a href=#55 id=55 data-nosnippet>55</a> <span class="doccomment">/// Returns a mutable reference to the underlying reader.
<a href=#56 id=56 data-nosnippet>56</a> </span><span class="kw">pub fn </span>reader_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>R {
<a href=#57 id=57 data-nosnippet>57</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.reader
<a href=#58 id=58 data-nosnippet>58</a> }
<a href=#59 id=59 data-nosnippet>59</a>
<a href=#60 id=60 data-nosnippet>60</a> <span class="doccomment">/// Returns a reference to the underlying reader.
<a href=#61 id=61 data-nosnippet>61</a> </span><span class="kw">pub fn </span>reader(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>R {
<a href=#62 id=62 data-nosnippet>62</a> <span class="kw-2">&amp;</span><span class="self">self</span>.reader
<a href=#63 id=63 data-nosnippet>63</a> }
<a href=#64 id=64 data-nosnippet>64</a>
<a href=#65 id=65 data-nosnippet>65</a> <span class="doccomment">/// Returns the inner reader.
<a href=#66 id=66 data-nosnippet>66</a> </span><span class="kw">pub fn </span>into_inner(<span class="self">self</span>) -&gt; R {
<a href=#67 id=67 data-nosnippet>67</a> <span class="self">self</span>.reader
<a href=#68 id=68 data-nosnippet>68</a> }
<a href=#69 id=69 data-nosnippet>69</a>
<a href=#70 id=70 data-nosnippet>70</a> <span class="doccomment">/// Flush any internal buffer.
<a href=#71 id=71 data-nosnippet>71</a> ///
<a href=#72 id=72 data-nosnippet>72</a> /// For encoders, this ensures all input consumed so far is compressed.
<a href=#73 id=73 data-nosnippet>73</a> </span><span class="kw">pub fn </span>flush(<span class="kw-2">&amp;mut </span><span class="self">self</span>, output: <span class="kw-2">&amp;mut </span>[u8]) -&gt; io::Result&lt;usize&gt;
<a href=#74 id=74 data-nosnippet>74</a> <span class="kw">where
<a href=#75 id=75 data-nosnippet>75</a> </span>D: Operation,
<a href=#76 id=76 data-nosnippet>76</a> {
<a href=#77 id=77 data-nosnippet>77</a> <span class="self">self</span>.operation.flush(<span class="kw-2">&amp;mut </span>OutBuffer::around(output))
<a href=#78 id=78 data-nosnippet>78</a> }
<a href=#79 id=79 data-nosnippet>79</a>}
<a href=#80 id=80 data-nosnippet>80</a><span class="comment">// Read and retry on Interrupted errors.
<a href=#81 id=81 data-nosnippet>81</a></span><span class="kw">fn </span>fill_buf&lt;R&gt;(reader: <span class="kw-2">&amp;mut </span>R) -&gt; io::Result&lt;<span class="kw-2">&amp;</span>[u8]&gt;
<a href=#82 id=82 data-nosnippet>82</a><span class="kw">where
<a href=#83 id=83 data-nosnippet>83</a> </span>R: BufRead,
<a href=#84 id=84 data-nosnippet>84</a>{
<a href=#85 id=85 data-nosnippet>85</a> <span class="comment">// This doesn't work right now because of the borrow-checker.
<a href=#86 id=86 data-nosnippet>86</a> // When it can be made to compile, it would allow Reader to automatically
<a href=#87 id=87 data-nosnippet>87</a> // retry on `Interrupted` error.
<a href=#88 id=88 data-nosnippet>88</a> /*
<a href=#89 id=89 data-nosnippet>89</a> loop {
<a href=#90 id=90 data-nosnippet>90</a> match reader.fill_buf() {
<a href=#91 id=91 data-nosnippet>91</a> Err(ref e) if e.kind() == io::ErrorKind::Interrupted =&gt; {}
<a href=#92 id=92 data-nosnippet>92</a> otherwise =&gt; return otherwise,
<a href=#93 id=93 data-nosnippet>93</a> }
<a href=#94 id=94 data-nosnippet>94</a> }
<a href=#95 id=95 data-nosnippet>95</a> */
<a href=#96 id=96 data-nosnippet>96</a>
<a href=#97 id=97 data-nosnippet>97</a> // Workaround for now
<a href=#98 id=98 data-nosnippet>98</a> </span><span class="kw">let </span>res = reader.fill_buf()<span class="question-mark">?</span>;
<a href=#99 id=99 data-nosnippet>99</a>
<a href=#100 id=100 data-nosnippet>100</a> <span class="comment">// eprintln!("Filled buffer: {:?}", res);
<a href=#101 id=101 data-nosnippet>101</a>
<a href=#102 id=102 data-nosnippet>102</a> </span><span class="prelude-val">Ok</span>(res)
<a href=#103 id=103 data-nosnippet>103</a>}
<a href=#104 id=104 data-nosnippet>104</a>
<a href=#105 id=105 data-nosnippet>105</a><span class="kw">impl</span>&lt;R, D&gt; Read <span class="kw">for </span>Reader&lt;R, D&gt;
<a href=#106 id=106 data-nosnippet>106</a><span class="kw">where
<a href=#107 id=107 data-nosnippet>107</a> </span>R: BufRead,
<a href=#108 id=108 data-nosnippet>108</a> D: Operation,
<a href=#109 id=109 data-nosnippet>109</a>{
<a href=#110 id=110 data-nosnippet>110</a> <span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; io::Result&lt;usize&gt; {
<a href=#111 id=111 data-nosnippet>111</a> <span class="comment">// Keep trying until _something_ has been written.
<a href=#112 id=112 data-nosnippet>112</a> </span><span class="kw">let </span><span class="kw-2">mut </span>first = <span class="bool-val">true</span>;
<a href=#113 id=113 data-nosnippet>113</a> <span class="kw">loop </span>{
<a href=#114 id=114 data-nosnippet>114</a> <span class="kw">match </span><span class="self">self</span>.state {
<a href=#115 id=115 data-nosnippet>115</a> State::Reading =&gt; {
<a href=#116 id=116 data-nosnippet>116</a> <span class="kw">let </span>(bytes_read, bytes_written) = {
<a href=#117 id=117 data-nosnippet>117</a> <span class="comment">// Start with a fresh pool of un-processed data.
<a href=#118 id=118 data-nosnippet>118</a> // This is the only line that can return an interruption error.
<a href=#119 id=119 data-nosnippet>119</a> </span><span class="kw">let </span>input = <span class="kw">if </span>first {
<a href=#120 id=120 data-nosnippet>120</a> <span class="comment">// eprintln!("First run, no input coming.");
<a href=#121 id=121 data-nosnippet>121</a> </span><span class="string">b""
<a href=#122 id=122 data-nosnippet>122</a> </span>} <span class="kw">else </span>{
<a href=#123 id=123 data-nosnippet>123</a> fill_buf(<span class="kw-2">&amp;mut </span><span class="self">self</span>.reader)<span class="question-mark">?
<a href=#124 id=124 data-nosnippet>124</a> </span>};
<a href=#125 id=125 data-nosnippet>125</a>
<a href=#126 id=126 data-nosnippet>126</a> <span class="comment">// eprintln!("Input = {:?}", input);
<a href=#127 id=127 data-nosnippet>127</a>
<a href=#128 id=128 data-nosnippet>128</a> // It's possible we don't have any new data to read.
<a href=#129 id=129 data-nosnippet>129</a> // (In this case we may still have zstd's own buffer to clear.)
<a href=#130 id=130 data-nosnippet>130</a> </span><span class="kw">if </span>!first &amp;&amp; input.is_empty() {
<a href=#131 id=131 data-nosnippet>131</a> <span class="self">self</span>.state = State::PastEof;
<a href=#132 id=132 data-nosnippet>132</a> <span class="kw">continue</span>;
<a href=#133 id=133 data-nosnippet>133</a> }
<a href=#134 id=134 data-nosnippet>134</a> first = <span class="bool-val">false</span>;
<a href=#135 id=135 data-nosnippet>135</a>
<a href=#136 id=136 data-nosnippet>136</a> <span class="kw">let </span><span class="kw-2">mut </span>src = InBuffer::around(input);
<a href=#137 id=137 data-nosnippet>137</a> <span class="kw">let </span><span class="kw-2">mut </span>dst = OutBuffer::around(buf);
<a href=#138 id=138 data-nosnippet>138</a>
<a href=#139 id=139 data-nosnippet>139</a> <span class="comment">// We don't want empty input (from first=true) to cause a frame
<a href=#140 id=140 data-nosnippet>140</a> // re-initialization.
<a href=#141 id=141 data-nosnippet>141</a> </span><span class="kw">if </span><span class="self">self</span>.finished_frame &amp;&amp; !input.is_empty() {
<a href=#142 id=142 data-nosnippet>142</a> <span class="comment">// eprintln!("!! Reigniting !!");
<a href=#143 id=143 data-nosnippet>143</a> </span><span class="self">self</span>.operation.reinit()<span class="question-mark">?</span>;
<a href=#144 id=144 data-nosnippet>144</a> <span class="self">self</span>.finished_frame = <span class="bool-val">false</span>;
<a href=#145 id=145 data-nosnippet>145</a> }
<a href=#146 id=146 data-nosnippet>146</a>
<a href=#147 id=147 data-nosnippet>147</a> <span class="comment">// Phase 1: feed input to the operation
<a href=#148 id=148 data-nosnippet>148</a> </span><span class="kw">let </span>hint = <span class="self">self</span>.operation.run(<span class="kw-2">&amp;mut </span>src, <span class="kw-2">&amp;mut </span>dst)<span class="question-mark">?</span>;
<a href=#149 id=149 data-nosnippet>149</a> <span class="comment">// eprintln!(
<a href=#150 id=150 data-nosnippet>150</a> // "Hint={} Just run our operation:\n In={:?}\n Out={:?}",
<a href=#151 id=151 data-nosnippet>151</a> // hint, src, dst
<a href=#152 id=152 data-nosnippet>152</a> // );
<a href=#153 id=153 data-nosnippet>153</a>
<a href=#154 id=154 data-nosnippet>154</a> </span><span class="kw">if </span>hint == <span class="number">0 </span>{
<a href=#155 id=155 data-nosnippet>155</a> <span class="comment">// In practice this only happens when decoding, when we just finished
<a href=#156 id=156 data-nosnippet>156</a> // reading a frame.
<a href=#157 id=157 data-nosnippet>157</a> </span><span class="self">self</span>.finished_frame = <span class="bool-val">true</span>;
<a href=#158 id=158 data-nosnippet>158</a> <span class="kw">if </span><span class="self">self</span>.single_frame {
<a href=#159 id=159 data-nosnippet>159</a> <span class="self">self</span>.state = State::Finished;
<a href=#160 id=160 data-nosnippet>160</a> }
<a href=#161 id=161 data-nosnippet>161</a> }
<a href=#162 id=162 data-nosnippet>162</a>
<a href=#163 id=163 data-nosnippet>163</a> <span class="comment">// eprintln!("Output: {:?}", dst);
<a href=#164 id=164 data-nosnippet>164</a>
<a href=#165 id=165 data-nosnippet>165</a> </span>(src.pos(), dst.pos())
<a href=#166 id=166 data-nosnippet>166</a> };
<a href=#167 id=167 data-nosnippet>167</a>
<a href=#168 id=168 data-nosnippet>168</a> <span class="self">self</span>.reader.consume(bytes_read);
<a href=#169 id=169 data-nosnippet>169</a>
<a href=#170 id=170 data-nosnippet>170</a> <span class="kw">if </span>bytes_written &gt; <span class="number">0 </span>{
<a href=#171 id=171 data-nosnippet>171</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(bytes_written);
<a href=#172 id=172 data-nosnippet>172</a> }
<a href=#173 id=173 data-nosnippet>173</a>
<a href=#174 id=174 data-nosnippet>174</a> <span class="comment">// We need more data! Try again!
<a href=#175 id=175 data-nosnippet>175</a> </span>}
<a href=#176 id=176 data-nosnippet>176</a> State::PastEof =&gt; {
<a href=#177 id=177 data-nosnippet>177</a> <span class="kw">let </span><span class="kw-2">mut </span>dst = OutBuffer::around(buf);
<a href=#178 id=178 data-nosnippet>178</a>
<a href=#179 id=179 data-nosnippet>179</a> <span class="comment">// We already sent all the input we could get to zstd. Time to flush out the
<a href=#180 id=180 data-nosnippet>180</a> // buffer and be done with it.
<a href=#181 id=181 data-nosnippet>181</a>
<a href=#182 id=182 data-nosnippet>182</a> // Phase 2: flush out the operation's buffer
<a href=#183 id=183 data-nosnippet>183</a> // Keep calling `finish()` until the buffer is empty.
<a href=#184 id=184 data-nosnippet>184</a> </span><span class="kw">let </span>hint = <span class="self">self
<a href=#185 id=185 data-nosnippet>185</a> </span>.operation
<a href=#186 id=186 data-nosnippet>186</a> .finish(<span class="kw-2">&amp;mut </span>dst, <span class="self">self</span>.finished_frame)<span class="question-mark">?</span>;
<a href=#187 id=187 data-nosnippet>187</a> <span class="comment">// eprintln!("Hint: {} ; Output: {:?}", hint, dst);
<a href=#188 id=188 data-nosnippet>188</a> </span><span class="kw">if </span>hint == <span class="number">0 </span>{
<a href=#189 id=189 data-nosnippet>189</a> <span class="comment">// This indicates that the footer is complete.
<a href=#190 id=190 data-nosnippet>190</a> // This is the only way to terminate the stream cleanly.
<a href=#191 id=191 data-nosnippet>191</a> </span><span class="self">self</span>.state = State::Finished;
<a href=#192 id=192 data-nosnippet>192</a> }
<a href=#193 id=193 data-nosnippet>193</a>
<a href=#194 id=194 data-nosnippet>194</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(dst.pos());
<a href=#195 id=195 data-nosnippet>195</a> }
<a href=#196 id=196 data-nosnippet>196</a> State::Finished =&gt; {
<a href=#197 id=197 data-nosnippet>197</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="number">0</span>);
<a href=#198 id=198 data-nosnippet>198</a> }
<a href=#199 id=199 data-nosnippet>199</a> }
<a href=#200 id=200 data-nosnippet>200</a> }
<a href=#201 id=201 data-nosnippet>201</a> }
<a href=#202 id=202 data-nosnippet>202</a>}
<a href=#203 id=203 data-nosnippet>203</a>
<a href=#204 id=204 data-nosnippet>204</a><span class="attr">#[cfg(test)]
<a href=#205 id=205 data-nosnippet>205</a></span><span class="kw">mod </span>tests {
<a href=#206 id=206 data-nosnippet>206</a> <span class="kw">use </span><span class="kw">super</span>::Reader;
<a href=#207 id=207 data-nosnippet>207</a> <span class="kw">use </span>std::io::{Cursor, Read};
<a href=#208 id=208 data-nosnippet>208</a>
<a href=#209 id=209 data-nosnippet>209</a> <span class="attr">#[test]
<a href=#210 id=210 data-nosnippet>210</a> </span><span class="kw">fn </span>test_noop() {
<a href=#211 id=211 data-nosnippet>211</a> <span class="kw">use </span><span class="kw">crate</span>::stream::raw::NoOp;
<a href=#212 id=212 data-nosnippet>212</a>
<a href=#213 id=213 data-nosnippet>213</a> <span class="kw">let </span>input = <span class="string">b"AbcdefghAbcdefgh."</span>;
<a href=#214 id=214 data-nosnippet>214</a>
<a href=#215 id=215 data-nosnippet>215</a> <span class="comment">// Test reader
<a href=#216 id=216 data-nosnippet>216</a> </span><span class="kw">let </span><span class="kw-2">mut </span>output = Vec::new();
<a href=#217 id=217 data-nosnippet>217</a> {
<a href=#218 id=218 data-nosnippet>218</a> <span class="kw">let </span><span class="kw-2">mut </span>reader = Reader::new(Cursor::new(input), NoOp);
<a href=#219 id=219 data-nosnippet>219</a> reader.read_to_end(<span class="kw-2">&amp;mut </span>output).unwrap();
<a href=#220 id=220 data-nosnippet>220</a> }
<a href=#221 id=221 data-nosnippet>221</a> <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>output, input);
<a href=#222 id=222 data-nosnippet>222</a> }
<a href=#223 id=223 data-nosnippet>223</a>
<a href=#224 id=224 data-nosnippet>224</a> <span class="attr">#[test]
<a href=#225 id=225 data-nosnippet>225</a> </span><span class="kw">fn </span>test_compress() {
<a href=#226 id=226 data-nosnippet>226</a> <span class="kw">use </span><span class="kw">crate</span>::stream::raw::Encoder;
<a href=#227 id=227 data-nosnippet>227</a>
<a href=#228 id=228 data-nosnippet>228</a> <span class="kw">let </span>input = <span class="string">b"AbcdefghAbcdefgh."</span>;
<a href=#229 id=229 data-nosnippet>229</a>
<a href=#230 id=230 data-nosnippet>230</a> <span class="comment">// Test reader
<a href=#231 id=231 data-nosnippet>231</a> </span><span class="kw">let </span><span class="kw-2">mut </span>output = Vec::new();
<a href=#232 id=232 data-nosnippet>232</a> {
<a href=#233 id=233 data-nosnippet>233</a> <span class="kw">let </span><span class="kw-2">mut </span>reader =
<a href=#234 id=234 data-nosnippet>234</a> Reader::new(Cursor::new(input), Encoder::new(<span class="number">1</span>).unwrap());
<a href=#235 id=235 data-nosnippet>235</a> reader.read_to_end(<span class="kw-2">&amp;mut </span>output).unwrap();
<a href=#236 id=236 data-nosnippet>236</a> }
<a href=#237 id=237 data-nosnippet>237</a> <span class="comment">// eprintln!("{:?}", output);
<a href=#238 id=238 data-nosnippet>238</a> </span><span class="kw">let </span>decoded = <span class="kw">crate</span>::decode_all(<span class="kw-2">&amp;</span>output[..]).unwrap();
<a href=#239 id=239 data-nosnippet>239</a> <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>decoded, input);
<a href=#240 id=240 data-nosnippet>240</a> }
<a href=#241 id=241 data-nosnippet>241</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,390 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zstd-0.13.3/src/stream/zio/writer.rs`."><title>writer.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../../" data-static-root-path="../../../../static.files/" data-current-crate="zstd" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../../static.files/src-script-813739b1.js"></script><script defer src="../../../../src-files.js"></script><script defer src="../../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">zstd/stream/zio/</div>writer.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>std::io::{<span class="self">self</span>, Write};
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use </span><span class="kw">crate</span>::stream::raw::{InBuffer, Operation, OutBuffer};
<a href=#4 id=4 data-nosnippet>4</a>
<a href=#5 id=5 data-nosnippet>5</a><span class="comment">// input -&gt; [ zstd -&gt; buffer -&gt; writer ]
<a href=#6 id=6 data-nosnippet>6</a>
<a href=#7 id=7 data-nosnippet>7</a></span><span class="doccomment">/// Implements the [`Write`] API around an [`Operation`].
<a href=#8 id=8 data-nosnippet>8</a>///
<a href=#9 id=9 data-nosnippet>9</a>/// This can be used to wrap a raw in-memory operation in a write-focused API.
<a href=#10 id=10 data-nosnippet>10</a>///
<a href=#11 id=11 data-nosnippet>11</a>/// It can be used with either compression or decompression, and forwards the
<a href=#12 id=12 data-nosnippet>12</a>/// output to a wrapped `Write`.
<a href=#13 id=13 data-nosnippet>13</a></span><span class="kw">pub struct </span>Writer&lt;W, D&gt; {
<a href=#14 id=14 data-nosnippet>14</a> <span class="doccomment">/// Either an encoder or a decoder.
<a href=#15 id=15 data-nosnippet>15</a> </span>operation: D,
<a href=#16 id=16 data-nosnippet>16</a>
<a href=#17 id=17 data-nosnippet>17</a> <span class="doccomment">/// Where we send the output of the operation.
<a href=#18 id=18 data-nosnippet>18</a> </span>writer: W,
<a href=#19 id=19 data-nosnippet>19</a>
<a href=#20 id=20 data-nosnippet>20</a> <span class="doccomment">/// Offset into the buffer
<a href=#21 id=21 data-nosnippet>21</a> ///
<a href=#22 id=22 data-nosnippet>22</a> /// Only things after this matter. Things before have already been sent to the writer.
<a href=#23 id=23 data-nosnippet>23</a> </span>offset: usize,
<a href=#24 id=24 data-nosnippet>24</a>
<a href=#25 id=25 data-nosnippet>25</a> <span class="doccomment">/// Output buffer
<a href=#26 id=26 data-nosnippet>26</a> ///
<a href=#27 id=27 data-nosnippet>27</a> /// Where the operation writes, before it gets flushed to the writer
<a href=#28 id=28 data-nosnippet>28</a> </span>buffer: Vec&lt;u8&gt;,
<a href=#29 id=29 data-nosnippet>29</a>
<a href=#30 id=30 data-nosnippet>30</a> <span class="comment">// When `true`, indicates that nothing should be added to the buffer.
<a href=#31 id=31 data-nosnippet>31</a> // All that's left if to empty the buffer.
<a href=#32 id=32 data-nosnippet>32</a> </span>finished: bool,
<a href=#33 id=33 data-nosnippet>33</a>
<a href=#34 id=34 data-nosnippet>34</a> <span class="doccomment">/// When `true`, the operation just finished a frame.
<a href=#35 id=35 data-nosnippet>35</a> ///
<a href=#36 id=36 data-nosnippet>36</a> /// Only happens when decompressing.
<a href=#37 id=37 data-nosnippet>37</a> /// The context needs to be re-initialized to process the next frame.
<a href=#38 id=38 data-nosnippet>38</a> </span>finished_frame: bool,
<a href=#39 id=39 data-nosnippet>39</a>}
<a href=#40 id=40 data-nosnippet>40</a>
<a href=#41 id=41 data-nosnippet>41</a><span class="kw">impl</span>&lt;W, D&gt; Writer&lt;W, D&gt;
<a href=#42 id=42 data-nosnippet>42</a><span class="kw">where
<a href=#43 id=43 data-nosnippet>43</a> </span>W: Write,
<a href=#44 id=44 data-nosnippet>44</a> D: Operation,
<a href=#45 id=45 data-nosnippet>45</a>{
<a href=#46 id=46 data-nosnippet>46</a> <span class="doccomment">/// Creates a new `Writer` with a fixed buffer capacity of 32KB
<a href=#47 id=47 data-nosnippet>47</a> ///
<a href=#48 id=48 data-nosnippet>48</a> /// All output from the given operation will be forwarded to `writer`.
<a href=#49 id=49 data-nosnippet>49</a> </span><span class="kw">pub fn </span>new(writer: W, operation: D) -&gt; <span class="self">Self </span>{
<a href=#50 id=50 data-nosnippet>50</a> <span class="comment">// 32KB buffer? That's what flate2 uses
<a href=#51 id=51 data-nosnippet>51</a> </span><span class="self">Self</span>::new_with_capacity(writer, operation, <span class="number">32 </span>* <span class="number">1024</span>)
<a href=#52 id=52 data-nosnippet>52</a> }
<a href=#53 id=53 data-nosnippet>53</a>
<a href=#54 id=54 data-nosnippet>54</a> <span class="doccomment">/// Creates a new `Writer` with user defined capacity.
<a href=#55 id=55 data-nosnippet>55</a> ///
<a href=#56 id=56 data-nosnippet>56</a> /// All output from the given operation will be forwarded to `writer`.
<a href=#57 id=57 data-nosnippet>57</a> </span><span class="kw">pub fn </span>new_with_capacity(
<a href=#58 id=58 data-nosnippet>58</a> writer: W,
<a href=#59 id=59 data-nosnippet>59</a> operation: D,
<a href=#60 id=60 data-nosnippet>60</a> capacity: usize,
<a href=#61 id=61 data-nosnippet>61</a> ) -&gt; <span class="self">Self </span>{
<a href=#62 id=62 data-nosnippet>62</a> <span class="self">Self</span>::with_output_buffer(
<a href=#63 id=63 data-nosnippet>63</a> Vec::with_capacity(capacity),
<a href=#64 id=64 data-nosnippet>64</a> writer,
<a href=#65 id=65 data-nosnippet>65</a> operation,
<a href=#66 id=66 data-nosnippet>66</a> )
<a href=#67 id=67 data-nosnippet>67</a> }
<a href=#68 id=68 data-nosnippet>68</a>
<a href=#69 id=69 data-nosnippet>69</a> <span class="doccomment">/// Creates a new `Writer` using the given output buffer.
<a href=#70 id=70 data-nosnippet>70</a> ///
<a href=#71 id=71 data-nosnippet>71</a> /// The output buffer _must_ have pre-allocated capacity (its capacity will not be changed after).
<a href=#72 id=72 data-nosnippet>72</a> ///
<a href=#73 id=73 data-nosnippet>73</a> /// Usually you would use `Vec::with_capacity(desired_buffer_size)`.
<a href=#74 id=74 data-nosnippet>74</a> </span><span class="kw">pub fn </span>with_output_buffer(
<a href=#75 id=75 data-nosnippet>75</a> output_buffer: Vec&lt;u8&gt;,
<a href=#76 id=76 data-nosnippet>76</a> writer: W,
<a href=#77 id=77 data-nosnippet>77</a> operation: D,
<a href=#78 id=78 data-nosnippet>78</a> ) -&gt; <span class="self">Self </span>{
<a href=#79 id=79 data-nosnippet>79</a> Writer {
<a href=#80 id=80 data-nosnippet>80</a> writer,
<a href=#81 id=81 data-nosnippet>81</a> operation,
<a href=#82 id=82 data-nosnippet>82</a>
<a href=#83 id=83 data-nosnippet>83</a> offset: <span class="number">0</span>,
<a href=#84 id=84 data-nosnippet>84</a> <span class="comment">// 32KB buffer? That's what flate2 uses
<a href=#85 id=85 data-nosnippet>85</a> </span>buffer: output_buffer,
<a href=#86 id=86 data-nosnippet>86</a>
<a href=#87 id=87 data-nosnippet>87</a> finished: <span class="bool-val">false</span>,
<a href=#88 id=88 data-nosnippet>88</a> finished_frame: <span class="bool-val">false</span>,
<a href=#89 id=89 data-nosnippet>89</a> }
<a href=#90 id=90 data-nosnippet>90</a> }
<a href=#91 id=91 data-nosnippet>91</a>
<a href=#92 id=92 data-nosnippet>92</a> <span class="doccomment">/// Ends the stream.
<a href=#93 id=93 data-nosnippet>93</a> ///
<a href=#94 id=94 data-nosnippet>94</a> /// This *must* be called after all data has been written to finish the
<a href=#95 id=95 data-nosnippet>95</a> /// stream.
<a href=#96 id=96 data-nosnippet>96</a> ///
<a href=#97 id=97 data-nosnippet>97</a> /// If you forget to call this and just drop the `Writer`, you *will* have
<a href=#98 id=98 data-nosnippet>98</a> /// an incomplete output.
<a href=#99 id=99 data-nosnippet>99</a> ///
<a href=#100 id=100 data-nosnippet>100</a> /// Keep calling it until it returns `Ok(())`, then don't call it again.
<a href=#101 id=101 data-nosnippet>101</a> </span><span class="kw">pub fn </span>finish(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; io::Result&lt;()&gt; {
<a href=#102 id=102 data-nosnippet>102</a> <span class="kw">loop </span>{
<a href=#103 id=103 data-nosnippet>103</a> <span class="comment">// Keep trying until we're really done.
<a href=#104 id=104 data-nosnippet>104</a> </span><span class="self">self</span>.write_from_offset()<span class="question-mark">?</span>;
<a href=#105 id=105 data-nosnippet>105</a>
<a href=#106 id=106 data-nosnippet>106</a> <span class="comment">// At this point the buffer has been fully written out.
<a href=#107 id=107 data-nosnippet>107</a>
<a href=#108 id=108 data-nosnippet>108</a> </span><span class="kw">if </span><span class="self">self</span>.finished {
<a href=#109 id=109 data-nosnippet>109</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(());
<a href=#110 id=110 data-nosnippet>110</a> }
<a href=#111 id=111 data-nosnippet>111</a>
<a href=#112 id=112 data-nosnippet>112</a> <span class="comment">// Let's fill this buffer again!
<a href=#113 id=113 data-nosnippet>113</a>
<a href=#114 id=114 data-nosnippet>114</a> </span><span class="kw">let </span>finished_frame = <span class="self">self</span>.finished_frame;
<a href=#115 id=115 data-nosnippet>115</a> <span class="kw">let </span>hint =
<a href=#116 id=116 data-nosnippet>116</a> <span class="self">self</span>.with_buffer(|dst, op| op.finish(dst, finished_frame));
<a href=#117 id=117 data-nosnippet>117</a> <span class="self">self</span>.offset = <span class="number">0</span>;
<a href=#118 id=118 data-nosnippet>118</a> <span class="comment">// println!("Hint: {:?}\nOut:{:?}", hint, &amp;self.buffer);
<a href=#119 id=119 data-nosnippet>119</a>
<a href=#120 id=120 data-nosnippet>120</a> // We return here if zstd had a problem.
<a href=#121 id=121 data-nosnippet>121</a> // Could happen with invalid data, ...
<a href=#122 id=122 data-nosnippet>122</a> </span><span class="kw">let </span>hint = hint<span class="question-mark">?</span>;
<a href=#123 id=123 data-nosnippet>123</a>
<a href=#124 id=124 data-nosnippet>124</a> <span class="kw">if </span><span class="macro">hint !</span>= <span class="number">0 </span>&amp;&amp; <span class="self">self</span>.buffer.is_empty() {
<a href=#125 id=125 data-nosnippet>125</a> <span class="comment">// This happens if we are decoding an incomplete frame.
<a href=#126 id=126 data-nosnippet>126</a> </span><span class="kw">return </span><span class="prelude-val">Err</span>(io::Error::new(
<a href=#127 id=127 data-nosnippet>127</a> io::ErrorKind::UnexpectedEof,
<a href=#128 id=128 data-nosnippet>128</a> <span class="string">"incomplete frame"</span>,
<a href=#129 id=129 data-nosnippet>129</a> ));
<a href=#130 id=130 data-nosnippet>130</a> }
<a href=#131 id=131 data-nosnippet>131</a>
<a href=#132 id=132 data-nosnippet>132</a> <span class="comment">// println!("Finishing {}, {}", bytes_written, hint);
<a href=#133 id=133 data-nosnippet>133</a>
<a href=#134 id=134 data-nosnippet>134</a> </span><span class="self">self</span>.finished = hint == <span class="number">0</span>;
<a href=#135 id=135 data-nosnippet>135</a> }
<a href=#136 id=136 data-nosnippet>136</a> }
<a href=#137 id=137 data-nosnippet>137</a>
<a href=#138 id=138 data-nosnippet>138</a> <span class="doccomment">/// Run the given closure on `self.buffer`.
<a href=#139 id=139 data-nosnippet>139</a> ///
<a href=#140 id=140 data-nosnippet>140</a> /// The buffer will be cleared, and made available wrapped in an `OutBuffer`.
<a href=#141 id=141 data-nosnippet>141</a> </span><span class="kw">fn </span>with_buffer&lt;F, T&gt;(<span class="kw-2">&amp;mut </span><span class="self">self</span>, f: F) -&gt; T
<a href=#142 id=142 data-nosnippet>142</a> <span class="kw">where
<a href=#143 id=143 data-nosnippet>143</a> </span>F: FnOnce(<span class="kw-2">&amp;mut </span>OutBuffer&lt;<span class="lifetime">'_</span>, Vec&lt;u8&gt;&gt;, <span class="kw-2">&amp;mut </span>D) -&gt; T,
<a href=#144 id=144 data-nosnippet>144</a> {
<a href=#145 id=145 data-nosnippet>145</a> <span class="self">self</span>.buffer.clear();
<a href=#146 id=146 data-nosnippet>146</a> <span class="kw">let </span><span class="kw-2">mut </span>output = OutBuffer::around(<span class="kw-2">&amp;mut </span><span class="self">self</span>.buffer);
<a href=#147 id=147 data-nosnippet>147</a> <span class="comment">// eprintln!("Output: {:?}", output);
<a href=#148 id=148 data-nosnippet>148</a> </span>f(<span class="kw-2">&amp;mut </span>output, <span class="kw-2">&amp;mut </span><span class="self">self</span>.operation)
<a href=#149 id=149 data-nosnippet>149</a> }
<a href=#150 id=150 data-nosnippet>150</a>
<a href=#151 id=151 data-nosnippet>151</a> <span class="doccomment">/// Attempt to write `self.buffer` to the wrapped writer.
<a href=#152 id=152 data-nosnippet>152</a> ///
<a href=#153 id=153 data-nosnippet>153</a> /// Returns `Ok(())` once all the buffer has been written.
<a href=#154 id=154 data-nosnippet>154</a> </span><span class="kw">fn </span>write_from_offset(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; io::Result&lt;()&gt; {
<a href=#155 id=155 data-nosnippet>155</a> <span class="comment">// The code looks a lot like `write_all`, but keeps track of what has
<a href=#156 id=156 data-nosnippet>156</a> // been written in case we're interrupted.
<a href=#157 id=157 data-nosnippet>157</a> </span><span class="kw">while </span><span class="self">self</span>.offset &lt; <span class="self">self</span>.buffer.len() {
<a href=#158 id=158 data-nosnippet>158</a> <span class="kw">match </span><span class="self">self</span>.writer.write(<span class="kw-2">&amp;</span><span class="self">self</span>.buffer[<span class="self">self</span>.offset..]) {
<a href=#159 id=159 data-nosnippet>159</a> <span class="prelude-val">Ok</span>(<span class="number">0</span>) =&gt; {
<a href=#160 id=160 data-nosnippet>160</a> <span class="kw">return </span><span class="prelude-val">Err</span>(io::Error::new(
<a href=#161 id=161 data-nosnippet>161</a> io::ErrorKind::WriteZero,
<a href=#162 id=162 data-nosnippet>162</a> <span class="string">"writer will not accept any more data"</span>,
<a href=#163 id=163 data-nosnippet>163</a> ))
<a href=#164 id=164 data-nosnippet>164</a> }
<a href=#165 id=165 data-nosnippet>165</a> <span class="prelude-val">Ok</span>(n) =&gt; <span class="self">self</span>.offset += n,
<a href=#166 id=166 data-nosnippet>166</a> <span class="prelude-val">Err</span>(<span class="kw-2">ref </span>e) <span class="kw">if </span>e.kind() == io::ErrorKind::Interrupted =&gt; (),
<a href=#167 id=167 data-nosnippet>167</a> <span class="prelude-val">Err</span>(e) =&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(e),
<a href=#168 id=168 data-nosnippet>168</a> }
<a href=#169 id=169 data-nosnippet>169</a> }
<a href=#170 id=170 data-nosnippet>170</a> <span class="prelude-val">Ok</span>(())
<a href=#171 id=171 data-nosnippet>171</a> }
<a href=#172 id=172 data-nosnippet>172</a>
<a href=#173 id=173 data-nosnippet>173</a> <span class="doccomment">/// Return the wrapped `Writer` and `Operation`.
<a href=#174 id=174 data-nosnippet>174</a> ///
<a href=#175 id=175 data-nosnippet>175</a> /// Careful: if you call this before calling [`Writer::finish()`], the
<a href=#176 id=176 data-nosnippet>176</a> /// output may be incomplete.
<a href=#177 id=177 data-nosnippet>177</a> </span><span class="kw">pub fn </span>into_inner(<span class="self">self</span>) -&gt; (W, D) {
<a href=#178 id=178 data-nosnippet>178</a> (<span class="self">self</span>.writer, <span class="self">self</span>.operation)
<a href=#179 id=179 data-nosnippet>179</a> }
<a href=#180 id=180 data-nosnippet>180</a>
<a href=#181 id=181 data-nosnippet>181</a> <span class="doccomment">/// Gives a reference to the inner writer.
<a href=#182 id=182 data-nosnippet>182</a> </span><span class="kw">pub fn </span>writer(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>W {
<a href=#183 id=183 data-nosnippet>183</a> <span class="kw-2">&amp;</span><span class="self">self</span>.writer
<a href=#184 id=184 data-nosnippet>184</a> }
<a href=#185 id=185 data-nosnippet>185</a>
<a href=#186 id=186 data-nosnippet>186</a> <span class="doccomment">/// Gives a mutable reference to the inner writer.
<a href=#187 id=187 data-nosnippet>187</a> </span><span class="kw">pub fn </span>writer_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>W {
<a href=#188 id=188 data-nosnippet>188</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.writer
<a href=#189 id=189 data-nosnippet>189</a> }
<a href=#190 id=190 data-nosnippet>190</a>
<a href=#191 id=191 data-nosnippet>191</a> <span class="doccomment">/// Gives a reference to the inner operation.
<a href=#192 id=192 data-nosnippet>192</a> </span><span class="kw">pub fn </span>operation(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>D {
<a href=#193 id=193 data-nosnippet>193</a> <span class="kw-2">&amp;</span><span class="self">self</span>.operation
<a href=#194 id=194 data-nosnippet>194</a> }
<a href=#195 id=195 data-nosnippet>195</a>
<a href=#196 id=196 data-nosnippet>196</a> <span class="doccomment">/// Gives a mutable reference to the inner operation.
<a href=#197 id=197 data-nosnippet>197</a> </span><span class="kw">pub fn </span>operation_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>D {
<a href=#198 id=198 data-nosnippet>198</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.operation
<a href=#199 id=199 data-nosnippet>199</a> }
<a href=#200 id=200 data-nosnippet>200</a>
<a href=#201 id=201 data-nosnippet>201</a> <span class="doccomment">/// Returns the offset in the current buffer. Only useful for debugging.
<a href=#202 id=202 data-nosnippet>202</a> </span><span class="attr">#[cfg(test)]
<a href=#203 id=203 data-nosnippet>203</a> </span><span class="kw">pub fn </span>offset(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#204 id=204 data-nosnippet>204</a> <span class="self">self</span>.offset
<a href=#205 id=205 data-nosnippet>205</a> }
<a href=#206 id=206 data-nosnippet>206</a>
<a href=#207 id=207 data-nosnippet>207</a> <span class="doccomment">/// Returns the current buffer. Only useful for debugging.
<a href=#208 id=208 data-nosnippet>208</a> </span><span class="attr">#[cfg(test)]
<a href=#209 id=209 data-nosnippet>209</a> </span><span class="kw">pub fn </span>buffer(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8] {
<a href=#210 id=210 data-nosnippet>210</a> <span class="kw-2">&amp;</span><span class="self">self</span>.buffer
<a href=#211 id=211 data-nosnippet>211</a> }
<a href=#212 id=212 data-nosnippet>212</a>}
<a href=#213 id=213 data-nosnippet>213</a>
<a href=#214 id=214 data-nosnippet>214</a><span class="kw">impl</span>&lt;W, D&gt; Write <span class="kw">for </span>Writer&lt;W, D&gt;
<a href=#215 id=215 data-nosnippet>215</a><span class="kw">where
<a href=#216 id=216 data-nosnippet>216</a> </span>W: Write,
<a href=#217 id=217 data-nosnippet>217</a> D: Operation,
<a href=#218 id=218 data-nosnippet>218</a>{
<a href=#219 id=219 data-nosnippet>219</a> <span class="kw">fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;</span>[u8]) -&gt; io::Result&lt;usize&gt; {
<a href=#220 id=220 data-nosnippet>220</a> <span class="kw">if </span><span class="self">self</span>.finished {
<a href=#221 id=221 data-nosnippet>221</a> <span class="kw">return </span><span class="prelude-val">Err</span>(io::Error::new(
<a href=#222 id=222 data-nosnippet>222</a> io::ErrorKind::Other,
<a href=#223 id=223 data-nosnippet>223</a> <span class="string">"encoder is finished"</span>,
<a href=#224 id=224 data-nosnippet>224</a> ));
<a href=#225 id=225 data-nosnippet>225</a> }
<a href=#226 id=226 data-nosnippet>226</a> <span class="comment">// Keep trying until _something_ has been consumed.
<a href=#227 id=227 data-nosnippet>227</a> // As soon as some input has been taken, we cannot afford
<a href=#228 id=228 data-nosnippet>228</a> // to take any chance: if an error occurs, the user couldn't know
<a href=#229 id=229 data-nosnippet>229</a> // that some data _was_ successfully written.
<a href=#230 id=230 data-nosnippet>230</a> </span><span class="kw">loop </span>{
<a href=#231 id=231 data-nosnippet>231</a> <span class="comment">// First, write any pending data from `self.buffer`.
<a href=#232 id=232 data-nosnippet>232</a> </span><span class="self">self</span>.write_from_offset()<span class="question-mark">?</span>;
<a href=#233 id=233 data-nosnippet>233</a> <span class="comment">// At this point `self.buffer` can safely be discarded.
<a href=#234 id=234 data-nosnippet>234</a>
<a href=#235 id=235 data-nosnippet>235</a> // Support writing concatenated frames by re-initializing the
<a href=#236 id=236 data-nosnippet>236</a> // context.
<a href=#237 id=237 data-nosnippet>237</a> </span><span class="kw">if </span><span class="self">self</span>.finished_frame {
<a href=#238 id=238 data-nosnippet>238</a> <span class="self">self</span>.operation.reinit()<span class="question-mark">?</span>;
<a href=#239 id=239 data-nosnippet>239</a> <span class="self">self</span>.finished_frame = <span class="bool-val">false</span>;
<a href=#240 id=240 data-nosnippet>240</a> }
<a href=#241 id=241 data-nosnippet>241</a>
<a href=#242 id=242 data-nosnippet>242</a> <span class="kw">let </span><span class="kw-2">mut </span>src = InBuffer::around(buf);
<a href=#243 id=243 data-nosnippet>243</a> <span class="kw">let </span>hint = <span class="self">self</span>.with_buffer(|dst, op| op.run(<span class="kw-2">&amp;mut </span>src, dst));
<a href=#244 id=244 data-nosnippet>244</a> <span class="kw">let </span>bytes_read = src.pos;
<a href=#245 id=245 data-nosnippet>245</a>
<a href=#246 id=246 data-nosnippet>246</a> <span class="comment">// eprintln!(
<a href=#247 id=247 data-nosnippet>247</a> // "Write Hint: {:?}\n src: {:?}\n dst: {:?}",
<a href=#248 id=248 data-nosnippet>248</a> // hint, src, self.buffer
<a href=#249 id=249 data-nosnippet>249</a> // );
<a href=#250 id=250 data-nosnippet>250</a>
<a href=#251 id=251 data-nosnippet>251</a> </span><span class="self">self</span>.offset = <span class="number">0</span>;
<a href=#252 id=252 data-nosnippet>252</a> <span class="kw">let </span>hint = hint<span class="question-mark">?</span>;
<a href=#253 id=253 data-nosnippet>253</a>
<a href=#254 id=254 data-nosnippet>254</a> <span class="kw">if </span>hint == <span class="number">0 </span>{
<a href=#255 id=255 data-nosnippet>255</a> <span class="self">self</span>.finished_frame = <span class="bool-val">true</span>;
<a href=#256 id=256 data-nosnippet>256</a> }
<a href=#257 id=257 data-nosnippet>257</a>
<a href=#258 id=258 data-nosnippet>258</a> <span class="comment">// As we said, as soon as we've consumed something, return.
<a href=#259 id=259 data-nosnippet>259</a> </span><span class="kw">if </span>bytes_read &gt; <span class="number">0 </span>|| buf.is_empty() {
<a href=#260 id=260 data-nosnippet>260</a> <span class="comment">// println!("Returning {}", bytes_read);
<a href=#261 id=261 data-nosnippet>261</a> </span><span class="kw">return </span><span class="prelude-val">Ok</span>(bytes_read);
<a href=#262 id=262 data-nosnippet>262</a> }
<a href=#263 id=263 data-nosnippet>263</a> }
<a href=#264 id=264 data-nosnippet>264</a> }
<a href=#265 id=265 data-nosnippet>265</a>
<a href=#266 id=266 data-nosnippet>266</a> <span class="kw">fn </span>flush(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; io::Result&lt;()&gt; {
<a href=#267 id=267 data-nosnippet>267</a> <span class="kw">let </span><span class="kw-2">mut </span>finished = <span class="self">self</span>.finished;
<a href=#268 id=268 data-nosnippet>268</a> <span class="kw">loop </span>{
<a href=#269 id=269 data-nosnippet>269</a> <span class="comment">// If the output is blocked or has an error, return now.
<a href=#270 id=270 data-nosnippet>270</a> </span><span class="self">self</span>.write_from_offset()<span class="question-mark">?</span>;
<a href=#271 id=271 data-nosnippet>271</a>
<a href=#272 id=272 data-nosnippet>272</a> <span class="kw">if </span>finished {
<a href=#273 id=273 data-nosnippet>273</a> <span class="kw">break</span>;
<a href=#274 id=274 data-nosnippet>274</a> }
<a href=#275 id=275 data-nosnippet>275</a>
<a href=#276 id=276 data-nosnippet>276</a> <span class="kw">let </span>hint = <span class="self">self</span>.with_buffer(|dst, op| op.flush(dst));
<a href=#277 id=277 data-nosnippet>277</a>
<a href=#278 id=278 data-nosnippet>278</a> <span class="self">self</span>.offset = <span class="number">0</span>;
<a href=#279 id=279 data-nosnippet>279</a> <span class="kw">let </span>hint = hint<span class="question-mark">?</span>;
<a href=#280 id=280 data-nosnippet>280</a>
<a href=#281 id=281 data-nosnippet>281</a> finished = hint == <span class="number">0</span>;
<a href=#282 id=282 data-nosnippet>282</a> }
<a href=#283 id=283 data-nosnippet>283</a>
<a href=#284 id=284 data-nosnippet>284</a> <span class="self">self</span>.writer.flush()
<a href=#285 id=285 data-nosnippet>285</a> }
<a href=#286 id=286 data-nosnippet>286</a>}
<a href=#287 id=287 data-nosnippet>287</a>
<a href=#288 id=288 data-nosnippet>288</a><span class="attr">#[cfg(test)]
<a href=#289 id=289 data-nosnippet>289</a></span><span class="kw">mod </span>tests {
<a href=#290 id=290 data-nosnippet>290</a> <span class="kw">use </span><span class="kw">super</span>::Writer;
<a href=#291 id=291 data-nosnippet>291</a> <span class="kw">use </span>std::io::Write;
<a href=#292 id=292 data-nosnippet>292</a>
<a href=#293 id=293 data-nosnippet>293</a> <span class="attr">#[test]
<a href=#294 id=294 data-nosnippet>294</a> </span><span class="kw">fn </span>test_noop() {
<a href=#295 id=295 data-nosnippet>295</a> <span class="kw">use </span><span class="kw">crate</span>::stream::raw::NoOp;
<a href=#296 id=296 data-nosnippet>296</a>
<a href=#297 id=297 data-nosnippet>297</a> <span class="kw">let </span>input = <span class="string">b"AbcdefghAbcdefgh."</span>;
<a href=#298 id=298 data-nosnippet>298</a>
<a href=#299 id=299 data-nosnippet>299</a> <span class="comment">// Test writer
<a href=#300 id=300 data-nosnippet>300</a> </span><span class="kw">let </span><span class="kw-2">mut </span>output = Vec::new();
<a href=#301 id=301 data-nosnippet>301</a> {
<a href=#302 id=302 data-nosnippet>302</a> <span class="kw">let </span><span class="kw-2">mut </span>writer = Writer::new(<span class="kw-2">&amp;mut </span>output, NoOp);
<a href=#303 id=303 data-nosnippet>303</a> writer.write_all(input).unwrap();
<a href=#304 id=304 data-nosnippet>304</a> writer.finish().unwrap();
<a href=#305 id=305 data-nosnippet>305</a> }
<a href=#306 id=306 data-nosnippet>306</a> <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>output, input);
<a href=#307 id=307 data-nosnippet>307</a> }
<a href=#308 id=308 data-nosnippet>308</a>
<a href=#309 id=309 data-nosnippet>309</a> <span class="attr">#[test]
<a href=#310 id=310 data-nosnippet>310</a> </span><span class="kw">fn </span>test_compress() {
<a href=#311 id=311 data-nosnippet>311</a> <span class="kw">use </span><span class="kw">crate</span>::stream::raw::Encoder;
<a href=#312 id=312 data-nosnippet>312</a>
<a href=#313 id=313 data-nosnippet>313</a> <span class="kw">let </span>input = <span class="string">b"AbcdefghAbcdefgh."</span>;
<a href=#314 id=314 data-nosnippet>314</a>
<a href=#315 id=315 data-nosnippet>315</a> <span class="comment">// Test writer
<a href=#316 id=316 data-nosnippet>316</a> </span><span class="kw">let </span><span class="kw-2">mut </span>output = Vec::new();
<a href=#317 id=317 data-nosnippet>317</a> {
<a href=#318 id=318 data-nosnippet>318</a> <span class="kw">let </span><span class="kw-2">mut </span>writer =
<a href=#319 id=319 data-nosnippet>319</a> Writer::new(<span class="kw-2">&amp;mut </span>output, Encoder::new(<span class="number">1</span>).unwrap());
<a href=#320 id=320 data-nosnippet>320</a> writer.write_all(input).unwrap();
<a href=#321 id=321 data-nosnippet>321</a> writer.finish().unwrap();
<a href=#322 id=322 data-nosnippet>322</a> }
<a href=#323 id=323 data-nosnippet>323</a> <span class="comment">// println!("Output: {:?}", output);
<a href=#324 id=324 data-nosnippet>324</a> </span><span class="kw">let </span>decoded = <span class="kw">crate</span>::decode_all(<span class="kw-2">&amp;</span>output[..]).unwrap();
<a href=#325 id=325 data-nosnippet>325</a> <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>decoded, input);
<a href=#326 id=326 data-nosnippet>326</a> }
<a href=#327 id=327 data-nosnippet>327</a>
<a href=#328 id=328 data-nosnippet>328</a> <span class="attr">#[test]
<a href=#329 id=329 data-nosnippet>329</a> </span><span class="kw">fn </span>test_compress_with_capacity() {
<a href=#330 id=330 data-nosnippet>330</a> <span class="kw">use </span><span class="kw">crate</span>::stream::raw::Encoder;
<a href=#331 id=331 data-nosnippet>331</a>
<a href=#332 id=332 data-nosnippet>332</a> <span class="kw">let </span>input = <span class="string">b"AbcdefghAbcdefgh."</span>;
<a href=#333 id=333 data-nosnippet>333</a>
<a href=#334 id=334 data-nosnippet>334</a> <span class="comment">// Test writer
<a href=#335 id=335 data-nosnippet>335</a> </span><span class="kw">let </span><span class="kw-2">mut </span>output = Vec::new();
<a href=#336 id=336 data-nosnippet>336</a> {
<a href=#337 id=337 data-nosnippet>337</a> <span class="kw">let </span><span class="kw-2">mut </span>writer = Writer::new_with_capacity(
<a href=#338 id=338 data-nosnippet>338</a> <span class="kw-2">&amp;mut </span>output,
<a href=#339 id=339 data-nosnippet>339</a> Encoder::new(<span class="number">1</span>).unwrap(),
<a href=#340 id=340 data-nosnippet>340</a> <span class="number">64</span>,
<a href=#341 id=341 data-nosnippet>341</a> );
<a href=#342 id=342 data-nosnippet>342</a> <span class="macro">assert_eq!</span>(writer.buffer.capacity(), <span class="number">64</span>);
<a href=#343 id=343 data-nosnippet>343</a> writer.write_all(input).unwrap();
<a href=#344 id=344 data-nosnippet>344</a> writer.finish().unwrap();
<a href=#345 id=345 data-nosnippet>345</a> }
<a href=#346 id=346 data-nosnippet>346</a> <span class="kw">let </span>decoded = <span class="kw">crate</span>::decode_all(<span class="kw-2">&amp;</span>output[..]).unwrap();
<a href=#347 id=347 data-nosnippet>347</a> <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>decoded, input);
<a href=#348 id=348 data-nosnippet>348</a> }
<a href=#349 id=349 data-nosnippet>349</a>
<a href=#350 id=350 data-nosnippet>350</a> <span class="attr">#[test]
<a href=#351 id=351 data-nosnippet>351</a> </span><span class="kw">fn </span>test_decompress() {
<a href=#352 id=352 data-nosnippet>352</a> <span class="kw">use </span><span class="kw">crate</span>::stream::raw::Decoder;
<a href=#353 id=353 data-nosnippet>353</a>
<a href=#354 id=354 data-nosnippet>354</a> <span class="kw">let </span>input = <span class="string">b"AbcdefghAbcdefgh."</span>;
<a href=#355 id=355 data-nosnippet>355</a> <span class="kw">let </span>compressed = <span class="kw">crate</span>::encode_all(<span class="kw-2">&amp;</span>input[..], <span class="number">1</span>).unwrap();
<a href=#356 id=356 data-nosnippet>356</a>
<a href=#357 id=357 data-nosnippet>357</a> <span class="comment">// Test writer
<a href=#358 id=358 data-nosnippet>358</a> </span><span class="kw">let </span><span class="kw-2">mut </span>output = Vec::new();
<a href=#359 id=359 data-nosnippet>359</a> {
<a href=#360 id=360 data-nosnippet>360</a> <span class="kw">let </span><span class="kw-2">mut </span>writer = Writer::new(<span class="kw-2">&amp;mut </span>output, Decoder::new().unwrap());
<a href=#361 id=361 data-nosnippet>361</a> writer.write_all(<span class="kw-2">&amp;</span>compressed).unwrap();
<a href=#362 id=362 data-nosnippet>362</a> writer.finish().unwrap();
<a href=#363 id=363 data-nosnippet>363</a> }
<a href=#364 id=364 data-nosnippet>364</a> <span class="comment">// println!("Output: {:?}", output);
<a href=#365 id=365 data-nosnippet>365</a> </span><span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>output, input);
<a href=#366 id=366 data-nosnippet>366</a> }
<a href=#367 id=367 data-nosnippet>367</a>
<a href=#368 id=368 data-nosnippet>368</a> <span class="attr">#[test]
<a href=#369 id=369 data-nosnippet>369</a> </span><span class="kw">fn </span>test_decompress_with_capacity() {
<a href=#370 id=370 data-nosnippet>370</a> <span class="kw">use </span><span class="kw">crate</span>::stream::raw::Decoder;
<a href=#371 id=371 data-nosnippet>371</a>
<a href=#372 id=372 data-nosnippet>372</a> <span class="kw">let </span>input = <span class="string">b"AbcdefghAbcdefgh."</span>;
<a href=#373 id=373 data-nosnippet>373</a> <span class="kw">let </span>compressed = <span class="kw">crate</span>::encode_all(<span class="kw-2">&amp;</span>input[..], <span class="number">1</span>).unwrap();
<a href=#374 id=374 data-nosnippet>374</a>
<a href=#375 id=375 data-nosnippet>375</a> <span class="comment">// Test writer
<a href=#376 id=376 data-nosnippet>376</a> </span><span class="kw">let </span><span class="kw-2">mut </span>output = Vec::new();
<a href=#377 id=377 data-nosnippet>377</a> {
<a href=#378 id=378 data-nosnippet>378</a> <span class="kw">let </span><span class="kw-2">mut </span>writer = Writer::new_with_capacity(
<a href=#379 id=379 data-nosnippet>379</a> <span class="kw-2">&amp;mut </span>output,
<a href=#380 id=380 data-nosnippet>380</a> Decoder::new().unwrap(),
<a href=#381 id=381 data-nosnippet>381</a> <span class="number">64</span>,
<a href=#382 id=382 data-nosnippet>382</a> );
<a href=#383 id=383 data-nosnippet>383</a> <span class="macro">assert_eq!</span>(writer.buffer.capacity(), <span class="number">64</span>);
<a href=#384 id=384 data-nosnippet>384</a> writer.write_all(<span class="kw-2">&amp;</span>compressed).unwrap();
<a href=#385 id=385 data-nosnippet>385</a> writer.finish().unwrap();
<a href=#386 id=386 data-nosnippet>386</a> }
<a href=#387 id=387 data-nosnippet>387</a> <span class="macro">assert_eq!</span>(<span class="kw-2">&amp;</span>output, input);
<a href=#388 id=388 data-nosnippet>388</a> }
<a href=#389 id=389 data-nosnippet>389</a>}
</code></pre></div></section></main></body></html>