stdex/stream_8hpp_source.html

3872 lines
711 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>stdex: include/stdex/stream.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">stdex
</div>
<div id="projectbrief">Additional custom or not Standard C++ covered algorithms</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li><li class="navelem"><a class="el" href="dir_fca3c47b2ea228727bd6729832f89576.html">stdex</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle"><div class="title">stream.hpp</div></div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/*</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"> SPDX-License-Identifier: MIT</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment"> Copyright © 2023 Amebis</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment">*/</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span> </div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="preprocessor">#pragma once</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span> </div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="preprocessor">#include &quot;compat.hpp&quot;</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="preprocessor">#include &quot;endian.hpp&quot;</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="preprocessor">#include &quot;interval.hpp&quot;</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="preprocessor">#include &quot;math.hpp&quot;</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#include &quot;ring.hpp&quot;</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#include &quot;string.hpp&quot;</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include &quot;system.hpp&quot;</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include &quot;unicode.hpp&quot;</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;assert.h&gt;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;stdint.h&gt;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include &lt;stdlib.h&gt;</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#if defined(_WIN32)</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &lt;asptlb.h&gt;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include &lt;objidl.h&gt;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include &lt;fcntl.h&gt;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#include &lt;unistd.h&gt;</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#include &lt;sys/stat.h&gt;</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#include &lt;chrono&gt;</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="preprocessor">#include &lt;condition_variable&gt;</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="preprocessor">#include &lt;list&gt;</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="preprocessor">#include &lt;memory&gt;</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="preprocessor">#include &lt;string&gt;</span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="preprocessor">#include &lt;thread&gt;</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> </div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="preprocessor">#if !defined(SET_FILE_OP_TIMES) &amp;&amp; defined(RDAT_BELEZI_CAS_DOSTOPA_VER)</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="preprocessor">#define SET_FILE_OP_TIMES 1</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="preprocessor">#pragma message(&quot;RDAT_BELEZI_CAS_DOSTOPA_VER is deprecated. Use SET_FILE_OP_TIMES instead.&quot;)</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="preprocessor">#elif !defined(SET_FILE_OP_TIMES)</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="preprocessor">#define SET_FILE_OP_TIMES 0</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="preprocessor">#if !defined(CHECK_STREAM_STATE) &amp;&amp; defined(RDAT_NE_PREVERJAJ_STANJA_VER)</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><span class="preprocessor">#define CHECK_STREAM_STATE 0</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="preprocessor">#pragma message(&quot;RDAT_NE_PREVERJAJ_EOF_VER is deprecated. Use CHECK_STREAM_STATE=0 instead.&quot;)</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="preprocessor">#define CHECK_STREAM_STATE 1</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> </div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="keyword">namespace </span>stdex</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span>{</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> <span class="keyword">namespace </span>stream</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> {</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keyword">enum class</span> state_t {</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> ok = 0,</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> eof,</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> fail,</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> };</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> </div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> <span class="keyword">using </span>fsize_t = uint64_t;</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="keyword">constexpr</span> fsize_t fsize_max = UINT64_MAX;</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> </div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <span class="keyword">constexpr</span> <span class="keywordtype">size_t</span> iterate_count = 0x10;</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="keyword">constexpr</span> <span class="keywordtype">size_t</span> default_block_size = 0x10000; </div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <span class="keyword">constexpr</span> <span class="keywordtype">wchar_t</span> utf16_bom = L<span class="stringliteral">&#39;\ufeff&#39;</span>; </div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="keyword">constexpr</span> <span class="keyword">const</span> <span class="keywordtype">char</span> utf8_bom[3] = { <span class="stringliteral">&#39;\xef&#39;</span>, <span class="stringliteral">&#39;\xbb&#39;</span>, <span class="stringliteral">&#39;\xbf&#39;</span> }; </div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> </div>
<div class="foldopen" id="foldopen00075" data-start="{" data-end="};">
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html"> 75</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> {</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>(_In_ state_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a> = state_t::ok) : m_state(<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>) {}</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> </div>
<div class="foldopen" id="foldopen00091" data-start="{" data-end="}">
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a"> 91</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> {</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> _Unreferenced_(data);</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> _Unreferenced_(length);</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> m_state = state_t::fail;</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> }</div>
</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> </div>
<div class="foldopen" id="foldopen00109" data-start="{" data-end="}">
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081"> 109</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> {</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> _Unreferenced_(data);</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> _Unreferenced_(length);</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> m_state = state_t::fail;</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> }</div>
</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> </div>
<div class="foldopen" id="foldopen00121" data-start="{" data-end="}">
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a46c70519f3e4b1f3436e85a6623555dc"> 121</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a46c70519f3e4b1f3436e85a6623555dc">flush</a>()</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> {</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> m_state = state_t::ok;</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> }</div>
</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> </div>
<div class="foldopen" id="foldopen00129" data-start="{" data-end="}">
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a5392748c19b5799da94a5fe031f7ec3b"> 129</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a5392748c19b5799da94a5fe031f7ec3b">close</a>()</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> {</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> m_state = state_t::ok;</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> }</div>
</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> </div>
<div class="foldopen" id="foldopen00137" data-start="{" data-end="}">
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a52ce3bdf28a9a7fc5a881616c8db2da4"> 137</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a52ce3bdf28a9a7fc5a881616c8db2da4">skip</a>(_In_ fsize_t amount)</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> {</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keywordflow">if</span> (amount == 1)</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a600e123c10d6f0604d58ae0e9be95f0b">read_byte</a>();</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (amount &lt; iterate_count) {</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; static_cast&lt;size_t&gt;(amount); i++) {</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a600e123c10d6f0604d58ae0e9be95f0b">read_byte</a>();</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> }</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> }</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> <span class="keywordtype">size_t</span> block = <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(std::min&lt;fsize_t&gt;(amount, default_block_size));</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> std::unique_ptr&lt;uint8_t[]&gt; dummy(<span class="keyword">new</span> uint8_t[block]);</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keywordflow">while</span> (amount) {</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> amount -= <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a7723ae23bc35c2ffb74380eab5b0a9ba">read_array</a>(dummy.get(), <span class="keyword">sizeof</span>(uint8_t), <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(std::min&lt;fsize_t&gt;(amount, block)));</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> }</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> }</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::bad_alloc&amp;) { m_state = state_t::fail; }</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> }</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> }</div>
</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> </div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0"> 165</a></span> <span class="keyword">inline</span> state_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_state; };</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> </div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1"> 170</a></span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_state == state_t::ok; };</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> </div>
<div class="foldopen" id="foldopen00179" data-start="{" data-end="}">
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a6148810b1d873b9f5a3496b06b1aa90b"> 179</a></span> <span class="keyword">virtual</span> std::vector&lt;uint8_t&gt; <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a6148810b1d873b9f5a3496b06b1aa90b">read_remainder</a>(_In_ <span class="keywordtype">size_t</span> max_length = SIZE_MAX)</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> {</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> std::vector&lt;uint8_t&gt; result;</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> <span class="keywordtype">size_t</span> offset, length;</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> offset = 0;</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> length = default_block_size;</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <span class="keywordflow">while</span> (offset &lt; max_length) {</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> length = std::min(length, max_length);</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> <span class="keywordflow">try</span> { result.resize(length); }</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::bad_alloc&amp;) {</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> m_state = state_t::fail;</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> }</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> <span class="keyword">auto</span> num_read = <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a7723ae23bc35c2ffb74380eab5b0a9ba">read_array</a>(result.data() + offset, <span class="keyword">sizeof</span>(uint8_t), length - offset);</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> offset += num_read;</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> length += default_block_size;</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> }</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> result.resize(offset);</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> }</div>
</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> </div>
<div class="foldopen" id="foldopen00205" data-start="{" data-end="}">
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a600e123c10d6f0604d58ae0e9be95f0b"> 205</a></span> <span class="keyword">inline</span> uint8_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a600e123c10d6f0604d58ae0e9be95f0b">read_byte</a>()</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> {</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> uint8_t byte;</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a7723ae23bc35c2ffb74380eab5b0a9ba">read_array</a>(&amp;<span class="keywordtype">byte</span>, <span class="keyword">sizeof</span>(<span class="keywordtype">byte</span>), 1) == 1)</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="keywordflow">return</span> byte;</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;failed to read&quot;</span>);</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> }</div>
</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> </div>
<div class="foldopen" id="foldopen00216" data-start="{" data-end="}">
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#af83cd6902f3f3bf18df2f08045570603"> 216</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#af83cd6902f3f3bf18df2f08045570603">write_byte</a>(_In_ uint8_t <span class="keywordtype">byte</span>, _In_ fsize_t amount = 1)</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> {</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <span class="keywordflow">if</span> (amount == 1)</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(&amp;<span class="keywordtype">byte</span>, <span class="keyword">sizeof</span>(uint8_t));</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (amount &lt; iterate_count) {</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; static_cast&lt;size_t&gt;(amount); i++) {</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(&amp;<span class="keywordtype">byte</span>, <span class="keyword">sizeof</span>(uint8_t));</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> }</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> }</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <span class="keywordtype">size_t</span> block = <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(std::min&lt;fsize_t&gt;(amount, default_block_size));</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> std::unique_ptr&lt;uint8_t[]&gt; dummy(<span class="keyword">new</span> uint8_t[block]);</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> memset(dummy.get(), <span class="keywordtype">byte</span>, block);</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> <span class="keywordflow">while</span> (amount) {</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> amount -= <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a">write_array</a>(dummy.get(), <span class="keyword">sizeof</span>(uint8_t), <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(std::min&lt;fsize_t&gt;(amount, block)));</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> }</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> }</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::bad_alloc&amp;) { m_state = state_t::fail; }</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> }</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> }</div>
</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> </div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="foldopen" id="foldopen00254" data-start="{" data-end="}">
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df"> 254</a></span> <span class="keyword">inline</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(_Out_ T&amp; data)</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> {</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_ {</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> data = 0;</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> }</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a7723ae23bc35c2ffb74380eab5b0a9ba">read_array</a>(&amp;data, <span class="keyword">sizeof</span>(T), 1) == 1)</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> (void)LE2HE(&amp;data);</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> data = 0;</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>())</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> m_state = state_t::eof;</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> }</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> }</div>
</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> </div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="foldopen" id="foldopen00282" data-start="{" data-end="}">
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab"> 282</a></span> <span class="keyword">inline</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(_In_ <span class="keyword">const</span> T data)</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> {</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span><span class="preprocessor">#if BYTE_ORDER == BIG_ENDIAN</span></div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> T data_le = HE2LE(data);</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(&amp;data_le, <span class="keyword">sizeof</span>(T));</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(&amp;data, <span class="keyword">sizeof</span>(T));</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> }</div>
</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> </div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Traits = std::<span class="keywordtype">char</span>_traits&lt;<span class="keywordtype">char</span>&gt;, <span class="keyword">class</span> _Ax = std::allocator&lt;<span class="keywordtype">char</span>&gt;&gt;</div>
<div class="foldopen" id="foldopen00301" data-start="{" data-end="}">
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a674d87b6ac5ca7b50cb0498a7ffcefcb"> 301</a></span> <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a674d87b6ac5ca7b50cb0498a7ffcefcb">readln</a>(_Inout_ std::basic_string&lt;char, _Traits, _Ax&gt;&amp; str)</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> {</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> str.clear();</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a6e67bf06f20bc1743cd75622c4b83892">readln_and_attach</a>(str);</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> }</div>
</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> </div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Traits = std::<span class="keywordtype">char</span>_traits&lt;<span class="keywordtype">wchar_t</span>&gt;, <span class="keyword">class</span> _Ax = std::allocator&lt;<span class="keywordtype">wchar_t</span>&gt;&gt;</div>
<div class="foldopen" id="foldopen00313" data-start="{" data-end="}">
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#aa8ab653a03de90f7e60242915c3b5378"> 313</a></span> <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa8ab653a03de90f7e60242915c3b5378">readln</a>(_Inout_ std::basic_string&lt;wchar_t, _Traits, _Ax&gt;&amp; wstr)</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> {</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> wstr.clear();</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a6e67bf06f20bc1743cd75622c4b83892">readln_and_attach</a>(wstr);</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> }</div>
</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> </div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Traits = std::<span class="keywordtype">char</span>_traits&lt;<span class="keywordtype">wchar_t</span>&gt;, <span class="keyword">class</span> _Ax = std::allocator&lt;<span class="keywordtype">wchar_t</span>&gt;&gt;</div>
<div class="foldopen" id="foldopen00325" data-start="{" data-end="}">
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#ab93d06a993faf3b5f5026c0f5da326a1"> 325</a></span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ab93d06a993faf3b5f5026c0f5da326a1">readln</a>(_Inout_ std::basic_string&lt;wchar_t, _Traits, _Ax&gt;&amp; wstr, _In_ charset_id charset)</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> {</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> <span class="keywordflow">if</span> (charset == charset_id::utf16)</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a674d87b6ac5ca7b50cb0498a7ffcefcb">readln</a>(wstr);</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> std::string str;</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a6e67bf06f20bc1743cd75622c4b83892">readln_and_attach</a>(str);</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> wstr.clear();</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> str2wstr(wstr, str, charset);</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> <span class="keywordflow">return</span> wstr.size();</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> }</div>
</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> </div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Elem, <span class="keyword">class</span> _Traits = std::<span class="keywordtype">char</span>_traits&lt;_Elem&gt;, <span class="keyword">class</span> _Ax = std::allocator&lt;_Elem&gt;&gt;</div>
<div class="foldopen" id="foldopen00342" data-start="{" data-end="}">
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a6e67bf06f20bc1743cd75622c4b83892"> 342</a></span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a6e67bf06f20bc1743cd75622c4b83892">readln_and_attach</a>(_Inout_ std::basic_string&lt;_Elem, _Traits, _Ax&gt;&amp; str)</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> {</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> <span class="keywordtype">bool</span> initial = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> _Elem chr, previous = (_Elem)0;</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> <span class="keywordflow">do</span> {</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a7723ae23bc35c2ffb74380eab5b0a9ba">read_array</a>(&amp;chr, <span class="keyword">sizeof</span>(_Elem), 1);</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> <span class="keywordflow">if</span> (!initial &amp;&amp; !(previous == <span class="keyword">static_cast&lt;</span>_Elem<span class="keyword">&gt;</span>(<span class="charliteral">&#39;\r&#39;</span>) &amp;&amp; chr == <span class="keyword">static_cast&lt;</span>_Elem<span class="keyword">&gt;</span>(<span class="charliteral">&#39;\n&#39;</span>)))</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> str += previous;</div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> initial = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> previous = chr;</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> } <span class="keywordflow">while</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>() &amp;&amp; chr != <span class="keyword">static_cast&lt;</span>_Elem<span class="keyword">&gt;</span>(<span class="charliteral">&#39;\n&#39;</span>));</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> <span class="keywordflow">return</span> str.size();</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> }</div>
</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> </div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Traits = std::<span class="keywordtype">char</span>_traits&lt;<span class="keywordtype">wchar_t</span>&gt;, <span class="keyword">class</span> _Ax = std::allocator&lt;<span class="keywordtype">wchar_t</span>&gt;&gt;</div>
<div class="foldopen" id="foldopen00363" data-start="{" data-end="}">
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a6386d7eb1316122d6403bcb83b7edfc9"> 363</a></span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a6386d7eb1316122d6403bcb83b7edfc9">readln_and_attach</a>(_Inout_ std::basic_string&lt;wchar_t, _Traits, _Ax&gt;&amp; wstr, _In_ charset_id charset)</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> {</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> <span class="keywordflow">if</span> (charset == charset_id::utf16)</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a6e67bf06f20bc1743cd75622c4b83892">readln_and_attach</a>(wstr);</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> std::string str;</div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a6e67bf06f20bc1743cd75622c4b83892">readln_and_attach</a>(str);</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> str2wstr(wstr, str, charset);</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> <span class="keywordflow">return</span> wstr.size();</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> }</div>
</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span> </div>
<div class="foldopen" id="foldopen00378" data-start="{" data-end="}">
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a7723ae23bc35c2ffb74380eab5b0a9ba"> 378</a></span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a7723ae23bc35c2ffb74380eab5b0a9ba">read_array</a>(_Out_writes_bytes_(size* count) <span class="keywordtype">void</span>* array, _In_ <span class="keywordtype">size_t</span> size, _In_ <span class="keywordtype">size_t</span> count)</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> {</div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_read = mul(size, count);;) {</div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> <span class="keywordtype">size_t</span> num_read = <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(array, to_read);</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> to_read -= num_read;</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> <span class="keywordflow">if</span> (!to_read)</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> <span class="keywordflow">return</span> count;</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> <span class="keywordflow">return</span> count - to_read / size;</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> <span class="keyword">reinterpret_cast&lt;</span>uint8_t*&amp;<span class="keyword">&gt;</span>(array) += num_read;</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> }</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> }</div>
</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> </div>
<div class="foldopen" id="foldopen00396" data-start="{" data-end="}">
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a"> 396</a></span> <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a">write_array</a>(_In_reads_bytes_opt_(size* count) <span class="keyword">const</span> <span class="keywordtype">void</span>* array, _In_ <span class="keywordtype">size_t</span> size, _In_ <span class="keywordtype">size_t</span> count)</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> {</div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(array, mul(size, count)) / size;</div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> }</div>
</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> </div>
<div class="foldopen" id="foldopen00409" data-start="{" data-end="}">
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#aca55a448ce9bec6b50be680f1ac63b09"> 409</a></span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aca55a448ce9bec6b50be680f1ac63b09">write_array</a>(_In_z_ <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* wstr, _In_ charset_id charset)</div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> {</div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> <span class="keywordtype">size_t</span> num_chars = stdex::strlen(wstr);</div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> <span class="keywordflow">if</span> (charset != charset_id::utf16) {</div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> std::string str(wstr2str(wstr, num_chars, charset));</div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a">write_array</a>(str.data(), <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>), str.size());</div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> }</div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a">write_array</a>(wstr, <span class="keyword">sizeof</span>(<span class="keywordtype">wchar_t</span>), num_chars);</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> }</div>
</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> </div>
<div class="foldopen" id="foldopen00430" data-start="{" data-end="}">
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a248d5e688633f04139ee36aacc0258ad"> 430</a></span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a248d5e688633f04139ee36aacc0258ad">write_array</a>(_In_reads_or_z_opt_(num_chars) <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* wstr, _In_ <span class="keywordtype">size_t</span> num_chars, _In_ charset_id charset)</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> {</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> num_chars = stdex::strnlen(wstr, num_chars);</div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> <span class="keywordflow">if</span> (charset != charset_id::utf16) {</div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> std::string str(wstr2str(wstr, num_chars, charset));</div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a">write_array</a>(str.data(), <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>), str.size());</div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> }</div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a">write_array</a>(wstr, <span class="keyword">sizeof</span>(<span class="keywordtype">wchar_t</span>), num_chars);</div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> }</div>
</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> </div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Traits = std::<span class="keywordtype">char</span>_traits&lt;<span class="keywordtype">wchar_t</span>&gt;, <span class="keyword">class</span> _Ax = std::allocator&lt;<span class="keywordtype">wchar_t</span>&gt;&gt;</div>
<div class="foldopen" id="foldopen00451" data-start="{" data-end="}">
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#ae7e725d1bfe3b7a08a87c969ce441a7a"> 451</a></span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ae7e725d1bfe3b7a08a87c969ce441a7a">write_array</a>(_In_ <span class="keyword">const</span> std::basic_string&lt;wchar_t, _Traits, _Ax&gt;&amp; wstr, _In_ charset_id charset)</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> {</div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> <span class="keywordflow">if</span> (charset != charset_id::utf16) {</div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> std::string str(wstr2str(wstr, charset));</div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a">write_array</a>(str.data(), <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>), str.size());</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> }</div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a">write_array</a>(wstr.data(), <span class="keyword">sizeof</span>(<span class="keywordtype">wchar_t</span>), wstr.size());</div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> }</div>
</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> </div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Elem, <span class="keyword">class</span> _Traits = std::<span class="keywordtype">char</span>_traits&lt;_Elem&gt;, <span class="keyword">class</span> _Ax = std::allocator&lt;_Elem&gt;&gt;</div>
<div class="foldopen" id="foldopen00474" data-start="{" data-end="}">
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a2fece103fa6ca15dfe093fe90ceae65e"> 474</a></span> <span class="keyword">inline</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2fece103fa6ca15dfe093fe90ceae65e">read_str</a>(_Inout_ std::basic_string&lt;_Elem, _Traits, _Ax&gt;&amp; data)</div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> {</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> uint32_t num_chars;</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(num_chars);</div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_ {</div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> data.clear();</div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> }</div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> data.resize(num_chars);</div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> data.resize(<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a7723ae23bc35c2ffb74380eab5b0a9ba">read_array</a>(data.data(), <span class="keyword">sizeof</span>(_Elem), num_chars));</div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> }</div>
</div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> </div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="foldopen" id="foldopen00499" data-start="{" data-end="}">
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a815369ef1a8ba07b289b8236fce018ac"> 499</a></span> <span class="keyword">inline</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a815369ef1a8ba07b289b8236fce018ac">write_str</a>(_In_z_ <span class="keyword">const</span> T* data)</div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> {</div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> <span class="comment">// Stream state will be checked in write_data.</span></div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> <span class="keywordtype">size_t</span> num_chars = stdex::strlen(data);</div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> <span class="keywordflow">if</span> (num_chars &gt; UINT32_MAX)</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;string too long&quot;</span>);</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>((uint32_t)num_chars);</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a">write_array</a>(data, <span class="keyword">sizeof</span>(T), num_chars);</div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> }</div>
</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> </div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> <span class="keywordtype">size_t</span> write_sa(_In_ LPSAFEARRAY sa)</div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> {</div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> safearray_accessor&lt;void&gt; a(sa);</div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> <span class="keywordtype">long</span> ubound, lbound;</div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> <span class="keywordflow">if</span> (FAILED(SafeArrayGetUBound(sa, 1, &amp;ubound)) ||</div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> FAILED(SafeArrayGetLBound(sa, 1, &amp;lbound)))</div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;SafeArrayGet[UL]Bound failed&quot;</span>);</div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(a.data(), <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(ubound) - lbound + 1);</div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> }</div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span> </div>
<div class="foldopen" id="foldopen00534" data-start="{" data-end="}">
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#ad28b193e6afa1352a00864bd28193cc2"> 534</a></span> fsize_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad28b193e6afa1352a00864bd28193cc2">write_stream</a>(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>&amp; stream, _In_ fsize_t amount = fsize_max)</div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> {</div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span> std::unique_ptr&lt;uint8_t[]&gt; data(<span class="keyword">new</span> uint8_t[<span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(std::min&lt;fsize_t&gt;(amount, default_block_size))]);</div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> fsize_t num_copied = 0, to_write = amount;</div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> m_state = state_t::ok;</div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> <span class="keywordflow">while</span> (to_write) {</div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> <span class="keywordtype">size_t</span> num_read = stream.read(data.get(), <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(std::min&lt;fsize_t&gt;(default_block_size, to_write)));</div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> <span class="keywordtype">size_t</span> num_written = <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(data.get(), num_read);</div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> num_copied += num_written;</div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> to_write -= num_written;</div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> <span class="keywordflow">if</span> (stream.m_state == state_t::eof) {</div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> <span class="comment">// EOF is not an error.</span></div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> m_state = state_t::ok;</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> }</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> m_state = stream.m_state;</div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>())</div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> }</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> <span class="keywordflow">return</span> num_copied;</div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> }</div>
</div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> </div>
<div class="foldopen" id="foldopen00559" data-start="{" data-end="}">
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#ab61abc19936554288ea929e0eb299144"> 559</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ab61abc19936554288ea929e0eb299144">write_charset</a>(_In_ charset_id charset)</div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> {</div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> <span class="keywordflow">if</span> (charset == charset_id::utf16)</div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(utf16_bom);</div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (charset == charset_id::utf8)</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a">write_array</a>(utf8_bom, <span class="keyword">sizeof</span>(utf8_bom), 1);</div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span> }</div>
</div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> </div>
<div class="foldopen" id="foldopen00572" data-start="{" data-end="}">
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a63528d1cf030257c9d7f24d0d1d668f7"> 572</a></span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a63528d1cf030257c9d7f24d0d1d668f7">write_sprintf</a>(_In_z_ _Printf_format_string_params_(2) <span class="keyword">const</span> <span class="keywordtype">char</span>* format, _In_opt_ locale_t locale, ...)</div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span> {</div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> va_list params;</div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span> va_start(params, locale);</div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> <span class="keywordtype">size_t</span> num_chars = <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a14931af91db2bab8204d6352a59c1bf7">write_vsprintf</a>(format, locale, params);</div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> va_end(params);</div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span> <span class="keywordflow">return</span> num_chars;</div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span> }</div>
</div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</span> </div>
<div class="foldopen" id="foldopen00586" data-start="{" data-end="}">
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a32f854944dc108d99c5ea5e87b19db7e"> 586</a></span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a32f854944dc108d99c5ea5e87b19db7e">write_sprintf</a>(_In_z_ _Printf_format_string_params_(2) <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* format, _In_opt_ locale_t locale, ...)</div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"> 587</span> {</div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno"> 588</span> va_list params;</div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno"> 589</span> va_start(params, locale);</div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"> 590</span> <span class="keywordtype">size_t</span> num_chars = <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a14931af91db2bab8204d6352a59c1bf7">write_vsprintf</a>(format, locale, params);</div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno"> 591</span> va_end(params);</div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno"> 592</span> <span class="keywordflow">return</span> num_chars;</div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno"> 593</span> }</div>
</div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"> 594</span> </div>
<div class="foldopen" id="foldopen00600" data-start="{" data-end="}">
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a14931af91db2bab8204d6352a59c1bf7"> 600</a></span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a14931af91db2bab8204d6352a59c1bf7">write_vsprintf</a>(_In_z_ _Printf_format_string_params_(2) <span class="keyword">const</span> <span class="keywordtype">char</span>* format, _In_opt_ locale_t locale, _In_ va_list params)</div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno"> 601</span> {</div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno"> 602</span> std::string str;</div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span> str.reserve(default_block_size);</div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</span> vappendf(str, format, locale, params);</div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a">write_array</a>(str.data(), <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>), str.size());</div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> }</div>
</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> </div>
<div class="foldopen" id="foldopen00613" data-start="{" data-end="}">
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic.html#a3a7ac9211cd81b2203b55f1a2f131bc1"> 613</a></span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a3a7ac9211cd81b2203b55f1a2f131bc1">write_vsprintf</a>(_In_z_ _Printf_format_string_params_(2) <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* format, _In_opt_ locale_t locale, _In_ va_list params)</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> {</div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> std::wstring str;</div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> str.reserve(default_block_size);</div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> vappendf(str, format, locale, params);</div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a">write_array</a>(str.data(), <span class="keyword">sizeof</span>(<span class="keywordtype">wchar_t</span>), str.size());</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> }</div>
</div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span> </div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> <span class="keyword">inline</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>&amp; operator &gt;&gt;(_Out_ int8_t&amp; data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(data); }</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> <span class="keyword">inline</span> basic&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> int8_t data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(data); }</div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span> <span class="keyword">inline</span> basic&amp; operator &gt;&gt;(_Out_ int16_t&amp; data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(data); }</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"> 624</span> <span class="keyword">inline</span> basic&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> int16_t data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(data); }</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> <span class="keyword">inline</span> basic&amp; operator &gt;&gt;(_Out_ int32_t&amp; data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(data); }</div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> <span class="keyword">inline</span> basic&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> int32_t data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(data); }</div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> <span class="keyword">inline</span> basic&amp; operator &gt;&gt;(_Out_ int64_t&amp; data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(data); }</div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> <span class="keyword">inline</span> basic&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> int64_t data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(data); }</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span> <span class="keyword">inline</span> basic&amp; operator &gt;&gt;(_Out_ uint8_t&amp; data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(data); }</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span> <span class="keyword">inline</span> basic&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> uint8_t data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(data); }</div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span> <span class="keyword">inline</span> basic&amp; operator &gt;&gt;(_Out_ uint16_t&amp; data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(data); }</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> <span class="keyword">inline</span> basic&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> uint16_t data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(data); }</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> <span class="keyword">inline</span> basic&amp; operator &gt;&gt;(_Out_ uint32_t&amp; data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(data); }</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> <span class="keyword">inline</span> basic&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> uint32_t data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(data); }</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> <span class="keyword">inline</span> basic&amp; operator &gt;&gt;(_Out_ uint64_t&amp; data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(data); }</div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span> <span class="keyword">inline</span> basic&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> uint64_t data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(data); }</div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span> <span class="keyword">inline</span> basic&amp; operator &gt;&gt;(_Out_ <span class="keywordtype">float</span>&amp; data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(data); }</div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span> <span class="keyword">inline</span> basic&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> <span class="keywordtype">float</span> data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(data); }</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> <span class="keyword">inline</span> basic&amp; operator &gt;&gt;(_Out_ <span class="keywordtype">double</span>&amp; data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(data); }</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> <span class="keyword">inline</span> basic&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> <span class="keywordtype">double</span> data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(data); }</div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> <span class="keyword">inline</span> basic&amp; operator &gt;&gt;(_Out_ <span class="keywordtype">char</span>&amp; data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(data); }</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span> <span class="keyword">inline</span> basic&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> <span class="keywordtype">char</span> data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(data); }</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span><span class="preprocessor">#ifdef _NATIVE_WCHAR_T_DEFINED</span></div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> <span class="keyword">inline</span> basic&amp; operator &gt;&gt;(_Out_ <span class="keywordtype">wchar_t</span>&amp; data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">read_data</a>(data); }</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> <span class="keyword">inline</span> basic&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> <span class="keywordtype">wchar_t</span> data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">write_data</a>(data); }</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Elem, <span class="keyword">class</span> _Traits = std::<span class="keywordtype">char</span>_traits&lt;_Elem&gt;, <span class="keyword">class</span> _Ax = std::allocator&lt;_Elem&gt;&gt;</div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno"> 648</span> <span class="keyword">inline</span> basic&amp; operator &gt;&gt;(_Inout_ std::basic_string&lt;_Elem, _Traits, _Ax&gt;&amp; data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2fece103fa6ca15dfe093fe90ceae65e">read_str</a>(data); }</div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno"> 649</span> <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span> <span class="keyword">inline</span> basic&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> T* data) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a815369ef1a8ba07b289b8236fce018ac">write_str</a>(data); }</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> </div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span> state_t m_state;</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> };</div>
</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> </div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span> <span class="keyword">using </span>fpos_t = uint64_t;</div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> <span class="keyword">constexpr</span> fpos_t fpos_max = UINT64_MAX;</div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> <span class="keyword">constexpr</span> fpos_t fpos_min = 0;</div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span> </div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno"> 666</span> <span class="keyword">using </span>foff_t = int64_t;</div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno"> 667</span> <span class="keyword">constexpr</span> foff_t foff_max = INT64_MAX;</div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> <span class="keyword">constexpr</span> foff_t foff_min = INT64_MIN;</div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span> </div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> <span class="keyword">enum class</span> seek_t {</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> beg = FILE_BEGIN,</div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> cur = FILE_CURRENT,</div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span> end = FILE_END</div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> beg = SEEK_SET,</div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span> cur = SEEK_CUR,</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> end = SEEK_END</div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> };</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> </div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span><span class="preprocessor">#if _HAS_CXX20</span></div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> <span class="keyword">using </span>clock = std::chrono::file_clock;</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> <span class="keyword">using </span>clock = std::chrono::system_clock;</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> <span class="keyword">using </span>time_point = std::chrono::time_point&lt;clock&gt;;</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> </div>
<div class="foldopen" id="foldopen00695" data-start="{" data-end="};">
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html"> 695</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1basic__file.html">basic_file</a> : <span class="keyword">virtual</span> <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a></div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> {</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> <span class="keyword">public</span>:</div>
<div class="foldopen" id="foldopen00698" data-start="{" data-end="}">
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#a72aa16169eea2156e83053ba9bd91cd8"> 698</a></span> <span class="keyword">virtual</span> std::vector&lt;uint8_t&gt; <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a72aa16169eea2156e83053ba9bd91cd8">read_remainder</a>(_In_ <span class="keywordtype">size_t</span> max_length = SIZE_MAX)</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> {</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> <span class="keywordtype">size_t</span> length = std::min&lt;size_t&gt;(max_length, <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ad868d7c25aa45cefc95dd54a24febf2f">size</a>() - <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ae072990f9c42b372048045717de438c3">tell</a>()));</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> std::vector&lt;uint8_t&gt; result;</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> <span class="keywordflow">try</span> { result.resize(length); }</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::bad_alloc&amp;) {</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> m_state = state_t::fail;</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> }</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> result.resize(<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a7723ae23bc35c2ffb74380eab5b0a9ba">read_array</a>(result.data(), <span class="keyword">sizeof</span>(uint8_t), length));</div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> }</div>
</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> </div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465"> 716</a></span> <span class="keyword">virtual</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(_In_ foff_t offset, _In_ seek_t how = seek_t::beg) = 0;</div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> </div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#a6a8da9a1b0a3926b9bc453bf0209ee5e"> 723</a></span> <span class="keyword">inline</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a6a8da9a1b0a3926b9bc453bf0209ee5e">seekbeg</a>(_In_ fpos_t offset) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(offset, seek_t::beg); }</div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> </div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#a8158cb89ef54a737b7bcfed635c215d6"> 730</a></span> <span class="keyword">inline</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a8158cb89ef54a737b7bcfed635c215d6">seekcur</a>(_In_ foff_t offset) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(offset, seek_t::cur); }</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> </div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#ae13b5941415b3dbb9883c1da9bcd39c7"> 737</a></span> <span class="keyword">inline</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ae13b5941415b3dbb9883c1da9bcd39c7">seekend</a>(_In_ foff_t offset) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(offset, seek_t::end); }</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> </div>
<div class="foldopen" id="foldopen00739" data-start="{" data-end="}">
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#a15a1e6a778adefea421f32d14c8178dd"> 739</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a15a1e6a778adefea421f32d14c8178dd">skip</a>(_In_ fsize_t amount)</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> {</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(amount, seek_t::cur);</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> }</div>
</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> </div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#ae072990f9c42b372048045717de438c3"> 750</a></span> <span class="keyword">virtual</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ae072990f9c42b372048045717de438c3">tell</a>() <span class="keyword">const</span> = 0;</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> </div>
<div class="foldopen" id="foldopen00755" data-start="{" data-end="}">
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#a484ec74004fe0b4528c11675b91161e0"> 755</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a484ec74004fe0b4528c11675b91161e0">lock</a>(_In_ fpos_t offset, _In_ fsize_t length)</div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> {</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> _Unreferenced_(offset);</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> _Unreferenced_(length);</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> <span class="keywordflow">throw</span> std::domain_error(<span class="stringliteral">&quot;not implemented&quot;</span>);</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> }</div>
</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> </div>
<div class="foldopen" id="foldopen00765" data-start="{" data-end="}">
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#adf1a39e7aec3f14fedf6ce5c0984a791"> 765</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#adf1a39e7aec3f14fedf6ce5c0984a791">unlock</a>(_In_ fpos_t offset, _In_ fsize_t length)</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> {</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> _Unreferenced_(offset);</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> _Unreferenced_(length);</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> <span class="keywordflow">throw</span> std::domain_error(<span class="stringliteral">&quot;not implemented&quot;</span>);</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> }</div>
</div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> </div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#ad868d7c25aa45cefc95dd54a24febf2f"> 776</a></span> <span class="keyword">virtual</span> fsize_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ad868d7c25aa45cefc95dd54a24febf2f">size</a>() = 0;</div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> </div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#a522305da60cc442ca3cd6b7aa2214d6e"> 781</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a522305da60cc442ca3cd6b7aa2214d6e">truncate</a>() = 0;</div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> </div>
<div class="foldopen" id="foldopen00786" data-start="{" data-end="}">
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#a3c02c83246c43ed868dab1dd5a5d698d"> 786</a></span> <span class="keyword">virtual</span> time_point <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a3c02c83246c43ed868dab1dd5a5d698d">ctime</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> <span class="keywordflow">return</span> time_point::min();</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> }</div>
</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> </div>
<div class="foldopen" id="foldopen00794" data-start="{" data-end="}">
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#a84936e230100934793aad8a516efa826"> 794</a></span> <span class="keyword">virtual</span> time_point <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a84936e230100934793aad8a516efa826">atime</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> <span class="keywordflow">return</span> time_point::min();</div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> }</div>
</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> </div>
<div class="foldopen" id="foldopen00802" data-start="{" data-end="}">
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#ae10432137e01b7ce7c254c2a455c719e"> 802</a></span> <span class="keyword">virtual</span> time_point <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ae10432137e01b7ce7c254c2a455c719e">mtime</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> <span class="keywordflow">return</span> time_point::min();</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span> }</div>
</div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span> </div>
<div class="foldopen" id="foldopen00810" data-start="{" data-end="}">
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#aba668e53fc4709cd545f12a49521ed56"> 810</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#aba668e53fc4709cd545f12a49521ed56">set_ctime</a>(time_point date)</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> {</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> _Unreferenced_(date);</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> <span class="keywordflow">throw</span> std::domain_error(<span class="stringliteral">&quot;not implemented&quot;</span>);</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> }</div>
</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> </div>
<div class="foldopen" id="foldopen00819" data-start="{" data-end="}">
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#ae76436514ac66d88bbd584ea07d879d0"> 819</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ae76436514ac66d88bbd584ea07d879d0">set_atime</a>(time_point date)</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span> {</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> _Unreferenced_(date);</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span> <span class="keywordflow">throw</span> std::domain_error(<span class="stringliteral">&quot;not implemented&quot;</span>);</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span> }</div>
</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"> 824</span> </div>
<div class="foldopen" id="foldopen00828" data-start="{" data-end="}">
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#a814a080cb6da2041013749cc125bfd2b"> 828</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a814a080cb6da2041013749cc125bfd2b">set_mtime</a>(time_point date)</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> {</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> _Unreferenced_(date);</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> <span class="keywordflow">throw</span> std::domain_error(<span class="stringliteral">&quot;not implemented&quot;</span>);</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span> }</div>
</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span> </div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span> LPSAFEARRAY read_sa()</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span> {</div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"> 840</span> assert(<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ad868d7c25aa45cefc95dd54a24febf2f">size</a>() &lt;= SIZE_MAX);</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> <span class="keywordtype">size_t</span> length = <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ad868d7c25aa45cefc95dd54a24febf2f">size</a>());</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span> std::unique_ptr&lt;SAFEARRAY, SafeArrayDestroy_delete&gt; sa(SafeArrayCreateVector(VT_UI1, 0, (ULONG)length));</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> <span class="keywordflow">if</span> (!sa)</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;SafeArrayCreateVector failed&quot;</span>);</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span> safearray_accessor&lt;void&gt; a(sa.get());</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(0) != 0)</div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"> 847</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;failed to seek&quot;</span>);</div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a7723ae23bc35c2ffb74380eab5b0a9ba">read_array</a>(a.data(), 1, length) != length)</div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;failed to read&quot;</span>);</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"> 850</span> <span class="keywordflow">return</span> sa.release();</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> }</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span> </div>
<div class="foldopen" id="foldopen00859" data-start="{" data-end="}">
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__file.html#a6a3bc2c76e78363a2232eff12dd5e370"> 859</a></span> charset_id <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a6a3bc2c76e78363a2232eff12dd5e370">read_charset</a>(_In_ charset_id default_charset = charset_id::system)</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"> 860</span> {</div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"> 861</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(0) != 0)</div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;failed to seek&quot;</span>);</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> <span class="keywordtype">wchar_t</span> id_utf16;</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"> 864</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a7723ae23bc35c2ffb74380eab5b0a9ba">read_array</a>(&amp;id_utf16, <span class="keyword">sizeof</span>(<span class="keywordtype">wchar_t</span>), 1);</div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> <span class="keywordflow">return</span> default_charset;</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"> 867</span> <span class="keywordflow">if</span> (id_utf16 == utf16_bom)</div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno"> 868</span> <span class="keywordflow">return</span> charset_id::utf16;</div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno"> 869</span> </div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno"> 870</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(0) != 0)</div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno"> 871</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;failed to seek&quot;</span>);</div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno"> 872</span> <span class="keywordtype">char</span> id_utf8[3] = { 0 };</div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno"> 873</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a7723ae23bc35c2ffb74380eab5b0a9ba">read_array</a>(id_utf8, <span class="keyword">sizeof</span>(id_utf8), 1);</div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"> 874</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> <span class="keywordflow">return</span> default_charset;</div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"> 876</span> <span class="keywordflow">if</span> (strncmp(id_utf8, _countof(id_utf8), utf8_bom, _countof(utf8_bom)) == 0)</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span> <span class="keywordflow">return</span> charset_id::utf8;</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> </div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"> 879</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(0) != 0)</div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;failed to seek&quot;</span>);</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span> <span class="keywordflow">return</span> default_charset;</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"> 882</span> }</div>
</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span> };</div>
</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span> </div>
<div class="foldopen" id="foldopen00888" data-start="{" data-end="};">
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1converter.html"> 888</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">converter</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a></div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno"> 889</span> {</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno"> 890</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"> 891</span> <span class="keyword">explicit</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">converter</a>() :</div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno"> 892</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>(state_t::fail),</div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno"> 893</span> m_source(<span class="keyword">nullptr</span>)</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno"> 894</span> {}</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno"> 895</span> </div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno"> 896</span> <span class="keywordtype">void</span> init(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>&amp; source)</div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno"> 897</span> {</div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno"> 898</span> m_state = source.state();</div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno"> 899</span> m_source = &amp;source;</div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno"> 900</span> }</div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno"> 901</span> </div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno"> 902</span> <span class="keywordtype">void</span> done()</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno"> 903</span> {</div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno"> 904</span> m_source = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno"> 905</span> }</div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno"> 906</span> </div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno"> 907</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno"> 908</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">converter</a>(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>&amp; source) :</div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno"> 909</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>(source.state()),</div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno"> 910</span> m_source(&amp;source)</div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno"> 911</span> {}</div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno"> 912</span> </div>
<div class="foldopen" id="foldopen00913" data-start="{" data-end="}">
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1converter.html#abdca66af4847c6f8b6d87a0909fc061f"> 913</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1converter.html#abdca66af4847c6f8b6d87a0909fc061f">read</a>(</div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno"> 914</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno"> 915</span> {</div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno"> 916</span> <span class="keywordtype">size_t</span> num_read = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(data, length);</div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno"> 917</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno"> 918</span> <span class="keywordflow">return</span> num_read;</div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno"> 919</span> }</div>
</div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno"> 920</span> </div>
<div class="foldopen" id="foldopen00921" data-start="{" data-end="}">
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1converter.html#ae84a5c8d64942dbaa81ed54a181b3d7a"> 921</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1converter.html#ae84a5c8d64942dbaa81ed54a181b3d7a">write</a>(</div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno"> 922</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno"> 923</span> {</div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno"> 924</span> <span class="keywordtype">size_t</span> num_written = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(data, length);</div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno"> 925</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno"> 926</span> <span class="keywordflow">return</span> num_written;</div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno"> 927</span> }</div>
</div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno"> 928</span> </div>
<div class="foldopen" id="foldopen00929" data-start="{" data-end="}">
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1converter.html#a96c368204acf32239318a026762cd22c"> 929</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1converter.html#a96c368204acf32239318a026762cd22c">close</a>()</div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno"> 930</span> {</div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno"> 931</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a5392748c19b5799da94a5fe031f7ec3b">close</a>();</div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno"> 932</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno"> 933</span> }</div>
</div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno"> 934</span> </div>
<div class="foldopen" id="foldopen00935" data-start="{" data-end="}">
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1converter.html#a0d6af4c223625bc8ab677978b225d06e"> 935</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1converter.html#a0d6af4c223625bc8ab677978b225d06e">flush</a>()</div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno"> 936</span> {</div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno"> 937</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a46c70519f3e4b1f3436e85a6623555dc">flush</a>();</div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno"> 938</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno"> 939</span> }</div>
</div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno"> 940</span> </div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno"> 941</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno"> 942</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>* m_source;</div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno"> 943</span> };</div>
</div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno"> 944</span> </div>
<div class="foldopen" id="foldopen00948" data-start="{" data-end="};">
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1replicator.html"> 948</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1replicator.html">replicator</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a></div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno"> 949</span> {</div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno"> 950</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno"> 951</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classstdex_1_1stream_1_1replicator.html">~replicator</a>()</div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno"> 952</span> {</div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno"> 953</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> w = m_workers.begin(), w_end = m_workers.end(); w != w_end; ++w) {</div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno"> 954</span> <span class="keyword">auto</span> _w = w-&gt;get();</div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno"> 955</span> {</div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno"> 956</span> <span class="keyword">const</span> std::lock_guard&lt;std::mutex&gt; lk(_w-&gt;mutex);</div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno"> 957</span> _w-&gt;op = worker::op_t::quit;</div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno"> 958</span> }</div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno"> 959</span> _w-&gt;cv.notify_one();</div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno"> 960</span> }</div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno"> 961</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> w = m_workers.begin(), w_end = m_workers.end(); w != w_end; ++w)</div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno"> 962</span> w-&gt;get()-&gt;thread.join();</div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno"> 963</span> }</div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno"> 964</span> </div>
<div class="foldopen" id="foldopen00968" data-start="{" data-end="}">
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1replicator.html#a26a983c6d340261ef1c55af0e9916701"> 968</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1replicator.html#a26a983c6d340261ef1c55af0e9916701">push_back</a>(_In_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>* source)</div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno"> 969</span> {</div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno"> 970</span> m_workers.push_back(std::unique_ptr&lt;worker&gt;(<span class="keyword">new</span> <a class="code hl_class" href="classstdex_1_1stream_1_1replicator_1_1worker.html">worker</a>(source)));</div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno"> 971</span> }</div>
</div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno"> 972</span> </div>
<div class="foldopen" id="foldopen00976" data-start="{" data-end="}">
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1replicator.html#a7916a391dfa9484df02b1202c0a03edf"> 976</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1replicator.html#a7916a391dfa9484df02b1202c0a03edf">remove</a>(<a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>* source)</div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno"> 977</span> {</div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno"> 978</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> w = m_workers.begin(), w_end = m_workers.end(); w != w_end; ++w) {</div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno"> 979</span> <span class="keyword">auto</span> _w = w-&gt;get();</div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno"> 980</span> <span class="keywordflow">if</span> (_w-&gt;source == source) {</div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno"> 981</span> {</div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno"> 982</span> <span class="keyword">const</span> std::lock_guard&lt;std::mutex&gt; lk(_w-&gt;mutex);</div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno"> 983</span> _w-&gt;op = worker::op_t::quit;</div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno"> 984</span> }</div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno"> 985</span> _w-&gt;cv.notify_one();</div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno"> 986</span> _w-&gt;thread.join();</div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno"> 987</span> m_workers.erase(w);</div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno"> 988</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno"> 989</span> }</div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno"> 990</span> }</div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno"> 991</span> }</div>
</div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno"> 992</span> </div>
<div class="foldopen" id="foldopen00993" data-start="{" data-end="}">
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1replicator.html#abbbaa912a887b00a4a7a5d518079f5ec"> 993</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1replicator.html#abbbaa912a887b00a4a7a5d518079f5ec">write</a>(</div>
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno"> 994</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno"> 995</span> {</div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno"> 996</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> w = m_workers.begin(), w_end = m_workers.end(); w != w_end; ++w) {</div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno"> 997</span> <span class="keyword">auto</span> _w = w-&gt;get();</div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno"> 998</span> {</div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno"> 999</span> <span class="keyword">const</span> std::lock_guard&lt;std::mutex&gt; lk(_w-&gt;mutex);</div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span> _w-&gt;op = worker::op_t::write;</div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span> _w-&gt;data = data;</div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span> _w-&gt;length = length;</div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span> }</div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span> _w-&gt;cv.notify_one();</div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span> }</div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span> <span class="keywordtype">size_t</span> num_written = length;</div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> w = m_workers.begin(), w_end = m_workers.end(); w != w_end; ++w) {</div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span> <span class="keyword">auto</span> _w = w-&gt;get();</div>
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span> std::unique_lock&lt;std::mutex&gt; lk(_w-&gt;mutex);</div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span> _w-&gt;cv.wait(lk, [&amp;] {<span class="keywordflow">return</span> _w-&gt;op == worker::op_t::noop; });</div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span> <span class="keywordflow">if</span> (_w-&gt;num_written &lt; num_written)</div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span> num_written = _w-&gt;num_written;</div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>() &amp;&amp; !_w-&gt;source-&gt;ok())</div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span> m_state = _w-&gt;source-&gt;state();</div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span> }</div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span> <span class="keywordflow">return</span> num_written;</div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"> 1018</span> }</div>
</div>
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span> </div>
<div class="foldopen" id="foldopen01020" data-start="{" data-end="}">
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1replicator.html#afa3e2cec6e254e7bb53cc5e1b1ea0f90"> 1020</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1replicator.html#afa3e2cec6e254e7bb53cc5e1b1ea0f90">close</a>()</div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span> {</div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span> foreach_worker(worker::op_t::close);</div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"> 1023</span> }</div>
</div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span> </div>
<div class="foldopen" id="foldopen01025" data-start="{" data-end="}">
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1replicator.html#a77d2ddda29ef5dfb835453ff1dd90f2e"> 1025</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1replicator.html#a77d2ddda29ef5dfb835453ff1dd90f2e">flush</a>()</div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span> {</div>
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"> 1027</span> foreach_worker(worker::op_t::flush);</div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span> }</div>
</div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span> </div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span> <span class="keyword">protected</span>:</div>
<div class="foldopen" id="foldopen01031" data-start="{" data-end="};">
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1replicator_1_1worker.html"> 1031</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1replicator_1_1worker.html">worker</a></div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span> {</div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"> 1034</span> <a class="code hl_class" href="classstdex_1_1stream_1_1replicator_1_1worker.html">worker</a>(_In_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>* _source) :</div>
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"> 1035</span> source(_source),</div>
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1replicator_1_1worker.html#a9ddd37c6da22d559f6deb46102833f31">op</a>(op_t::noop),</div>
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"> 1037</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1replicator_1_1worker.html#af37e1df8c6e0189e856a2bb38dd603bf">data</a>(<span class="keyword">nullptr</span>),</div>
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"> 1038</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1replicator_1_1worker.html#acdf8a4a4f07271bc7bd4f634640e7f5a">length</a>(0),</div>
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1replicator_1_1worker.html#acd6595e01accdb9d3c8d97f8f19b8cf1">num_written</a>(0),</div>
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"> 1040</span> thread(process_op, std::ref(*<span class="keyword">this</span>))</div>
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span> {}</div>
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span> </div>
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"> 1043</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span> <span class="keyword">static</span> <span class="keywordtype">void</span> process_op(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1replicator_1_1worker.html">worker</a>&amp; w)</div>
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span> {</div>
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span> <span class="keywordflow">for</span> (;;) {</div>
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span> std::unique_lock&lt;std::mutex&gt; lk(w.mutex);</div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span> w.cv.wait(lk, [&amp;] {<span class="keywordflow">return</span> w.op != op_t::noop; });</div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span> <span class="keywordflow">switch</span> (w.op) {</div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span> <span class="keywordflow">case</span> op_t::quit:</div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"> 1052</span> <span class="keywordflow">case</span> op_t::write:</div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span> w.num_written = w.source-&gt;write(w.data, w.length);</div>
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"> 1055</span> <span class="keywordflow">case</span> op_t::close:</div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span> w.source-&gt;close();</div>
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span> <span class="keywordflow">case</span> op_t::flush:</div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span> w.source-&gt;flush();</div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span> <span class="keywordflow">case</span> op_t::noop:;</div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span> }</div>
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"> 1063</span> w.op = op_t::noop;</div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span> lk.unlock();</div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span> w.cv.notify_one();</div>
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"> 1066</span> }</div>
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span> }</div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span> </div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>* source;</div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span> <span class="keyword">enum class</span> op_t {</div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span> noop = 0,</div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span> quit,</div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span> write,</div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span> close,</div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span> flush,</div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1replicator_1_1worker.html#a9ddd37c6da22d559f6deb46102833f31"> 1077</a></span> } <a class="code hl_variable" href="classstdex_1_1stream_1_1replicator_1_1worker.html#a9ddd37c6da22d559f6deb46102833f31">op</a>; </div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1replicator_1_1worker.html#af37e1df8c6e0189e856a2bb38dd603bf"> 1078</a></span> <span class="keyword">const</span> <span class="keywordtype">void</span>* <a class="code hl_variable" href="classstdex_1_1stream_1_1replicator_1_1worker.html#af37e1df8c6e0189e856a2bb38dd603bf">data</a>; </div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1replicator_1_1worker.html#acdf8a4a4f07271bc7bd4f634640e7f5a"> 1079</a></span> <span class="keywordtype">size_t</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1replicator_1_1worker.html#acdf8a4a4f07271bc7bd4f634640e7f5a">length</a>; </div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1replicator_1_1worker.html#acd6595e01accdb9d3c8d97f8f19b8cf1"> 1080</a></span> <span class="keywordtype">size_t</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1replicator_1_1worker.html#acd6595e01accdb9d3c8d97f8f19b8cf1">num_written</a>; </div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span> std::mutex mutex;</div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span> std::condition_variable cv;</div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span> std::thread thread;</div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span> };</div>
</div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span> </div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span> <span class="keywordtype">void</span> foreach_worker(_In_ worker::op_t op)</div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span> {</div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> w = m_workers.begin(), w_end = m_workers.end(); w != w_end; ++w) {</div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span> <span class="keyword">auto</span> _w = w-&gt;get();</div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span> {</div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span> <span class="keyword">const</span> std::lock_guard&lt;std::mutex&gt; lk(_w-&gt;mutex);</div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span> _w-&gt;op = op;</div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span> }</div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span> _w-&gt;cv.notify_one();</div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span> }</div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> w = m_workers.begin(), w_end = m_workers.end(); w != w_end; ++w) {</div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span> <span class="keyword">auto</span> _w = w-&gt;get();</div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span> std::unique_lock&lt;std::mutex&gt; lk(_w-&gt;mutex);</div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span> _w-&gt;cv.wait(lk, [&amp;] {<span class="keywordflow">return</span> _w-&gt;op == worker::op_t::noop; });</div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>())</div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span> m_state = _w-&gt;source-&gt;state();</div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span> }</div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span> }</div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span> </div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span> std::list&lt;std::unique_ptr&lt;worker&gt;&gt; m_workers;</div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span> };</div>
</div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span> </div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span> <span class="keyword">constexpr</span> <span class="keywordtype">size_t</span> default_async_limit = 0x100000; </div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span> </div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</span> <span class="keyword">template</span> &lt;<span class="keywordtype">size_t</span> CAPACITY = default_async_limit&gt;</div>
<div class="foldopen" id="foldopen01117" data-start="{" data-end="};">
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1async__reader.html"> 1117</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1async__reader.html">async_reader</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">converter</a></div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span> {</div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span> <a class="code hl_class" href="classstdex_1_1stream_1_1async__reader.html">async_reader</a>(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>&amp; source) :</div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">converter</a>(source),</div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span> m_worker(process, std::ref(*<span class="keyword">this</span>))</div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span> {}</div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span> </div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classstdex_1_1stream_1_1async__reader.html">~async_reader</a>()</div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span> {</div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</span> m_ring.quit();</div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span> m_worker.join();</div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span> }</div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span> </div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span><span class="preprocessor">#pragma warning(suppress: 6101) </span><span class="comment">// See [1] below</span></div>
<div class="foldopen" id="foldopen01132" data-start="{" data-end="}">
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1async__reader.html#a841c1e3cb01cb96df94701465086a529"> 1132</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1async__reader.html#a841c1e3cb01cb96df94701465086a529">read</a>(</div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span> {</div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span> assert(data || !length);</div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_read = length;;) {</div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span> uint8_t* ptr; <span class="keywordtype">size_t</span> num_read;</div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span> std::tie(ptr, num_read) = m_ring.front();</div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span> <span class="keywordflow">if</span> (!ptr) _Unlikely_ {</div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span> <span class="comment">// [1] Code analysis misses length - to_read bytes were written to data in previous loop iterations.</span></div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span> m_state = to_read &lt; length || !length ? state_t::ok : m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span> }</div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span> <span class="keywordflow">if</span> (to_read &lt; num_read)</div>
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span> num_read = to_read;</div>
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span> memcpy(data, ptr, num_read);</div>
<div class="line"><a id="l01147" name="l01147"></a><span class="lineno"> 1147</span> m_ring.pop(num_read);</div>
<div class="line"><a id="l01148" name="l01148"></a><span class="lineno"> 1148</span> to_read -= num_read;</div>
<div class="line"><a id="l01149" name="l01149"></a><span class="lineno"> 1149</span> <span class="keywordflow">if</span> (!to_read) {</div>
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"> 1150</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span> }</div>
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span> <span class="keyword">reinterpret_cast&lt;</span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += num_read;</div>
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span> }</div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span> }</div>
</div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span> </div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span> <span class="keyword">static</span> <span class="keywordtype">void</span> process(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1async__reader.html">async_reader</a>&amp; w)</div>
<div class="line"><a id="l01159" name="l01159"></a><span class="lineno"> 1159</span> {</div>
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span> <span class="keywordflow">for</span> (;;) {</div>
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"> 1161</span> uint8_t* ptr; <span class="keywordtype">size_t</span> num_write;</div>
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span> std::tie(ptr, num_write) = w.m_ring.back();</div>
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span> <span class="keywordflow">if</span> (!ptr) _Unlikely_</div>
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"> 1164</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span> num_write = w.m_source-&gt;read(ptr, num_write);</div>
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span> w.m_ring.push(num_write);</div>
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span> <span class="keywordflow">if</span> (!w.m_source-&gt;ok()) {</div>
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span> w.m_ring.quit();</div>
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span> }</div>
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span> }</div>
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"> 1172</span> }</div>
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span> </div>
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"> 1174</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"> 1175</span> ring&lt;uint8_t, CAPACITY&gt; m_ring;</div>
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"> 1176</span> std::thread m_worker;</div>
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"> 1177</span> };</div>
</div>
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span> </div>
<div class="line"><a id="l01184" name="l01184"></a><span class="lineno"> 1184</span> <span class="keyword">template</span> &lt;<span class="keywordtype">size_t</span> CAPACITY = default_async_limit&gt;</div>
<div class="foldopen" id="foldopen01185" data-start="{" data-end="};">
<div class="line"><a id="l01185" name="l01185"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1async__writer.html"> 1185</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1async__writer.html">async_writer</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">converter</a></div>
<div class="line"><a id="l01186" name="l01186"></a><span class="lineno"> 1186</span> {</div>
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"> 1187</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l01188" name="l01188"></a><span class="lineno"> 1188</span> <a class="code hl_class" href="classstdex_1_1stream_1_1async__writer.html">async_writer</a>(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>&amp; source) :</div>
<div class="line"><a id="l01189" name="l01189"></a><span class="lineno"> 1189</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">converter</a>(source),</div>
<div class="line"><a id="l01190" name="l01190"></a><span class="lineno"> 1190</span> m_worker(process, std::ref(*<span class="keyword">this</span>))</div>
<div class="line"><a id="l01191" name="l01191"></a><span class="lineno"> 1191</span> {}</div>
<div class="line"><a id="l01192" name="l01192"></a><span class="lineno"> 1192</span> </div>
<div class="line"><a id="l01193" name="l01193"></a><span class="lineno"> 1193</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classstdex_1_1stream_1_1async__writer.html">~async_writer</a>()</div>
<div class="line"><a id="l01194" name="l01194"></a><span class="lineno"> 1194</span> {</div>
<div class="line"><a id="l01195" name="l01195"></a><span class="lineno"> 1195</span> m_ring.quit();</div>
<div class="line"><a id="l01196" name="l01196"></a><span class="lineno"> 1196</span> m_worker.join();</div>
<div class="line"><a id="l01197" name="l01197"></a><span class="lineno"> 1197</span> }</div>
<div class="line"><a id="l01198" name="l01198"></a><span class="lineno"> 1198</span> </div>
<div class="foldopen" id="foldopen01199" data-start="{" data-end="}">
<div class="line"><a id="l01199" name="l01199"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1async__writer.html#a39d3fc4fffb8aa9b971fa15beaa8149b"> 1199</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1async__writer.html#a39d3fc4fffb8aa9b971fa15beaa8149b">write</a>(</div>
<div class="line"><a id="l01200" name="l01200"></a><span class="lineno"> 1200</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l01201" name="l01201"></a><span class="lineno"> 1201</span> {</div>
<div class="line"><a id="l01202" name="l01202"></a><span class="lineno"> 1202</span> assert(data || !length);</div>
<div class="line"><a id="l01203" name="l01203"></a><span class="lineno"> 1203</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_write = length;;) {</div>
<div class="line"><a id="l01204" name="l01204"></a><span class="lineno"> 1204</span> uint8_t* ptr; <span class="keywordtype">size_t</span> num_write;</div>
<div class="line"><a id="l01205" name="l01205"></a><span class="lineno"> 1205</span> std::tie(ptr, num_write) = m_ring.back();</div>
<div class="line"><a id="l01206" name="l01206"></a><span class="lineno"> 1206</span> <span class="keywordflow">if</span> (!ptr) _Unlikely_ {</div>
<div class="line"><a id="l01207" name="l01207"></a><span class="lineno"> 1207</span> m_state = state_t::fail;</div>
<div class="line"><a id="l01208" name="l01208"></a><span class="lineno"> 1208</span> <span class="keywordflow">return</span> length - to_write;</div>
<div class="line"><a id="l01209" name="l01209"></a><span class="lineno"> 1209</span> }</div>
<div class="line"><a id="l01210" name="l01210"></a><span class="lineno"> 1210</span> <span class="keywordflow">if</span> (to_write &lt; num_write)</div>
<div class="line"><a id="l01211" name="l01211"></a><span class="lineno"> 1211</span> num_write = to_write;</div>
<div class="line"><a id="l01212" name="l01212"></a><span class="lineno"> 1212</span> memcpy(ptr, data, num_write);</div>
<div class="line"><a id="l01213" name="l01213"></a><span class="lineno"> 1213</span> m_ring.push(num_write);</div>
<div class="line"><a id="l01214" name="l01214"></a><span class="lineno"> 1214</span> to_write -= num_write;</div>
<div class="line"><a id="l01215" name="l01215"></a><span class="lineno"> 1215</span> <span class="keywordflow">if</span> (!to_write) {</div>
<div class="line"><a id="l01216" name="l01216"></a><span class="lineno"> 1216</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01217" name="l01217"></a><span class="lineno"> 1217</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l01218" name="l01218"></a><span class="lineno"> 1218</span> }</div>
<div class="line"><a id="l01219" name="l01219"></a><span class="lineno"> 1219</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += num_write;</div>
<div class="line"><a id="l01220" name="l01220"></a><span class="lineno"> 1220</span> }</div>
<div class="line"><a id="l01221" name="l01221"></a><span class="lineno"> 1221</span> }</div>
</div>
<div class="line"><a id="l01222" name="l01222"></a><span class="lineno"> 1222</span> </div>
<div class="foldopen" id="foldopen01223" data-start="{" data-end="}">
<div class="line"><a id="l01223" name="l01223"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1async__writer.html#a25c72d3b2edaba300eb158d06dfd03d2"> 1223</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1async__writer.html#a25c72d3b2edaba300eb158d06dfd03d2">flush</a>()</div>
<div class="line"><a id="l01224" name="l01224"></a><span class="lineno"> 1224</span> {</div>
<div class="line"><a id="l01225" name="l01225"></a><span class="lineno"> 1225</span> m_ring.sync();</div>
<div class="line"><a id="l01226" name="l01226"></a><span class="lineno"> 1226</span> <a class="code hl_function" href="classstdex_1_1stream_1_1converter.html#a0d6af4c223625bc8ab677978b225d06e">converter::flush</a>();</div>
<div class="line"><a id="l01227" name="l01227"></a><span class="lineno"> 1227</span> }</div>
</div>
<div class="line"><a id="l01228" name="l01228"></a><span class="lineno"> 1228</span> </div>
<div class="line"><a id="l01229" name="l01229"></a><span class="lineno"> 1229</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l01230" name="l01230"></a><span class="lineno"> 1230</span> <span class="keyword">static</span> <span class="keywordtype">void</span> process(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1async__writer.html">async_writer</a>&amp; w)</div>
<div class="line"><a id="l01231" name="l01231"></a><span class="lineno"> 1231</span> {</div>
<div class="line"><a id="l01232" name="l01232"></a><span class="lineno"> 1232</span> <span class="keywordflow">for</span> (;;) {</div>
<div class="line"><a id="l01233" name="l01233"></a><span class="lineno"> 1233</span> uint8_t* ptr; <span class="keywordtype">size_t</span> num_read;</div>
<div class="line"><a id="l01234" name="l01234"></a><span class="lineno"> 1234</span> std::tie(ptr, num_read) = w.m_ring.front();</div>
<div class="line"><a id="l01235" name="l01235"></a><span class="lineno"> 1235</span> <span class="keywordflow">if</span> (!ptr)</div>
<div class="line"><a id="l01236" name="l01236"></a><span class="lineno"> 1236</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01237" name="l01237"></a><span class="lineno"> 1237</span> num_read = w.m_source-&gt;write(ptr, num_read);</div>
<div class="line"><a id="l01238" name="l01238"></a><span class="lineno"> 1238</span> w.m_ring.pop(num_read);</div>
<div class="line"><a id="l01239" name="l01239"></a><span class="lineno"> 1239</span> <span class="keywordflow">if</span> (!w.m_source-&gt;ok()) {</div>
<div class="line"><a id="l01240" name="l01240"></a><span class="lineno"> 1240</span> w.m_ring.quit();</div>
<div class="line"><a id="l01241" name="l01241"></a><span class="lineno"> 1241</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l01242" name="l01242"></a><span class="lineno"> 1242</span> }</div>
<div class="line"><a id="l01243" name="l01243"></a><span class="lineno"> 1243</span> }</div>
<div class="line"><a id="l01244" name="l01244"></a><span class="lineno"> 1244</span> }</div>
<div class="line"><a id="l01245" name="l01245"></a><span class="lineno"> 1245</span> </div>
<div class="line"><a id="l01246" name="l01246"></a><span class="lineno"> 1246</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l01247" name="l01247"></a><span class="lineno"> 1247</span> ring&lt;uint8_t, CAPACITY&gt; m_ring;</div>
<div class="line"><a id="l01248" name="l01248"></a><span class="lineno"> 1248</span> std::thread m_worker;</div>
<div class="line"><a id="l01249" name="l01249"></a><span class="lineno"> 1249</span> };</div>
</div>
<div class="line"><a id="l01250" name="l01250"></a><span class="lineno"> 1250</span> </div>
<div class="line"><a id="l01251" name="l01251"></a><span class="lineno"> 1251</span> <span class="keyword">constexpr</span> <span class="keywordtype">size_t</span> default_buffer_size = 0x400; </div>
<div class="line"><a id="l01252" name="l01252"></a><span class="lineno"> 1252</span> </div>
<div class="foldopen" id="foldopen01256" data-start="{" data-end="};">
<div class="line"><a id="l01256" name="l01256"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1buffer.html"> 1256</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1buffer.html">buffer</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">converter</a></div>
<div class="line"><a id="l01257" name="l01257"></a><span class="lineno"> 1257</span> {</div>
<div class="line"><a id="l01258" name="l01258"></a><span class="lineno"> 1258</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l01259" name="l01259"></a><span class="lineno"> 1259</span> <span class="keyword">explicit</span> <a class="code hl_class" href="classstdex_1_1stream_1_1buffer.html">buffer</a>(_In_ <span class="keywordtype">size_t</span> read_buffer_size = default_buffer_size, _In_ <span class="keywordtype">size_t</span> write_buffer_size = default_buffer_size) :</div>
<div class="line"><a id="l01260" name="l01260"></a><span class="lineno"> 1260</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">converter</a>(),</div>
<div class="line"><a id="l01261" name="l01261"></a><span class="lineno"> 1261</span> m_read_buffer(read_buffer_size),</div>
<div class="line"><a id="l01262" name="l01262"></a><span class="lineno"> 1262</span> m_write_buffer(write_buffer_size)</div>
<div class="line"><a id="l01263" name="l01263"></a><span class="lineno"> 1263</span> {}</div>
<div class="line"><a id="l01264" name="l01264"></a><span class="lineno"> 1264</span> </div>
<div class="line"><a id="l01265" name="l01265"></a><span class="lineno"> 1265</span> <span class="keywordtype">void</span> done()</div>
<div class="line"><a id="l01266" name="l01266"></a><span class="lineno"> 1266</span> {</div>
<div class="line"><a id="l01267" name="l01267"></a><span class="lineno"> 1267</span> <span class="keywordflow">if</span> (m_source)</div>
<div class="line"><a id="l01268" name="l01268"></a><span class="lineno"> 1268</span> flush_write();</div>
<div class="line"><a id="l01269" name="l01269"></a><span class="lineno"> 1269</span> converter::done();</div>
<div class="line"><a id="l01270" name="l01270"></a><span class="lineno"> 1270</span> }</div>
<div class="line"><a id="l01271" name="l01271"></a><span class="lineno"> 1271</span> </div>
<div class="line"><a id="l01272" name="l01272"></a><span class="lineno"> 1272</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l01273" name="l01273"></a><span class="lineno"> 1273</span> <a class="code hl_class" href="classstdex_1_1stream_1_1buffer.html">buffer</a>(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>&amp; source, _In_ <span class="keywordtype">size_t</span> read_buffer_size = default_buffer_size, _In_ <span class="keywordtype">size_t</span> write_buffer_size = default_buffer_size) :</div>
<div class="line"><a id="l01274" name="l01274"></a><span class="lineno"> 1274</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">converter</a>(source),</div>
<div class="line"><a id="l01275" name="l01275"></a><span class="lineno"> 1275</span> m_read_buffer(read_buffer_size),</div>
<div class="line"><a id="l01276" name="l01276"></a><span class="lineno"> 1276</span> m_write_buffer(write_buffer_size)</div>
<div class="line"><a id="l01277" name="l01277"></a><span class="lineno"> 1277</span> {}</div>
<div class="line"><a id="l01278" name="l01278"></a><span class="lineno"> 1278</span> </div>
<div class="line"><a id="l01279" name="l01279"></a><span class="lineno"> 1279</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classstdex_1_1stream_1_1buffer.html">~buffer</a>()</div>
<div class="line"><a id="l01280" name="l01280"></a><span class="lineno"> 1280</span> {</div>
<div class="line"><a id="l01281" name="l01281"></a><span class="lineno"> 1281</span> <span class="keywordflow">if</span> (m_source)</div>
<div class="line"><a id="l01282" name="l01282"></a><span class="lineno"> 1282</span> flush_write();</div>
<div class="line"><a id="l01283" name="l01283"></a><span class="lineno"> 1283</span> }</div>
<div class="line"><a id="l01284" name="l01284"></a><span class="lineno"> 1284</span> </div>
<div class="foldopen" id="foldopen01285" data-start="{" data-end="}">
<div class="line"><a id="l01285" name="l01285"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1buffer.html#a2ef05f2df784dce1d1c4319a98cd22e0"> 1285</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1buffer.html#a2ef05f2df784dce1d1c4319a98cd22e0">read</a>(</div>
<div class="line"><a id="l01286" name="l01286"></a><span class="lineno"> 1286</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l01287" name="l01287"></a><span class="lineno"> 1287</span> {</div>
<div class="line"><a id="l01288" name="l01288"></a><span class="lineno"> 1288</span> assert(data || !length);</div>
<div class="line"><a id="l01289" name="l01289"></a><span class="lineno"> 1289</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_read = length;;) {</div>
<div class="line"><a id="l01290" name="l01290"></a><span class="lineno"> 1290</span> <span class="keywordtype">size_t</span> buffer_size = m_read_buffer.tail - m_read_buffer.head;</div>
<div class="line"><a id="l01291" name="l01291"></a><span class="lineno"> 1291</span> <span class="keywordflow">if</span> (to_read &lt;= buffer_size) {</div>
<div class="line"><a id="l01292" name="l01292"></a><span class="lineno"> 1292</span> memcpy(data, m_read_buffer.data + m_read_buffer.head, to_read);</div>
<div class="line"><a id="l01293" name="l01293"></a><span class="lineno"> 1293</span> m_read_buffer.head += to_read;</div>
<div class="line"><a id="l01294" name="l01294"></a><span class="lineno"> 1294</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01295" name="l01295"></a><span class="lineno"> 1295</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l01296" name="l01296"></a><span class="lineno"> 1296</span> }</div>
<div class="line"><a id="l01297" name="l01297"></a><span class="lineno"> 1297</span> <span class="keywordflow">if</span> (buffer_size) {</div>
<div class="line"><a id="l01298" name="l01298"></a><span class="lineno"> 1298</span> memcpy(data, m_read_buffer.data + m_read_buffer.head, buffer_size);</div>
<div class="line"><a id="l01299" name="l01299"></a><span class="lineno"> 1299</span> <span class="keyword">reinterpret_cast&lt;</span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += buffer_size;</div>
<div class="line"><a id="l01300" name="l01300"></a><span class="lineno"> 1300</span> to_read -= buffer_size;</div>
<div class="line"><a id="l01301" name="l01301"></a><span class="lineno"> 1301</span> }</div>
<div class="line"><a id="l01302" name="l01302"></a><span class="lineno"> 1302</span> m_read_buffer.head = 0;</div>
<div class="line"><a id="l01303" name="l01303"></a><span class="lineno"> 1303</span> <span class="keywordflow">if</span> (to_read &gt; m_read_buffer.capacity) {</div>
<div class="line"><a id="l01304" name="l01304"></a><span class="lineno"> 1304</span> <span class="comment">// When needing to read more data than buffer capacity, bypass the buffer.</span></div>
<div class="line"><a id="l01305" name="l01305"></a><span class="lineno"> 1305</span> m_read_buffer.tail = 0;</div>
<div class="line"><a id="l01306" name="l01306"></a><span class="lineno"> 1306</span> to_read -= m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(data, to_read);</div>
<div class="line"><a id="l01307" name="l01307"></a><span class="lineno"> 1307</span> m_state = to_read &lt; length ? state_t::ok : m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01308" name="l01308"></a><span class="lineno"> 1308</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l01309" name="l01309"></a><span class="lineno"> 1309</span> }</div>
<div class="line"><a id="l01310" name="l01310"></a><span class="lineno"> 1310</span> m_read_buffer.tail = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(m_read_buffer.data, m_read_buffer.capacity);</div>
<div class="line"><a id="l01311" name="l01311"></a><span class="lineno"> 1311</span> <span class="keywordflow">if</span> (m_read_buffer.tail &lt; m_read_buffer.capacity &amp;&amp; m_read_buffer.tail &lt; to_read) _Unlikely_ {</div>
<div class="line"><a id="l01312" name="l01312"></a><span class="lineno"> 1312</span> memcpy(data, m_read_buffer.data, m_read_buffer.tail);</div>
<div class="line"><a id="l01313" name="l01313"></a><span class="lineno"> 1313</span> m_read_buffer.head = m_read_buffer.tail;</div>
<div class="line"><a id="l01314" name="l01314"></a><span class="lineno"> 1314</span> to_read -= m_read_buffer.tail;</div>
<div class="line"><a id="l01315" name="l01315"></a><span class="lineno"> 1315</span> m_state = to_read &lt; length ? state_t::ok : m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01316" name="l01316"></a><span class="lineno"> 1316</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l01317" name="l01317"></a><span class="lineno"> 1317</span> }</div>
<div class="line"><a id="l01318" name="l01318"></a><span class="lineno"> 1318</span> }</div>
<div class="line"><a id="l01319" name="l01319"></a><span class="lineno"> 1319</span> }</div>
</div>
<div class="line"><a id="l01320" name="l01320"></a><span class="lineno"> 1320</span> </div>
<div class="foldopen" id="foldopen01321" data-start="{" data-end="}">
<div class="line"><a id="l01321" name="l01321"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1buffer.html#a489a01a4c187e85f06ebe10314a891ae"> 1321</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1buffer.html#a489a01a4c187e85f06ebe10314a891ae">write</a>(</div>
<div class="line"><a id="l01322" name="l01322"></a><span class="lineno"> 1322</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l01323" name="l01323"></a><span class="lineno"> 1323</span> {</div>
<div class="line"><a id="l01324" name="l01324"></a><span class="lineno"> 1324</span> assert(data || !length);</div>
<div class="line"><a id="l01325" name="l01325"></a><span class="lineno"> 1325</span> <span class="keywordflow">if</span> (!length) _Unlikely_ {</div>
<div class="line"><a id="l01326" name="l01326"></a><span class="lineno"> 1326</span> <span class="comment">// Pass null writes (zero-byte length). Null write operations have special meaning with with Windows pipes.</span></div>
<div class="line"><a id="l01327" name="l01327"></a><span class="lineno"> 1327</span> flush_write();</div>
<div class="line"><a id="l01328" name="l01328"></a><span class="lineno"> 1328</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l01329" name="l01329"></a><span class="lineno"> 1329</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l01330" name="l01330"></a><span class="lineno"> 1330</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(<span class="keyword">nullptr</span>, 0);</div>
<div class="line"><a id="l01331" name="l01331"></a><span class="lineno"> 1331</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01332" name="l01332"></a><span class="lineno"> 1332</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l01333" name="l01333"></a><span class="lineno"> 1333</span> }</div>
<div class="line"><a id="l01334" name="l01334"></a><span class="lineno"> 1334</span> </div>
<div class="line"><a id="l01335" name="l01335"></a><span class="lineno"> 1335</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_write = length;;) {</div>
<div class="line"><a id="l01336" name="l01336"></a><span class="lineno"> 1336</span> <span class="keywordtype">size_t</span> available_buffer = m_write_buffer.capacity - m_write_buffer.tail;</div>
<div class="line"><a id="l01337" name="l01337"></a><span class="lineno"> 1337</span> <span class="keywordflow">if</span> (to_write &lt;= available_buffer) {</div>
<div class="line"><a id="l01338" name="l01338"></a><span class="lineno"> 1338</span> memcpy(m_write_buffer.data + m_write_buffer.tail, data, to_write);</div>
<div class="line"><a id="l01339" name="l01339"></a><span class="lineno"> 1339</span> m_write_buffer.tail += to_write;</div>
<div class="line"><a id="l01340" name="l01340"></a><span class="lineno"> 1340</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01341" name="l01341"></a><span class="lineno"> 1341</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l01342" name="l01342"></a><span class="lineno"> 1342</span> }</div>
<div class="line"><a id="l01343" name="l01343"></a><span class="lineno"> 1343</span> <span class="keywordflow">if</span> (available_buffer) {</div>
<div class="line"><a id="l01344" name="l01344"></a><span class="lineno"> 1344</span> memcpy(m_write_buffer.data + m_write_buffer.tail, data, available_buffer);</div>
<div class="line"><a id="l01345" name="l01345"></a><span class="lineno"> 1345</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += available_buffer;</div>
<div class="line"><a id="l01346" name="l01346"></a><span class="lineno"> 1346</span> to_write -= available_buffer;</div>
<div class="line"><a id="l01347" name="l01347"></a><span class="lineno"> 1347</span> m_write_buffer.tail += available_buffer;</div>
<div class="line"><a id="l01348" name="l01348"></a><span class="lineno"> 1348</span> }</div>
<div class="line"><a id="l01349" name="l01349"></a><span class="lineno"> 1349</span> <span class="keywordtype">size_t</span> buffer_size = m_write_buffer.tail - m_write_buffer.head;</div>
<div class="line"><a id="l01350" name="l01350"></a><span class="lineno"> 1350</span> <span class="keywordflow">if</span> (buffer_size) {</div>
<div class="line"><a id="l01351" name="l01351"></a><span class="lineno"> 1351</span> m_write_buffer.head += m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(m_write_buffer.data + m_write_buffer.head, buffer_size);</div>
<div class="line"><a id="l01352" name="l01352"></a><span class="lineno"> 1352</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01353" name="l01353"></a><span class="lineno"> 1353</span> <span class="keywordflow">if</span> (m_write_buffer.head == m_write_buffer.tail)</div>
<div class="line"><a id="l01354" name="l01354"></a><span class="lineno"> 1354</span> m_write_buffer.head = m_write_buffer.tail = 0;</div>
<div class="line"><a id="l01355" name="l01355"></a><span class="lineno"> 1355</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01356" name="l01356"></a><span class="lineno"> 1356</span> <span class="keywordflow">return</span> length - to_write;</div>
<div class="line"><a id="l01357" name="l01357"></a><span class="lineno"> 1357</span> }</div>
<div class="line"><a id="l01358" name="l01358"></a><span class="lineno"> 1358</span> <span class="keywordflow">if</span> (to_write &gt; m_write_buffer.capacity) {</div>
<div class="line"><a id="l01359" name="l01359"></a><span class="lineno"> 1359</span> <span class="comment">// When needing to write more data than buffer capacity, bypass the buffer.</span></div>
<div class="line"><a id="l01360" name="l01360"></a><span class="lineno"> 1360</span> to_write -= m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(data, to_write);</div>
<div class="line"><a id="l01361" name="l01361"></a><span class="lineno"> 1361</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01362" name="l01362"></a><span class="lineno"> 1362</span> <span class="keywordflow">return</span> length - to_write;</div>
<div class="line"><a id="l01363" name="l01363"></a><span class="lineno"> 1363</span> }</div>
<div class="line"><a id="l01364" name="l01364"></a><span class="lineno"> 1364</span> }</div>
<div class="line"><a id="l01365" name="l01365"></a><span class="lineno"> 1365</span> }</div>
</div>
<div class="line"><a id="l01366" name="l01366"></a><span class="lineno"> 1366</span> </div>
<div class="foldopen" id="foldopen01367" data-start="{" data-end="}">
<div class="line"><a id="l01367" name="l01367"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1buffer.html#a18f9edc9af41f3a71d84f7eb4e7d5332"> 1367</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1buffer.html#a18f9edc9af41f3a71d84f7eb4e7d5332">flush</a>()</div>
<div class="line"><a id="l01368" name="l01368"></a><span class="lineno"> 1368</span> {</div>
<div class="line"><a id="l01369" name="l01369"></a><span class="lineno"> 1369</span> flush_write();</div>
<div class="line"><a id="l01370" name="l01370"></a><span class="lineno"> 1370</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>())</div>
<div class="line"><a id="l01371" name="l01371"></a><span class="lineno"> 1371</span> <a class="code hl_function" href="classstdex_1_1stream_1_1converter.html#a0d6af4c223625bc8ab677978b225d06e">converter::flush</a>();</div>
<div class="line"><a id="l01372" name="l01372"></a><span class="lineno"> 1372</span> }</div>
</div>
<div class="line"><a id="l01373" name="l01373"></a><span class="lineno"> 1373</span> </div>
<div class="line"><a id="l01374" name="l01374"></a><span class="lineno"> 1374</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l01375" name="l01375"></a><span class="lineno"> 1375</span> <span class="keywordtype">void</span> flush_write()</div>
<div class="line"><a id="l01376" name="l01376"></a><span class="lineno"> 1376</span> {</div>
<div class="line"><a id="l01377" name="l01377"></a><span class="lineno"> 1377</span> <span class="keywordtype">size_t</span> buffer_size = m_write_buffer.tail - m_write_buffer.head;</div>
<div class="line"><a id="l01378" name="l01378"></a><span class="lineno"> 1378</span> <span class="keywordflow">if</span> (buffer_size) {</div>
<div class="line"><a id="l01379" name="l01379"></a><span class="lineno"> 1379</span> m_write_buffer.head += m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(m_write_buffer.data + m_write_buffer.head, buffer_size);</div>
<div class="line"><a id="l01380" name="l01380"></a><span class="lineno"> 1380</span> <span class="keywordflow">if</span> (m_write_buffer.head == m_write_buffer.tail) {</div>
<div class="line"><a id="l01381" name="l01381"></a><span class="lineno"> 1381</span> m_write_buffer.head = 0;</div>
<div class="line"><a id="l01382" name="l01382"></a><span class="lineno"> 1382</span> m_write_buffer.tail = 0;</div>
<div class="line"><a id="l01383" name="l01383"></a><span class="lineno"> 1383</span> }</div>
<div class="line"><a id="l01384" name="l01384"></a><span class="lineno"> 1384</span> <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l01385" name="l01385"></a><span class="lineno"> 1385</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01386" name="l01386"></a><span class="lineno"> 1386</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01387" name="l01387"></a><span class="lineno"> 1387</span> }</div>
<div class="line"><a id="l01388" name="l01388"></a><span class="lineno"> 1388</span> }</div>
<div class="line"><a id="l01389" name="l01389"></a><span class="lineno"> 1389</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01390" name="l01390"></a><span class="lineno"> 1390</span> }</div>
<div class="line"><a id="l01391" name="l01391"></a><span class="lineno"> 1391</span> </div>
<div class="foldopen" id="foldopen01392" data-start="{" data-end="};">
<div class="line"><a id="l01392" name="l01392"></a><span class="lineno"><a class="line" href="structstdex_1_1stream_1_1buffer_1_1buffer__t.html"> 1392</a></span> <span class="keyword">struct </span><a class="code hl_struct" href="structstdex_1_1stream_1_1buffer_1_1buffer__t.html">buffer_t</a> {</div>
<div class="line"><a id="l01393" name="l01393"></a><span class="lineno"> 1393</span> uint8_t* data;</div>
<div class="line"><a id="l01394" name="l01394"></a><span class="lineno"> 1394</span> <span class="keywordtype">size_t</span> head, tail, capacity;</div>
<div class="line"><a id="l01395" name="l01395"></a><span class="lineno"> 1395</span> </div>
<div class="line"><a id="l01396" name="l01396"></a><span class="lineno"> 1396</span> <a class="code hl_struct" href="structstdex_1_1stream_1_1buffer_1_1buffer__t.html">buffer_t</a>(_In_ <span class="keywordtype">size_t</span> buffer_size) :</div>
<div class="line"><a id="l01397" name="l01397"></a><span class="lineno"> 1397</span> head(0),</div>
<div class="line"><a id="l01398" name="l01398"></a><span class="lineno"> 1398</span> tail(0),</div>
<div class="line"><a id="l01399" name="l01399"></a><span class="lineno"> 1399</span> capacity(buffer_size),</div>
<div class="line"><a id="l01400" name="l01400"></a><span class="lineno"> 1400</span> data(buffer_size ? <span class="keyword">new</span> uint8_t[buffer_size] : <span class="keyword">nullptr</span>)</div>
<div class="line"><a id="l01401" name="l01401"></a><span class="lineno"> 1401</span> {}</div>
<div class="line"><a id="l01402" name="l01402"></a><span class="lineno"> 1402</span> </div>
<div class="line"><a id="l01403" name="l01403"></a><span class="lineno"> 1403</span> <a class="code hl_struct" href="structstdex_1_1stream_1_1buffer_1_1buffer__t.html">~buffer_t</a>()</div>
<div class="line"><a id="l01404" name="l01404"></a><span class="lineno"> 1404</span> {</div>
<div class="line"><a id="l01405" name="l01405"></a><span class="lineno"> 1405</span> <span class="keywordflow">if</span> (data)</div>
<div class="line"><a id="l01406" name="l01406"></a><span class="lineno"> 1406</span> <span class="keyword">delete</span>[] data;</div>
<div class="line"><a id="l01407" name="l01407"></a><span class="lineno"> 1407</span> }</div>
<div class="line"><a id="l01408" name="l01408"></a><span class="lineno"> 1408</span> } m_read_buffer, m_write_buffer;</div>
</div>
<div class="line"><a id="l01409" name="l01409"></a><span class="lineno"> 1409</span> };</div>
</div>
<div class="line"><a id="l01410" name="l01410"></a><span class="lineno"> 1410</span> </div>
<div class="foldopen" id="foldopen01414" data-start="{" data-end="};">
<div class="line"><a id="l01414" name="l01414"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1limiter.html"> 1414</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1limiter.html">limiter</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">converter</a></div>
<div class="line"><a id="l01415" name="l01415"></a><span class="lineno"> 1415</span> {</div>
<div class="line"><a id="l01416" name="l01416"></a><span class="lineno"> 1416</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l01417" name="l01417"></a><span class="lineno"> 1417</span> <a class="code hl_class" href="classstdex_1_1stream_1_1limiter.html">limiter</a>(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>&amp; source, _In_ fsize_t _read_limit = 0, _In_ fsize_t _write_limit = 0) :</div>
<div class="line"><a id="l01418" name="l01418"></a><span class="lineno"> 1418</span> <a class="code hl_class" href="classstdex_1_1stream_1_1converter.html">converter</a>(source),</div>
<div class="line"><a id="l01419" name="l01419"></a><span class="lineno"> 1419</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a>(_read_limit),</div>
<div class="line"><a id="l01420" name="l01420"></a><span class="lineno"> 1420</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a>(_write_limit)</div>
<div class="line"><a id="l01421" name="l01421"></a><span class="lineno"> 1421</span> {}</div>
<div class="line"><a id="l01422" name="l01422"></a><span class="lineno"> 1422</span> </div>
<div class="foldopen" id="foldopen01423" data-start="{" data-end="}">
<div class="line"><a id="l01423" name="l01423"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1limiter.html#a80b68f1b4a8fb8c72c09b1313e9d02ed"> 1423</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1limiter.html#a80b68f1b4a8fb8c72c09b1313e9d02ed">read</a>(</div>
<div class="line"><a id="l01424" name="l01424"></a><span class="lineno"> 1424</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l01425" name="l01425"></a><span class="lineno"> 1425</span> {</div>
<div class="line"><a id="l01426" name="l01426"></a><span class="lineno"> 1426</span> <span class="keywordtype">size_t</span> num_read;</div>
<div class="line"><a id="l01427" name="l01427"></a><span class="lineno"> 1427</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a> == fsize_max) {</div>
<div class="line"><a id="l01428" name="l01428"></a><span class="lineno"> 1428</span> num_read = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(data, length);</div>
<div class="line"><a id="l01429" name="l01429"></a><span class="lineno"> 1429</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01430" name="l01430"></a><span class="lineno"> 1430</span> }</div>
<div class="line"><a id="l01431" name="l01431"></a><span class="lineno"> 1431</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (length &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a>) {</div>
<div class="line"><a id="l01432" name="l01432"></a><span class="lineno"> 1432</span> num_read = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(data, length);</div>
<div class="line"><a id="l01433" name="l01433"></a><span class="lineno"> 1433</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01434" name="l01434"></a><span class="lineno"> 1434</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a> -= num_read;</div>
<div class="line"><a id="l01435" name="l01435"></a><span class="lineno"> 1435</span> }</div>
<div class="line"><a id="l01436" name="l01436"></a><span class="lineno"> 1436</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (length &amp;&amp; !<a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a>) {</div>
<div class="line"><a id="l01437" name="l01437"></a><span class="lineno"> 1437</span> num_read = 0;</div>
<div class="line"><a id="l01438" name="l01438"></a><span class="lineno"> 1438</span> m_state = state_t::eof;</div>
<div class="line"><a id="l01439" name="l01439"></a><span class="lineno"> 1439</span> }</div>
<div class="line"><a id="l01440" name="l01440"></a><span class="lineno"> 1440</span> <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l01441" name="l01441"></a><span class="lineno"> 1441</span> num_read = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(data, <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a>));</div>
<div class="line"><a id="l01442" name="l01442"></a><span class="lineno"> 1442</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01443" name="l01443"></a><span class="lineno"> 1443</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a> -= num_read;</div>
<div class="line"><a id="l01444" name="l01444"></a><span class="lineno"> 1444</span> }</div>
<div class="line"><a id="l01445" name="l01445"></a><span class="lineno"> 1445</span> <span class="keywordflow">return</span> num_read;</div>
<div class="line"><a id="l01446" name="l01446"></a><span class="lineno"> 1446</span> }</div>
</div>
<div class="line"><a id="l01447" name="l01447"></a><span class="lineno"> 1447</span> </div>
<div class="foldopen" id="foldopen01448" data-start="{" data-end="}">
<div class="line"><a id="l01448" name="l01448"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1limiter.html#a8fe783b504f019e29034c0572cec7834"> 1448</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1limiter.html#a8fe783b504f019e29034c0572cec7834">write</a>(</div>
<div class="line"><a id="l01449" name="l01449"></a><span class="lineno"> 1449</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l01450" name="l01450"></a><span class="lineno"> 1450</span> {</div>
<div class="line"><a id="l01451" name="l01451"></a><span class="lineno"> 1451</span> <span class="keywordtype">size_t</span> num_written;</div>
<div class="line"><a id="l01452" name="l01452"></a><span class="lineno"> 1452</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a> == fsize_max) {</div>
<div class="line"><a id="l01453" name="l01453"></a><span class="lineno"> 1453</span> num_written = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(data, length);</div>
<div class="line"><a id="l01454" name="l01454"></a><span class="lineno"> 1454</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01455" name="l01455"></a><span class="lineno"> 1455</span> }</div>
<div class="line"><a id="l01456" name="l01456"></a><span class="lineno"> 1456</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (length &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a>) {</div>
<div class="line"><a id="l01457" name="l01457"></a><span class="lineno"> 1457</span> num_written = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(data, length);</div>
<div class="line"><a id="l01458" name="l01458"></a><span class="lineno"> 1458</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01459" name="l01459"></a><span class="lineno"> 1459</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a> -= num_written;</div>
<div class="line"><a id="l01460" name="l01460"></a><span class="lineno"> 1460</span> }</div>
<div class="line"><a id="l01461" name="l01461"></a><span class="lineno"> 1461</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (length &amp;&amp; !<a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a>) {</div>
<div class="line"><a id="l01462" name="l01462"></a><span class="lineno"> 1462</span> num_written = 0;</div>
<div class="line"><a id="l01463" name="l01463"></a><span class="lineno"> 1463</span> m_state = state_t::fail;</div>
<div class="line"><a id="l01464" name="l01464"></a><span class="lineno"> 1464</span> }</div>
<div class="line"><a id="l01465" name="l01465"></a><span class="lineno"> 1465</span> <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l01466" name="l01466"></a><span class="lineno"> 1466</span> num_written = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(data, <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a>));</div>
<div class="line"><a id="l01467" name="l01467"></a><span class="lineno"> 1467</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01468" name="l01468"></a><span class="lineno"> 1468</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a> -= num_written;</div>
<div class="line"><a id="l01469" name="l01469"></a><span class="lineno"> 1469</span> }</div>
<div class="line"><a id="l01470" name="l01470"></a><span class="lineno"> 1470</span> <span class="keywordflow">return</span> num_written;</div>
<div class="line"><a id="l01471" name="l01471"></a><span class="lineno"> 1471</span> }</div>
</div>
<div class="line"><a id="l01472" name="l01472"></a><span class="lineno"> 1472</span> </div>
<div class="line"><a id="l01473" name="l01473"></a><span class="lineno"> 1473</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l01474" name="l01474"></a><span class="lineno"> 1474</span> fsize_t</div>
<div class="line"><a id="l01475" name="l01475"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0"> 1475</a></span> <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a>, </div>
<div class="line"><a id="l01476" name="l01476"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873"> 1476</a></span> <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a>; </div>
<div class="line"><a id="l01477" name="l01477"></a><span class="lineno"> 1477</span> };</div>
</div>
<div class="line"><a id="l01478" name="l01478"></a><span class="lineno"> 1478</span> </div>
<div class="foldopen" id="foldopen01482" data-start="{" data-end="};">
<div class="line"><a id="l01482" name="l01482"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1window.html"> 1482</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1window.html">window</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1limiter.html">limiter</a></div>
<div class="line"><a id="l01483" name="l01483"></a><span class="lineno"> 1483</span> {</div>
<div class="line"><a id="l01484" name="l01484"></a><span class="lineno"> 1484</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l01485" name="l01485"></a><span class="lineno"> 1485</span> <a class="code hl_class" href="classstdex_1_1stream_1_1window.html">window</a>(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>&amp; source, _In_ fpos_t _read_offset = 0, _In_ fsize_t <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a> = fsize_max, _In_ fpos_t _write_offset = 0, _In_ fsize_t <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a> = fsize_max) :</div>
<div class="line"><a id="l01486" name="l01486"></a><span class="lineno"> 1486</span> <a class="code hl_class" href="classstdex_1_1stream_1_1limiter.html">limiter</a>(source, <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a>, <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a>),</div>
<div class="line"><a id="l01487" name="l01487"></a><span class="lineno"> 1487</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#acff67a2931b8f1a85f12806002e7e131">read_offset</a>(_read_offset),</div>
<div class="line"><a id="l01488" name="l01488"></a><span class="lineno"> 1488</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#a01d191d653be7a6d218c7feffa1b0ec3">write_offset</a>(_write_offset)</div>
<div class="line"><a id="l01489" name="l01489"></a><span class="lineno"> 1489</span> {}</div>
<div class="line"><a id="l01490" name="l01490"></a><span class="lineno"> 1490</span> </div>
<div class="foldopen" id="foldopen01491" data-start="{" data-end="}">
<div class="line"><a id="l01491" name="l01491"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1window.html#a45f2420dfc94c07e101186ae2e541e13"> 1491</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1window.html#a45f2420dfc94c07e101186ae2e541e13">read</a>(</div>
<div class="line"><a id="l01492" name="l01492"></a><span class="lineno"> 1492</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l01493" name="l01493"></a><span class="lineno"> 1493</span> {</div>
<div class="line"><a id="l01494" name="l01494"></a><span class="lineno"> 1494</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#acff67a2931b8f1a85f12806002e7e131">read_offset</a>) {</div>
<div class="line"><a id="l01495" name="l01495"></a><span class="lineno"> 1495</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a52ce3bdf28a9a7fc5a881616c8db2da4">skip</a>(<a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#acff67a2931b8f1a85f12806002e7e131">read_offset</a>);</div>
<div class="line"><a id="l01496" name="l01496"></a><span class="lineno"> 1496</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01497" name="l01497"></a><span class="lineno"> 1497</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l01498" name="l01498"></a><span class="lineno"> 1498</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l01499" name="l01499"></a><span class="lineno"> 1499</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#acff67a2931b8f1a85f12806002e7e131">read_offset</a> = 0;</div>
<div class="line"><a id="l01500" name="l01500"></a><span class="lineno"> 1500</span> }</div>
<div class="line"><a id="l01501" name="l01501"></a><span class="lineno"> 1501</span> <span class="keywordtype">size_t</span> num_read;</div>
<div class="line"><a id="l01502" name="l01502"></a><span class="lineno"> 1502</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a> == fsize_max) {</div>
<div class="line"><a id="l01503" name="l01503"></a><span class="lineno"> 1503</span> num_read = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(data, length);</div>
<div class="line"><a id="l01504" name="l01504"></a><span class="lineno"> 1504</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01505" name="l01505"></a><span class="lineno"> 1505</span> }</div>
<div class="line"><a id="l01506" name="l01506"></a><span class="lineno"> 1506</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (length &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a>) {</div>
<div class="line"><a id="l01507" name="l01507"></a><span class="lineno"> 1507</span> num_read = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(data, length);</div>
<div class="line"><a id="l01508" name="l01508"></a><span class="lineno"> 1508</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01509" name="l01509"></a><span class="lineno"> 1509</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a> -= num_read;</div>
<div class="line"><a id="l01510" name="l01510"></a><span class="lineno"> 1510</span> }</div>
<div class="line"><a id="l01511" name="l01511"></a><span class="lineno"> 1511</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (length &amp;&amp; !<a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a>) {</div>
<div class="line"><a id="l01512" name="l01512"></a><span class="lineno"> 1512</span> num_read = 0;</div>
<div class="line"><a id="l01513" name="l01513"></a><span class="lineno"> 1513</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a52ce3bdf28a9a7fc5a881616c8db2da4">skip</a>(length);</div>
<div class="line"><a id="l01514" name="l01514"></a><span class="lineno"> 1514</span> m_state = state_t::eof;</div>
<div class="line"><a id="l01515" name="l01515"></a><span class="lineno"> 1515</span> }</div>
<div class="line"><a id="l01516" name="l01516"></a><span class="lineno"> 1516</span> <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l01517" name="l01517"></a><span class="lineno"> 1517</span> num_read = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(data, <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a>));</div>
<div class="line"><a id="l01518" name="l01518"></a><span class="lineno"> 1518</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01519" name="l01519"></a><span class="lineno"> 1519</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">read_limit</a> -= num_read;</div>
<div class="line"><a id="l01520" name="l01520"></a><span class="lineno"> 1520</span> }</div>
<div class="line"><a id="l01521" name="l01521"></a><span class="lineno"> 1521</span> <span class="keywordflow">return</span> num_read;</div>
<div class="line"><a id="l01522" name="l01522"></a><span class="lineno"> 1522</span> }</div>
</div>
<div class="line"><a id="l01523" name="l01523"></a><span class="lineno"> 1523</span> </div>
<div class="foldopen" id="foldopen01524" data-start="{" data-end="}">
<div class="line"><a id="l01524" name="l01524"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1window.html#a06f05191c35fdbadebc49e05a19d9f3c"> 1524</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1window.html#a06f05191c35fdbadebc49e05a19d9f3c">write</a>(</div>
<div class="line"><a id="l01525" name="l01525"></a><span class="lineno"> 1525</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l01526" name="l01526"></a><span class="lineno"> 1526</span> {</div>
<div class="line"><a id="l01527" name="l01527"></a><span class="lineno"> 1527</span> <span class="keywordtype">size_t</span> num_skipped, num_written;</div>
<div class="line"><a id="l01528" name="l01528"></a><span class="lineno"> 1528</span> <span class="keywordflow">if</span> (length &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#a01d191d653be7a6d218c7feffa1b0ec3">write_offset</a>) {</div>
<div class="line"><a id="l01529" name="l01529"></a><span class="lineno"> 1529</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#a01d191d653be7a6d218c7feffa1b0ec3">write_offset</a> -= length;</div>
<div class="line"><a id="l01530" name="l01530"></a><span class="lineno"> 1530</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01531" name="l01531"></a><span class="lineno"> 1531</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l01532" name="l01532"></a><span class="lineno"> 1532</span> }</div>
<div class="line"><a id="l01533" name="l01533"></a><span class="lineno"> 1533</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#a01d191d653be7a6d218c7feffa1b0ec3">write_offset</a>) {</div>
<div class="line"><a id="l01534" name="l01534"></a><span class="lineno"> 1534</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#a01d191d653be7a6d218c7feffa1b0ec3">write_offset</a>);</div>
<div class="line"><a id="l01535" name="l01535"></a><span class="lineno"> 1535</span> length -= <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#a01d191d653be7a6d218c7feffa1b0ec3">write_offset</a>);</div>
<div class="line"><a id="l01536" name="l01536"></a><span class="lineno"> 1536</span> num_skipped = <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#a01d191d653be7a6d218c7feffa1b0ec3">write_offset</a>);</div>
<div class="line"><a id="l01537" name="l01537"></a><span class="lineno"> 1537</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#a01d191d653be7a6d218c7feffa1b0ec3">write_offset</a> = 0;</div>
<div class="line"><a id="l01538" name="l01538"></a><span class="lineno"> 1538</span> }</div>
<div class="line"><a id="l01539" name="l01539"></a><span class="lineno"> 1539</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01540" name="l01540"></a><span class="lineno"> 1540</span> num_skipped = 0;</div>
<div class="line"><a id="l01541" name="l01541"></a><span class="lineno"> 1541</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a> == fsize_max) {</div>
<div class="line"><a id="l01542" name="l01542"></a><span class="lineno"> 1542</span> num_written = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(data, length);</div>
<div class="line"><a id="l01543" name="l01543"></a><span class="lineno"> 1543</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01544" name="l01544"></a><span class="lineno"> 1544</span> }</div>
<div class="line"><a id="l01545" name="l01545"></a><span class="lineno"> 1545</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (length &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a>) {</div>
<div class="line"><a id="l01546" name="l01546"></a><span class="lineno"> 1546</span> num_written = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(data, length);</div>
<div class="line"><a id="l01547" name="l01547"></a><span class="lineno"> 1547</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01548" name="l01548"></a><span class="lineno"> 1548</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a> -= num_written;</div>
<div class="line"><a id="l01549" name="l01549"></a><span class="lineno"> 1549</span> }</div>
<div class="line"><a id="l01550" name="l01550"></a><span class="lineno"> 1550</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (length &amp;&amp; !<a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a>) {</div>
<div class="line"><a id="l01551" name="l01551"></a><span class="lineno"> 1551</span> num_skipped += length;</div>
<div class="line"><a id="l01552" name="l01552"></a><span class="lineno"> 1552</span> num_written = 0;</div>
<div class="line"><a id="l01553" name="l01553"></a><span class="lineno"> 1553</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01554" name="l01554"></a><span class="lineno"> 1554</span> }</div>
<div class="line"><a id="l01555" name="l01555"></a><span class="lineno"> 1555</span> <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l01556" name="l01556"></a><span class="lineno"> 1556</span> num_skipped += length - <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a>);</div>
<div class="line"><a id="l01557" name="l01557"></a><span class="lineno"> 1557</span> num_written = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(data, <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a>));</div>
<div class="line"><a id="l01558" name="l01558"></a><span class="lineno"> 1558</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01559" name="l01559"></a><span class="lineno"> 1559</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">write_limit</a> -= num_written;</div>
<div class="line"><a id="l01560" name="l01560"></a><span class="lineno"> 1560</span> }</div>
<div class="line"><a id="l01561" name="l01561"></a><span class="lineno"> 1561</span> <span class="keywordflow">return</span> num_skipped + num_written;</div>
<div class="line"><a id="l01562" name="l01562"></a><span class="lineno"> 1562</span> }</div>
</div>
<div class="line"><a id="l01563" name="l01563"></a><span class="lineno"> 1563</span> </div>
<div class="line"><a id="l01564" name="l01564"></a><span class="lineno"> 1564</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l01565" name="l01565"></a><span class="lineno"> 1565</span> fpos_t</div>
<div class="line"><a id="l01566" name="l01566"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1window.html#acff67a2931b8f1a85f12806002e7e131"> 1566</a></span> <a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#acff67a2931b8f1a85f12806002e7e131">read_offset</a>, </div>
<div class="line"><a id="l01567" name="l01567"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1window.html#a01d191d653be7a6d218c7feffa1b0ec3"> 1567</a></span> <a class="code hl_variable" href="classstdex_1_1stream_1_1window.html#a01d191d653be7a6d218c7feffa1b0ec3">write_offset</a>; </div>
<div class="line"><a id="l01568" name="l01568"></a><span class="lineno"> 1568</span> };</div>
</div>
<div class="line"><a id="l01569" name="l01569"></a><span class="lineno"> 1569</span> </div>
<div class="foldopen" id="foldopen01573" data-start="{" data-end="};">
<div class="line"><a id="l01573" name="l01573"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file__window.html"> 1573</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1file__window.html">file_window</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic__file.html">basic_file</a></div>
<div class="line"><a id="l01574" name="l01574"></a><span class="lineno"> 1574</span> {</div>
<div class="line"><a id="l01575" name="l01575"></a><span class="lineno"> 1575</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l01576" name="l01576"></a><span class="lineno"> 1576</span> <a class="code hl_class" href="classstdex_1_1stream_1_1file__window.html">file_window</a>(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic__file.html">basic_file</a>&amp; source, fpos_t offset = 0, fsize_t length = 0) :</div>
<div class="line"><a id="l01577" name="l01577"></a><span class="lineno"> 1577</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>(source.state()),</div>
<div class="line"><a id="l01578" name="l01578"></a><span class="lineno"> 1578</span> m_source(source),</div>
<div class="line"><a id="l01579" name="l01579"></a><span class="lineno"> 1579</span> m_offset(source.tell()),</div>
<div class="line"><a id="l01580" name="l01580"></a><span class="lineno"> 1580</span> m_region(offset, offset + length)</div>
<div class="line"><a id="l01581" name="l01581"></a><span class="lineno"> 1581</span> {}</div>
<div class="line"><a id="l01582" name="l01582"></a><span class="lineno"> 1582</span> </div>
<div class="foldopen" id="foldopen01583" data-start="{" data-end="}">
<div class="line"><a id="l01583" name="l01583"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file__window.html#a9cdfe9f40ccb1f84e121b1b949a21246"> 1583</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1file__window.html#a9cdfe9f40ccb1f84e121b1b949a21246">read</a>(</div>
<div class="line"><a id="l01584" name="l01584"></a><span class="lineno"> 1584</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l01585" name="l01585"></a><span class="lineno"> 1585</span> {</div>
<div class="line"><a id="l01586" name="l01586"></a><span class="lineno"> 1586</span> assert(data || !length);</div>
<div class="line"><a id="l01587" name="l01587"></a><span class="lineno"> 1587</span> <span class="keywordflow">if</span> (m_region.<a class="code hl_function" href="structstdex_1_1interval.html#a1624ca77e8c9cb45cef61f7f8b532222">contains</a>(m_offset)) {</div>
<div class="line"><a id="l01588" name="l01588"></a><span class="lineno"> 1588</span> <span class="keywordtype">size_t</span> num_read = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(data, <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(std::min&lt;fpos_t&gt;(length, m_region.<a class="code hl_variable" href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">end</a> - m_offset)));</div>
<div class="line"><a id="l01589" name="l01589"></a><span class="lineno"> 1589</span> m_state = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01590" name="l01590"></a><span class="lineno"> 1590</span> m_offset += num_read;</div>
<div class="line"><a id="l01591" name="l01591"></a><span class="lineno"> 1591</span> <span class="keywordflow">return</span> num_read;</div>
<div class="line"><a id="l01592" name="l01592"></a><span class="lineno"> 1592</span> }</div>
<div class="line"><a id="l01593" name="l01593"></a><span class="lineno"> 1593</span> m_state = length ? state_t::eof : state_t::ok;</div>
<div class="line"><a id="l01594" name="l01594"></a><span class="lineno"> 1594</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l01595" name="l01595"></a><span class="lineno"> 1595</span> }</div>
</div>
<div class="line"><a id="l01596" name="l01596"></a><span class="lineno"> 1596</span> </div>
<div class="foldopen" id="foldopen01597" data-start="{" data-end="}">
<div class="line"><a id="l01597" name="l01597"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file__window.html#a7a264381cf344fcd6fa70e0a4964cc93"> 1597</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1file__window.html#a7a264381cf344fcd6fa70e0a4964cc93">write</a>(</div>
<div class="line"><a id="l01598" name="l01598"></a><span class="lineno"> 1598</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l01599" name="l01599"></a><span class="lineno"> 1599</span> {</div>
<div class="line"><a id="l01600" name="l01600"></a><span class="lineno"> 1600</span> assert(data || !length);</div>
<div class="line"><a id="l01601" name="l01601"></a><span class="lineno"> 1601</span> <span class="keywordflow">if</span> (m_region.<a class="code hl_function" href="structstdex_1_1interval.html#a1624ca77e8c9cb45cef61f7f8b532222">contains</a>(m_offset)) {</div>
<div class="line"><a id="l01602" name="l01602"></a><span class="lineno"> 1602</span> <span class="keywordtype">size_t</span> num_written = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(data, <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(std::min&lt;fpos_t&gt;(length, m_region.<a class="code hl_variable" href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">end</a> - m_offset)));</div>
<div class="line"><a id="l01603" name="l01603"></a><span class="lineno"> 1603</span> m_state = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01604" name="l01604"></a><span class="lineno"> 1604</span> m_offset += num_written;</div>
<div class="line"><a id="l01605" name="l01605"></a><span class="lineno"> 1605</span> <span class="keywordflow">return</span> num_written;</div>
<div class="line"><a id="l01606" name="l01606"></a><span class="lineno"> 1606</span> }</div>
<div class="line"><a id="l01607" name="l01607"></a><span class="lineno"> 1607</span> m_state = state_t::fail;</div>
<div class="line"><a id="l01608" name="l01608"></a><span class="lineno"> 1608</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l01609" name="l01609"></a><span class="lineno"> 1609</span> }</div>
</div>
<div class="line"><a id="l01610" name="l01610"></a><span class="lineno"> 1610</span> </div>
<div class="foldopen" id="foldopen01611" data-start="{" data-end="}">
<div class="line"><a id="l01611" name="l01611"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file__window.html#acace60a7ba95a139852f85aa4232bb14"> 1611</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file__window.html#acace60a7ba95a139852f85aa4232bb14">close</a>()</div>
<div class="line"><a id="l01612" name="l01612"></a><span class="lineno"> 1612</span> {</div>
<div class="line"><a id="l01613" name="l01613"></a><span class="lineno"> 1613</span> m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a5392748c19b5799da94a5fe031f7ec3b">close</a>();</div>
<div class="line"><a id="l01614" name="l01614"></a><span class="lineno"> 1614</span> m_state = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01615" name="l01615"></a><span class="lineno"> 1615</span> }</div>
</div>
<div class="line"><a id="l01616" name="l01616"></a><span class="lineno"> 1616</span> </div>
<div class="foldopen" id="foldopen01617" data-start="{" data-end="}">
<div class="line"><a id="l01617" name="l01617"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file__window.html#a2a2b88934b073b456da579ca3e3b43ff"> 1617</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file__window.html#a2a2b88934b073b456da579ca3e3b43ff">flush</a>()</div>
<div class="line"><a id="l01618" name="l01618"></a><span class="lineno"> 1618</span> {</div>
<div class="line"><a id="l01619" name="l01619"></a><span class="lineno"> 1619</span> m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a46c70519f3e4b1f3436e85a6623555dc">flush</a>();</div>
<div class="line"><a id="l01620" name="l01620"></a><span class="lineno"> 1620</span> m_state = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01621" name="l01621"></a><span class="lineno"> 1621</span> }</div>
</div>
<div class="line"><a id="l01622" name="l01622"></a><span class="lineno"> 1622</span> </div>
<div class="foldopen" id="foldopen01623" data-start="{" data-end="}">
<div class="line"><a id="l01623" name="l01623"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file__window.html#a53a12a1979b770030c0de05b349f1e55"> 1623</a></span> <span class="keyword">virtual</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1file__window.html#a53a12a1979b770030c0de05b349f1e55">seek</a>(_In_ foff_t offset, _In_ seek_t how = seek_t::beg)</div>
<div class="line"><a id="l01624" name="l01624"></a><span class="lineno"> 1624</span> {</div>
<div class="line"><a id="l01625" name="l01625"></a><span class="lineno"> 1625</span> m_offset = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(offset, how);</div>
<div class="line"><a id="l01626" name="l01626"></a><span class="lineno"> 1626</span> m_state = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01627" name="l01627"></a><span class="lineno"> 1627</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>() ? m_offset - m_region.<a class="code hl_variable" href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">start</a> : fpos_max;</div>
<div class="line"><a id="l01628" name="l01628"></a><span class="lineno"> 1628</span> }</div>
</div>
<div class="line"><a id="l01629" name="l01629"></a><span class="lineno"> 1629</span> </div>
<div class="foldopen" id="foldopen01630" data-start="{" data-end="}">
<div class="line"><a id="l01630" name="l01630"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file__window.html#a4202fcc2b9e69e40bf15aaa3b5f50dda"> 1630</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file__window.html#a4202fcc2b9e69e40bf15aaa3b5f50dda">skip</a>(_In_ fsize_t amount)</div>
<div class="line"><a id="l01631" name="l01631"></a><span class="lineno"> 1631</span> {</div>
<div class="line"><a id="l01632" name="l01632"></a><span class="lineno"> 1632</span> m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a15a1e6a778adefea421f32d14c8178dd">skip</a>(amount);</div>
<div class="line"><a id="l01633" name="l01633"></a><span class="lineno"> 1633</span> m_state = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01634" name="l01634"></a><span class="lineno"> 1634</span> }</div>
</div>
<div class="line"><a id="l01635" name="l01635"></a><span class="lineno"> 1635</span> </div>
<div class="foldopen" id="foldopen01636" data-start="{" data-end="}">
<div class="line"><a id="l01636" name="l01636"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file__window.html#ac5977ca09563126e2976abb356cb3b36"> 1636</a></span> <span class="keyword">virtual</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1file__window.html#ac5977ca09563126e2976abb356cb3b36">tell</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l01637" name="l01637"></a><span class="lineno"> 1637</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l01638" name="l01638"></a><span class="lineno"> 1638</span> fpos_t offset = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ae072990f9c42b372048045717de438c3">tell</a>();</div>
<div class="line"><a id="l01639" name="l01639"></a><span class="lineno"> 1639</span> <span class="keywordflow">return</span> m_region.<a class="code hl_function" href="structstdex_1_1interval.html#a1624ca77e8c9cb45cef61f7f8b532222">contains</a>(offset) ? offset - m_region.<a class="code hl_variable" href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">start</a> : fpos_max;</div>
<div class="line"><a id="l01640" name="l01640"></a><span class="lineno"> 1640</span> }</div>
</div>
<div class="line"><a id="l01641" name="l01641"></a><span class="lineno"> 1641</span> </div>
<div class="foldopen" id="foldopen01642" data-start="{" data-end="}">
<div class="line"><a id="l01642" name="l01642"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file__window.html#a820fea50931a0769161f617a524f72c6"> 1642</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file__window.html#a820fea50931a0769161f617a524f72c6">lock</a>(_In_ fpos_t offset, _In_ fsize_t length)</div>
<div class="line"><a id="l01643" name="l01643"></a><span class="lineno"> 1643</span> {</div>
<div class="line"><a id="l01644" name="l01644"></a><span class="lineno"> 1644</span> <span class="keywordflow">if</span> (m_region.<a class="code hl_function" href="structstdex_1_1interval.html#a1624ca77e8c9cb45cef61f7f8b532222">contains</a>(offset)) {</div>
<div class="line"><a id="l01645" name="l01645"></a><span class="lineno"> 1645</span> m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a484ec74004fe0b4528c11675b91161e0">lock</a>(m_region.<a class="code hl_variable" href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">start</a> + offset, std::min&lt;fsize_t&gt;(length, m_region.<a class="code hl_variable" href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">end</a> - offset));</div>
<div class="line"><a id="l01646" name="l01646"></a><span class="lineno"> 1646</span> m_state = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01647" name="l01647"></a><span class="lineno"> 1647</span> }</div>
<div class="line"><a id="l01648" name="l01648"></a><span class="lineno"> 1648</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01649" name="l01649"></a><span class="lineno"> 1649</span> m_state = state_t::fail;</div>
<div class="line"><a id="l01650" name="l01650"></a><span class="lineno"> 1650</span> }</div>
</div>
<div class="line"><a id="l01651" name="l01651"></a><span class="lineno"> 1651</span> </div>
<div class="foldopen" id="foldopen01652" data-start="{" data-end="}">
<div class="line"><a id="l01652" name="l01652"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file__window.html#ac3d9a3cf3636010b43612d2c298e7c3d"> 1652</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file__window.html#ac3d9a3cf3636010b43612d2c298e7c3d">unlock</a>(_In_ fpos_t offset, _In_ fsize_t length)</div>
<div class="line"><a id="l01653" name="l01653"></a><span class="lineno"> 1653</span> {</div>
<div class="line"><a id="l01654" name="l01654"></a><span class="lineno"> 1654</span> <span class="keywordflow">if</span> (m_region.<a class="code hl_function" href="structstdex_1_1interval.html#a1624ca77e8c9cb45cef61f7f8b532222">contains</a>(offset)) {</div>
<div class="line"><a id="l01655" name="l01655"></a><span class="lineno"> 1655</span> m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#adf1a39e7aec3f14fedf6ce5c0984a791">unlock</a>(m_region.<a class="code hl_variable" href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">start</a> + offset, std::min&lt;fsize_t&gt;(length, m_region.<a class="code hl_variable" href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">end</a> - offset));</div>
<div class="line"><a id="l01656" name="l01656"></a><span class="lineno"> 1656</span> m_state = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01657" name="l01657"></a><span class="lineno"> 1657</span> }</div>
<div class="line"><a id="l01658" name="l01658"></a><span class="lineno"> 1658</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l01659" name="l01659"></a><span class="lineno"> 1659</span> m_state = state_t::fail;</div>
<div class="line"><a id="l01660" name="l01660"></a><span class="lineno"> 1660</span> }</div>
</div>
<div class="line"><a id="l01661" name="l01661"></a><span class="lineno"> 1661</span> </div>
<div class="foldopen" id="foldopen01662" data-start="{" data-end="}">
<div class="line"><a id="l01662" name="l01662"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file__window.html#a70d596dd863a5265303aab11db59768e"> 1662</a></span> <span class="keyword">virtual</span> fsize_t <a class="code hl_function" href="classstdex_1_1stream_1_1file__window.html#a70d596dd863a5265303aab11db59768e">size</a>()</div>
<div class="line"><a id="l01663" name="l01663"></a><span class="lineno"> 1663</span> {</div>
<div class="line"><a id="l01664" name="l01664"></a><span class="lineno"> 1664</span> <span class="keywordflow">return</span> m_region.<a class="code hl_function" href="structstdex_1_1interval.html#a8c5222bc73fc66ba78bfabc1b985c864">size</a>();</div>
<div class="line"><a id="l01665" name="l01665"></a><span class="lineno"> 1665</span> }</div>
</div>
<div class="line"><a id="l01666" name="l01666"></a><span class="lineno"> 1666</span> </div>
<div class="foldopen" id="foldopen01667" data-start="{" data-end="}">
<div class="line"><a id="l01667" name="l01667"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file__window.html#a10f67434e8f3784933e3f7fddd20ce54"> 1667</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file__window.html#a10f67434e8f3784933e3f7fddd20ce54">truncate</a>()</div>
<div class="line"><a id="l01668" name="l01668"></a><span class="lineno"> 1668</span> {</div>
<div class="line"><a id="l01669" name="l01669"></a><span class="lineno"> 1669</span> m_state = state_t::fail;</div>
<div class="line"><a id="l01670" name="l01670"></a><span class="lineno"> 1670</span> }</div>
</div>
<div class="line"><a id="l01671" name="l01671"></a><span class="lineno"> 1671</span> </div>
<div class="line"><a id="l01672" name="l01672"></a><span class="lineno"> 1672</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l01673" name="l01673"></a><span class="lineno"> 1673</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic__file.html">basic_file</a>&amp; m_source;</div>
<div class="line"><a id="l01674" name="l01674"></a><span class="lineno"> 1674</span> fpos_t m_offset;</div>
<div class="line"><a id="l01675" name="l01675"></a><span class="lineno"> 1675</span> <a class="code hl_struct" href="structstdex_1_1interval.html">interval&lt;fpos_t&gt;</a> m_region;</div>
<div class="line"><a id="l01676" name="l01676"></a><span class="lineno"> 1676</span> };</div>
</div>
<div class="line"><a id="l01677" name="l01677"></a><span class="lineno"> 1677</span> </div>
<div class="line"><a id="l01678" name="l01678"></a><span class="lineno"> 1678</span> <span class="keyword">constexpr</span> <span class="keywordtype">size_t</span> default_cache_size = 0x1000; </div>
<div class="line"><a id="l01679" name="l01679"></a><span class="lineno"> 1679</span> </div>
<div class="foldopen" id="foldopen01683" data-start="{" data-end="};">
<div class="line"><a id="l01683" name="l01683"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html"> 1683</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1cache.html">cache</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic__file.html">basic_file</a></div>
<div class="line"><a id="l01684" name="l01684"></a><span class="lineno"> 1684</span> {</div>
<div class="line"><a id="l01685" name="l01685"></a><span class="lineno"> 1685</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l01686" name="l01686"></a><span class="lineno"> 1686</span> <span class="keyword">explicit</span> <a class="code hl_class" href="classstdex_1_1stream_1_1cache.html">cache</a>(_In_ <span class="keywordtype">size_t</span> cache_size = default_cache_size) :</div>
<div class="line"><a id="l01687" name="l01687"></a><span class="lineno"> 1687</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>(state_t::fail),</div>
<div class="line"><a id="l01688" name="l01688"></a><span class="lineno"> 1688</span> m_source(<span class="keyword">nullptr</span>),</div>
<div class="line"><a id="l01689" name="l01689"></a><span class="lineno"> 1689</span> m_cache(cache_size),</div>
<div class="line"><a id="l01690" name="l01690"></a><span class="lineno"> 1690</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>(0)</div>
<div class="line"><a id="l01691" name="l01691"></a><span class="lineno"> 1691</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l01692" name="l01692"></a><span class="lineno"> 1692</span> , m_atime(time_point::min()),</div>
<div class="line"><a id="l01693" name="l01693"></a><span class="lineno"> 1693</span> m_mtime(time_point::min())</div>
<div class="line"><a id="l01694" name="l01694"></a><span class="lineno"> 1694</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01695" name="l01695"></a><span class="lineno"> 1695</span> {}</div>
<div class="line"><a id="l01696" name="l01696"></a><span class="lineno"> 1696</span> </div>
<div class="line"><a id="l01697" name="l01697"></a><span class="lineno"> 1697</span> <span class="keywordtype">void</span> init(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic__file.html">basic_file</a>&amp; source)</div>
<div class="line"><a id="l01698" name="l01698"></a><span class="lineno"> 1698</span> {</div>
<div class="line"><a id="l01699" name="l01699"></a><span class="lineno"> 1699</span> m_state = source.state();</div>
<div class="line"><a id="l01700" name="l01700"></a><span class="lineno"> 1700</span> m_source = &amp;source;</div>
<div class="line"><a id="l01701" name="l01701"></a><span class="lineno"> 1701</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> = source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ae072990f9c42b372048045717de438c3">tell</a>();</div>
<div class="line"><a id="l01702" name="l01702"></a><span class="lineno"> 1702</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l01703" name="l01703"></a><span class="lineno"> 1703</span> m_atime = source.atime();</div>
<div class="line"><a id="l01704" name="l01704"></a><span class="lineno"> 1704</span> m_mtime = source.mtime();</div>
<div class="line"><a id="l01705" name="l01705"></a><span class="lineno"> 1705</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01706" name="l01706"></a><span class="lineno"> 1706</span> }</div>
<div class="line"><a id="l01707" name="l01707"></a><span class="lineno"> 1707</span> </div>
<div class="line"><a id="l01708" name="l01708"></a><span class="lineno"> 1708</span> <span class="keywordtype">void</span> done()</div>
<div class="line"><a id="l01709" name="l01709"></a><span class="lineno"> 1709</span> {</div>
<div class="line"><a id="l01710" name="l01710"></a><span class="lineno"> 1710</span> <span class="keywordflow">if</span> (m_source) {</div>
<div class="line"><a id="l01711" name="l01711"></a><span class="lineno"> 1711</span> flush_cache();</div>
<div class="line"><a id="l01712" name="l01712"></a><span class="lineno"> 1712</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l01713" name="l01713"></a><span class="lineno"> 1713</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;cache flush failed&quot;</span>); <span class="comment">// Data loss occured</span></div>
<div class="line"><a id="l01714" name="l01714"></a><span class="lineno"> 1714</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>);</div>
<div class="line"><a id="l01715" name="l01715"></a><span class="lineno"> 1715</span> m_source = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l01716" name="l01716"></a><span class="lineno"> 1716</span> }</div>
<div class="line"><a id="l01717" name="l01717"></a><span class="lineno"> 1717</span> }</div>
<div class="line"><a id="l01718" name="l01718"></a><span class="lineno"> 1718</span> </div>
<div class="line"><a id="l01719" name="l01719"></a><span class="lineno"> 1719</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l01720" name="l01720"></a><span class="lineno"> 1720</span> <a class="code hl_class" href="classstdex_1_1stream_1_1cache.html">cache</a>(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic__file.html">basic_file</a>&amp; source, _In_ <span class="keywordtype">size_t</span> cache_size = default_cache_size) :</div>
<div class="line"><a id="l01721" name="l01721"></a><span class="lineno"> 1721</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>(source.state()),</div>
<div class="line"><a id="l01722" name="l01722"></a><span class="lineno"> 1722</span> m_source(&amp;source),</div>
<div class="line"><a id="l01723" name="l01723"></a><span class="lineno"> 1723</span> m_cache(cache_size),</div>
<div class="line"><a id="l01724" name="l01724"></a><span class="lineno"> 1724</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>(source.tell())</div>
<div class="line"><a id="l01725" name="l01725"></a><span class="lineno"> 1725</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l01726" name="l01726"></a><span class="lineno"> 1726</span> , m_atime(source.atime()),</div>
<div class="line"><a id="l01727" name="l01727"></a><span class="lineno"> 1727</span> m_mtime(source.mtime())</div>
<div class="line"><a id="l01728" name="l01728"></a><span class="lineno"> 1728</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01729" name="l01729"></a><span class="lineno"> 1729</span> {}</div>
<div class="line"><a id="l01730" name="l01730"></a><span class="lineno"> 1730</span> </div>
<div class="line"><a id="l01731" name="l01731"></a><span class="lineno"> 1731</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classstdex_1_1stream_1_1cache.html">~cache</a>() <span class="keyword">noexcept</span>(<span class="keyword">false</span>)</div>
<div class="line"><a id="l01732" name="l01732"></a><span class="lineno"> 1732</span> {</div>
<div class="line"><a id="l01733" name="l01733"></a><span class="lineno"> 1733</span> <span class="keywordflow">if</span> (m_source) {</div>
<div class="line"><a id="l01734" name="l01734"></a><span class="lineno"> 1734</span> flush_cache();</div>
<div class="line"><a id="l01735" name="l01735"></a><span class="lineno"> 1735</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l01736" name="l01736"></a><span class="lineno"> 1736</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;cache flush failed&quot;</span>); <span class="comment">// Data loss occured</span></div>
<div class="line"><a id="l01737" name="l01737"></a><span class="lineno"> 1737</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>);</div>
<div class="line"><a id="l01738" name="l01738"></a><span class="lineno"> 1738</span> }</div>
<div class="line"><a id="l01739" name="l01739"></a><span class="lineno"> 1739</span> }</div>
<div class="line"><a id="l01740" name="l01740"></a><span class="lineno"> 1740</span> </div>
<div class="foldopen" id="foldopen01741" data-start="{" data-end="}">
<div class="line"><a id="l01741" name="l01741"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#a43dd464dd032888de79f5cd606adffa9"> 1741</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#a43dd464dd032888de79f5cd606adffa9">read</a>(</div>
<div class="line"><a id="l01742" name="l01742"></a><span class="lineno"> 1742</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l01743" name="l01743"></a><span class="lineno"> 1743</span> {</div>
<div class="line"><a id="l01744" name="l01744"></a><span class="lineno"> 1744</span> assert(data || !length);</div>
<div class="line"><a id="l01745" name="l01745"></a><span class="lineno"> 1745</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l01746" name="l01746"></a><span class="lineno"> 1746</span> m_atime = time_point::now();</div>
<div class="line"><a id="l01747" name="l01747"></a><span class="lineno"> 1747</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01748" name="l01748"></a><span class="lineno"> 1748</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_read = length;;) {</div>
<div class="line"><a id="l01749" name="l01749"></a><span class="lineno"> 1749</span> <span class="keywordflow">if</span> (m_cache.status != cache_t::cache_t::status_t::empty) {</div>
<div class="line"><a id="l01750" name="l01750"></a><span class="lineno"> 1750</span> <span class="keywordflow">if</span> (m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_function" href="structstdex_1_1interval.html#a1624ca77e8c9cb45cef61f7f8b532222">contains</a>(<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>)) {</div>
<div class="line"><a id="l01751" name="l01751"></a><span class="lineno"> 1751</span> <span class="keywordtype">size_t</span> remaining_cache = <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">end</a> - <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>);</div>
<div class="line"><a id="l01752" name="l01752"></a><span class="lineno"> 1752</span> <span class="keywordflow">if</span> (to_read &lt;= remaining_cache) {</div>
<div class="line"><a id="l01753" name="l01753"></a><span class="lineno"> 1753</span> memcpy(data, m_cache.data + <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> - m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">start</a>), to_read);</div>
<div class="line"><a id="l01754" name="l01754"></a><span class="lineno"> 1754</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> += to_read;</div>
<div class="line"><a id="l01755" name="l01755"></a><span class="lineno"> 1755</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01756" name="l01756"></a><span class="lineno"> 1756</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l01757" name="l01757"></a><span class="lineno"> 1757</span> }</div>
<div class="line"><a id="l01758" name="l01758"></a><span class="lineno"> 1758</span> memcpy(data, m_cache.data + <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> - m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">start</a>), remaining_cache);</div>
<div class="line"><a id="l01759" name="l01759"></a><span class="lineno"> 1759</span> <span class="keyword">reinterpret_cast&lt;</span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += remaining_cache;</div>
<div class="line"><a id="l01760" name="l01760"></a><span class="lineno"> 1760</span> to_read -= remaining_cache;</div>
<div class="line"><a id="l01761" name="l01761"></a><span class="lineno"> 1761</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> += remaining_cache;</div>
<div class="line"><a id="l01762" name="l01762"></a><span class="lineno"> 1762</span> }</div>
<div class="line"><a id="l01763" name="l01763"></a><span class="lineno"> 1763</span> flush_cache();</div>
<div class="line"><a id="l01764" name="l01764"></a><span class="lineno"> 1764</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_ {</div>
<div class="line"><a id="l01765" name="l01765"></a><span class="lineno"> 1765</span> <span class="keywordflow">if</span> (to_read &lt; length)</div>
<div class="line"><a id="l01766" name="l01766"></a><span class="lineno"> 1766</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01767" name="l01767"></a><span class="lineno"> 1767</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l01768" name="l01768"></a><span class="lineno"> 1768</span> }</div>
<div class="line"><a id="l01769" name="l01769"></a><span class="lineno"> 1769</span> }</div>
<div class="line"><a id="l01770" name="l01770"></a><span class="lineno"> 1770</span> {</div>
<div class="line"><a id="l01771" name="l01771"></a><span class="lineno"> 1771</span> fpos_t end_max = <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> + to_read;</div>
<div class="line"><a id="l01772" name="l01772"></a><span class="lineno"> 1772</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> / m_cache.capacity &lt; end_max / m_cache.capacity) {</div>
<div class="line"><a id="l01773" name="l01773"></a><span class="lineno"> 1773</span> <span class="comment">// Read spans multiple cache blocks. Bypass cache to the last block.</span></div>
<div class="line"><a id="l01774" name="l01774"></a><span class="lineno"> 1774</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>);</div>
<div class="line"><a id="l01775" name="l01775"></a><span class="lineno"> 1775</span> <span class="keywordflow">if</span> (!m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_ {</div>
<div class="line"><a id="l01776" name="l01776"></a><span class="lineno"> 1776</span> m_state = to_read &lt; length ? state_t::ok : state_t::fail;</div>
<div class="line"><a id="l01777" name="l01777"></a><span class="lineno"> 1777</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l01778" name="l01778"></a><span class="lineno"> 1778</span> }</div>
<div class="line"><a id="l01779" name="l01779"></a><span class="lineno"> 1779</span> <span class="keywordtype">size_t</span> num_read = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(data, to_read - <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(end_max % m_cache.capacity));</div>
<div class="line"><a id="l01780" name="l01780"></a><span class="lineno"> 1780</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> += num_read;</div>
<div class="line"><a id="l01781" name="l01781"></a><span class="lineno"> 1781</span> to_read -= num_read;</div>
<div class="line"><a id="l01782" name="l01782"></a><span class="lineno"> 1782</span> <span class="keywordflow">if</span> (!to_read) {</div>
<div class="line"><a id="l01783" name="l01783"></a><span class="lineno"> 1783</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01784" name="l01784"></a><span class="lineno"> 1784</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l01785" name="l01785"></a><span class="lineno"> 1785</span> }</div>
<div class="line"><a id="l01786" name="l01786"></a><span class="lineno"> 1786</span> <span class="keyword">reinterpret_cast&lt;</span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += num_read;</div>
<div class="line"><a id="l01787" name="l01787"></a><span class="lineno"> 1787</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01788" name="l01788"></a><span class="lineno"> 1788</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) {</div>
<div class="line"><a id="l01789" name="l01789"></a><span class="lineno"> 1789</span> <span class="keywordflow">if</span> (to_read &lt; length)</div>
<div class="line"><a id="l01790" name="l01790"></a><span class="lineno"> 1790</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01791" name="l01791"></a><span class="lineno"> 1791</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l01792" name="l01792"></a><span class="lineno"> 1792</span> }</div>
<div class="line"><a id="l01793" name="l01793"></a><span class="lineno"> 1793</span> }</div>
<div class="line"><a id="l01794" name="l01794"></a><span class="lineno"> 1794</span> }</div>
<div class="line"><a id="l01795" name="l01795"></a><span class="lineno"> 1795</span> load_cache(<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>);</div>
<div class="line"><a id="l01796" name="l01796"></a><span class="lineno"> 1796</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>() || m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">end</a> &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>) _Unlikely_ {</div>
<div class="line"><a id="l01797" name="l01797"></a><span class="lineno"> 1797</span> m_state = to_read &lt; length ? state_t::ok : state_t::fail;</div>
<div class="line"><a id="l01798" name="l01798"></a><span class="lineno"> 1798</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l01799" name="l01799"></a><span class="lineno"> 1799</span> }</div>
<div class="line"><a id="l01800" name="l01800"></a><span class="lineno"> 1800</span> }</div>
<div class="line"><a id="l01801" name="l01801"></a><span class="lineno"> 1801</span> }</div>
</div>
<div class="line"><a id="l01802" name="l01802"></a><span class="lineno"> 1802</span> </div>
<div class="foldopen" id="foldopen01803" data-start="{" data-end="}">
<div class="line"><a id="l01803" name="l01803"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#ac436fbcac7eddf95b6e25d6368da3fb7"> 1803</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#ac436fbcac7eddf95b6e25d6368da3fb7">write</a>(</div>
<div class="line"><a id="l01804" name="l01804"></a><span class="lineno"> 1804</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l01805" name="l01805"></a><span class="lineno"> 1805</span> {</div>
<div class="line"><a id="l01806" name="l01806"></a><span class="lineno"> 1806</span> assert(data || !length);</div>
<div class="line"><a id="l01807" name="l01807"></a><span class="lineno"> 1807</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l01808" name="l01808"></a><span class="lineno"> 1808</span> m_atime = m_mtime = time_point::now();</div>
<div class="line"><a id="l01809" name="l01809"></a><span class="lineno"> 1809</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01810" name="l01810"></a><span class="lineno"> 1810</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_write = length;;) {</div>
<div class="line"><a id="l01811" name="l01811"></a><span class="lineno"> 1811</span> <span class="keywordflow">if</span> (m_cache.status != cache_t::cache_t::status_t::empty) {</div>
<div class="line"><a id="l01812" name="l01812"></a><span class="lineno"> 1812</span> fpos_t end_max = m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">start</a> + m_cache.capacity;</div>
<div class="line"><a id="l01813" name="l01813"></a><span class="lineno"> 1813</span> <span class="keywordflow">if</span> (m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">start</a> &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> &amp;&amp; <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> &lt; end_max) {</div>
<div class="line"><a id="l01814" name="l01814"></a><span class="lineno"> 1814</span> <span class="keywordtype">size_t</span> remaining_cache = <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(end_max - <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>);</div>
<div class="line"><a id="l01815" name="l01815"></a><span class="lineno"> 1815</span> <span class="keywordflow">if</span> (to_write &lt;= remaining_cache) {</div>
<div class="line"><a id="l01816" name="l01816"></a><span class="lineno"> 1816</span> memcpy(m_cache.data + <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> - m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">start</a>), data, to_write);</div>
<div class="line"><a id="l01817" name="l01817"></a><span class="lineno"> 1817</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> += to_write;</div>
<div class="line"><a id="l01818" name="l01818"></a><span class="lineno"> 1818</span> m_cache.status = cache_t::cache_t::status_t::dirty;</div>
<div class="line"><a id="l01819" name="l01819"></a><span class="lineno"> 1819</span> m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">end</a> = std::max(m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">end</a>, <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>);</div>
<div class="line"><a id="l01820" name="l01820"></a><span class="lineno"> 1820</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01821" name="l01821"></a><span class="lineno"> 1821</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l01822" name="l01822"></a><span class="lineno"> 1822</span> }</div>
<div class="line"><a id="l01823" name="l01823"></a><span class="lineno"> 1823</span> memcpy(m_cache.data + <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> - m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">start</a>), data, remaining_cache);</div>
<div class="line"><a id="l01824" name="l01824"></a><span class="lineno"> 1824</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += remaining_cache;</div>
<div class="line"><a id="l01825" name="l01825"></a><span class="lineno"> 1825</span> to_write -= remaining_cache;</div>
<div class="line"><a id="l01826" name="l01826"></a><span class="lineno"> 1826</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> += remaining_cache;</div>
<div class="line"><a id="l01827" name="l01827"></a><span class="lineno"> 1827</span> m_cache.status = cache_t::cache_t::status_t::dirty;</div>
<div class="line"><a id="l01828" name="l01828"></a><span class="lineno"> 1828</span> m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">end</a> = end_max;</div>
<div class="line"><a id="l01829" name="l01829"></a><span class="lineno"> 1829</span> }</div>
<div class="line"><a id="l01830" name="l01830"></a><span class="lineno"> 1830</span> flush_cache();</div>
<div class="line"><a id="l01831" name="l01831"></a><span class="lineno"> 1831</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l01832" name="l01832"></a><span class="lineno"> 1832</span> <span class="keywordflow">return</span> length - to_write;</div>
<div class="line"><a id="l01833" name="l01833"></a><span class="lineno"> 1833</span> }</div>
<div class="line"><a id="l01834" name="l01834"></a><span class="lineno"> 1834</span> {</div>
<div class="line"><a id="l01835" name="l01835"></a><span class="lineno"> 1835</span> fpos_t end_max = <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> + to_write;</div>
<div class="line"><a id="l01836" name="l01836"></a><span class="lineno"> 1836</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> / m_cache.capacity &lt; end_max / m_cache.capacity) {</div>
<div class="line"><a id="l01837" name="l01837"></a><span class="lineno"> 1837</span> <span class="comment">// Write spans multiple cache blocks. Bypass cache to the last block.</span></div>
<div class="line"><a id="l01838" name="l01838"></a><span class="lineno"> 1838</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>);</div>
<div class="line"><a id="l01839" name="l01839"></a><span class="lineno"> 1839</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l01840" name="l01840"></a><span class="lineno"> 1840</span> <span class="keywordflow">return</span> length - to_write;</div>
<div class="line"><a id="l01841" name="l01841"></a><span class="lineno"> 1841</span> <span class="keywordtype">size_t</span> num_written = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(data, to_write - <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(end_max % m_cache.capacity));</div>
<div class="line"><a id="l01842" name="l01842"></a><span class="lineno"> 1842</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> += num_written;</div>
<div class="line"><a id="l01843" name="l01843"></a><span class="lineno"> 1843</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01844" name="l01844"></a><span class="lineno"> 1844</span> to_write -= num_written;</div>
<div class="line"><a id="l01845" name="l01845"></a><span class="lineno"> 1845</span> <span class="keywordflow">if</span> (!to_write || !<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>())</div>
<div class="line"><a id="l01846" name="l01846"></a><span class="lineno"> 1846</span> <span class="keywordflow">return</span> length - to_write;</div>
<div class="line"><a id="l01847" name="l01847"></a><span class="lineno"> 1847</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += num_written;</div>
<div class="line"><a id="l01848" name="l01848"></a><span class="lineno"> 1848</span> }</div>
<div class="line"><a id="l01849" name="l01849"></a><span class="lineno"> 1849</span> }</div>
<div class="line"><a id="l01850" name="l01850"></a><span class="lineno"> 1850</span> load_cache(<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>);</div>
<div class="line"><a id="l01851" name="l01851"></a><span class="lineno"> 1851</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l01852" name="l01852"></a><span class="lineno"> 1852</span> <span class="keywordflow">return</span> length - to_write;</div>
<div class="line"><a id="l01853" name="l01853"></a><span class="lineno"> 1853</span> }</div>
<div class="line"><a id="l01854" name="l01854"></a><span class="lineno"> 1854</span> }</div>
</div>
<div class="line"><a id="l01855" name="l01855"></a><span class="lineno"> 1855</span> </div>
<div class="foldopen" id="foldopen01856" data-start="{" data-end="}">
<div class="line"><a id="l01856" name="l01856"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#aa88074bb669bcb654e027b76e32a2799"> 1856</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#aa88074bb669bcb654e027b76e32a2799">close</a>()</div>
<div class="line"><a id="l01857" name="l01857"></a><span class="lineno"> 1857</span> {</div>
<div class="line"><a id="l01858" name="l01858"></a><span class="lineno"> 1858</span> invalidate_cache();</div>
<div class="line"><a id="l01859" name="l01859"></a><span class="lineno"> 1859</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l01860" name="l01860"></a><span class="lineno"> 1860</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;cache flush failed&quot;</span>); <span class="comment">// Data loss occured</span></div>
<div class="line"><a id="l01861" name="l01861"></a><span class="lineno"> 1861</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a5392748c19b5799da94a5fe031f7ec3b">close</a>();</div>
<div class="line"><a id="l01862" name="l01862"></a><span class="lineno"> 1862</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01863" name="l01863"></a><span class="lineno"> 1863</span> }</div>
</div>
<div class="line"><a id="l01864" name="l01864"></a><span class="lineno"> 1864</span> </div>
<div class="foldopen" id="foldopen01865" data-start="{" data-end="}">
<div class="line"><a id="l01865" name="l01865"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#ac33e763d8103ad8e910b75085a4cf3ac"> 1865</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#ac33e763d8103ad8e910b75085a4cf3ac">flush</a>()</div>
<div class="line"><a id="l01866" name="l01866"></a><span class="lineno"> 1866</span> {</div>
<div class="line"><a id="l01867" name="l01867"></a><span class="lineno"> 1867</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l01868" name="l01868"></a><span class="lineno"> 1868</span> m_atime = m_mtime = time_point::min();</div>
<div class="line"><a id="l01869" name="l01869"></a><span class="lineno"> 1869</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01870" name="l01870"></a><span class="lineno"> 1870</span> flush_cache();</div>
<div class="line"><a id="l01871" name="l01871"></a><span class="lineno"> 1871</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l01872" name="l01872"></a><span class="lineno"> 1872</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01873" name="l01873"></a><span class="lineno"> 1873</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a46c70519f3e4b1f3436e85a6623555dc">flush</a>();</div>
<div class="line"><a id="l01874" name="l01874"></a><span class="lineno"> 1874</span> }</div>
</div>
<div class="line"><a id="l01875" name="l01875"></a><span class="lineno"> 1875</span> </div>
<div class="foldopen" id="foldopen01876" data-start="{" data-end="}">
<div class="line"><a id="l01876" name="l01876"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#af2979118bdeca35cbfd84a8a2be00f8a"> 1876</a></span> <span class="keyword">virtual</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#af2979118bdeca35cbfd84a8a2be00f8a">seek</a>(_In_ foff_t offset, _In_ seek_t how = seek_t::beg)</div>
<div class="line"><a id="l01877" name="l01877"></a><span class="lineno"> 1877</span> {</div>
<div class="line"><a id="l01878" name="l01878"></a><span class="lineno"> 1878</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01879" name="l01879"></a><span class="lineno"> 1879</span> <span class="keywordflow">switch</span> (how) {</div>
<div class="line"><a id="l01880" name="l01880"></a><span class="lineno"> 1880</span> <span class="keywordflow">case</span> seek_t::beg:</div>
<div class="line"><a id="l01881" name="l01881"></a><span class="lineno"> 1881</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> = offset;</div>
<div class="line"><a id="l01882" name="l01882"></a><span class="lineno"> 1882</span> <span class="keywordflow">case</span> seek_t::cur:</div>
<div class="line"><a id="l01883" name="l01883"></a><span class="lineno"> 1883</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> += offset;</div>
<div class="line"><a id="l01884" name="l01884"></a><span class="lineno"> 1884</span> <span class="keywordflow">case</span> seek_t::end:</div>
<div class="line"><a id="l01885" name="l01885"></a><span class="lineno"> 1885</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> = <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#a769034b8641a17210a916091b112af2d">size</a>() + offset;</div>
<div class="line"><a id="l01886" name="l01886"></a><span class="lineno"> 1886</span> <span class="keywordflow">default</span>:</div>
<div class="line"><a id="l01887" name="l01887"></a><span class="lineno"> 1887</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;unknown seek origin&quot;</span>);</div>
<div class="line"><a id="l01888" name="l01888"></a><span class="lineno"> 1888</span> }</div>
<div class="line"><a id="l01889" name="l01889"></a><span class="lineno"> 1889</span> }</div>
</div>
<div class="line"><a id="l01890" name="l01890"></a><span class="lineno"> 1890</span> </div>
<div class="foldopen" id="foldopen01891" data-start="{" data-end="}">
<div class="line"><a id="l01891" name="l01891"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#ae790c5f526771cfe2cb3b28d38a11dd9"> 1891</a></span> <span class="keyword">virtual</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#ae790c5f526771cfe2cb3b28d38a11dd9">tell</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l01892" name="l01892"></a><span class="lineno"> 1892</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l01893" name="l01893"></a><span class="lineno"> 1893</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>;</div>
<div class="line"><a id="l01894" name="l01894"></a><span class="lineno"> 1894</span> }</div>
</div>
<div class="line"><a id="l01895" name="l01895"></a><span class="lineno"> 1895</span> </div>
<div class="foldopen" id="foldopen01896" data-start="{" data-end="}">
<div class="line"><a id="l01896" name="l01896"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#ac1ca25b572574b35cd4895964e835204"> 1896</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#ac1ca25b572574b35cd4895964e835204">lock</a>(_In_ fpos_t offset, _In_ fsize_t length)</div>
<div class="line"><a id="l01897" name="l01897"></a><span class="lineno"> 1897</span> {</div>
<div class="line"><a id="l01898" name="l01898"></a><span class="lineno"> 1898</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a484ec74004fe0b4528c11675b91161e0">lock</a>(offset, length);</div>
<div class="line"><a id="l01899" name="l01899"></a><span class="lineno"> 1899</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01900" name="l01900"></a><span class="lineno"> 1900</span> }</div>
</div>
<div class="line"><a id="l01901" name="l01901"></a><span class="lineno"> 1901</span> </div>
<div class="foldopen" id="foldopen01902" data-start="{" data-end="}">
<div class="line"><a id="l01902" name="l01902"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#a7a15ab17abc847b380b13b43b4f1d12e"> 1902</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#a7a15ab17abc847b380b13b43b4f1d12e">unlock</a>(_In_ fpos_t offset, _In_ fsize_t length)</div>
<div class="line"><a id="l01903" name="l01903"></a><span class="lineno"> 1903</span> {</div>
<div class="line"><a id="l01904" name="l01904"></a><span class="lineno"> 1904</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#adf1a39e7aec3f14fedf6ce5c0984a791">unlock</a>(offset, length);</div>
<div class="line"><a id="l01905" name="l01905"></a><span class="lineno"> 1905</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01906" name="l01906"></a><span class="lineno"> 1906</span> }</div>
</div>
<div class="line"><a id="l01907" name="l01907"></a><span class="lineno"> 1907</span> </div>
<div class="foldopen" id="foldopen01908" data-start="{" data-end="}">
<div class="line"><a id="l01908" name="l01908"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#a769034b8641a17210a916091b112af2d"> 1908</a></span> <span class="keyword">virtual</span> fsize_t <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#a769034b8641a17210a916091b112af2d">size</a>()</div>
<div class="line"><a id="l01909" name="l01909"></a><span class="lineno"> 1909</span> {</div>
<div class="line"><a id="l01910" name="l01910"></a><span class="lineno"> 1910</span> <span class="keywordflow">return</span> m_cache.status != cache_t::cache_t::status_t::empty ?</div>
<div class="line"><a id="l01911" name="l01911"></a><span class="lineno"> 1911</span> std::max(m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ad868d7c25aa45cefc95dd54a24febf2f">size</a>(), m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">end</a>) :</div>
<div class="line"><a id="l01912" name="l01912"></a><span class="lineno"> 1912</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ad868d7c25aa45cefc95dd54a24febf2f">size</a>();</div>
<div class="line"><a id="l01913" name="l01913"></a><span class="lineno"> 1913</span> }</div>
</div>
<div class="line"><a id="l01914" name="l01914"></a><span class="lineno"> 1914</span> </div>
<div class="foldopen" id="foldopen01915" data-start="{" data-end="}">
<div class="line"><a id="l01915" name="l01915"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#a2e19026e55cda14db786948b66d63aba"> 1915</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#a2e19026e55cda14db786948b66d63aba">truncate</a>()</div>
<div class="line"><a id="l01916" name="l01916"></a><span class="lineno"> 1916</span> {</div>
<div class="line"><a id="l01917" name="l01917"></a><span class="lineno"> 1917</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l01918" name="l01918"></a><span class="lineno"> 1918</span> m_atime = m_mtime = time_point::now();</div>
<div class="line"><a id="l01919" name="l01919"></a><span class="lineno"> 1919</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01920" name="l01920"></a><span class="lineno"> 1920</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(<a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>);</div>
<div class="line"><a id="l01921" name="l01921"></a><span class="lineno"> 1921</span> <span class="keywordflow">if</span> (m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">end</a> &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>) {</div>
<div class="line"><a id="l01922" name="l01922"></a><span class="lineno"> 1922</span> <span class="comment">// Truncation does not affect cache.</span></div>
<div class="line"><a id="l01923" name="l01923"></a><span class="lineno"> 1923</span> }</div>
<div class="line"><a id="l01924" name="l01924"></a><span class="lineno"> 1924</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">start</a> &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>) {</div>
<div class="line"><a id="l01925" name="l01925"></a><span class="lineno"> 1925</span> <span class="comment">// Truncation truncates cache.</span></div>
<div class="line"><a id="l01926" name="l01926"></a><span class="lineno"> 1926</span> m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">end</a> = <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>;</div>
<div class="line"><a id="l01927" name="l01927"></a><span class="lineno"> 1927</span> }</div>
<div class="line"><a id="l01928" name="l01928"></a><span class="lineno"> 1928</span> <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l01929" name="l01929"></a><span class="lineno"> 1929</span> <span class="comment">// Truncation invalidates cache.</span></div>
<div class="line"><a id="l01930" name="l01930"></a><span class="lineno"> 1930</span> m_cache.status = cache_t::cache_t::status_t::empty;</div>
<div class="line"><a id="l01931" name="l01931"></a><span class="lineno"> 1931</span> }</div>
<div class="line"><a id="l01932" name="l01932"></a><span class="lineno"> 1932</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a522305da60cc442ca3cd6b7aa2214d6e">truncate</a>();</div>
<div class="line"><a id="l01933" name="l01933"></a><span class="lineno"> 1933</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l01934" name="l01934"></a><span class="lineno"> 1934</span> }</div>
</div>
<div class="line"><a id="l01935" name="l01935"></a><span class="lineno"> 1935</span> </div>
<div class="foldopen" id="foldopen01936" data-start="{" data-end="}">
<div class="line"><a id="l01936" name="l01936"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#a0306f70f169f924f41306c71646c9276"> 1936</a></span> <span class="keyword">virtual</span> time_point <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#a0306f70f169f924f41306c71646c9276">ctime</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l01937" name="l01937"></a><span class="lineno"> 1937</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l01938" name="l01938"></a><span class="lineno"> 1938</span> <span class="keywordflow">return</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a3c02c83246c43ed868dab1dd5a5d698d">ctime</a>();</div>
<div class="line"><a id="l01939" name="l01939"></a><span class="lineno"> 1939</span> }</div>
</div>
<div class="line"><a id="l01940" name="l01940"></a><span class="lineno"> 1940</span> </div>
<div class="foldopen" id="foldopen01941" data-start="{" data-end="}">
<div class="line"><a id="l01941" name="l01941"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#a5fd8962b5a49d549a36d96f3e8919cd7"> 1941</a></span> <span class="keyword">virtual</span> time_point <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#a5fd8962b5a49d549a36d96f3e8919cd7">atime</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l01942" name="l01942"></a><span class="lineno"> 1942</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l01943" name="l01943"></a><span class="lineno"> 1943</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l01944" name="l01944"></a><span class="lineno"> 1944</span> <span class="keywordflow">return</span> std::max(m_atime, m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a84936e230100934793aad8a516efa826">atime</a>());</div>
<div class="line"><a id="l01945" name="l01945"></a><span class="lineno"> 1945</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l01946" name="l01946"></a><span class="lineno"> 1946</span> <span class="keywordflow">return</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a84936e230100934793aad8a516efa826">atime</a>();</div>
<div class="line"><a id="l01947" name="l01947"></a><span class="lineno"> 1947</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01948" name="l01948"></a><span class="lineno"> 1948</span> }</div>
</div>
<div class="line"><a id="l01949" name="l01949"></a><span class="lineno"> 1949</span> </div>
<div class="foldopen" id="foldopen01950" data-start="{" data-end="}">
<div class="line"><a id="l01950" name="l01950"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#a8350e6c158982e5511da18ed122bf24d"> 1950</a></span> <span class="keyword">virtual</span> time_point <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#a8350e6c158982e5511da18ed122bf24d">mtime</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l01951" name="l01951"></a><span class="lineno"> 1951</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l01952" name="l01952"></a><span class="lineno"> 1952</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l01953" name="l01953"></a><span class="lineno"> 1953</span> <span class="keywordflow">return</span> std::max(m_mtime, m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ae10432137e01b7ce7c254c2a455c719e">mtime</a>());</div>
<div class="line"><a id="l01954" name="l01954"></a><span class="lineno"> 1954</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l01955" name="l01955"></a><span class="lineno"> 1955</span> <span class="keywordflow">return</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ae10432137e01b7ce7c254c2a455c719e">mtime</a>();</div>
<div class="line"><a id="l01956" name="l01956"></a><span class="lineno"> 1956</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01957" name="l01957"></a><span class="lineno"> 1957</span> }</div>
</div>
<div class="line"><a id="l01958" name="l01958"></a><span class="lineno"> 1958</span> </div>
<div class="foldopen" id="foldopen01959" data-start="{" data-end="}">
<div class="line"><a id="l01959" name="l01959"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#ae62a75156ff79910e1b9afc506e38e44"> 1959</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#ae62a75156ff79910e1b9afc506e38e44">set_ctime</a>(time_point date)</div>
<div class="line"><a id="l01960" name="l01960"></a><span class="lineno"> 1960</span> {</div>
<div class="line"><a id="l01961" name="l01961"></a><span class="lineno"> 1961</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#aba668e53fc4709cd545f12a49521ed56">set_ctime</a>(date);</div>
<div class="line"><a id="l01962" name="l01962"></a><span class="lineno"> 1962</span> }</div>
</div>
<div class="line"><a id="l01963" name="l01963"></a><span class="lineno"> 1963</span> </div>
<div class="foldopen" id="foldopen01964" data-start="{" data-end="}">
<div class="line"><a id="l01964" name="l01964"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#af026881969ee78e2aef1bf02922aea93"> 1964</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#af026881969ee78e2aef1bf02922aea93">set_atime</a>(time_point date)</div>
<div class="line"><a id="l01965" name="l01965"></a><span class="lineno"> 1965</span> {</div>
<div class="line"><a id="l01966" name="l01966"></a><span class="lineno"> 1966</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l01967" name="l01967"></a><span class="lineno"> 1967</span> m_atime = date;</div>
<div class="line"><a id="l01968" name="l01968"></a><span class="lineno"> 1968</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01969" name="l01969"></a><span class="lineno"> 1969</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ae76436514ac66d88bbd584ea07d879d0">set_atime</a>(date);</div>
<div class="line"><a id="l01970" name="l01970"></a><span class="lineno"> 1970</span> }</div>
</div>
<div class="line"><a id="l01971" name="l01971"></a><span class="lineno"> 1971</span> </div>
<div class="foldopen" id="foldopen01972" data-start="{" data-end="}">
<div class="line"><a id="l01972" name="l01972"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#aafad7bfb4c03d0d56854b4c148ae0ee1"> 1972</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1cache.html#aafad7bfb4c03d0d56854b4c148ae0ee1">set_mtime</a>(time_point date)</div>
<div class="line"><a id="l01973" name="l01973"></a><span class="lineno"> 1973</span> {</div>
<div class="line"><a id="l01974" name="l01974"></a><span class="lineno"> 1974</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l01975" name="l01975"></a><span class="lineno"> 1975</span> m_mtime = date;</div>
<div class="line"><a id="l01976" name="l01976"></a><span class="lineno"> 1976</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01977" name="l01977"></a><span class="lineno"> 1977</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a814a080cb6da2041013749cc125bfd2b">set_mtime</a>(date);</div>
<div class="line"><a id="l01978" name="l01978"></a><span class="lineno"> 1978</span> }</div>
</div>
<div class="line"><a id="l01979" name="l01979"></a><span class="lineno"> 1979</span> </div>
<div class="line"><a id="l01980" name="l01980"></a><span class="lineno"> 1980</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l01981" name="l01981"></a><span class="lineno"> 1981</span> <span class="keywordtype">void</span> flush_cache()</div>
<div class="line"><a id="l01982" name="l01982"></a><span class="lineno"> 1982</span> {</div>
<div class="line"><a id="l01983" name="l01983"></a><span class="lineno"> 1983</span> <span class="keywordflow">if</span> (m_cache.status != cache_t::cache_t::status_t::dirty)</div>
<div class="line"><a id="l01984" name="l01984"></a><span class="lineno"> 1984</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01985" name="l01985"></a><span class="lineno"> 1985</span> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_function" href="structstdex_1_1interval.html#a1fa5153f1f7707e21dc41c31197659a4">empty</a>()) {</div>
<div class="line"><a id="l01986" name="l01986"></a><span class="lineno"> 1986</span> write_cache();</div>
<div class="line"><a id="l01987" name="l01987"></a><span class="lineno"> 1987</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>())</div>
<div class="line"><a id="l01988" name="l01988"></a><span class="lineno"> 1988</span> m_cache.status = cache_t::cache_t::status_t::loaded;</div>
<div class="line"><a id="l01989" name="l01989"></a><span class="lineno"> 1989</span> }</div>
<div class="line"><a id="l01990" name="l01990"></a><span class="lineno"> 1990</span> <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l01991" name="l01991"></a><span class="lineno"> 1991</span> m_state = state_t::ok;</div>
<div class="line"><a id="l01992" name="l01992"></a><span class="lineno"> 1992</span> m_cache.status = cache_t::cache_t::status_t::loaded;</div>
<div class="line"><a id="l01993" name="l01993"></a><span class="lineno"> 1993</span> }</div>
<div class="line"><a id="l01994" name="l01994"></a><span class="lineno"> 1994</span> }</div>
<div class="line"><a id="l01995" name="l01995"></a><span class="lineno"> 1995</span> </div>
<div class="line"><a id="l01996" name="l01996"></a><span class="lineno"> 1996</span> <span class="keywordtype">void</span> invalidate_cache()</div>
<div class="line"><a id="l01997" name="l01997"></a><span class="lineno"> 1997</span> {</div>
<div class="line"><a id="l01998" name="l01998"></a><span class="lineno"> 1998</span> <span class="keywordflow">if</span> (m_cache.status == cache_t::cache_t::status_t::dirty &amp;&amp; !m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_function" href="structstdex_1_1interval.html#a1fa5153f1f7707e21dc41c31197659a4">empty</a>()) {</div>
<div class="line"><a id="l01999" name="l01999"></a><span class="lineno"> 1999</span> write_cache();</div>
<div class="line"><a id="l02000" name="l02000"></a><span class="lineno"> 2000</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l02001" name="l02001"></a><span class="lineno"> 2001</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02002" name="l02002"></a><span class="lineno"> 2002</span> } <span class="keywordflow">else</span></div>
<div class="line"><a id="l02003" name="l02003"></a><span class="lineno"> 2003</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02004" name="l02004"></a><span class="lineno"> 2004</span> m_cache.status = cache_t::cache_t::status_t::empty;</div>
<div class="line"><a id="l02005" name="l02005"></a><span class="lineno"> 2005</span> }</div>
<div class="line"><a id="l02006" name="l02006"></a><span class="lineno"> 2006</span> </div>
<div class="line"><a id="l02007" name="l02007"></a><span class="lineno"> 2007</span> <span class="keywordtype">void</span> load_cache(_In_ fpos_t start)</div>
<div class="line"><a id="l02008" name="l02008"></a><span class="lineno"> 2008</span> {</div>
<div class="line"><a id="l02009" name="l02009"></a><span class="lineno"> 2009</span> assert(m_cache.status != cache_t::cache_t::status_t::dirty);</div>
<div class="line"><a id="l02010" name="l02010"></a><span class="lineno"> 2010</span> start -= start % m_cache.capacity; <span class="comment">// Align to cache block size.</span></div>
<div class="line"><a id="l02011" name="l02011"></a><span class="lineno"> 2011</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">start</a> = start);</div>
<div class="line"><a id="l02012" name="l02012"></a><span class="lineno"> 2012</span> <span class="keywordflow">if</span> (m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) {</div>
<div class="line"><a id="l02013" name="l02013"></a><span class="lineno"> 2013</span> m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">end</a> = start + m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">read</a>(m_cache.data, m_cache.capacity);</div>
<div class="line"><a id="l02014" name="l02014"></a><span class="lineno"> 2014</span> m_cache.status = cache_t::cache_t::status_t::loaded;</div>
<div class="line"><a id="l02015" name="l02015"></a><span class="lineno"> 2015</span> m_state = state_t::ok; <span class="comment">// Regardless the read failure, we still might have cached some data.</span></div>
<div class="line"><a id="l02016" name="l02016"></a><span class="lineno"> 2016</span> }</div>
<div class="line"><a id="l02017" name="l02017"></a><span class="lineno"> 2017</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l02018" name="l02018"></a><span class="lineno"> 2018</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02019" name="l02019"></a><span class="lineno"> 2019</span> }</div>
<div class="line"><a id="l02020" name="l02020"></a><span class="lineno"> 2020</span> </div>
<div class="line"><a id="l02021" name="l02021"></a><span class="lineno"> 2021</span> <span class="keywordtype">void</span> write_cache()</div>
<div class="line"><a id="l02022" name="l02022"></a><span class="lineno"> 2022</span> {</div>
<div class="line"><a id="l02023" name="l02023"></a><span class="lineno"> 2023</span> assert(m_cache.status == cache_t::cache_t::status_t::dirty);</div>
<div class="line"><a id="l02024" name="l02024"></a><span class="lineno"> 2024</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">seek</a>(m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_variable" href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">start</a>);</div>
<div class="line"><a id="l02025" name="l02025"></a><span class="lineno"> 2025</span> m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">write</a>(m_cache.data, <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(m_cache.<a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>.<a class="code hl_function" href="structstdex_1_1interval.html#a8c5222bc73fc66ba78bfabc1b985c864">size</a>()));</div>
<div class="line"><a id="l02026" name="l02026"></a><span class="lineno"> 2026</span> m_state = m_source-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>();</div>
<div class="line"><a id="l02027" name="l02027"></a><span class="lineno"> 2027</span> }</div>
<div class="line"><a id="l02028" name="l02028"></a><span class="lineno"> 2028</span> </div>
<div class="line"><a id="l02029" name="l02029"></a><span class="lineno"> 2029</span> basic_file* m_source;</div>
<div class="foldopen" id="foldopen02030" data-start="{" data-end="};">
<div class="line"><a id="l02030" name="l02030"></a><span class="lineno"><a class="line" href="structstdex_1_1stream_1_1cache_1_1cache__t.html"> 2030</a></span> <span class="keyword">struct </span><a class="code hl_struct" href="structstdex_1_1stream_1_1cache_1_1cache__t.html">cache_t</a> {</div>
<div class="line"><a id="l02031" name="l02031"></a><span class="lineno"> 2031</span> uint8_t* data;</div>
<div class="line"><a id="l02032" name="l02032"></a><span class="lineno"> 2032</span> <span class="keywordtype">size_t</span> capacity;</div>
<div class="line"><a id="l02033" name="l02033"></a><span class="lineno"> 2033</span> <span class="keyword">enum class</span> status_t {</div>
<div class="line"><a id="l02034" name="l02034"></a><span class="lineno"> 2034</span> empty = 0,</div>
<div class="line"><a id="l02035" name="l02035"></a><span class="lineno"> 2035</span> loaded,</div>
<div class="line"><a id="l02036" name="l02036"></a><span class="lineno"> 2036</span> dirty,</div>
<div class="line"><a id="l02037" name="l02037"></a><span class="lineno"> 2037</span> } status;</div>
<div class="line"><a id="l02038" name="l02038"></a><span class="lineno"><a class="line" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db"> 2038</a></span> <a class="code hl_struct" href="structstdex_1_1interval.html">interval&lt;fpos_t&gt;</a> <a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>; </div>
<div class="line"><a id="l02039" name="l02039"></a><span class="lineno"> 2039</span> </div>
<div class="line"><a id="l02040" name="l02040"></a><span class="lineno"> 2040</span> <a class="code hl_struct" href="structstdex_1_1stream_1_1cache_1_1cache__t.html">cache_t</a>(_In_ <span class="keywordtype">size_t</span> _capacity) :</div>
<div class="line"><a id="l02041" name="l02041"></a><span class="lineno"> 2041</span> data(new uint8_t[_capacity]),</div>
<div class="line"><a id="l02042" name="l02042"></a><span class="lineno"> 2042</span> capacity(_capacity),</div>
<div class="line"><a id="l02043" name="l02043"></a><span class="lineno"> 2043</span> status(status_t::empty),</div>
<div class="line"><a id="l02044" name="l02044"></a><span class="lineno"> 2044</span> <a class="code hl_variable" href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">region</a>(0)</div>
<div class="line"><a id="l02045" name="l02045"></a><span class="lineno"> 2045</span> {}</div>
<div class="line"><a id="l02046" name="l02046"></a><span class="lineno"> 2046</span> </div>
<div class="line"><a id="l02047" name="l02047"></a><span class="lineno"> 2047</span> <a class="code hl_struct" href="structstdex_1_1stream_1_1cache_1_1cache__t.html">~cache_t</a>()</div>
<div class="line"><a id="l02048" name="l02048"></a><span class="lineno"> 2048</span> {</div>
<div class="line"><a id="l02049" name="l02049"></a><span class="lineno"> 2049</span> <span class="keyword">delete</span>[] data;</div>
<div class="line"><a id="l02050" name="l02050"></a><span class="lineno"> 2050</span> }</div>
<div class="line"><a id="l02051" name="l02051"></a><span class="lineno"> 2051</span> } m_cache;</div>
</div>
<div class="line"><a id="l02052" name="l02052"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640"> 2052</a></span> fpos_t <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a>; </div>
<div class="line"><a id="l02053" name="l02053"></a><span class="lineno"> 2053</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l02054" name="l02054"></a><span class="lineno"> 2054</span> time_point</div>
<div class="line"><a id="l02055" name="l02055"></a><span class="lineno"> 2055</span> m_atime,</div>
<div class="line"><a id="l02056" name="l02056"></a><span class="lineno"> 2056</span> m_mtime;</div>
<div class="line"><a id="l02057" name="l02057"></a><span class="lineno"> 2057</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02058" name="l02058"></a><span class="lineno"> 2058</span> };</div>
</div>
<div class="line"><a id="l02059" name="l02059"></a><span class="lineno"> 2059</span> </div>
<div class="foldopen" id="foldopen02063" data-start="{" data-end="};">
<div class="line"><a id="l02063" name="l02063"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__sys.html"> 2063</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1basic__sys.html">basic_sys</a> : <span class="keyword">virtual</span> <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>, <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1sys__object.html">sys_object</a></div>
<div class="line"><a id="l02064" name="l02064"></a><span class="lineno"> 2064</span> {</div>
<div class="line"><a id="l02065" name="l02065"></a><span class="lineno"> 2065</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l02066" name="l02066"></a><span class="lineno"> 2066</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic__sys.html">basic_sys</a>(_In_opt_ sys_handle h = invalid_handle, _In_ state_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a> = state_t::ok) :</div>
<div class="line"><a id="l02067" name="l02067"></a><span class="lineno"> 2067</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>),</div>
<div class="line"><a id="l02068" name="l02068"></a><span class="lineno"> 2068</span> <a class="code hl_class" href="classstdex_1_1sys__object.html">sys_object</a>(h)</div>
<div class="line"><a id="l02069" name="l02069"></a><span class="lineno"> 2069</span> {}</div>
<div class="line"><a id="l02070" name="l02070"></a><span class="lineno"> 2070</span> </div>
<div class="foldopen" id="foldopen02071" data-start="{" data-end="}">
<div class="line"><a id="l02071" name="l02071"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__sys.html#ad5daf3c776b615dcfbb0b0891afdb9d0"> 2071</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic__sys.html#ad5daf3c776b615dcfbb0b0891afdb9d0">read</a>(</div>
<div class="line"><a id="l02072" name="l02072"></a><span class="lineno"> 2072</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l02073" name="l02073"></a><span class="lineno"> 2073</span> {</div>
<div class="line"><a id="l02074" name="l02074"></a><span class="lineno"> 2074</span> assert(data || !length);</div>
<div class="line"><a id="l02075" name="l02075"></a><span class="lineno"> 2075</span> <span class="comment">// Windows Server 2003 and Windows XP: Pipe write operations across a network are limited in size per write.</span></div>
<div class="line"><a id="l02076" name="l02076"></a><span class="lineno"> 2076</span> <span class="comment">// The amount varies per platform. For x86 platforms it&#39;s 63.97 MB. For x64 platforms it&#39;s 31.97 MB. For Itanium</span></div>
<div class="line"><a id="l02077" name="l02077"></a><span class="lineno"> 2077</span> <span class="comment">// it&#39;s 63.95 MB. For more information regarding pipes, see the Remarks section.</span></div>
<div class="line"><a id="l02078" name="l02078"></a><span class="lineno"> 2078</span> <span class="keywordtype">size_t</span></div>
<div class="line"><a id="l02079" name="l02079"></a><span class="lineno"> 2079</span><span class="preprocessor">#if defined(_WIN64)</span></div>
<div class="line"><a id="l02080" name="l02080"></a><span class="lineno"> 2080</span> block_size = 0x1F80000;</div>
<div class="line"><a id="l02081" name="l02081"></a><span class="lineno"> 2081</span><span class="preprocessor">#elif defined(_WIN32)</span></div>
<div class="line"><a id="l02082" name="l02082"></a><span class="lineno"> 2082</span> block_size = 0x3f00000;</div>
<div class="line"><a id="l02083" name="l02083"></a><span class="lineno"> 2083</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02084" name="l02084"></a><span class="lineno"> 2084</span> block_size = SSIZE_MAX;</div>
<div class="line"><a id="l02085" name="l02085"></a><span class="lineno"> 2085</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02086" name="l02086"></a><span class="lineno"> 2086</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_read = length;;) {</div>
<div class="line"><a id="l02087" name="l02087"></a><span class="lineno"> 2087</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02088" name="l02088"></a><span class="lineno"> 2088</span> <span class="comment">// ReadFile() might raise exception (e.g. STATUS_FILE_BAD_FORMAT/0xE0000002).</span></div>
<div class="line"><a id="l02089" name="l02089"></a><span class="lineno"> 2089</span> BOOL succeeded;</div>
<div class="line"><a id="l02090" name="l02090"></a><span class="lineno"> 2090</span> DWORD num_read;</div>
<div class="line"><a id="l02091" name="l02091"></a><span class="lineno"> 2091</span> __try { succeeded = ReadFile(m_h, data, <span class="keyword">static_cast&lt;</span>DWORD<span class="keyword">&gt;</span>(std::min&lt;size_t&gt;(to_read, block_size)), &amp;num_read, <span class="keyword">nullptr</span>); }</div>
<div class="line"><a id="l02092" name="l02092"></a><span class="lineno"> 2092</span> __except (EXCEPTION_EXECUTE_HANDLER) { succeeded = FALSE; SetLastError(ERROR_UNHANDLED_EXCEPTION); num_read = 0; }</div>
<div class="line"><a id="l02093" name="l02093"></a><span class="lineno"> 2093</span> <span class="keywordflow">if</span> (!succeeded &amp;&amp; GetLastError() == ERROR_NO_SYSTEM_RESOURCES &amp;&amp; block_size &gt; default_block_size) _Unlikely_ {</div>
<div class="line"><a id="l02094" name="l02094"></a><span class="lineno"> 2094</span> <span class="comment">// Error &quot;Insufficient system resources exist to complete the requested service.&quot; occurs</span></div>
<div class="line"><a id="l02095" name="l02095"></a><span class="lineno"> 2095</span> <span class="comment">// ocasionally, when attempting to read too much data at once (e.g. over \\TSClient).</span></div>
<div class="line"><a id="l02096" name="l02096"></a><span class="lineno"> 2096</span> block_size = default_block_size;</div>
<div class="line"><a id="l02097" name="l02097"></a><span class="lineno"> 2097</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l02098" name="l02098"></a><span class="lineno"> 2098</span> }</div>
<div class="line"><a id="l02099" name="l02099"></a><span class="lineno"> 2099</span> <span class="keywordflow">if</span> (!succeeded) _Unlikely_</div>
<div class="line"><a id="l02100" name="l02100"></a><span class="lineno"> 2100</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02101" name="l02101"></a><span class="lineno"> 2101</span> ssize_t num_read = <a class="code hl_function" href="classstdex_1_1stream_1_1basic__sys.html#ad5daf3c776b615dcfbb0b0891afdb9d0">::read</a>(m_h, data, <span class="keyword">static_cast&lt;</span>ssize_t<span class="keyword">&gt;</span>(std::min&lt;size_t&gt;(to_read, block_size)));</div>
<div class="line"><a id="l02102" name="l02102"></a><span class="lineno"> 2102</span> <span class="keywordflow">if</span> (num_read &lt; 0) _Unlikely_</div>
<div class="line"><a id="l02103" name="l02103"></a><span class="lineno"> 2103</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02104" name="l02104"></a><span class="lineno"> 2104</span> {</div>
<div class="line"><a id="l02105" name="l02105"></a><span class="lineno"> 2105</span> m_state = to_read &lt; length ? state_t::ok : state_t::fail;</div>
<div class="line"><a id="l02106" name="l02106"></a><span class="lineno"> 2106</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l02107" name="l02107"></a><span class="lineno"> 2107</span> }</div>
<div class="line"><a id="l02108" name="l02108"></a><span class="lineno"> 2108</span> <span class="keywordflow">if</span> (!num_read) _Unlikely_ {</div>
<div class="line"><a id="l02109" name="l02109"></a><span class="lineno"> 2109</span> m_state = to_read &lt; length || !length ? state_t::ok : state_t::eof;</div>
<div class="line"><a id="l02110" name="l02110"></a><span class="lineno"> 2110</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l02111" name="l02111"></a><span class="lineno"> 2111</span> }</div>
<div class="line"><a id="l02112" name="l02112"></a><span class="lineno"> 2112</span> to_read -= num_read;</div>
<div class="line"><a id="l02113" name="l02113"></a><span class="lineno"> 2113</span> <span class="keywordflow">if</span> (!to_read) {</div>
<div class="line"><a id="l02114" name="l02114"></a><span class="lineno"> 2114</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02115" name="l02115"></a><span class="lineno"> 2115</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l02116" name="l02116"></a><span class="lineno"> 2116</span> }</div>
<div class="line"><a id="l02117" name="l02117"></a><span class="lineno"> 2117</span> <span class="keyword">reinterpret_cast&lt;</span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += num_read;</div>
<div class="line"><a id="l02118" name="l02118"></a><span class="lineno"> 2118</span> }</div>
<div class="line"><a id="l02119" name="l02119"></a><span class="lineno"> 2119</span> }</div>
</div>
<div class="line"><a id="l02120" name="l02120"></a><span class="lineno"> 2120</span> </div>
<div class="foldopen" id="foldopen02121" data-start="{" data-end="}">
<div class="line"><a id="l02121" name="l02121"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__sys.html#a06666e09bf1e7486d277996267b51618"> 2121</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic__sys.html#a06666e09bf1e7486d277996267b51618">write</a>(</div>
<div class="line"><a id="l02122" name="l02122"></a><span class="lineno"> 2122</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l02123" name="l02123"></a><span class="lineno"> 2123</span> {</div>
<div class="line"><a id="l02124" name="l02124"></a><span class="lineno"> 2124</span> <span class="comment">// Windows Server 2003 and Windows XP: Pipe write operations across a network are limited in size per write.</span></div>
<div class="line"><a id="l02125" name="l02125"></a><span class="lineno"> 2125</span> <span class="comment">// The amount varies per platform. For x86 platforms it&#39;s 63.97 MB. For x64 platforms it&#39;s 31.97 MB. For Itanium</span></div>
<div class="line"><a id="l02126" name="l02126"></a><span class="lineno"> 2126</span> <span class="comment">// it&#39;s 63.95 MB. For more information regarding pipes, see the Remarks section.</span></div>
<div class="line"><a id="l02127" name="l02127"></a><span class="lineno"> 2127</span> <span class="keyword">constexpr</span> <span class="keywordtype">size_t</span></div>
<div class="line"><a id="l02128" name="l02128"></a><span class="lineno"> 2128</span><span class="preprocessor">#if defined(_WIN64)</span></div>
<div class="line"><a id="l02129" name="l02129"></a><span class="lineno"> 2129</span> block_size = 0x1F80000;</div>
<div class="line"><a id="l02130" name="l02130"></a><span class="lineno"> 2130</span><span class="preprocessor">#elif defined(_WIN32)</span></div>
<div class="line"><a id="l02131" name="l02131"></a><span class="lineno"> 2131</span> block_size = 0x3f00000;</div>
<div class="line"><a id="l02132" name="l02132"></a><span class="lineno"> 2132</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02133" name="l02133"></a><span class="lineno"> 2133</span> block_size = SSIZE_MAX;</div>
<div class="line"><a id="l02134" name="l02134"></a><span class="lineno"> 2134</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02135" name="l02135"></a><span class="lineno"> 2135</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_write = length;;) {</div>
<div class="line"><a id="l02136" name="l02136"></a><span class="lineno"> 2136</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02137" name="l02137"></a><span class="lineno"> 2137</span> <span class="comment">// ReadFile() might raise an exception. Be cautious with WriteFile() too.</span></div>
<div class="line"><a id="l02138" name="l02138"></a><span class="lineno"> 2138</span> BOOL succeeded;</div>
<div class="line"><a id="l02139" name="l02139"></a><span class="lineno"> 2139</span> DWORD num_written;</div>
<div class="line"><a id="l02140" name="l02140"></a><span class="lineno"> 2140</span> __try { succeeded = WriteFile(m_h, data, <span class="keyword">static_cast&lt;</span>DWORD<span class="keyword">&gt;</span>(std::min&lt;size_t&gt;(to_write, block_size)), &amp;num_written, <span class="keyword">nullptr</span>); }</div>
<div class="line"><a id="l02141" name="l02141"></a><span class="lineno"> 2141</span> __except (EXCEPTION_EXECUTE_HANDLER) { succeeded = FALSE; SetLastError(ERROR_UNHANDLED_EXCEPTION); num_written = 0; }</div>
<div class="line"><a id="l02142" name="l02142"></a><span class="lineno"> 2142</span> to_write -= num_written;</div>
<div class="line"><a id="l02143" name="l02143"></a><span class="lineno"> 2143</span> <span class="keywordflow">if</span> (!to_write) {</div>
<div class="line"><a id="l02144" name="l02144"></a><span class="lineno"> 2144</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02145" name="l02145"></a><span class="lineno"> 2145</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l02146" name="l02146"></a><span class="lineno"> 2146</span> }</div>
<div class="line"><a id="l02147" name="l02147"></a><span class="lineno"> 2147</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += num_written;</div>
<div class="line"><a id="l02148" name="l02148"></a><span class="lineno"> 2148</span> <span class="keywordflow">if</span> (!succeeded) _Unlikely_ {</div>
<div class="line"><a id="l02149" name="l02149"></a><span class="lineno"> 2149</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02150" name="l02150"></a><span class="lineno"> 2150</span> <span class="keywordflow">return</span> length - to_write;</div>
<div class="line"><a id="l02151" name="l02151"></a><span class="lineno"> 2151</span> }</div>
<div class="line"><a id="l02152" name="l02152"></a><span class="lineno"> 2152</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02153" name="l02153"></a><span class="lineno"> 2153</span> ssize_t num_written = <a class="code hl_function" href="classstdex_1_1stream_1_1basic__sys.html#a06666e09bf1e7486d277996267b51618">::write</a>(m_h, data, <span class="keyword">static_cast&lt;</span>ssize_t<span class="keyword">&gt;</span>(std::min&lt;size_t&gt;(to_write, block_size)));</div>
<div class="line"><a id="l02154" name="l02154"></a><span class="lineno"> 2154</span> <span class="keywordflow">if</span> (num_written &lt; 0) _Unlikely_ {</div>
<div class="line"><a id="l02155" name="l02155"></a><span class="lineno"> 2155</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02156" name="l02156"></a><span class="lineno"> 2156</span> <span class="keywordflow">return</span> length - to_write;</div>
<div class="line"><a id="l02157" name="l02157"></a><span class="lineno"> 2157</span> }</div>
<div class="line"><a id="l02158" name="l02158"></a><span class="lineno"> 2158</span> to_write -= num_written;</div>
<div class="line"><a id="l02159" name="l02159"></a><span class="lineno"> 2159</span> <span class="keywordflow">if</span> (!to_write) {</div>
<div class="line"><a id="l02160" name="l02160"></a><span class="lineno"> 2160</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02161" name="l02161"></a><span class="lineno"> 2161</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l02162" name="l02162"></a><span class="lineno"> 2162</span> }</div>
<div class="line"><a id="l02163" name="l02163"></a><span class="lineno"> 2163</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += num_written;</div>
<div class="line"><a id="l02164" name="l02164"></a><span class="lineno"> 2164</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02165" name="l02165"></a><span class="lineno"> 2165</span> }</div>
<div class="line"><a id="l02166" name="l02166"></a><span class="lineno"> 2166</span> }</div>
</div>
<div class="line"><a id="l02167" name="l02167"></a><span class="lineno"> 2167</span> </div>
<div class="foldopen" id="foldopen02168" data-start="{" data-end="}">
<div class="line"><a id="l02168" name="l02168"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__sys.html#aee56fbeb8b576a4337cb205ae865fafc"> 2168</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__sys.html#aee56fbeb8b576a4337cb205ae865fafc">close</a>()</div>
<div class="line"><a id="l02169" name="l02169"></a><span class="lineno"> 2169</span> {</div>
<div class="line"><a id="l02170" name="l02170"></a><span class="lineno"> 2170</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l02171" name="l02171"></a><span class="lineno"> 2171</span> <a class="code hl_function" href="classstdex_1_1sys__object.html#ab8c0119bc4958f78f51ef2f3b7c91f66">sys_object::close</a>();</div>
<div class="line"><a id="l02172" name="l02172"></a><span class="lineno"> 2172</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02173" name="l02173"></a><span class="lineno"> 2173</span> }</div>
<div class="line"><a id="l02174" name="l02174"></a><span class="lineno"> 2174</span> <span class="keywordflow">catch</span> (...) {</div>
<div class="line"><a id="l02175" name="l02175"></a><span class="lineno"> 2175</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02176" name="l02176"></a><span class="lineno"> 2176</span> }</div>
<div class="line"><a id="l02177" name="l02177"></a><span class="lineno"> 2177</span> }</div>
</div>
<div class="line"><a id="l02178" name="l02178"></a><span class="lineno"> 2178</span> </div>
<div class="foldopen" id="foldopen02179" data-start="{" data-end="}">
<div class="line"><a id="l02179" name="l02179"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1basic__sys.html#a6eae9769feea69fa9ce8b127ca2f7891"> 2179</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__sys.html#a6eae9769feea69fa9ce8b127ca2f7891">flush</a>()</div>
<div class="line"><a id="l02180" name="l02180"></a><span class="lineno"> 2180</span> {</div>
<div class="line"><a id="l02181" name="l02181"></a><span class="lineno"> 2181</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02182" name="l02182"></a><span class="lineno"> 2182</span> m_state = FlushFileBuffers(m_h) ? state_t::ok : state_t::fail;</div>
<div class="line"><a id="l02183" name="l02183"></a><span class="lineno"> 2183</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02184" name="l02184"></a><span class="lineno"> 2184</span> m_state = fsync(m_h) &gt;= 0 ? state_t::ok : state_t::fail;</div>
<div class="line"><a id="l02185" name="l02185"></a><span class="lineno"> 2185</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02186" name="l02186"></a><span class="lineno"> 2186</span> }</div>
</div>
<div class="line"><a id="l02187" name="l02187"></a><span class="lineno"> 2187</span> };</div>
</div>
<div class="line"><a id="l02188" name="l02188"></a><span class="lineno"> 2188</span> </div>
<div class="foldopen" id="foldopen02192" data-start="{" data-end="};">
<div class="line"><a id="l02192" name="l02192"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1buffered__sys.html"> 2192</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1buffered__sys.html">buffered_sys</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1buffer.html">buffer</a></div>
<div class="line"><a id="l02193" name="l02193"></a><span class="lineno"> 2193</span> {</div>
<div class="line"><a id="l02194" name="l02194"></a><span class="lineno"> 2194</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l02195" name="l02195"></a><span class="lineno"> 2195</span> <a class="code hl_class" href="classstdex_1_1stream_1_1buffered__sys.html">buffered_sys</a>(_In_opt_ sys_handle h = invalid_handle, <span class="keywordtype">size_t</span> read_buffer_size = default_buffer_size, <span class="keywordtype">size_t</span> write_buffer_size = default_buffer_size) :</div>
<div class="line"><a id="l02196" name="l02196"></a><span class="lineno"> 2196</span> <a class="code hl_class" href="classstdex_1_1stream_1_1buffer.html">buffer</a>(read_buffer_size, write_buffer_size),</div>
<div class="line"><a id="l02197" name="l02197"></a><span class="lineno"> 2197</span> m_source(h)</div>
<div class="line"><a id="l02198" name="l02198"></a><span class="lineno"> 2198</span> {</div>
<div class="line"><a id="l02199" name="l02199"></a><span class="lineno"> 2199</span> init(m_source);</div>
<div class="line"><a id="l02200" name="l02200"></a><span class="lineno"> 2200</span> }</div>
<div class="line"><a id="l02201" name="l02201"></a><span class="lineno"> 2201</span> </div>
<div class="line"><a id="l02202" name="l02202"></a><span class="lineno"> 2202</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classstdex_1_1stream_1_1buffered__sys.html">~buffered_sys</a>()</div>
<div class="line"><a id="l02203" name="l02203"></a><span class="lineno"> 2203</span> {</div>
<div class="line"><a id="l02204" name="l02204"></a><span class="lineno"> 2204</span> done();</div>
<div class="line"><a id="l02205" name="l02205"></a><span class="lineno"> 2205</span> }</div>
<div class="line"><a id="l02206" name="l02206"></a><span class="lineno"> 2206</span> </div>
<div class="line"><a id="l02207" name="l02207"></a><span class="lineno"> 2207</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l02208" name="l02208"></a><span class="lineno"> 2208</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic__sys.html">basic_sys</a> m_source;</div>
<div class="line"><a id="l02209" name="l02209"></a><span class="lineno"> 2209</span> };</div>
</div>
<div class="line"><a id="l02210" name="l02210"></a><span class="lineno"> 2210</span> </div>
<div class="line"><a id="l02211" name="l02211"></a><span class="lineno"> 2211</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02215" name="l02215"></a><span class="lineno"> 2215</span> <span class="keyword">class </span>sequential_stream : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a></div>
<div class="line"><a id="l02216" name="l02216"></a><span class="lineno"> 2216</span> {</div>
<div class="line"><a id="l02217" name="l02217"></a><span class="lineno"> 2217</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l02218" name="l02218"></a><span class="lineno"> 2218</span> sequential_stream(_In_ ISequentialStream* source) : m_source(source)</div>
<div class="line"><a id="l02219" name="l02219"></a><span class="lineno"> 2219</span> {</div>
<div class="line"><a id="l02220" name="l02220"></a><span class="lineno"> 2220</span> m_source-&gt;AddRef();</div>
<div class="line"><a id="l02221" name="l02221"></a><span class="lineno"> 2221</span> }</div>
<div class="line"><a id="l02222" name="l02222"></a><span class="lineno"> 2222</span> </div>
<div class="line"><a id="l02223" name="l02223"></a><span class="lineno"> 2223</span> <span class="keyword">virtual</span> ~sequential_stream()</div>
<div class="line"><a id="l02224" name="l02224"></a><span class="lineno"> 2224</span> {</div>
<div class="line"><a id="l02225" name="l02225"></a><span class="lineno"> 2225</span> m_source-&gt;Release();</div>
<div class="line"><a id="l02226" name="l02226"></a><span class="lineno"> 2226</span> }</div>
<div class="line"><a id="l02227" name="l02227"></a><span class="lineno"> 2227</span> </div>
<div class="line"><a id="l02228" name="l02228"></a><span class="lineno"> 2228</span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t read(</div>
<div class="line"><a id="l02229" name="l02229"></a><span class="lineno"> 2229</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l02230" name="l02230"></a><span class="lineno"> 2230</span> {</div>
<div class="line"><a id="l02231" name="l02231"></a><span class="lineno"> 2231</span> assert(data || !length);</div>
<div class="line"><a id="l02232" name="l02232"></a><span class="lineno"> 2232</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_read = length;;) {</div>
<div class="line"><a id="l02233" name="l02233"></a><span class="lineno"> 2233</span> HRESULT hr;</div>
<div class="line"><a id="l02234" name="l02234"></a><span class="lineno"> 2234</span> ULONG num_read = 0;</div>
<div class="line"><a id="l02235" name="l02235"></a><span class="lineno"> 2235</span> __try { hr = m_source-&gt;Read(data, (ULONG)std::min&lt;size_t&gt;(to_read, ULONG_MAX), &amp;num_read); }</div>
<div class="line"><a id="l02236" name="l02236"></a><span class="lineno"> 2236</span> __except (EXCEPTION_EXECUTE_HANDLER) { hr = E_FAIL; }</div>
<div class="line"><a id="l02237" name="l02237"></a><span class="lineno"> 2237</span> <span class="keywordflow">if</span> (FAILED(hr)) _Unlikely_ {</div>
<div class="line"><a id="l02238" name="l02238"></a><span class="lineno"> 2238</span> m_state = to_read &lt; length ? state_t::ok : state_t::fail;</div>
<div class="line"><a id="l02239" name="l02239"></a><span class="lineno"> 2239</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l02240" name="l02240"></a><span class="lineno"> 2240</span> }</div>
<div class="line"><a id="l02241" name="l02241"></a><span class="lineno"> 2241</span> to_read -= num_read;</div>
<div class="line"><a id="l02242" name="l02242"></a><span class="lineno"> 2242</span> <span class="keywordflow">if</span> (hr == S_FALSE) _Unlikely_ {</div>
<div class="line"><a id="l02243" name="l02243"></a><span class="lineno"> 2243</span> m_state = to_read &lt; length || !length ? state_t::ok : state_t::eof;</div>
<div class="line"><a id="l02244" name="l02244"></a><span class="lineno"> 2244</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l02245" name="l02245"></a><span class="lineno"> 2245</span> }</div>
<div class="line"><a id="l02246" name="l02246"></a><span class="lineno"> 2246</span> <span class="keywordflow">if</span> (!to_read) {</div>
<div class="line"><a id="l02247" name="l02247"></a><span class="lineno"> 2247</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02248" name="l02248"></a><span class="lineno"> 2248</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l02249" name="l02249"></a><span class="lineno"> 2249</span> }</div>
<div class="line"><a id="l02250" name="l02250"></a><span class="lineno"> 2250</span> <span class="keyword">reinterpret_cast&lt;</span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += num_read;</div>
<div class="line"><a id="l02251" name="l02251"></a><span class="lineno"> 2251</span> }</div>
<div class="line"><a id="l02252" name="l02252"></a><span class="lineno"> 2252</span> }</div>
<div class="line"><a id="l02253" name="l02253"></a><span class="lineno"> 2253</span> </div>
<div class="line"><a id="l02254" name="l02254"></a><span class="lineno"> 2254</span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t write(</div>
<div class="line"><a id="l02255" name="l02255"></a><span class="lineno"> 2255</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l02256" name="l02256"></a><span class="lineno"> 2256</span> {</div>
<div class="line"><a id="l02257" name="l02257"></a><span class="lineno"> 2257</span> assert(data || !length);</div>
<div class="line"><a id="l02258" name="l02258"></a><span class="lineno"> 2258</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_write = length;;) {</div>
<div class="line"><a id="l02259" name="l02259"></a><span class="lineno"> 2259</span> HRESULT hr;</div>
<div class="line"><a id="l02260" name="l02260"></a><span class="lineno"> 2260</span> ULONG num_written = 0;</div>
<div class="line"><a id="l02261" name="l02261"></a><span class="lineno"> 2261</span> __try { hr = m_source-&gt;Write(data, <span class="keyword">static_cast&lt;</span>ULONG<span class="keyword">&gt;</span>(std::min&lt;size_t&gt;(to_write, ULONG_MAX)), &amp;num_written); }</div>
<div class="line"><a id="l02262" name="l02262"></a><span class="lineno"> 2262</span> __except (EXCEPTION_EXECUTE_HANDLER) { hr = E_FAIL; }</div>
<div class="line"><a id="l02263" name="l02263"></a><span class="lineno"> 2263</span> <span class="comment">// In abscence of documentation whether num_written gets set when FAILED(hr) (i.e. partially succesful writes),</span></div>
<div class="line"><a id="l02264" name="l02264"></a><span class="lineno"> 2264</span> <span class="comment">// assume write failed completely.</span></div>
<div class="line"><a id="l02265" name="l02265"></a><span class="lineno"> 2265</span> <span class="keywordflow">if</span> (FAILED(hr)) _Unlikely_ {</div>
<div class="line"><a id="l02266" name="l02266"></a><span class="lineno"> 2266</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02267" name="l02267"></a><span class="lineno"> 2267</span> <span class="keywordflow">return</span> length - to_write;</div>
<div class="line"><a id="l02268" name="l02268"></a><span class="lineno"> 2268</span> }</div>
<div class="line"><a id="l02269" name="l02269"></a><span class="lineno"> 2269</span> to_write -= num_written;</div>
<div class="line"><a id="l02270" name="l02270"></a><span class="lineno"> 2270</span> <span class="keywordflow">if</span> (!to_write) {</div>
<div class="line"><a id="l02271" name="l02271"></a><span class="lineno"> 2271</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02272" name="l02272"></a><span class="lineno"> 2272</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l02273" name="l02273"></a><span class="lineno"> 2273</span> }</div>
<div class="line"><a id="l02274" name="l02274"></a><span class="lineno"> 2274</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += num_written;</div>
<div class="line"><a id="l02275" name="l02275"></a><span class="lineno"> 2275</span> }</div>
<div class="line"><a id="l02276" name="l02276"></a><span class="lineno"> 2276</span> }</div>
<div class="line"><a id="l02277" name="l02277"></a><span class="lineno"> 2277</span> </div>
<div class="line"><a id="l02278" name="l02278"></a><span class="lineno"> 2278</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l02279" name="l02279"></a><span class="lineno"> 2279</span> ISequentialStream* m_source;</div>
<div class="line"><a id="l02280" name="l02280"></a><span class="lineno"> 2280</span> };</div>
<div class="line"><a id="l02281" name="l02281"></a><span class="lineno"> 2281</span> </div>
<div class="line"><a id="l02285" name="l02285"></a><span class="lineno"> 2285</span> <span class="keyword">class </span>asp : <span class="keyword">public</span> basic</div>
<div class="line"><a id="l02286" name="l02286"></a><span class="lineno"> 2286</span> {</div>
<div class="line"><a id="l02287" name="l02287"></a><span class="lineno"> 2287</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l02288" name="l02288"></a><span class="lineno"> 2288</span> asp(_In_opt_ IRequest* request, _In_opt_ IResponse* response) :</div>
<div class="line"><a id="l02289" name="l02289"></a><span class="lineno"> 2289</span> m_request(request),</div>
<div class="line"><a id="l02290" name="l02290"></a><span class="lineno"> 2290</span> m_response(response)</div>
<div class="line"><a id="l02291" name="l02291"></a><span class="lineno"> 2291</span> {</div>
<div class="line"><a id="l02292" name="l02292"></a><span class="lineno"> 2292</span> <span class="keywordflow">if</span> (m_request)</div>
<div class="line"><a id="l02293" name="l02293"></a><span class="lineno"> 2293</span> m_request-&gt;AddRef();</div>
<div class="line"><a id="l02294" name="l02294"></a><span class="lineno"> 2294</span> <span class="keywordflow">if</span> (m_response)</div>
<div class="line"><a id="l02295" name="l02295"></a><span class="lineno"> 2295</span> m_response-&gt;AddRef();</div>
<div class="line"><a id="l02296" name="l02296"></a><span class="lineno"> 2296</span> }</div>
<div class="line"><a id="l02297" name="l02297"></a><span class="lineno"> 2297</span> </div>
<div class="line"><a id="l02298" name="l02298"></a><span class="lineno"> 2298</span> <span class="keyword">virtual</span> ~asp()</div>
<div class="line"><a id="l02299" name="l02299"></a><span class="lineno"> 2299</span> {</div>
<div class="line"><a id="l02300" name="l02300"></a><span class="lineno"> 2300</span> <span class="keywordflow">if</span> (m_request)</div>
<div class="line"><a id="l02301" name="l02301"></a><span class="lineno"> 2301</span> m_request-&gt;Release();</div>
<div class="line"><a id="l02302" name="l02302"></a><span class="lineno"> 2302</span> <span class="keywordflow">if</span> (m_response)</div>
<div class="line"><a id="l02303" name="l02303"></a><span class="lineno"> 2303</span> m_response-&gt;Release();</div>
<div class="line"><a id="l02304" name="l02304"></a><span class="lineno"> 2304</span> }</div>
<div class="line"><a id="l02305" name="l02305"></a><span class="lineno"> 2305</span> </div>
<div class="line"><a id="l02306" name="l02306"></a><span class="lineno"> 2306</span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t read(</div>
<div class="line"><a id="l02307" name="l02307"></a><span class="lineno"> 2307</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l02308" name="l02308"></a><span class="lineno"> 2308</span> {</div>
<div class="line"><a id="l02309" name="l02309"></a><span class="lineno"> 2309</span> assert(data || !length);</div>
<div class="line"><a id="l02310" name="l02310"></a><span class="lineno"> 2310</span> <span class="keywordflow">if</span> (!m_request) _Unlikely_ {</div>
<div class="line"><a id="l02311" name="l02311"></a><span class="lineno"> 2311</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02312" name="l02312"></a><span class="lineno"> 2312</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l02313" name="l02313"></a><span class="lineno"> 2313</span> }</div>
<div class="line"><a id="l02314" name="l02314"></a><span class="lineno"> 2314</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_read = length;;) {</div>
<div class="line"><a id="l02315" name="l02315"></a><span class="lineno"> 2315</span> VARIANT var_amount, var_data;</div>
<div class="line"><a id="l02316" name="l02316"></a><span class="lineno"> 2316</span> V_VT(&amp;var_amount) = VT_I4;</div>
<div class="line"><a id="l02317" name="l02317"></a><span class="lineno"> 2317</span> V_I4(&amp;var_amount) = (LONG)std::min&lt;size_t&gt;(to_read, LONG_MAX);</div>
<div class="line"><a id="l02318" name="l02318"></a><span class="lineno"> 2318</span> V_VT(&amp;var_data) = VT_EMPTY;</div>
<div class="line"><a id="l02319" name="l02319"></a><span class="lineno"> 2319</span> HRESULT hr = [&amp;]() {</div>
<div class="line"><a id="l02320" name="l02320"></a><span class="lineno"> 2320</span> __try { <span class="keywordflow">return</span> m_request-&gt;BinaryRead(&amp;var_amount, &amp;var_data); }</div>
<div class="line"><a id="l02321" name="l02321"></a><span class="lineno"> 2321</span> __except (EXCEPTION_EXECUTE_HANDLER) { <span class="keywordflow">return</span> E_FAIL; }</div>
<div class="line"><a id="l02322" name="l02322"></a><span class="lineno"> 2322</span> }();</div>
<div class="line"><a id="l02323" name="l02323"></a><span class="lineno"> 2323</span> <span class="keywordflow">if</span> (FAILED(hr)) _Unlikely_ {</div>
<div class="line"><a id="l02324" name="l02324"></a><span class="lineno"> 2324</span> m_state = to_read &lt; length ? state_t::ok : state_t::fail;</div>
<div class="line"><a id="l02325" name="l02325"></a><span class="lineno"> 2325</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l02326" name="l02326"></a><span class="lineno"> 2326</span> }</div>
<div class="line"><a id="l02327" name="l02327"></a><span class="lineno"> 2327</span> assert(V_VT(&amp;var_amount) == VT_I4);</div>
<div class="line"><a id="l02328" name="l02328"></a><span class="lineno"> 2328</span> assert(V_VT(&amp;var_data) == (VT_ARRAY | VT_UI1));</div>
<div class="line"><a id="l02329" name="l02329"></a><span class="lineno"> 2329</span> std::unique_ptr&lt;SAFEARRAY, SafeArrayDestroy_delete&gt; sa(V_ARRAY(&amp;var_data));</div>
<div class="line"><a id="l02330" name="l02330"></a><span class="lineno"> 2330</span> <span class="keywordflow">if</span> (!V_I4(&amp;var_amount)) _Unlikely_ {</div>
<div class="line"><a id="l02331" name="l02331"></a><span class="lineno"> 2331</span> m_state = to_read &lt; length || !length ? state_t::ok : state_t::eof;</div>
<div class="line"><a id="l02332" name="l02332"></a><span class="lineno"> 2332</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l02333" name="l02333"></a><span class="lineno"> 2333</span> }</div>
<div class="line"><a id="l02334" name="l02334"></a><span class="lineno"> 2334</span> safearray_accessor&lt;uint8_t&gt; a(sa.get());</div>
<div class="line"><a id="l02335" name="l02335"></a><span class="lineno"> 2335</span> memcpy(data, a.data(), V_I4(&amp;var_amount));</div>
<div class="line"><a id="l02336" name="l02336"></a><span class="lineno"> 2336</span> to_read -= V_I4(&amp;var_amount);</div>
<div class="line"><a id="l02337" name="l02337"></a><span class="lineno"> 2337</span> <span class="keywordflow">if</span> (!to_read) {</div>
<div class="line"><a id="l02338" name="l02338"></a><span class="lineno"> 2338</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02339" name="l02339"></a><span class="lineno"> 2339</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l02340" name="l02340"></a><span class="lineno"> 2340</span> }</div>
<div class="line"><a id="l02341" name="l02341"></a><span class="lineno"> 2341</span> <span class="keyword">reinterpret_cast&lt;</span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += V_I4(&amp;var_amount);</div>
<div class="line"><a id="l02342" name="l02342"></a><span class="lineno"> 2342</span> }</div>
<div class="line"><a id="l02343" name="l02343"></a><span class="lineno"> 2343</span> }</div>
<div class="line"><a id="l02344" name="l02344"></a><span class="lineno"> 2344</span> </div>
<div class="line"><a id="l02345" name="l02345"></a><span class="lineno"> 2345</span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t write(</div>
<div class="line"><a id="l02346" name="l02346"></a><span class="lineno"> 2346</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l02347" name="l02347"></a><span class="lineno"> 2347</span> {</div>
<div class="line"><a id="l02348" name="l02348"></a><span class="lineno"> 2348</span> <span class="keywordflow">if</span> (!m_response) {</div>
<div class="line"><a id="l02349" name="l02349"></a><span class="lineno"> 2349</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02350" name="l02350"></a><span class="lineno"> 2350</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l02351" name="l02351"></a><span class="lineno"> 2351</span> }</div>
<div class="line"><a id="l02352" name="l02352"></a><span class="lineno"> 2352</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_write = length;;) {</div>
<div class="line"><a id="l02353" name="l02353"></a><span class="lineno"> 2353</span> UINT num_written = <span class="keyword">static_cast&lt;</span>UINT<span class="keyword">&gt;</span>(std::min&lt;size_t&gt;(to_write, UINT_MAX));</div>
<div class="line"><a id="l02354" name="l02354"></a><span class="lineno"> 2354</span> std::unique_ptr&lt;OLECHAR, SysFreeString_delete&gt; bstr_data(SysAllocStringByteLen(<span class="keyword">reinterpret_cast&lt;</span>LPCSTR<span class="keyword">&gt;</span>(data), num_written));</div>
<div class="line"><a id="l02355" name="l02355"></a><span class="lineno"> 2355</span> VARIANT var_data;</div>
<div class="line"><a id="l02356" name="l02356"></a><span class="lineno"> 2356</span> V_VT(&amp;var_data) = VT_BSTR;</div>
<div class="line"><a id="l02357" name="l02357"></a><span class="lineno"> 2357</span> V_BSTR(&amp;var_data) = bstr_data.get();</div>
<div class="line"><a id="l02358" name="l02358"></a><span class="lineno"> 2358</span> HRESULT hr = [&amp;]() {</div>
<div class="line"><a id="l02359" name="l02359"></a><span class="lineno"> 2359</span> __try { <span class="keywordflow">return</span> m_response-&gt;BinaryWrite(var_data); }</div>
<div class="line"><a id="l02360" name="l02360"></a><span class="lineno"> 2360</span> __except (EXCEPTION_EXECUTE_HANDLER) { <span class="keywordflow">return</span> E_FAIL; }</div>
<div class="line"><a id="l02361" name="l02361"></a><span class="lineno"> 2361</span> }();</div>
<div class="line"><a id="l02362" name="l02362"></a><span class="lineno"> 2362</span> <span class="keywordflow">if</span> (FAILED(hr)) _Unlikely_ {</div>
<div class="line"><a id="l02363" name="l02363"></a><span class="lineno"> 2363</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02364" name="l02364"></a><span class="lineno"> 2364</span> <span class="keywordflow">return</span> length - to_write;</div>
<div class="line"><a id="l02365" name="l02365"></a><span class="lineno"> 2365</span> }</div>
<div class="line"><a id="l02366" name="l02366"></a><span class="lineno"> 2366</span> to_write -= num_written;</div>
<div class="line"><a id="l02367" name="l02367"></a><span class="lineno"> 2367</span> <span class="keywordflow">if</span> (!to_write) {</div>
<div class="line"><a id="l02368" name="l02368"></a><span class="lineno"> 2368</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02369" name="l02369"></a><span class="lineno"> 2369</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l02370" name="l02370"></a><span class="lineno"> 2370</span> }</div>
<div class="line"><a id="l02371" name="l02371"></a><span class="lineno"> 2371</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += num_written;</div>
<div class="line"><a id="l02372" name="l02372"></a><span class="lineno"> 2372</span> }</div>
<div class="line"><a id="l02373" name="l02373"></a><span class="lineno"> 2373</span> }</div>
<div class="line"><a id="l02374" name="l02374"></a><span class="lineno"> 2374</span> </div>
<div class="line"><a id="l02375" name="l02375"></a><span class="lineno"> 2375</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> close()</div>
<div class="line"><a id="l02376" name="l02376"></a><span class="lineno"> 2376</span> {</div>
<div class="line"><a id="l02377" name="l02377"></a><span class="lineno"> 2377</span> <span class="keywordflow">if</span> (m_response) {</div>
<div class="line"><a id="l02378" name="l02378"></a><span class="lineno"> 2378</span> __try { m_response-&gt;End(); }</div>
<div class="line"><a id="l02379" name="l02379"></a><span class="lineno"> 2379</span> __except (EXCEPTION_EXECUTE_HANDLER) {}</div>
<div class="line"><a id="l02380" name="l02380"></a><span class="lineno"> 2380</span> }</div>
<div class="line"><a id="l02381" name="l02381"></a><span class="lineno"> 2381</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02382" name="l02382"></a><span class="lineno"> 2382</span> }</div>
<div class="line"><a id="l02383" name="l02383"></a><span class="lineno"> 2383</span> </div>
<div class="line"><a id="l02384" name="l02384"></a><span class="lineno"> 2384</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> flush()</div>
<div class="line"><a id="l02385" name="l02385"></a><span class="lineno"> 2385</span> {</div>
<div class="line"><a id="l02386" name="l02386"></a><span class="lineno"> 2386</span> <span class="keywordflow">if</span> (m_response) {</div>
<div class="line"><a id="l02387" name="l02387"></a><span class="lineno"> 2387</span> HRESULT hr;</div>
<div class="line"><a id="l02388" name="l02388"></a><span class="lineno"> 2388</span> __try { hr = m_response-&gt;Flush(); }</div>
<div class="line"><a id="l02389" name="l02389"></a><span class="lineno"> 2389</span> __except (EXCEPTION_EXECUTE_HANDLER) { hr = E_FAIL; }</div>
<div class="line"><a id="l02390" name="l02390"></a><span class="lineno"> 2390</span> m_state = SUCCEEDED(hr) ? state_t::ok : state_t::fail;</div>
<div class="line"><a id="l02391" name="l02391"></a><span class="lineno"> 2391</span> }</div>
<div class="line"><a id="l02392" name="l02392"></a><span class="lineno"> 2392</span> }</div>
<div class="line"><a id="l02393" name="l02393"></a><span class="lineno"> 2393</span> </div>
<div class="line"><a id="l02394" name="l02394"></a><span class="lineno"> 2394</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l02395" name="l02395"></a><span class="lineno"> 2395</span> IRequest* m_request;</div>
<div class="line"><a id="l02396" name="l02396"></a><span class="lineno"> 2396</span> IResponse* m_response;</div>
<div class="line"><a id="l02397" name="l02397"></a><span class="lineno"> 2397</span> };</div>
<div class="line"><a id="l02398" name="l02398"></a><span class="lineno"> 2398</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02399" name="l02399"></a><span class="lineno"> 2399</span> </div>
<div class="line"><a id="l02403" name="l02403"></a><span class="lineno"> 2403</span> <span class="keyword">enum</span> mode_t</div>
<div class="line"><a id="l02404" name="l02404"></a><span class="lineno"> 2404</span> {</div>
<div class="line"><a id="l02405" name="l02405"></a><span class="lineno"> 2405</span> mode_for_reading = 1 &lt;&lt; 0, </div>
<div class="line"><a id="l02406" name="l02406"></a><span class="lineno"> 2406</span> mode_for_writing = 1 &lt;&lt; 1, </div>
<div class="line"><a id="l02407" name="l02407"></a><span class="lineno"> 2407</span> mode_for_chmod = 1 &lt;&lt; 2, </div>
<div class="line"><a id="l02408" name="l02408"></a><span class="lineno"> 2408</span> mode_create = 1 &lt;&lt; 3, </div>
<div class="line"><a id="l02409" name="l02409"></a><span class="lineno"> 2409</span> mode_preserve_existing = mode_create | (1 &lt;&lt; 4), </div>
<div class="line"><a id="l02410" name="l02410"></a><span class="lineno"> 2410</span> mode_append = 1 &lt;&lt; 5, </div>
<div class="line"><a id="l02411" name="l02411"></a><span class="lineno"> 2411</span> mode_text = 0, </div>
<div class="line"><a id="l02412" name="l02412"></a><span class="lineno"> 2412</span> mode_binary = 1 &lt;&lt; 6, </div>
<div class="line"><a id="l02413" name="l02413"></a><span class="lineno"> 2413</span> </div>
<div class="line"><a id="l02414" name="l02414"></a><span class="lineno"> 2414</span> share_none = 0, </div>
<div class="line"><a id="l02415" name="l02415"></a><span class="lineno"> 2415</span> share_reading = 1 &lt;&lt; 7, </div>
<div class="line"><a id="l02416" name="l02416"></a><span class="lineno"> 2416</span> share_writing = 1 &lt;&lt; 8, </div>
<div class="line"><a id="l02417" name="l02417"></a><span class="lineno"> 2417</span> share_deleting = 1 &lt;&lt; 9, </div>
<div class="line"><a id="l02418" name="l02418"></a><span class="lineno"> 2418</span> share_all = share_reading | share_writing | share_deleting, <span class="comment">// Allow others all operations on our file</span></div>
<div class="line"><a id="l02419" name="l02419"></a><span class="lineno"> 2419</span> </div>
<div class="line"><a id="l02420" name="l02420"></a><span class="lineno"> 2420</span> inherit_handle = 1 &lt;&lt; 10, </div>
<div class="line"><a id="l02421" name="l02421"></a><span class="lineno"> 2421</span> </div>
<div class="line"><a id="l02422" name="l02422"></a><span class="lineno"> 2422</span> hint_write_thru = 1 &lt;&lt; 11, </div>
<div class="line"><a id="l02423" name="l02423"></a><span class="lineno"> 2423</span> hint_no_buffering = 1 &lt;&lt; 12, </div>
<div class="line"><a id="l02424" name="l02424"></a><span class="lineno"> 2424</span> hint_random_access = 1 &lt;&lt; 13, </div>
<div class="line"><a id="l02425" name="l02425"></a><span class="lineno"> 2425</span> hint_sequential_access = 1 &lt;&lt; 14, </div>
<div class="line"><a id="l02426" name="l02426"></a><span class="lineno"> 2426</span> };</div>
<div class="line"><a id="l02427" name="l02427"></a><span class="lineno"> 2427</span> </div>
<div class="line"><a id="l02428" name="l02428"></a><span class="lineno"> 2428</span><span class="preprocessor">#pragma warning(push)</span></div>
<div class="line"><a id="l02429" name="l02429"></a><span class="lineno"> 2429</span><span class="preprocessor">#pragma warning(disable: 4250)</span></div>
<div class="foldopen" id="foldopen02433" data-start="{" data-end="};">
<div class="line"><a id="l02433" name="l02433"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html"> 2433</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1file.html">file</a> : <span class="keyword">virtual</span> <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic__file.html">basic_file</a>, <span class="keyword">virtual</span> <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic__sys.html">basic_sys</a></div>
<div class="line"><a id="l02434" name="l02434"></a><span class="lineno"> 2434</span> {</div>
<div class="line"><a id="l02435" name="l02435"></a><span class="lineno"> 2435</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l02436" name="l02436"></a><span class="lineno"> 2436</span> <a class="code hl_class" href="classstdex_1_1stream_1_1file.html">file</a>(_In_opt_ sys_handle h = invalid_handle, _In_ state_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a> = state_t::ok) : <a class="code hl_class" href="classstdex_1_1stream_1_1basic__sys.html">basic_sys</a>(h, <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>) {}</div>
<div class="line"><a id="l02437" name="l02437"></a><span class="lineno"> 2437</span> </div>
<div class="foldopen" id="foldopen02444" data-start="{" data-end="}">
<div class="line"><a id="l02444" name="l02444"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#a31e46e58ec40db989b36c3553b09084f"> 2444</a></span> <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a31e46e58ec40db989b36c3553b09084f">file</a>(_In_z_ <span class="keyword">const</span> schar_t* filename, _In_ <span class="keywordtype">int</span> mode)</div>
<div class="line"><a id="l02445" name="l02445"></a><span class="lineno"> 2445</span> {</div>
<div class="line"><a id="l02446" name="l02446"></a><span class="lineno"> 2446</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a556c4cff7086d5f258dcdf914556084a">open</a>(filename, mode);</div>
<div class="line"><a id="l02447" name="l02447"></a><span class="lineno"> 2447</span> }</div>
</div>
<div class="line"><a id="l02448" name="l02448"></a><span class="lineno"> 2448</span> </div>
<div class="foldopen" id="foldopen02455" data-start="{" data-end="}">
<div class="line"><a id="l02455" name="l02455"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#a556c4cff7086d5f258dcdf914556084a"> 2455</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a556c4cff7086d5f258dcdf914556084a">open</a>(_In_z_ <span class="keyword">const</span> schar_t* filename, _In_ <span class="keywordtype">int</span> mode)</div>
<div class="line"><a id="l02456" name="l02456"></a><span class="lineno"> 2456</span> {</div>
<div class="line"><a id="l02457" name="l02457"></a><span class="lineno"> 2457</span> <span class="keywordflow">if</span> (m_h != invalid_handle)</div>
<div class="line"><a id="l02458" name="l02458"></a><span class="lineno"> 2458</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__sys.html#aee56fbeb8b576a4337cb205ae865fafc">close</a>();</div>
<div class="line"><a id="l02459" name="l02459"></a><span class="lineno"> 2459</span> </div>
<div class="line"><a id="l02460" name="l02460"></a><span class="lineno"> 2460</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02461" name="l02461"></a><span class="lineno"> 2461</span> DWORD dwDesiredAccess = 0;</div>
<div class="line"><a id="l02462" name="l02462"></a><span class="lineno"> 2462</span> <span class="keywordflow">if</span> (mode &amp; mode_for_reading) dwDesiredAccess |= GENERIC_READ;</div>
<div class="line"><a id="l02463" name="l02463"></a><span class="lineno"> 2463</span> <span class="keywordflow">if</span> (mode &amp; mode_for_writing) dwDesiredAccess |= GENERIC_WRITE;</div>
<div class="line"><a id="l02464" name="l02464"></a><span class="lineno"> 2464</span> <span class="keywordflow">if</span> (mode &amp; mode_for_chmod) dwDesiredAccess |= FILE_WRITE_ATTRIBUTES;</div>
<div class="line"><a id="l02465" name="l02465"></a><span class="lineno"> 2465</span> </div>
<div class="line"><a id="l02466" name="l02466"></a><span class="lineno"> 2466</span> DWORD dwShareMode = 0;</div>
<div class="line"><a id="l02467" name="l02467"></a><span class="lineno"> 2467</span> <span class="keywordflow">if</span> (mode &amp; share_reading) dwShareMode |= FILE_SHARE_READ;</div>
<div class="line"><a id="l02468" name="l02468"></a><span class="lineno"> 2468</span> <span class="keywordflow">if</span> (mode &amp; share_writing) dwShareMode |= FILE_SHARE_WRITE;</div>
<div class="line"><a id="l02469" name="l02469"></a><span class="lineno"> 2469</span> <span class="keywordflow">if</span> (mode &amp; share_deleting) dwShareMode |= FILE_SHARE_DELETE;</div>
<div class="line"><a id="l02470" name="l02470"></a><span class="lineno"> 2470</span> </div>
<div class="line"><a id="l02471" name="l02471"></a><span class="lineno"> 2471</span> SECURITY_ATTRIBUTES sa = { <span class="keyword">sizeof</span>(SECURITY_ATTRIBUTES) };</div>
<div class="line"><a id="l02472" name="l02472"></a><span class="lineno"> 2472</span> sa.bInheritHandle = mode &amp; inherit_handle ? true : <span class="keyword">false</span>;</div>
<div class="line"><a id="l02473" name="l02473"></a><span class="lineno"> 2473</span> </div>
<div class="line"><a id="l02474" name="l02474"></a><span class="lineno"> 2474</span> DWORD dwCreationDisposition;</div>
<div class="line"><a id="l02475" name="l02475"></a><span class="lineno"> 2475</span> <span class="keywordflow">switch</span> (mode &amp; mode_preserve_existing) {</div>
<div class="line"><a id="l02476" name="l02476"></a><span class="lineno"> 2476</span> <span class="keywordflow">case</span> mode_create: dwCreationDisposition = CREATE_ALWAYS; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l02477" name="l02477"></a><span class="lineno"> 2477</span> <span class="keywordflow">case</span> mode_preserve_existing: dwCreationDisposition = OPEN_ALWAYS; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l02478" name="l02478"></a><span class="lineno"> 2478</span> <span class="keywordflow">case</span> 0: dwCreationDisposition = OPEN_EXISTING; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l02479" name="l02479"></a><span class="lineno"> 2479</span> <span class="keywordflow">default</span>: <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;invalid mode&quot;</span>);</div>
<div class="line"><a id="l02480" name="l02480"></a><span class="lineno"> 2480</span> }</div>
<div class="line"><a id="l02481" name="l02481"></a><span class="lineno"> 2481</span> </div>
<div class="line"><a id="l02482" name="l02482"></a><span class="lineno"> 2482</span> DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL;</div>
<div class="line"><a id="l02483" name="l02483"></a><span class="lineno"> 2483</span> <span class="keywordflow">if</span> (mode &amp; hint_write_thru) dwFlagsAndAttributes |= FILE_FLAG_WRITE_THROUGH;</div>
<div class="line"><a id="l02484" name="l02484"></a><span class="lineno"> 2484</span> <span class="keywordflow">if</span> (mode &amp; hint_no_buffering) dwFlagsAndAttributes |= FILE_FLAG_NO_BUFFERING;</div>
<div class="line"><a id="l02485" name="l02485"></a><span class="lineno"> 2485</span> <span class="keywordflow">if</span> (mode &amp; hint_random_access) dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS;</div>
<div class="line"><a id="l02486" name="l02486"></a><span class="lineno"> 2486</span> <span class="keywordflow">if</span> (mode &amp; hint_sequential_access) dwFlagsAndAttributes |= FILE_FLAG_SEQUENTIAL_SCAN;</div>
<div class="line"><a id="l02487" name="l02487"></a><span class="lineno"> 2487</span> </div>
<div class="line"><a id="l02488" name="l02488"></a><span class="lineno"> 2488</span> m_h = CreateFile(filename, dwDesiredAccess, dwShareMode, &amp;sa, dwCreationDisposition, dwFlagsAndAttributes, <span class="keyword">nullptr</span>);</div>
<div class="line"><a id="l02489" name="l02489"></a><span class="lineno"> 2489</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02490" name="l02490"></a><span class="lineno"> 2490</span> <span class="keywordtype">int</span> flags = 0;</div>
<div class="line"><a id="l02491" name="l02491"></a><span class="lineno"> 2491</span> <span class="keywordflow">switch</span> (mode &amp; (mode_for_reading | mode_for_writing)) {</div>
<div class="line"><a id="l02492" name="l02492"></a><span class="lineno"> 2492</span> <span class="keywordflow">case</span> mode_for_reading: flags |= O_RDONLY; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l02493" name="l02493"></a><span class="lineno"> 2493</span> <span class="keywordflow">case</span> mode_for_writing: flags |= O_WRONLY; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l02494" name="l02494"></a><span class="lineno"> 2494</span> <span class="keywordflow">case</span> mode_for_reading | mode_for_writing: flags |= O_RDWR; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l02495" name="l02495"></a><span class="lineno"> 2495</span> }</div>
<div class="line"><a id="l02496" name="l02496"></a><span class="lineno"> 2496</span> <span class="keywordflow">if</span> (mode &amp; mode_create) flags |= mode &amp; mode_preserve_existing ? O_CREAT : (O_CREAT | O_EXCL);</div>
<div class="line"><a id="l02497" name="l02497"></a><span class="lineno"> 2497</span> <span class="keywordflow">if</span> (mode &amp; hint_write_thru) flags |= O_DSYNC;</div>
<div class="line"><a id="l02498" name="l02498"></a><span class="lineno"> 2498</span><span class="preprocessor">#ifndef __APPLE__</span></div>
<div class="line"><a id="l02499" name="l02499"></a><span class="lineno"> 2499</span> <span class="keywordflow">if</span> (mode &amp; hint_no_buffering) flags |= O_RSYNC;</div>
<div class="line"><a id="l02500" name="l02500"></a><span class="lineno"> 2500</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02501" name="l02501"></a><span class="lineno"> 2501</span> </div>
<div class="line"><a id="l02502" name="l02502"></a><span class="lineno"> 2502</span> m_h = <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a556c4cff7086d5f258dcdf914556084a">::open</a>(filename, flags, DEFFILEMODE);</div>
<div class="line"><a id="l02503" name="l02503"></a><span class="lineno"> 2503</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02504" name="l02504"></a><span class="lineno"> 2504</span> <span class="keywordflow">if</span> (m_h != invalid_handle) {</div>
<div class="line"><a id="l02505" name="l02505"></a><span class="lineno"> 2505</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02506" name="l02506"></a><span class="lineno"> 2506</span> <span class="keywordflow">if</span> (mode &amp; mode_append)</div>
<div class="line"><a id="l02507" name="l02507"></a><span class="lineno"> 2507</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#acdfc1dc079ebeaeb05312e03925485ff">seek</a>(0, seek_t::end);</div>
<div class="line"><a id="l02508" name="l02508"></a><span class="lineno"> 2508</span> }</div>
<div class="line"><a id="l02509" name="l02509"></a><span class="lineno"> 2509</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l02510" name="l02510"></a><span class="lineno"> 2510</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02511" name="l02511"></a><span class="lineno"> 2511</span> }</div>
</div>
<div class="line"><a id="l02512" name="l02512"></a><span class="lineno"> 2512</span> </div>
<div class="foldopen" id="foldopen02513" data-start="{" data-end="}">
<div class="line"><a id="l02513" name="l02513"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#acdfc1dc079ebeaeb05312e03925485ff"> 2513</a></span> <span class="keyword">virtual</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#acdfc1dc079ebeaeb05312e03925485ff">seek</a>(_In_ foff_t offset, _In_ seek_t how = seek_t::beg)</div>
<div class="line"><a id="l02514" name="l02514"></a><span class="lineno"> 2514</span> {</div>
<div class="line"><a id="l02515" name="l02515"></a><span class="lineno"> 2515</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02516" name="l02516"></a><span class="lineno"> 2516</span> LARGE_INTEGER li;</div>
<div class="line"><a id="l02517" name="l02517"></a><span class="lineno"> 2517</span> li.QuadPart = offset;</div>
<div class="line"><a id="l02518" name="l02518"></a><span class="lineno"> 2518</span> li.LowPart = SetFilePointer(m_h, li.LowPart, &amp;li.HighPart, <span class="keyword">static_cast&lt;</span>DWORD<span class="keyword">&gt;</span>(how));</div>
<div class="line"><a id="l02519" name="l02519"></a><span class="lineno"> 2519</span> <span class="keywordflow">if</span> (li.LowPart != 0xFFFFFFFF || GetLastError() == NO_ERROR) {</div>
<div class="line"><a id="l02520" name="l02520"></a><span class="lineno"> 2520</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02521" name="l02521"></a><span class="lineno"> 2521</span> <span class="keywordflow">return</span> li.QuadPart;</div>
<div class="line"><a id="l02522" name="l02522"></a><span class="lineno"> 2522</span> }</div>
<div class="line"><a id="l02523" name="l02523"></a><span class="lineno"> 2523</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02524" name="l02524"></a><span class="lineno"> 2524</span> off64_t result = lseek64(m_h, offset, <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(how));</div>
<div class="line"><a id="l02525" name="l02525"></a><span class="lineno"> 2525</span> <span class="keywordflow">if</span> (result &gt;= 0) {</div>
<div class="line"><a id="l02526" name="l02526"></a><span class="lineno"> 2526</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02527" name="l02527"></a><span class="lineno"> 2527</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l02528" name="l02528"></a><span class="lineno"> 2528</span> }</div>
<div class="line"><a id="l02529" name="l02529"></a><span class="lineno"> 2529</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02530" name="l02530"></a><span class="lineno"> 2530</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02531" name="l02531"></a><span class="lineno"> 2531</span> <span class="keywordflow">return</span> fpos_max;</div>
<div class="line"><a id="l02532" name="l02532"></a><span class="lineno"> 2532</span> }</div>
</div>
<div class="line"><a id="l02533" name="l02533"></a><span class="lineno"> 2533</span> </div>
<div class="foldopen" id="foldopen02534" data-start="{" data-end="}">
<div class="line"><a id="l02534" name="l02534"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#aead21702bfdb09193a202afbce35421b"> 2534</a></span> <span class="keyword">virtual</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#aead21702bfdb09193a202afbce35421b">tell</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l02535" name="l02535"></a><span class="lineno"> 2535</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l02536" name="l02536"></a><span class="lineno"> 2536</span> <span class="keywordflow">if</span> (m_h != invalid_handle) {</div>
<div class="line"><a id="l02537" name="l02537"></a><span class="lineno"> 2537</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02538" name="l02538"></a><span class="lineno"> 2538</span> LARGE_INTEGER li;</div>
<div class="line"><a id="l02539" name="l02539"></a><span class="lineno"> 2539</span> li.QuadPart = 0;</div>
<div class="line"><a id="l02540" name="l02540"></a><span class="lineno"> 2540</span> li.LowPart = SetFilePointer(m_h, 0, &amp;li.HighPart, FILE_CURRENT);</div>
<div class="line"><a id="l02541" name="l02541"></a><span class="lineno"> 2541</span> <span class="keywordflow">if</span> (li.LowPart != 0xFFFFFFFF || GetLastError() == NO_ERROR)</div>
<div class="line"><a id="l02542" name="l02542"></a><span class="lineno"> 2542</span> <span class="keywordflow">return</span> li.QuadPart;</div>
<div class="line"><a id="l02543" name="l02543"></a><span class="lineno"> 2543</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02544" name="l02544"></a><span class="lineno"> 2544</span> off64_t result = lseek64(m_h, 0, SEEK_CUR);</div>
<div class="line"><a id="l02545" name="l02545"></a><span class="lineno"> 2545</span> <span class="keywordflow">if</span> (result &gt;= 0)</div>
<div class="line"><a id="l02546" name="l02546"></a><span class="lineno"> 2546</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l02547" name="l02547"></a><span class="lineno"> 2547</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02548" name="l02548"></a><span class="lineno"> 2548</span> }</div>
<div class="line"><a id="l02549" name="l02549"></a><span class="lineno"> 2549</span> <span class="keywordflow">return</span> fpos_max;</div>
<div class="line"><a id="l02550" name="l02550"></a><span class="lineno"> 2550</span> }</div>
</div>
<div class="line"><a id="l02551" name="l02551"></a><span class="lineno"> 2551</span> </div>
<div class="foldopen" id="foldopen02552" data-start="{" data-end="}">
<div class="line"><a id="l02552" name="l02552"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#a74fdb70cb8ce4d0ee73f6db9d7051d86"> 2552</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a74fdb70cb8ce4d0ee73f6db9d7051d86">lock</a>(_In_ fpos_t offset, _In_ fsize_t length)</div>
<div class="line"><a id="l02553" name="l02553"></a><span class="lineno"> 2553</span> {</div>
<div class="line"><a id="l02554" name="l02554"></a><span class="lineno"> 2554</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02555" name="l02555"></a><span class="lineno"> 2555</span> LARGE_INTEGER liOffset;</div>
<div class="line"><a id="l02556" name="l02556"></a><span class="lineno"> 2556</span> LARGE_INTEGER liSize;</div>
<div class="line"><a id="l02557" name="l02557"></a><span class="lineno"> 2557</span> liOffset.QuadPart = offset;</div>
<div class="line"><a id="l02558" name="l02558"></a><span class="lineno"> 2558</span> liSize.QuadPart = length;</div>
<div class="line"><a id="l02559" name="l02559"></a><span class="lineno"> 2559</span> <span class="keywordflow">if</span> (LockFile(m_h, liOffset.LowPart, liOffset.HighPart, liSize.LowPart, liSize.HighPart)) {</div>
<div class="line"><a id="l02560" name="l02560"></a><span class="lineno"> 2560</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02561" name="l02561"></a><span class="lineno"> 2561</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02562" name="l02562"></a><span class="lineno"> 2562</span> }</div>
<div class="line"><a id="l02563" name="l02563"></a><span class="lineno"> 2563</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02564" name="l02564"></a><span class="lineno"> 2564</span> off64_t orig = lseek64(m_h, 0, SEEK_CUR);</div>
<div class="line"><a id="l02565" name="l02565"></a><span class="lineno"> 2565</span> <span class="keywordflow">if</span> (orig &gt;= 0) {</div>
<div class="line"><a id="l02566" name="l02566"></a><span class="lineno"> 2566</span> m_state = lseek64(m_h, offset, SEEK_SET) &gt;= 0 &amp;&amp; lockf64(m_h, F_LOCK, length) &gt;= 0 ? state_t::ok : state_t::fail;</div>
<div class="line"><a id="l02567" name="l02567"></a><span class="lineno"> 2567</span> lseek64(m_h, orig, SEEK_SET);</div>
<div class="line"><a id="l02568" name="l02568"></a><span class="lineno"> 2568</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02569" name="l02569"></a><span class="lineno"> 2569</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02570" name="l02570"></a><span class="lineno"> 2570</span> }</div>
<div class="line"><a id="l02571" name="l02571"></a><span class="lineno"> 2571</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02572" name="l02572"></a><span class="lineno"> 2572</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02573" name="l02573"></a><span class="lineno"> 2573</span> }</div>
</div>
<div class="line"><a id="l02574" name="l02574"></a><span class="lineno"> 2574</span> </div>
<div class="foldopen" id="foldopen02575" data-start="{" data-end="}">
<div class="line"><a id="l02575" name="l02575"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#a28e6d46e4183e094ef9fdcf591ebec46"> 2575</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a28e6d46e4183e094ef9fdcf591ebec46">unlock</a>(_In_ fpos_t offset, _In_ fsize_t length)</div>
<div class="line"><a id="l02576" name="l02576"></a><span class="lineno"> 2576</span> {</div>
<div class="line"><a id="l02577" name="l02577"></a><span class="lineno"> 2577</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02578" name="l02578"></a><span class="lineno"> 2578</span> LARGE_INTEGER liOffset;</div>
<div class="line"><a id="l02579" name="l02579"></a><span class="lineno"> 2579</span> LARGE_INTEGER liSize;</div>
<div class="line"><a id="l02580" name="l02580"></a><span class="lineno"> 2580</span> liOffset.QuadPart = offset;</div>
<div class="line"><a id="l02581" name="l02581"></a><span class="lineno"> 2581</span> liSize.QuadPart = length;</div>
<div class="line"><a id="l02582" name="l02582"></a><span class="lineno"> 2582</span> <span class="keywordflow">if</span> (UnlockFile(m_h, liOffset.LowPart, liOffset.HighPart, liSize.LowPart, liSize.HighPart)) {</div>
<div class="line"><a id="l02583" name="l02583"></a><span class="lineno"> 2583</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02584" name="l02584"></a><span class="lineno"> 2584</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02585" name="l02585"></a><span class="lineno"> 2585</span> }</div>
<div class="line"><a id="l02586" name="l02586"></a><span class="lineno"> 2586</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02587" name="l02587"></a><span class="lineno"> 2587</span> off64_t orig = lseek64(m_h, 0, SEEK_CUR);</div>
<div class="line"><a id="l02588" name="l02588"></a><span class="lineno"> 2588</span> <span class="keywordflow">if</span> (orig &gt;= 0) {</div>
<div class="line"><a id="l02589" name="l02589"></a><span class="lineno"> 2589</span> <span class="keywordflow">if</span> (lseek64(m_h, offset, SEEK_SET) &gt;= 0 &amp;&amp; lockf64(m_h, F_ULOCK, length) &gt;= 0) {</div>
<div class="line"><a id="l02590" name="l02590"></a><span class="lineno"> 2590</span> lseek64(m_h, orig, SEEK_SET);</div>
<div class="line"><a id="l02591" name="l02591"></a><span class="lineno"> 2591</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02592" name="l02592"></a><span class="lineno"> 2592</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02593" name="l02593"></a><span class="lineno"> 2593</span> }</div>
<div class="line"><a id="l02594" name="l02594"></a><span class="lineno"> 2594</span> lseek64(m_h, orig, SEEK_SET);</div>
<div class="line"><a id="l02595" name="l02595"></a><span class="lineno"> 2595</span> }</div>
<div class="line"><a id="l02596" name="l02596"></a><span class="lineno"> 2596</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02597" name="l02597"></a><span class="lineno"> 2597</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02598" name="l02598"></a><span class="lineno"> 2598</span> }</div>
</div>
<div class="line"><a id="l02599" name="l02599"></a><span class="lineno"> 2599</span> </div>
<div class="foldopen" id="foldopen02600" data-start="{" data-end="}">
<div class="line"><a id="l02600" name="l02600"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#acc591c2378e51340b7af7fbf12d1a98f"> 2600</a></span> <span class="keyword">virtual</span> fsize_t <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#acc591c2378e51340b7af7fbf12d1a98f">size</a>()</div>
<div class="line"><a id="l02601" name="l02601"></a><span class="lineno"> 2601</span> {</div>
<div class="line"><a id="l02602" name="l02602"></a><span class="lineno"> 2602</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02603" name="l02603"></a><span class="lineno"> 2603</span> LARGE_INTEGER li;</div>
<div class="line"><a id="l02604" name="l02604"></a><span class="lineno"> 2604</span> li.LowPart = GetFileSize(m_h, (LPDWORD)&amp;li.HighPart);</div>
<div class="line"><a id="l02605" name="l02605"></a><span class="lineno"> 2605</span> <span class="keywordflow">if</span> (li.LowPart == 0xFFFFFFFF &amp;&amp; GetLastError() != NO_ERROR)</div>
<div class="line"><a id="l02606" name="l02606"></a><span class="lineno"> 2606</span> li.QuadPart = -1;</div>
<div class="line"><a id="l02607" name="l02607"></a><span class="lineno"> 2607</span> <span class="keywordflow">return</span> li.QuadPart;</div>
<div class="line"><a id="l02608" name="l02608"></a><span class="lineno"> 2608</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02609" name="l02609"></a><span class="lineno"> 2609</span> off64_t length = -1, orig = lseek64(m_h, 0, SEEK_CUR);</div>
<div class="line"><a id="l02610" name="l02610"></a><span class="lineno"> 2610</span> <span class="keywordflow">if</span> (orig &gt;= 0) {</div>
<div class="line"><a id="l02611" name="l02611"></a><span class="lineno"> 2611</span> length = lseek64(m_h, 0, SEEK_END);</div>
<div class="line"><a id="l02612" name="l02612"></a><span class="lineno"> 2612</span> lseek64(m_h, orig, SEEK_SET);</div>
<div class="line"><a id="l02613" name="l02613"></a><span class="lineno"> 2613</span> }</div>
<div class="line"><a id="l02614" name="l02614"></a><span class="lineno"> 2614</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l02615" name="l02615"></a><span class="lineno"> 2615</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02616" name="l02616"></a><span class="lineno"> 2616</span> }</div>
</div>
<div class="line"><a id="l02617" name="l02617"></a><span class="lineno"> 2617</span> </div>
<div class="foldopen" id="foldopen02618" data-start="{" data-end="}">
<div class="line"><a id="l02618" name="l02618"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#aa1c4de0bca72ddc02db4e8328cefcf17"> 2618</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#aa1c4de0bca72ddc02db4e8328cefcf17">truncate</a>()</div>
<div class="line"><a id="l02619" name="l02619"></a><span class="lineno"> 2619</span> {</div>
<div class="line"><a id="l02620" name="l02620"></a><span class="lineno"> 2620</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02621" name="l02621"></a><span class="lineno"> 2621</span> <span class="keywordflow">if</span> (SetEndOfFile(m_h)) {</div>
<div class="line"><a id="l02622" name="l02622"></a><span class="lineno"> 2622</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02623" name="l02623"></a><span class="lineno"> 2623</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02624" name="l02624"></a><span class="lineno"> 2624</span> }</div>
<div class="line"><a id="l02625" name="l02625"></a><span class="lineno"> 2625</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02626" name="l02626"></a><span class="lineno"> 2626</span> off64_t length = lseek64(m_h, 0, SEEK_CUR);</div>
<div class="line"><a id="l02627" name="l02627"></a><span class="lineno"> 2627</span> <span class="keywordflow">if</span> (length &gt;= 0 &amp;&amp; ftruncate64(m_h, length) &gt;= 0) {</div>
<div class="line"><a id="l02628" name="l02628"></a><span class="lineno"> 2628</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02629" name="l02629"></a><span class="lineno"> 2629</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02630" name="l02630"></a><span class="lineno"> 2630</span> }</div>
<div class="line"><a id="l02631" name="l02631"></a><span class="lineno"> 2631</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02632" name="l02632"></a><span class="lineno"> 2632</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02633" name="l02633"></a><span class="lineno"> 2633</span> }</div>
</div>
<div class="line"><a id="l02634" name="l02634"></a><span class="lineno"> 2634</span> </div>
<div class="line"><a id="l02635" name="l02635"></a><span class="lineno"> 2635</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02636" name="l02636"></a><span class="lineno"> 2636</span> <span class="keyword">static</span> <span class="keyword">inline</span> time_point ft2tp(_In_ <span class="keyword">const</span> FILETIME&amp; ft)</div>
<div class="line"><a id="l02637" name="l02637"></a><span class="lineno"> 2637</span> {</div>
<div class="line"><a id="l02638" name="l02638"></a><span class="lineno"> 2638</span><span class="preprocessor">#if _HAS_CXX20</span></div>
<div class="line"><a id="l02639" name="l02639"></a><span class="lineno"> 2639</span> uint64_t t = (<span class="keyword">static_cast&lt;</span>int64_t<span class="keyword">&gt;</span>(ft.dwHighDateTime) &lt;&lt; 32) | ft.dwLowDateTime;</div>
<div class="line"><a id="l02640" name="l02640"></a><span class="lineno"> 2640</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02641" name="l02641"></a><span class="lineno"> 2641</span> uint64_t t = ((<span class="keyword">static_cast&lt;</span>int64_t<span class="keyword">&gt;</span>(ft.dwHighDateTime) &lt;&lt; 32) | ft.dwLowDateTime) - 116444736000000000ll;</div>
<div class="line"><a id="l02642" name="l02642"></a><span class="lineno"> 2642</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02643" name="l02643"></a><span class="lineno"> 2643</span> <span class="keywordflow">return</span> time_point(time_point::duration(t));</div>
<div class="line"><a id="l02644" name="l02644"></a><span class="lineno"> 2644</span> }</div>
<div class="line"><a id="l02645" name="l02645"></a><span class="lineno"> 2645</span> </div>
<div class="line"><a id="l02646" name="l02646"></a><span class="lineno"> 2646</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> tp2ft(_In_ time_point tp, _Out_ FILETIME&amp; ft)</div>
<div class="line"><a id="l02647" name="l02647"></a><span class="lineno"> 2647</span> {</div>
<div class="line"><a id="l02648" name="l02648"></a><span class="lineno"> 2648</span><span class="preprocessor">#if _HAS_CXX20</span></div>
<div class="line"><a id="l02649" name="l02649"></a><span class="lineno"> 2649</span> uint64_t t = tp.time_since_epoch().count();</div>
<div class="line"><a id="l02650" name="l02650"></a><span class="lineno"> 2650</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02651" name="l02651"></a><span class="lineno"> 2651</span> uint64_t t = tp.time_since_epoch().count() + 116444736000000000ll;</div>
<div class="line"><a id="l02652" name="l02652"></a><span class="lineno"> 2652</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02653" name="l02653"></a><span class="lineno"> 2653</span> ft.dwHighDateTime = <span class="keyword">static_cast&lt;</span>DWORD<span class="keyword">&gt;</span>((t &gt;&gt; 32) &amp; 0xffffffff);</div>
<div class="line"><a id="l02654" name="l02654"></a><span class="lineno"> 2654</span> ft.dwLowDateTime = <span class="keyword">static_cast&lt;</span>DWORD<span class="keyword">&gt;</span>(t &amp; 0xffffffff);</div>
<div class="line"><a id="l02655" name="l02655"></a><span class="lineno"> 2655</span> }</div>
<div class="line"><a id="l02656" name="l02656"></a><span class="lineno"> 2656</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02657" name="l02657"></a><span class="lineno"> 2657</span> </div>
<div class="foldopen" id="foldopen02658" data-start="{" data-end="}">
<div class="line"><a id="l02658" name="l02658"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#aa54131619fe782de419ed74bab377dd5"> 2658</a></span> <span class="keyword">virtual</span> time_point <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#aa54131619fe782de419ed74bab377dd5">ctime</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l02659" name="l02659"></a><span class="lineno"> 2659</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l02660" name="l02660"></a><span class="lineno"> 2660</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02661" name="l02661"></a><span class="lineno"> 2661</span> FILETIME ft;</div>
<div class="line"><a id="l02662" name="l02662"></a><span class="lineno"> 2662</span> <span class="keywordflow">if</span> (GetFileTime(m_h, &amp;ft, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>))</div>
<div class="line"><a id="l02663" name="l02663"></a><span class="lineno"> 2663</span> <span class="keywordflow">return</span> ft2tp(ft);</div>
<div class="line"><a id="l02664" name="l02664"></a><span class="lineno"> 2664</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02665" name="l02665"></a><span class="lineno"> 2665</span> <span class="keywordflow">return</span> time_point::min();</div>
<div class="line"><a id="l02666" name="l02666"></a><span class="lineno"> 2666</span> }</div>
</div>
<div class="line"><a id="l02667" name="l02667"></a><span class="lineno"> 2667</span> </div>
<div class="foldopen" id="foldopen02668" data-start="{" data-end="}">
<div class="line"><a id="l02668" name="l02668"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#a4b5cdfe6c9dccd20726df867e34f4af3"> 2668</a></span> <span class="keyword">virtual</span> time_point <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a4b5cdfe6c9dccd20726df867e34f4af3">atime</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l02669" name="l02669"></a><span class="lineno"> 2669</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l02670" name="l02670"></a><span class="lineno"> 2670</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02671" name="l02671"></a><span class="lineno"> 2671</span> FILETIME ft;</div>
<div class="line"><a id="l02672" name="l02672"></a><span class="lineno"> 2672</span> <span class="keywordflow">if</span> (GetFileTime(m_h, <span class="keyword">nullptr</span>, &amp;ft, <span class="keyword">nullptr</span>))</div>
<div class="line"><a id="l02673" name="l02673"></a><span class="lineno"> 2673</span> <span class="keywordflow">return</span> ft2tp(ft);</div>
<div class="line"><a id="l02674" name="l02674"></a><span class="lineno"> 2674</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02675" name="l02675"></a><span class="lineno"> 2675</span> <span class="keyword">struct </span>stat buf;</div>
<div class="line"><a id="l02676" name="l02676"></a><span class="lineno"> 2676</span> <span class="keywordflow">if</span> (fstat(m_h, &amp;buf) &gt;= 0)</div>
<div class="line"><a id="l02677" name="l02677"></a><span class="lineno"> 2677</span> <span class="keywordflow">return</span> clock::from_time_t(buf.st_atime);</div>
<div class="line"><a id="l02678" name="l02678"></a><span class="lineno"> 2678</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02679" name="l02679"></a><span class="lineno"> 2679</span> <span class="keywordflow">return</span> time_point::min();</div>
<div class="line"><a id="l02680" name="l02680"></a><span class="lineno"> 2680</span> }</div>
</div>
<div class="line"><a id="l02681" name="l02681"></a><span class="lineno"> 2681</span> </div>
<div class="foldopen" id="foldopen02682" data-start="{" data-end="}">
<div class="line"><a id="l02682" name="l02682"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#a23e1061f6a9473241ef8af99f6a3f08f"> 2682</a></span> <span class="keyword">virtual</span> time_point <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a23e1061f6a9473241ef8af99f6a3f08f">mtime</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l02683" name="l02683"></a><span class="lineno"> 2683</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l02684" name="l02684"></a><span class="lineno"> 2684</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02685" name="l02685"></a><span class="lineno"> 2685</span> FILETIME ft;</div>
<div class="line"><a id="l02686" name="l02686"></a><span class="lineno"> 2686</span> <span class="keywordflow">if</span> (GetFileTime(m_h, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>, &amp;ft))</div>
<div class="line"><a id="l02687" name="l02687"></a><span class="lineno"> 2687</span> <span class="keywordflow">return</span> ft2tp(ft);</div>
<div class="line"><a id="l02688" name="l02688"></a><span class="lineno"> 2688</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02689" name="l02689"></a><span class="lineno"> 2689</span> <span class="keyword">struct </span>stat buf;</div>
<div class="line"><a id="l02690" name="l02690"></a><span class="lineno"> 2690</span> <span class="keywordflow">if</span> (fstat(m_h, &amp;buf) &gt;= 0)</div>
<div class="line"><a id="l02691" name="l02691"></a><span class="lineno"> 2691</span> <span class="keywordflow">return</span> clock::from_time_t(buf.st_mtime);</div>
<div class="line"><a id="l02692" name="l02692"></a><span class="lineno"> 2692</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02693" name="l02693"></a><span class="lineno"> 2693</span> <span class="keywordflow">return</span> time_point::min();</div>
<div class="line"><a id="l02694" name="l02694"></a><span class="lineno"> 2694</span> }</div>
</div>
<div class="line"><a id="l02695" name="l02695"></a><span class="lineno"> 2695</span> </div>
<div class="foldopen" id="foldopen02696" data-start="{" data-end="}">
<div class="line"><a id="l02696" name="l02696"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#a337a27cd63975e155b6ba29a18ed9a23"> 2696</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a337a27cd63975e155b6ba29a18ed9a23">set_ctime</a>(time_point date)</div>
<div class="line"><a id="l02697" name="l02697"></a><span class="lineno"> 2697</span> {</div>
<div class="line"><a id="l02698" name="l02698"></a><span class="lineno"> 2698</span> assert(m_h != invalid_handle);</div>
<div class="line"><a id="l02699" name="l02699"></a><span class="lineno"> 2699</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02700" name="l02700"></a><span class="lineno"> 2700</span> FILETIME ft;</div>
<div class="line"><a id="l02701" name="l02701"></a><span class="lineno"> 2701</span> tp2ft(date, ft);</div>
<div class="line"><a id="l02702" name="l02702"></a><span class="lineno"> 2702</span> <span class="keywordflow">if</span> (SetFileTime(m_h, &amp;ft, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>))</div>
<div class="line"><a id="l02703" name="l02703"></a><span class="lineno"> 2703</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02704" name="l02704"></a><span class="lineno"> 2704</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02705" name="l02705"></a><span class="lineno"> 2705</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;failed to set file ctime&quot;</span>);</div>
<div class="line"><a id="l02706" name="l02706"></a><span class="lineno"> 2706</span> }</div>
</div>
<div class="line"><a id="l02707" name="l02707"></a><span class="lineno"> 2707</span> </div>
<div class="foldopen" id="foldopen02708" data-start="{" data-end="}">
<div class="line"><a id="l02708" name="l02708"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#a64ded627a8843c155ea3a59b94c225f6"> 2708</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a64ded627a8843c155ea3a59b94c225f6">set_atime</a>(time_point date)</div>
<div class="line"><a id="l02709" name="l02709"></a><span class="lineno"> 2709</span> {</div>
<div class="line"><a id="l02710" name="l02710"></a><span class="lineno"> 2710</span> assert(m_h != invalid_handle);</div>
<div class="line"><a id="l02711" name="l02711"></a><span class="lineno"> 2711</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02712" name="l02712"></a><span class="lineno"> 2712</span> FILETIME ft;</div>
<div class="line"><a id="l02713" name="l02713"></a><span class="lineno"> 2713</span> tp2ft(date, ft);</div>
<div class="line"><a id="l02714" name="l02714"></a><span class="lineno"> 2714</span> <span class="keywordflow">if</span> (SetFileTime(m_h, <span class="keyword">nullptr</span>, &amp;ft, <span class="keyword">nullptr</span>))</div>
<div class="line"><a id="l02715" name="l02715"></a><span class="lineno"> 2715</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02716" name="l02716"></a><span class="lineno"> 2716</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02717" name="l02717"></a><span class="lineno"> 2717</span> <span class="keyword">struct </span>timespec ts[2] = {</div>
<div class="line"><a id="l02718" name="l02718"></a><span class="lineno"> 2718</span> { date.time_since_epoch().count(), 0 },</div>
<div class="line"><a id="l02719" name="l02719"></a><span class="lineno"> 2719</span> { 0, UTIME_OMIT },</div>
<div class="line"><a id="l02720" name="l02720"></a><span class="lineno"> 2720</span> };</div>
<div class="line"><a id="l02721" name="l02721"></a><span class="lineno"> 2721</span> <span class="keywordflow">if</span> (futimens(m_h, ts) &gt;= 0)</div>
<div class="line"><a id="l02722" name="l02722"></a><span class="lineno"> 2722</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02723" name="l02723"></a><span class="lineno"> 2723</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02724" name="l02724"></a><span class="lineno"> 2724</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;failed to set file atime&quot;</span>);</div>
<div class="line"><a id="l02725" name="l02725"></a><span class="lineno"> 2725</span> }</div>
</div>
<div class="line"><a id="l02726" name="l02726"></a><span class="lineno"> 2726</span> </div>
<div class="foldopen" id="foldopen02727" data-start="{" data-end="}">
<div class="line"><a id="l02727" name="l02727"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1file.html#a567620d1eb84032e460f3e173f9bd762"> 2727</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a567620d1eb84032e460f3e173f9bd762">set_mtime</a>(time_point date)</div>
<div class="line"><a id="l02728" name="l02728"></a><span class="lineno"> 2728</span> {</div>
<div class="line"><a id="l02729" name="l02729"></a><span class="lineno"> 2729</span><span class="preprocessor">#ifdef _WIN32</span></div>
<div class="line"><a id="l02730" name="l02730"></a><span class="lineno"> 2730</span> FILETIME ft;</div>
<div class="line"><a id="l02731" name="l02731"></a><span class="lineno"> 2731</span> tp2ft(date, ft);</div>
<div class="line"><a id="l02732" name="l02732"></a><span class="lineno"> 2732</span> <span class="keywordflow">if</span> (SetFileTime(m_h, <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>, &amp;ft))</div>
<div class="line"><a id="l02733" name="l02733"></a><span class="lineno"> 2733</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02734" name="l02734"></a><span class="lineno"> 2734</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l02735" name="l02735"></a><span class="lineno"> 2735</span> <span class="keyword">struct </span>timespec ts[2] = {</div>
<div class="line"><a id="l02736" name="l02736"></a><span class="lineno"> 2736</span> { 0, UTIME_OMIT },</div>
<div class="line"><a id="l02737" name="l02737"></a><span class="lineno"> 2737</span> { date.time_since_epoch().count(), 0 },</div>
<div class="line"><a id="l02738" name="l02738"></a><span class="lineno"> 2738</span> };</div>
<div class="line"><a id="l02739" name="l02739"></a><span class="lineno"> 2739</span> <span class="keywordflow">if</span> (futimens(m_h, ts) &gt;= 0)</div>
<div class="line"><a id="l02740" name="l02740"></a><span class="lineno"> 2740</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02741" name="l02741"></a><span class="lineno"> 2741</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02742" name="l02742"></a><span class="lineno"> 2742</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;failed to set file mtime&quot;</span>);</div>
<div class="line"><a id="l02743" name="l02743"></a><span class="lineno"> 2743</span> }</div>
</div>
<div class="line"><a id="l02744" name="l02744"></a><span class="lineno"> 2744</span> };</div>
</div>
<div class="line"><a id="l02745" name="l02745"></a><span class="lineno"> 2745</span><span class="preprocessor">#pragma warning(pop)</span></div>
<div class="line"><a id="l02746" name="l02746"></a><span class="lineno"> 2746</span> </div>
<div class="foldopen" id="foldopen02750" data-start="{" data-end="};">
<div class="line"><a id="l02750" name="l02750"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cached__file.html"> 2750</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1cached__file.html">cached_file</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1cache.html">cache</a></div>
<div class="line"><a id="l02751" name="l02751"></a><span class="lineno"> 2751</span> {</div>
<div class="line"><a id="l02752" name="l02752"></a><span class="lineno"> 2752</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l02753" name="l02753"></a><span class="lineno"> 2753</span> <a class="code hl_class" href="classstdex_1_1stream_1_1cached__file.html">cached_file</a>(_In_opt_ sys_handle h = invalid_handle, _In_ state_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a> = state_t::ok, _In_ <span class="keywordtype">size_t</span> cache_size = default_cache_size) :</div>
<div class="line"><a id="l02754" name="l02754"></a><span class="lineno"> 2754</span> <a class="code hl_class" href="classstdex_1_1stream_1_1cache.html">cache</a>(cache_size),</div>
<div class="line"><a id="l02755" name="l02755"></a><span class="lineno"> 2755</span> m_source(h, <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>)</div>
<div class="line"><a id="l02756" name="l02756"></a><span class="lineno"> 2756</span> {</div>
<div class="line"><a id="l02757" name="l02757"></a><span class="lineno"> 2757</span> init(m_source);</div>
<div class="line"><a id="l02758" name="l02758"></a><span class="lineno"> 2758</span> }</div>
<div class="line"><a id="l02759" name="l02759"></a><span class="lineno"> 2759</span> </div>
<div class="foldopen" id="foldopen02767" data-start="{" data-end="}">
<div class="line"><a id="l02767" name="l02767"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cached__file.html#aa53149a79b463450f64223f45285dc02"> 2767</a></span> <a class="code hl_function" href="classstdex_1_1stream_1_1cached__file.html#aa53149a79b463450f64223f45285dc02">cached_file</a>(_In_z_ <span class="keyword">const</span> schar_t* filename, _In_ <span class="keywordtype">int</span> mode, _In_ <span class="keywordtype">size_t</span> cache_size = default_cache_size) :</div>
<div class="line"><a id="l02768" name="l02768"></a><span class="lineno"> 2768</span> <a class="code hl_class" href="classstdex_1_1stream_1_1cache.html">cache</a>(cache_size),</div>
<div class="line"><a id="l02769" name="l02769"></a><span class="lineno"> 2769</span> m_source(filename, mode &amp; mode_for_writing ? mode | mode_for_reading : mode)</div>
<div class="line"><a id="l02770" name="l02770"></a><span class="lineno"> 2770</span> {</div>
<div class="line"><a id="l02771" name="l02771"></a><span class="lineno"> 2771</span> init(m_source);</div>
<div class="line"><a id="l02772" name="l02772"></a><span class="lineno"> 2772</span> }</div>
</div>
<div class="line"><a id="l02773" name="l02773"></a><span class="lineno"> 2773</span> </div>
<div class="line"><a id="l02774" name="l02774"></a><span class="lineno"> 2774</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classstdex_1_1stream_1_1cached__file.html">~cached_file</a>()</div>
<div class="line"><a id="l02775" name="l02775"></a><span class="lineno"> 2775</span> {</div>
<div class="line"><a id="l02776" name="l02776"></a><span class="lineno"> 2776</span> done();</div>
<div class="line"><a id="l02777" name="l02777"></a><span class="lineno"> 2777</span> }</div>
<div class="line"><a id="l02778" name="l02778"></a><span class="lineno"> 2778</span> </div>
<div class="foldopen" id="foldopen02785" data-start="{" data-end="}">
<div class="line"><a id="l02785" name="l02785"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1cached__file.html#a8a1ac6ccd8e1d321112412d346eec0e1"> 2785</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1cached__file.html#a8a1ac6ccd8e1d321112412d346eec0e1">open</a>(_In_z_ <span class="keyword">const</span> schar_t* filename, _In_ <span class="keywordtype">int</span> mode)</div>
<div class="line"><a id="l02786" name="l02786"></a><span class="lineno"> 2786</span> {</div>
<div class="line"><a id="l02787" name="l02787"></a><span class="lineno"> 2787</span> invalidate_cache();</div>
<div class="line"><a id="l02788" name="l02788"></a><span class="lineno"> 2788</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_{</div>
<div class="line"><a id="l02789" name="l02789"></a><span class="lineno"> 2789</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02790" name="l02790"></a><span class="lineno"> 2790</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02791" name="l02791"></a><span class="lineno"> 2791</span> }</div>
<div class="line"><a id="l02792" name="l02792"></a><span class="lineno"> 2792</span> m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a556c4cff7086d5f258dcdf914556084a">open</a>(filename, mode &amp; mode_for_writing ? mode | mode_for_reading : mode);</div>
<div class="line"><a id="l02793" name="l02793"></a><span class="lineno"> 2793</span> <span class="keywordflow">if</span> (m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) {</div>
<div class="line"><a id="l02794" name="l02794"></a><span class="lineno"> 2794</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l02795" name="l02795"></a><span class="lineno"> 2795</span> m_atime = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a4b5cdfe6c9dccd20726df867e34f4af3">atime</a>();</div>
<div class="line"><a id="l02796" name="l02796"></a><span class="lineno"> 2796</span> m_mtime = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a23e1061f6a9473241ef8af99f6a3f08f">mtime</a>();</div>
<div class="line"><a id="l02797" name="l02797"></a><span class="lineno"> 2797</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02798" name="l02798"></a><span class="lineno"> 2798</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">m_offset</a> = m_source.<a class="code hl_function" href="classstdex_1_1stream_1_1file.html#aead21702bfdb09193a202afbce35421b">tell</a>();</div>
<div class="line"><a id="l02799" name="l02799"></a><span class="lineno"> 2799</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02800" name="l02800"></a><span class="lineno"> 2800</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02801" name="l02801"></a><span class="lineno"> 2801</span> }</div>
<div class="line"><a id="l02802" name="l02802"></a><span class="lineno"> 2802</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02803" name="l02803"></a><span class="lineno"> 2803</span> }</div>
</div>
<div class="line"><a id="l02804" name="l02804"></a><span class="lineno"> 2804</span> </div>
<div class="line"><a id="l02805" name="l02805"></a><span class="lineno"> 2805</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l02806" name="l02806"></a><span class="lineno"> 2806</span> <a class="code hl_class" href="classstdex_1_1stream_1_1file.html">file</a> m_source;</div>
<div class="line"><a id="l02807" name="l02807"></a><span class="lineno"> 2807</span> };</div>
</div>
<div class="line"><a id="l02808" name="l02808"></a><span class="lineno"> 2808</span> </div>
<div class="foldopen" id="foldopen02812" data-start="{" data-end="};">
<div class="line"><a id="l02812" name="l02812"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html"> 2812</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1memory__file.html">memory_file</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic__file.html">basic_file</a></div>
<div class="line"><a id="l02813" name="l02813"></a><span class="lineno"> 2813</span> {</div>
<div class="line"><a id="l02814" name="l02814"></a><span class="lineno"> 2814</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l02815" name="l02815"></a><span class="lineno"> 2815</span> <a class="code hl_class" href="classstdex_1_1stream_1_1memory__file.html">memory_file</a>(_In_ state_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a> = state_t::ok) :</div>
<div class="line"><a id="l02816" name="l02816"></a><span class="lineno"> 2816</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>),</div>
<div class="line"><a id="l02817" name="l02817"></a><span class="lineno"> 2817</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a>(<span class="keyword">nullptr</span>),</div>
<div class="line"><a id="l02818" name="l02818"></a><span class="lineno"> 2818</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>(0),</div>
<div class="line"><a id="l02819" name="l02819"></a><span class="lineno"> 2819</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>(0),</div>
<div class="line"><a id="l02820" name="l02820"></a><span class="lineno"> 2820</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c">m_reserved</a>(0),</div>
<div class="line"><a id="l02821" name="l02821"></a><span class="lineno"> 2821</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#aca812d996b5b60660fa121787e4c0e68">m_manage</a>(<span class="keyword">true</span>)</div>
<div class="line"><a id="l02822" name="l02822"></a><span class="lineno"> 2822</span> {</div>
<div class="line"><a id="l02823" name="l02823"></a><span class="lineno"> 2823</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l02824" name="l02824"></a><span class="lineno"> 2824</span> m_ctime = m_atime = m_mtime = time_point::now();</div>
<div class="line"><a id="l02825" name="l02825"></a><span class="lineno"> 2825</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02826" name="l02826"></a><span class="lineno"> 2826</span> }</div>
<div class="line"><a id="l02827" name="l02827"></a><span class="lineno"> 2827</span> </div>
<div class="foldopen" id="foldopen02834" data-start="{" data-end="}">
<div class="line"><a id="l02834" name="l02834"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a6b4b9daa088fb20678a502e81553c745"> 2834</a></span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a6b4b9daa088fb20678a502e81553c745">memory_file</a>(_In_ <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a>, _In_ state_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a> = state_t::ok) :</div>
<div class="line"><a id="l02835" name="l02835"></a><span class="lineno"> 2835</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>),</div>
<div class="line"><a id="l02836" name="l02836"></a><span class="lineno"> 2836</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a>(reinterpret_cast&lt;uint8_t*&gt;(malloc(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a>))),</div>
<div class="line"><a id="l02837" name="l02837"></a><span class="lineno"> 2837</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>(0),</div>
<div class="line"><a id="l02838" name="l02838"></a><span class="lineno"> 2838</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>(0),</div>
<div class="line"><a id="l02839" name="l02839"></a><span class="lineno"> 2839</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c">m_reserved</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a>),</div>
<div class="line"><a id="l02840" name="l02840"></a><span class="lineno"> 2840</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#aca812d996b5b60660fa121787e4c0e68">m_manage</a>(true)</div>
<div class="line"><a id="l02841" name="l02841"></a><span class="lineno"> 2841</span> {</div>
<div class="line"><a id="l02842" name="l02842"></a><span class="lineno"> 2842</span> <span class="keywordflow">if</span> (!<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a>)</div>
<div class="line"><a id="l02843" name="l02843"></a><span class="lineno"> 2843</span> <span class="keywordflow">throw</span> std::bad_alloc();</div>
<div class="line"><a id="l02844" name="l02844"></a><span class="lineno"> 2844</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l02845" name="l02845"></a><span class="lineno"> 2845</span> m_ctime = m_atime = m_mtime = time_point::now();</div>
<div class="line"><a id="l02846" name="l02846"></a><span class="lineno"> 2846</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02847" name="l02847"></a><span class="lineno"> 2847</span> }</div>
</div>
<div class="line"><a id="l02848" name="l02848"></a><span class="lineno"> 2848</span> </div>
<div class="foldopen" id="foldopen02858" data-start="{" data-end="}">
<div class="line"><a id="l02858" name="l02858"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#af7fdc0b7ffcd3713487a75cfd9c1704f"> 2858</a></span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#af7fdc0b7ffcd3713487a75cfd9c1704f">memory_file</a>(_Inout_ <span class="keywordtype">void</span>* <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>, _In_ <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a>, _In_ <span class="keywordtype">size_t</span> reserved, _In_ <span class="keywordtype">bool</span> manage = <span class="keyword">false</span>, _In_ state_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a> = state_t::ok) :</div>
<div class="line"><a id="l02859" name="l02859"></a><span class="lineno"> 2859</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>),</div>
<div class="line"><a id="l02860" name="l02860"></a><span class="lineno"> 2860</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a>(reinterpret_cast&lt;uint8_t*&gt;(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>)),</div>
<div class="line"><a id="l02861" name="l02861"></a><span class="lineno"> 2861</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>(0),</div>
<div class="line"><a id="l02862" name="l02862"></a><span class="lineno"> 2862</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a>),</div>
<div class="line"><a id="l02863" name="l02863"></a><span class="lineno"> 2863</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c">m_reserved</a>(reserved),</div>
<div class="line"><a id="l02864" name="l02864"></a><span class="lineno"> 2864</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#aca812d996b5b60660fa121787e4c0e68">m_manage</a>(manage)</div>
<div class="line"><a id="l02865" name="l02865"></a><span class="lineno"> 2865</span> {</div>
<div class="line"><a id="l02866" name="l02866"></a><span class="lineno"> 2866</span> assert(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a> || !<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a>);</div>
<div class="line"><a id="l02867" name="l02867"></a><span class="lineno"> 2867</span> assert(reserved &gt;= <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a>);</div>
<div class="line"><a id="l02868" name="l02868"></a><span class="lineno"> 2868</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l02869" name="l02869"></a><span class="lineno"> 2869</span> m_ctime = m_atime = m_mtime = time_point::now();</div>
<div class="line"><a id="l02870" name="l02870"></a><span class="lineno"> 2870</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02871" name="l02871"></a><span class="lineno"> 2871</span> }</div>
</div>
<div class="line"><a id="l02872" name="l02872"></a><span class="lineno"> 2872</span> </div>
<div class="foldopen" id="foldopen02881" data-start="{" data-end="}">
<div class="line"><a id="l02881" name="l02881"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#ad0da8c8758672af312026957e2556b60"> 2881</a></span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ad0da8c8758672af312026957e2556b60">memory_file</a>(_Inout_ <span class="keywordtype">void</span>* <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>, _In_ <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a>, _In_ <span class="keywordtype">bool</span> manage = <span class="keyword">false</span>, _In_ state_t <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a> = state_t::ok) :</div>
<div class="line"><a id="l02882" name="l02882"></a><span class="lineno"> 2882</span> <a class="code hl_class" href="classstdex_1_1stream_1_1memory__file.html">memory_file</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a>, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a>, manage, <a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>)</div>
<div class="line"><a id="l02883" name="l02883"></a><span class="lineno"> 2883</span> {}</div>
</div>
<div class="line"><a id="l02884" name="l02884"></a><span class="lineno"> 2884</span> </div>
<div class="foldopen" id="foldopen02891" data-start="{" data-end="}">
<div class="line"><a id="l02891" name="l02891"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a0bb7b9759667e810c91b3e58c1771d91"> 2891</a></span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a0bb7b9759667e810c91b3e58c1771d91">memory_file</a>(_In_z_ <span class="keyword">const</span> schar_t* filename, _In_ <span class="keywordtype">int</span> mode) : <a class="code hl_class" href="classstdex_1_1stream_1_1memory__file.html">memory_file</a>()</div>
<div class="line"><a id="l02892" name="l02892"></a><span class="lineno"> 2892</span> {</div>
<div class="line"><a id="l02893" name="l02893"></a><span class="lineno"> 2893</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a98f0a5ecb59b4e50d5990aa505b658c2">load</a>(filename, mode);</div>
<div class="line"><a id="l02894" name="l02894"></a><span class="lineno"> 2894</span> }</div>
</div>
<div class="line"><a id="l02895" name="l02895"></a><span class="lineno"> 2895</span> </div>
<div class="line"><a id="l02896" name="l02896"></a><span class="lineno"> 2896</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classstdex_1_1stream_1_1memory__file.html">~memory_file</a>()</div>
<div class="line"><a id="l02897" name="l02897"></a><span class="lineno"> 2897</span> {</div>
<div class="line"><a id="l02898" name="l02898"></a><span class="lineno"> 2898</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#aca812d996b5b60660fa121787e4c0e68">m_manage</a> &amp;&amp; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a>)</div>
<div class="line"><a id="l02899" name="l02899"></a><span class="lineno"> 2899</span> free(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a>);</div>
<div class="line"><a id="l02900" name="l02900"></a><span class="lineno"> 2900</span> }</div>
<div class="line"><a id="l02901" name="l02901"></a><span class="lineno"> 2901</span> </div>
<div class="foldopen" id="foldopen02908" data-start="{" data-end="}">
<div class="line"><a id="l02908" name="l02908"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a6b59e4dd13195dd91211ece4c680cb9b"> 2908</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a6b59e4dd13195dd91211ece4c680cb9b">reserve</a>(_In_ <span class="keywordtype">size_t</span> required, _In_ <span class="keywordtype">bool</span> tight = <span class="keyword">false</span>) noexcept</div>
<div class="line"><a id="l02909" name="l02909"></a><span class="lineno"> 2909</span> {</div>
<div class="line"><a id="l02910" name="l02910"></a><span class="lineno"> 2910</span> <span class="keywordflow">if</span> (required &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c">m_reserved</a> &amp;&amp; (!tight || required &gt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c">m_reserved</a>)) {</div>
<div class="line"><a id="l02911" name="l02911"></a><span class="lineno"> 2911</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02912" name="l02912"></a><span class="lineno"> 2912</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02913" name="l02913"></a><span class="lineno"> 2913</span> }</div>
<div class="line"><a id="l02914" name="l02914"></a><span class="lineno"> 2914</span> <span class="keywordflow">if</span> (!<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#aca812d996b5b60660fa121787e4c0e68">m_manage</a>) {</div>
<div class="line"><a id="l02915" name="l02915"></a><span class="lineno"> 2915</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02916" name="l02916"></a><span class="lineno"> 2916</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02917" name="l02917"></a><span class="lineno"> 2917</span> }</div>
<div class="line"><a id="l02918" name="l02918"></a><span class="lineno"> 2918</span> <span class="keywordtype">size_t</span> reserved = tight ? required : ((required + required / 4 + (default_block_size - 1)) / default_block_size) * default_block_size;</div>
<div class="line"><a id="l02919" name="l02919"></a><span class="lineno"> 2919</span> <span class="keyword">auto</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a> = <span class="keyword">reinterpret_cast&lt;</span>uint8_t*<span class="keyword">&gt;</span>(realloc(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a>, reserved));</div>
<div class="line"><a id="l02920" name="l02920"></a><span class="lineno"> 2920</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a> &amp;&amp; reserved) _Unlikely_ {</div>
<div class="line"><a id="l02921" name="l02921"></a><span class="lineno"> 2921</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02922" name="l02922"></a><span class="lineno"> 2922</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02923" name="l02923"></a><span class="lineno"> 2923</span> }</div>
<div class="line"><a id="l02924" name="l02924"></a><span class="lineno"> 2924</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> = <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>;</div>
<div class="line"><a id="l02925" name="l02925"></a><span class="lineno"> 2925</span> <span class="keywordflow">if</span> (reserved &lt; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>)</div>
<div class="line"><a id="l02926" name="l02926"></a><span class="lineno"> 2926</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a> = reserved;</div>
<div class="line"><a id="l02927" name="l02927"></a><span class="lineno"> 2927</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c">m_reserved</a> = reserved;</div>
<div class="line"><a id="l02928" name="l02928"></a><span class="lineno"> 2928</span> m_state = state_t::ok;</div>
<div class="line"><a id="l02929" name="l02929"></a><span class="lineno"> 2929</span> }</div>
</div>
<div class="line"><a id="l02930" name="l02930"></a><span class="lineno"> 2930</span> </div>
<div class="foldopen" id="foldopen02937" data-start="{" data-end="}">
<div class="line"><a id="l02937" name="l02937"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a98f0a5ecb59b4e50d5990aa505b658c2"> 2937</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a98f0a5ecb59b4e50d5990aa505b658c2">load</a>(_In_z_ <span class="keyword">const</span> schar_t* filename, _In_ <span class="keywordtype">int</span> mode)</div>
<div class="line"><a id="l02938" name="l02938"></a><span class="lineno"> 2938</span> {</div>
<div class="line"><a id="l02939" name="l02939"></a><span class="lineno"> 2939</span> <a class="code hl_class" href="classstdex_1_1stream_1_1file.html">file</a> f(filename, (mode &amp; ~hint_random_access) | mode_for_reading | hint_sequential_access);</div>
<div class="line"><a id="l02940" name="l02940"></a><span class="lineno"> 2940</span> <span class="keywordflow">if</span> (!f.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) {</div>
<div class="line"><a id="l02941" name="l02941"></a><span class="lineno"> 2941</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02942" name="l02942"></a><span class="lineno"> 2942</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02943" name="l02943"></a><span class="lineno"> 2943</span> }</div>
<div class="line"><a id="l02944" name="l02944"></a><span class="lineno"> 2944</span> fsize_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a> = f.<a class="code hl_function" href="classstdex_1_1stream_1_1file.html#acc591c2378e51340b7af7fbf12d1a98f">size</a>();</div>
<div class="line"><a id="l02945" name="l02945"></a><span class="lineno"> 2945</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a> &gt; SIZE_MAX) {</div>
<div class="line"><a id="l02946" name="l02946"></a><span class="lineno"> 2946</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02947" name="l02947"></a><span class="lineno"> 2947</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02948" name="l02948"></a><span class="lineno"> 2948</span> }</div>
<div class="line"><a id="l02949" name="l02949"></a><span class="lineno"> 2949</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a6b59e4dd13195dd91211ece4c680cb9b">reserve</a>(<span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a>), <span class="keyword">true</span>);</div>
<div class="line"><a id="l02950" name="l02950"></a><span class="lineno"> 2950</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_ {</div>
<div class="line"><a id="l02951" name="l02951"></a><span class="lineno"> 2951</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02952" name="l02952"></a><span class="lineno"> 2952</span> }</div>
<div class="line"><a id="l02953" name="l02953"></a><span class="lineno"> 2953</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a> = 0;</div>
<div class="line"><a id="l02954" name="l02954"></a><span class="lineno"> 2954</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4216e7ae6e306170357aef1ea1c304c7">write_stream</a>(f);</div>
<div class="line"><a id="l02955" name="l02955"></a><span class="lineno"> 2955</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>())</div>
<div class="line"><a id="l02956" name="l02956"></a><span class="lineno"> 2956</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = 0;</div>
<div class="line"><a id="l02957" name="l02957"></a><span class="lineno"> 2957</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l02958" name="l02958"></a><span class="lineno"> 2958</span> m_ctime = f.<a class="code hl_function" href="classstdex_1_1stream_1_1file.html#aa54131619fe782de419ed74bab377dd5">ctime</a>();</div>
<div class="line"><a id="l02959" name="l02959"></a><span class="lineno"> 2959</span> m_atime = f.<a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a4b5cdfe6c9dccd20726df867e34f4af3">atime</a>();</div>
<div class="line"><a id="l02960" name="l02960"></a><span class="lineno"> 2960</span> m_mtime = f.<a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a23e1061f6a9473241ef8af99f6a3f08f">mtime</a>();</div>
<div class="line"><a id="l02961" name="l02961"></a><span class="lineno"> 2961</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02962" name="l02962"></a><span class="lineno"> 2962</span> }</div>
</div>
<div class="line"><a id="l02963" name="l02963"></a><span class="lineno"> 2963</span> </div>
<div class="foldopen" id="foldopen02970" data-start="{" data-end="}">
<div class="line"><a id="l02970" name="l02970"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a96210fbbca48af7097ddad7cc9bf6cb5"> 2970</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a96210fbbca48af7097ddad7cc9bf6cb5">save</a>(_In_z_ <span class="keyword">const</span> schar_t* filename, _In_ <span class="keywordtype">int</span> mode)</div>
<div class="line"><a id="l02971" name="l02971"></a><span class="lineno"> 2971</span> {</div>
<div class="line"><a id="l02972" name="l02972"></a><span class="lineno"> 2972</span> <a class="code hl_class" href="classstdex_1_1stream_1_1file.html">file</a> f(filename, (mode &amp; ~hint_random_access) | mode_for_writing | hint_sequential_access);</div>
<div class="line"><a id="l02973" name="l02973"></a><span class="lineno"> 2973</span> <span class="keywordflow">if</span> (!f.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) {</div>
<div class="line"><a id="l02974" name="l02974"></a><span class="lineno"> 2974</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02975" name="l02975"></a><span class="lineno"> 2975</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02976" name="l02976"></a><span class="lineno"> 2976</span> }</div>
<div class="line"><a id="l02977" name="l02977"></a><span class="lineno"> 2977</span> f.<a class="code hl_function" href="classstdex_1_1stream_1_1basic__sys.html#a06666e09bf1e7486d277996267b51618">write</a>(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a>, <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>);</div>
<div class="line"><a id="l02978" name="l02978"></a><span class="lineno"> 2978</span> <span class="keywordflow">if</span> (!f.<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) {</div>
<div class="line"><a id="l02979" name="l02979"></a><span class="lineno"> 2979</span> m_state = state_t::fail;</div>
<div class="line"><a id="l02980" name="l02980"></a><span class="lineno"> 2980</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02981" name="l02981"></a><span class="lineno"> 2981</span> }</div>
<div class="line"><a id="l02982" name="l02982"></a><span class="lineno"> 2982</span> f.<a class="code hl_function" href="classstdex_1_1stream_1_1file.html#aa1c4de0bca72ddc02db4e8328cefcf17">truncate</a>();</div>
<div class="line"><a id="l02983" name="l02983"></a><span class="lineno"> 2983</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l02984" name="l02984"></a><span class="lineno"> 2984</span> f.<a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a337a27cd63975e155b6ba29a18ed9a23">set_ctime</a>(m_ctime);</div>
<div class="line"><a id="l02985" name="l02985"></a><span class="lineno"> 2985</span> f.<a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a64ded627a8843c155ea3a59b94c225f6">set_atime</a>(m_atime);</div>
<div class="line"><a id="l02986" name="l02986"></a><span class="lineno"> 2986</span> f.<a class="code hl_function" href="classstdex_1_1stream_1_1file.html#a567620d1eb84032e460f3e173f9bd762">set_mtime</a>(m_mtime);</div>
<div class="line"><a id="l02987" name="l02987"></a><span class="lineno"> 2987</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l02988" name="l02988"></a><span class="lineno"> 2988</span> }</div>
</div>
<div class="line"><a id="l02989" name="l02989"></a><span class="lineno"> 2989</span> </div>
<div class="line"><a id="l02993" name="l02993"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce"> 2993</a></span> <span class="keyword">inline</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a>; }</div>
<div class="line"><a id="l02994" name="l02994"></a><span class="lineno"> 2994</span> </div>
<div class="foldopen" id="foldopen02995" data-start="{" data-end="}">
<div class="line"><a id="l02995" name="l02995"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a62a05e7dfb1f374dff881f922543e601"> 2995</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a62a05e7dfb1f374dff881f922543e601">read</a>(</div>
<div class="line"><a id="l02996" name="l02996"></a><span class="lineno"> 2996</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l02997" name="l02997"></a><span class="lineno"> 2997</span> {</div>
<div class="line"><a id="l02998" name="l02998"></a><span class="lineno"> 2998</span> assert(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a> || !length);</div>
<div class="line"><a id="l02999" name="l02999"></a><span class="lineno"> 2999</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03000" name="l03000"></a><span class="lineno"> 3000</span> m_atime = time_point::now();</div>
<div class="line"><a id="l03001" name="l03001"></a><span class="lineno"> 3001</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03002" name="l03002"></a><span class="lineno"> 3002</span> <span class="keywordtype">size_t</span> available = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a> - <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>;</div>
<div class="line"><a id="l03003" name="l03003"></a><span class="lineno"> 3003</span> <span class="keywordflow">if</span> (length &lt;= available) {</div>
<div class="line"><a id="l03004" name="l03004"></a><span class="lineno"> 3004</span> memcpy(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>, <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>, length);</div>
<div class="line"><a id="l03005" name="l03005"></a><span class="lineno"> 3005</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> += length;</div>
<div class="line"><a id="l03006" name="l03006"></a><span class="lineno"> 3006</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03007" name="l03007"></a><span class="lineno"> 3007</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l03008" name="l03008"></a><span class="lineno"> 3008</span> }</div>
<div class="line"><a id="l03009" name="l03009"></a><span class="lineno"> 3009</span> <span class="keywordflow">if</span> (length &amp;&amp; !available) {</div>
<div class="line"><a id="l03010" name="l03010"></a><span class="lineno"> 3010</span> m_state = state_t::eof;</div>
<div class="line"><a id="l03011" name="l03011"></a><span class="lineno"> 3011</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l03012" name="l03012"></a><span class="lineno"> 3012</span> }</div>
<div class="line"><a id="l03013" name="l03013"></a><span class="lineno"> 3013</span> memcpy(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>, <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>, available);</div>
<div class="line"><a id="l03014" name="l03014"></a><span class="lineno"> 3014</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> += available;</div>
<div class="line"><a id="l03015" name="l03015"></a><span class="lineno"> 3015</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03016" name="l03016"></a><span class="lineno"> 3016</span> <span class="keywordflow">return</span> available;</div>
<div class="line"><a id="l03017" name="l03017"></a><span class="lineno"> 3017</span> }</div>
</div>
<div class="line"><a id="l03018" name="l03018"></a><span class="lineno"> 3018</span> </div>
<div class="line"><a id="l03033" name="l03033"></a><span class="lineno"> 3033</span> <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="foldopen" id="foldopen03034" data-start="{" data-end="}">
<div class="line"><a id="l03034" name="l03034"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b"> 3034</a></span> <span class="keyword">inline</span> <a class="code hl_class" href="classstdex_1_1stream_1_1memory__file.html">memory_file</a>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">read_data</a>(T &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>)</div>
<div class="line"><a id="l03035" name="l03035"></a><span class="lineno"> 3035</span> {</div>
<div class="line"><a id="l03036" name="l03036"></a><span class="lineno"> 3036</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03037" name="l03037"></a><span class="lineno"> 3037</span> m_atime = time_point::now();</div>
<div class="line"><a id="l03038" name="l03038"></a><span class="lineno"> 3038</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03039" name="l03039"></a><span class="lineno"> 3039</span> <span class="keywordflow">if</span> (CHECK_STREAM_STATE &amp;&amp; !<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_ {</div>
<div class="line"><a id="l03040" name="l03040"></a><span class="lineno"> 3040</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a> = 0;</div>
<div class="line"><a id="l03041" name="l03041"></a><span class="lineno"> 3041</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l03042" name="l03042"></a><span class="lineno"> 3042</span> }</div>
<div class="line"><a id="l03043" name="l03043"></a><span class="lineno"> 3043</span> <span class="keywordtype">size_t</span> end_offset = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> + <span class="keyword">sizeof</span>(T);</div>
<div class="line"><a id="l03044" name="l03044"></a><span class="lineno"> 3044</span> <span class="keywordflow">if</span> (end_offset &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>) {</div>
<div class="line"><a id="l03045" name="l03045"></a><span class="lineno"> 3045</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a> = LE2HE(*<span class="keyword">reinterpret_cast&lt;</span>T*<span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>));</div>
<div class="line"><a id="l03046" name="l03046"></a><span class="lineno"> 3046</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = end_offset;</div>
<div class="line"><a id="l03047" name="l03047"></a><span class="lineno"> 3047</span><span class="preprocessor">#if !CHECK_STREAM_STATE</span></div>
<div class="line"><a id="l03048" name="l03048"></a><span class="lineno"> 3048</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03049" name="l03049"></a><span class="lineno"> 3049</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03050" name="l03050"></a><span class="lineno"> 3050</span> }</div>
<div class="line"><a id="l03051" name="l03051"></a><span class="lineno"> 3051</span> <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l03052" name="l03052"></a><span class="lineno"> 3052</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a> = 0;</div>
<div class="line"><a id="l03053" name="l03053"></a><span class="lineno"> 3053</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>;</div>
<div class="line"><a id="l03054" name="l03054"></a><span class="lineno"> 3054</span> m_state = state_t::eof;</div>
<div class="line"><a id="l03055" name="l03055"></a><span class="lineno"> 3055</span> }</div>
<div class="line"><a id="l03056" name="l03056"></a><span class="lineno"> 3056</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l03057" name="l03057"></a><span class="lineno"> 3057</span> }</div>
</div>
<div class="line"><a id="l03058" name="l03058"></a><span class="lineno"> 3058</span> </div>
<div class="line"><a id="l03073" name="l03073"></a><span class="lineno"> 3073</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Elem, <span class="keyword">class</span> _Traits = std::<span class="keywordtype">char</span>_traits&lt;_Elem&gt;, <span class="keyword">class</span> _Ax = std::allocator&lt;_Elem&gt;&gt;</div>
<div class="foldopen" id="foldopen03074" data-start="{" data-end="}">
<div class="line"><a id="l03074" name="l03074"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a7a8abbdd7f86e10ffb711621015645f6"> 3074</a></span> <a class="code hl_class" href="classstdex_1_1stream_1_1memory__file.html">memory_file</a>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a7a8abbdd7f86e10ffb711621015645f6">read_str</a>(_Inout_ std::basic_string&lt;_Elem, _Traits, _Ax&gt;&amp;<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>)</div>
<div class="line"><a id="l03075" name="l03075"></a><span class="lineno"> 3075</span> {</div>
<div class="line"><a id="l03076" name="l03076"></a><span class="lineno"> 3076</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03077" name="l03077"></a><span class="lineno"> 3077</span> m_atime = time_point::now();</div>
<div class="line"><a id="l03078" name="l03078"></a><span class="lineno"> 3078</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03079" name="l03079"></a><span class="lineno"> 3079</span> <span class="keywordflow">if</span> (CHECK_STREAM_STATE &amp;&amp; !<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_ {</div>
<div class="line"><a id="l03080" name="l03080"></a><span class="lineno"> 3080</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>.clear();</div>
<div class="line"><a id="l03081" name="l03081"></a><span class="lineno"> 3081</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l03082" name="l03082"></a><span class="lineno"> 3082</span> }</div>
<div class="line"><a id="l03083" name="l03083"></a><span class="lineno"> 3083</span> <span class="keywordtype">size_t</span> end_offset = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> + <span class="keyword">sizeof</span>(uint32_t);</div>
<div class="line"><a id="l03084" name="l03084"></a><span class="lineno"> 3084</span> <span class="keywordflow">if</span> (end_offset &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>) {</div>
<div class="line"><a id="l03085" name="l03085"></a><span class="lineno"> 3085</span> uint32_t num_chars = LE2HE(*<span class="keyword">reinterpret_cast&lt;</span>uint32_t*<span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>));</div>
<div class="line"><a id="l03086" name="l03086"></a><span class="lineno"> 3086</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = end_offset;</div>
<div class="line"><a id="l03087" name="l03087"></a><span class="lineno"> 3087</span> end_offset = stdex::add(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>, stdex::mul(num_chars, <span class="keyword">sizeof</span>(_Elem)));</div>
<div class="line"><a id="l03088" name="l03088"></a><span class="lineno"> 3088</span> _Elem* start = <span class="keyword">reinterpret_cast&lt;</span>_Elem*<span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>);</div>
<div class="line"><a id="l03089" name="l03089"></a><span class="lineno"> 3089</span> <span class="keywordflow">if</span> (end_offset &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>) {</div>
<div class="line"><a id="l03090" name="l03090"></a><span class="lineno"> 3090</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>.assign(start, start + num_chars);</div>
<div class="line"><a id="l03091" name="l03091"></a><span class="lineno"> 3091</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = end_offset;</div>
<div class="line"><a id="l03092" name="l03092"></a><span class="lineno"> 3092</span><span class="preprocessor">#if !CHECK_STREAM_STATE</span></div>
<div class="line"><a id="l03093" name="l03093"></a><span class="lineno"> 3093</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03094" name="l03094"></a><span class="lineno"> 3094</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03095" name="l03095"></a><span class="lineno"> 3095</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l03096" name="l03096"></a><span class="lineno"> 3096</span> }</div>
<div class="line"><a id="l03097" name="l03097"></a><span class="lineno"> 3097</span> <span class="keywordflow">if</span> (end_offset &lt;= <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>)</div>
<div class="line"><a id="l03098" name="l03098"></a><span class="lineno"> 3098</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>.assign(start, <span class="keyword">reinterpret_cast&lt;</span>_Elem*<span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>));</div>
<div class="line"><a id="l03099" name="l03099"></a><span class="lineno"> 3099</span> }</div>
<div class="line"><a id="l03100" name="l03100"></a><span class="lineno"> 3100</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>;</div>
<div class="line"><a id="l03101" name="l03101"></a><span class="lineno"> 3101</span> m_state = state_t::eof;</div>
<div class="line"><a id="l03102" name="l03102"></a><span class="lineno"> 3102</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l03103" name="l03103"></a><span class="lineno"> 3103</span> }</div>
</div>
<div class="line"><a id="l03104" name="l03104"></a><span class="lineno"> 3104</span> </div>
<div class="foldopen" id="foldopen03105" data-start="{" data-end="}">
<div class="line"><a id="l03105" name="l03105"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#ae5b6602e176f1053ab2eef88d8312b49"> 3105</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ae5b6602e176f1053ab2eef88d8312b49">write</a>(</div>
<div class="line"><a id="l03106" name="l03106"></a><span class="lineno"> 3106</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l03107" name="l03107"></a><span class="lineno"> 3107</span> {</div>
<div class="line"><a id="l03108" name="l03108"></a><span class="lineno"> 3108</span> assert(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a> || !length);</div>
<div class="line"><a id="l03109" name="l03109"></a><span class="lineno"> 3109</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03110" name="l03110"></a><span class="lineno"> 3110</span> m_atime = m_mtime = time_point::now();</div>
<div class="line"><a id="l03111" name="l03111"></a><span class="lineno"> 3111</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03112" name="l03112"></a><span class="lineno"> 3112</span> <span class="keywordtype">size_t</span> end_offset = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> + length;</div>
<div class="line"><a id="l03113" name="l03113"></a><span class="lineno"> 3113</span> <span class="keywordflow">if</span> (end_offset &gt; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c">m_reserved</a>) {</div>
<div class="line"><a id="l03114" name="l03114"></a><span class="lineno"> 3114</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a6b59e4dd13195dd91211ece4c680cb9b">reserve</a>(end_offset);</div>
<div class="line"><a id="l03115" name="l03115"></a><span class="lineno"> 3115</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l03116" name="l03116"></a><span class="lineno"> 3116</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l03117" name="l03117"></a><span class="lineno"> 3117</span> }</div>
<div class="line"><a id="l03118" name="l03118"></a><span class="lineno"> 3118</span> memcpy(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>, length);</div>
<div class="line"><a id="l03119" name="l03119"></a><span class="lineno"> 3119</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = end_offset;</div>
<div class="line"><a id="l03120" name="l03120"></a><span class="lineno"> 3120</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> &gt; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>)</div>
<div class="line"><a id="l03121" name="l03121"></a><span class="lineno"> 3121</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a> = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>;</div>
<div class="line"><a id="l03122" name="l03122"></a><span class="lineno"> 3122</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03123" name="l03123"></a><span class="lineno"> 3123</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l03124" name="l03124"></a><span class="lineno"> 3124</span> }</div>
</div>
<div class="line"><a id="l03125" name="l03125"></a><span class="lineno"> 3125</span> </div>
<div class="foldopen" id="foldopen03129" data-start="{" data-end="}">
<div class="line"><a id="l03129" name="l03129"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a7d2187e9f98729b2c711a9cd242b7fc2"> 3129</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a7d2187e9f98729b2c711a9cd242b7fc2">write_byte</a>(_In_ uint8_t <span class="keywordtype">byte</span>, _In_ <span class="keywordtype">size_t</span> amount = 1)</div>
<div class="line"><a id="l03130" name="l03130"></a><span class="lineno"> 3130</span> {</div>
<div class="line"><a id="l03131" name="l03131"></a><span class="lineno"> 3131</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03132" name="l03132"></a><span class="lineno"> 3132</span> m_atime = m_mtime = time_point::now();</div>
<div class="line"><a id="l03133" name="l03133"></a><span class="lineno"> 3133</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03134" name="l03134"></a><span class="lineno"> 3134</span> <span class="keywordtype">size_t</span> end_offset = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> + amount;</div>
<div class="line"><a id="l03135" name="l03135"></a><span class="lineno"> 3135</span> <span class="keywordflow">if</span> (end_offset &gt; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c">m_reserved</a>) {</div>
<div class="line"><a id="l03136" name="l03136"></a><span class="lineno"> 3136</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a6b59e4dd13195dd91211ece4c680cb9b">reserve</a>(end_offset);</div>
<div class="line"><a id="l03137" name="l03137"></a><span class="lineno"> 3137</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l03138" name="l03138"></a><span class="lineno"> 3138</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l03139" name="l03139"></a><span class="lineno"> 3139</span> }</div>
<div class="line"><a id="l03140" name="l03140"></a><span class="lineno"> 3140</span> memset(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>, <span class="keywordtype">byte</span>, amount);</div>
<div class="line"><a id="l03141" name="l03141"></a><span class="lineno"> 3141</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = end_offset;</div>
<div class="line"><a id="l03142" name="l03142"></a><span class="lineno"> 3142</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> &gt; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>)</div>
<div class="line"><a id="l03143" name="l03143"></a><span class="lineno"> 3143</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a> = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>;</div>
<div class="line"><a id="l03144" name="l03144"></a><span class="lineno"> 3144</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03145" name="l03145"></a><span class="lineno"> 3145</span> }</div>
</div>
<div class="line"><a id="l03146" name="l03146"></a><span class="lineno"> 3146</span> </div>
<div class="line"><a id="l03161" name="l03161"></a><span class="lineno"> 3161</span> <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="foldopen" id="foldopen03162" data-start="{" data-end="}">
<div class="line"><a id="l03162" name="l03162"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332"> 3162</a></span> <span class="keyword">inline</span> <a class="code hl_class" href="classstdex_1_1stream_1_1memory__file.html">memory_file</a>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">write_data</a>(<span class="keyword">const</span> T <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>)</div>
<div class="line"><a id="l03163" name="l03163"></a><span class="lineno"> 3163</span> {</div>
<div class="line"><a id="l03164" name="l03164"></a><span class="lineno"> 3164</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03165" name="l03165"></a><span class="lineno"> 3165</span> m_atime = m_mtime = time_point::now();</div>
<div class="line"><a id="l03166" name="l03166"></a><span class="lineno"> 3166</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03167" name="l03167"></a><span class="lineno"> 3167</span> <span class="keywordflow">if</span> (CHECK_STREAM_STATE &amp;&amp; !<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l03168" name="l03168"></a><span class="lineno"> 3168</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l03169" name="l03169"></a><span class="lineno"> 3169</span> <span class="keywordtype">size_t</span> end_offset = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> + <span class="keyword">sizeof</span>(T);</div>
<div class="line"><a id="l03170" name="l03170"></a><span class="lineno"> 3170</span> <span class="keywordflow">if</span> (end_offset &gt; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c">m_reserved</a>) {</div>
<div class="line"><a id="l03171" name="l03171"></a><span class="lineno"> 3171</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a6b59e4dd13195dd91211ece4c680cb9b">reserve</a>(end_offset);</div>
<div class="line"><a id="l03172" name="l03172"></a><span class="lineno"> 3172</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l03173" name="l03173"></a><span class="lineno"> 3173</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l03174" name="l03174"></a><span class="lineno"> 3174</span> }</div>
<div class="line"><a id="l03175" name="l03175"></a><span class="lineno"> 3175</span> (*<span class="keyword">reinterpret_cast&lt;</span>T*<span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>)) = HE2LE(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>);</div>
<div class="line"><a id="l03176" name="l03176"></a><span class="lineno"> 3176</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = end_offset;</div>
<div class="line"><a id="l03177" name="l03177"></a><span class="lineno"> 3177</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> &gt; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>)</div>
<div class="line"><a id="l03178" name="l03178"></a><span class="lineno"> 3178</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a> = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>;</div>
<div class="line"><a id="l03179" name="l03179"></a><span class="lineno"> 3179</span><span class="preprocessor">#if !CHECK_STREAM_STATE</span></div>
<div class="line"><a id="l03180" name="l03180"></a><span class="lineno"> 3180</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03181" name="l03181"></a><span class="lineno"> 3181</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03182" name="l03182"></a><span class="lineno"> 3182</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l03183" name="l03183"></a><span class="lineno"> 3183</span> }</div>
</div>
<div class="line"><a id="l03184" name="l03184"></a><span class="lineno"> 3184</span> </div>
<div class="line"><a id="l03199" name="l03199"></a><span class="lineno"> 3199</span> <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="foldopen" id="foldopen03200" data-start="{" data-end="}">
<div class="line"><a id="l03200" name="l03200"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#ab8326c16c06548801982b07c930d7dfd"> 3200</a></span> <span class="keyword">inline</span> <a class="code hl_class" href="classstdex_1_1stream_1_1memory__file.html">memory_file</a>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab8326c16c06548801982b07c930d7dfd">write_str</a>(_In_z_ <span class="keyword">const</span> T * <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>)</div>
<div class="line"><a id="l03201" name="l03201"></a><span class="lineno"> 3201</span> {</div>
<div class="line"><a id="l03202" name="l03202"></a><span class="lineno"> 3202</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03203" name="l03203"></a><span class="lineno"> 3203</span> m_atime = m_mtime = time_point::now();</div>
<div class="line"><a id="l03204" name="l03204"></a><span class="lineno"> 3204</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03205" name="l03205"></a><span class="lineno"> 3205</span> <span class="keywordflow">if</span> (CHECK_STREAM_STATE &amp;&amp; !<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l03206" name="l03206"></a><span class="lineno"> 3206</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l03207" name="l03207"></a><span class="lineno"> 3207</span> <span class="keywordtype">size_t</span> num_chars = stdex::strlen(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>);</div>
<div class="line"><a id="l03208" name="l03208"></a><span class="lineno"> 3208</span> <span class="keywordflow">if</span> (num_chars &gt; UINT32_MAX)</div>
<div class="line"><a id="l03209" name="l03209"></a><span class="lineno"> 3209</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;string too long&quot;</span>);</div>
<div class="line"><a id="l03210" name="l03210"></a><span class="lineno"> 3210</span> <span class="keywordtype">size_t</span> size_chars = num_chars * <span class="keyword">sizeof</span>(T);</div>
<div class="line"><a id="l03211" name="l03211"></a><span class="lineno"> 3211</span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a> = <span class="keyword">sizeof</span>(uint32_t) + size_chars;</div>
<div class="line"><a id="l03212" name="l03212"></a><span class="lineno"> 3212</span> <span class="keywordtype">size_t</span> end_offset = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> + <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a>;</div>
<div class="line"><a id="l03213" name="l03213"></a><span class="lineno"> 3213</span> <span class="keywordflow">if</span> (end_offset &gt; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c">m_reserved</a>) {</div>
<div class="line"><a id="l03214" name="l03214"></a><span class="lineno"> 3214</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a6b59e4dd13195dd91211ece4c680cb9b">reserve</a>(end_offset);</div>
<div class="line"><a id="l03215" name="l03215"></a><span class="lineno"> 3215</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l03216" name="l03216"></a><span class="lineno"> 3216</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l03217" name="l03217"></a><span class="lineno"> 3217</span> }</div>
<div class="line"><a id="l03218" name="l03218"></a><span class="lineno"> 3218</span> <span class="keyword">auto</span> p = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>;</div>
<div class="line"><a id="l03219" name="l03219"></a><span class="lineno"> 3219</span> *<span class="keyword">reinterpret_cast&lt;</span>uint32_t*<span class="keyword">&gt;</span>(p) = HE2LE((uint32_t)num_chars);</div>
<div class="line"><a id="l03220" name="l03220"></a><span class="lineno"> 3220</span> memcpy(p + <span class="keyword">sizeof</span>(uint32_t), <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>, size_chars);</div>
<div class="line"><a id="l03221" name="l03221"></a><span class="lineno"> 3221</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = end_offset;</div>
<div class="line"><a id="l03222" name="l03222"></a><span class="lineno"> 3222</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> &gt; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>)</div>
<div class="line"><a id="l03223" name="l03223"></a><span class="lineno"> 3223</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a> = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>;</div>
<div class="line"><a id="l03224" name="l03224"></a><span class="lineno"> 3224</span><span class="preprocessor">#if !CHECK_STREAM_STATE</span></div>
<div class="line"><a id="l03225" name="l03225"></a><span class="lineno"> 3225</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03226" name="l03226"></a><span class="lineno"> 3226</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03227" name="l03227"></a><span class="lineno"> 3227</span> <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div>
<div class="line"><a id="l03228" name="l03228"></a><span class="lineno"> 3228</span> }</div>
</div>
<div class="line"><a id="l03229" name="l03229"></a><span class="lineno"> 3229</span> </div>
<div class="foldopen" id="foldopen03235" data-start="{" data-end="}">
<div class="line"><a id="l03235" name="l03235"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a4216e7ae6e306170357aef1ea1c304c7"> 3235</a></span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4216e7ae6e306170357aef1ea1c304c7">write_stream</a>(_Inout_ <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a> &amp; stream, _In_ <span class="keywordtype">size_t</span> amount = SIZE_MAX)</div>
<div class="line"><a id="l03236" name="l03236"></a><span class="lineno"> 3236</span> {</div>
<div class="line"><a id="l03237" name="l03237"></a><span class="lineno"> 3237</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03238" name="l03238"></a><span class="lineno"> 3238</span> m_atime = m_mtime = time_point::now();</div>
<div class="line"><a id="l03239" name="l03239"></a><span class="lineno"> 3239</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03240" name="l03240"></a><span class="lineno"> 3240</span> <span class="keywordtype">size_t</span> num_read, dst_offset = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>, dst_size = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>;</div>
<div class="line"><a id="l03241" name="l03241"></a><span class="lineno"> 3241</span> <span class="keywordtype">size_t</span> num_copied = 0, to_write = amount;</div>
<div class="line"><a id="l03242" name="l03242"></a><span class="lineno"> 3242</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03243" name="l03243"></a><span class="lineno"> 3243</span> <span class="keywordflow">if</span> (amount != SIZE_MAX) {</div>
<div class="line"><a id="l03244" name="l03244"></a><span class="lineno"> 3244</span> dst_size = stdex::add(dst_size, amount);</div>
<div class="line"><a id="l03245" name="l03245"></a><span class="lineno"> 3245</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a6b59e4dd13195dd91211ece4c680cb9b">reserve</a>(dst_size);</div>
<div class="line"><a id="l03246" name="l03246"></a><span class="lineno"> 3246</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l03247" name="l03247"></a><span class="lineno"> 3247</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l03248" name="l03248"></a><span class="lineno"> 3248</span> <span class="keywordflow">while</span> (to_write) {</div>
<div class="line"><a id="l03249" name="l03249"></a><span class="lineno"> 3249</span> num_read = stream.read(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + dst_offset, to_write);</div>
<div class="line"><a id="l03250" name="l03250"></a><span class="lineno"> 3250</span> dst_size = dst_offset += num_read;</div>
<div class="line"><a id="l03251" name="l03251"></a><span class="lineno"> 3251</span> num_copied += num_read;</div>
<div class="line"><a id="l03252" name="l03252"></a><span class="lineno"> 3252</span> to_write -= num_read;</div>
<div class="line"><a id="l03253" name="l03253"></a><span class="lineno"> 3253</span> <span class="keywordflow">if</span> (!stream.ok()) {</div>
<div class="line"><a id="l03254" name="l03254"></a><span class="lineno"> 3254</span> <span class="keywordflow">if</span> (stream.state() != state_t::eof)</div>
<div class="line"><a id="l03255" name="l03255"></a><span class="lineno"> 3255</span> m_state = state_t::fail;</div>
<div class="line"><a id="l03256" name="l03256"></a><span class="lineno"> 3256</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l03257" name="l03257"></a><span class="lineno"> 3257</span> }</div>
<div class="line"><a id="l03258" name="l03258"></a><span class="lineno"> 3258</span> };</div>
<div class="line"><a id="l03259" name="l03259"></a><span class="lineno"> 3259</span> }</div>
<div class="line"><a id="l03260" name="l03260"></a><span class="lineno"> 3260</span> <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l03261" name="l03261"></a><span class="lineno"> 3261</span> <span class="keywordtype">size_t</span> block_size;</div>
<div class="line"><a id="l03262" name="l03262"></a><span class="lineno"> 3262</span> <span class="keywordflow">while</span> (to_write) {</div>
<div class="line"><a id="l03263" name="l03263"></a><span class="lineno"> 3263</span> block_size = std::min(to_write, default_block_size);</div>
<div class="line"><a id="l03264" name="l03264"></a><span class="lineno"> 3264</span> dst_size = stdex::add(dst_size, block_size);</div>
<div class="line"><a id="l03265" name="l03265"></a><span class="lineno"> 3265</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a6b59e4dd13195dd91211ece4c680cb9b">reserve</a>(dst_size);</div>
<div class="line"><a id="l03266" name="l03266"></a><span class="lineno"> 3266</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">ok</a>()) _Unlikely_</div>
<div class="line"><a id="l03267" name="l03267"></a><span class="lineno"> 3267</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l03268" name="l03268"></a><span class="lineno"> 3268</span> num_read = stream.read(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + dst_offset, block_size);</div>
<div class="line"><a id="l03269" name="l03269"></a><span class="lineno"> 3269</span> dst_size = dst_offset += num_read;</div>
<div class="line"><a id="l03270" name="l03270"></a><span class="lineno"> 3270</span> num_copied += num_read;</div>
<div class="line"><a id="l03271" name="l03271"></a><span class="lineno"> 3271</span> to_write -= num_read;</div>
<div class="line"><a id="l03272" name="l03272"></a><span class="lineno"> 3272</span> <span class="keywordflow">if</span> (!stream.ok()) {</div>
<div class="line"><a id="l03273" name="l03273"></a><span class="lineno"> 3273</span> <span class="keywordflow">if</span> (stream.state() != state_t::eof)</div>
<div class="line"><a id="l03274" name="l03274"></a><span class="lineno"> 3274</span> m_state = state_t::fail;</div>
<div class="line"><a id="l03275" name="l03275"></a><span class="lineno"> 3275</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l03276" name="l03276"></a><span class="lineno"> 3276</span> }</div>
<div class="line"><a id="l03277" name="l03277"></a><span class="lineno"> 3277</span> };</div>
<div class="line"><a id="l03278" name="l03278"></a><span class="lineno"> 3278</span> }</div>
<div class="line"><a id="l03279" name="l03279"></a><span class="lineno"> 3279</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = dst_offset;</div>
<div class="line"><a id="l03280" name="l03280"></a><span class="lineno"> 3280</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> &gt; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>)</div>
<div class="line"><a id="l03281" name="l03281"></a><span class="lineno"> 3281</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a> = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>;</div>
<div class="line"><a id="l03282" name="l03282"></a><span class="lineno"> 3282</span> <span class="keywordflow">return</span> num_copied;</div>
<div class="line"><a id="l03283" name="l03283"></a><span class="lineno"> 3283</span> }</div>
</div>
<div class="line"><a id="l03284" name="l03284"></a><span class="lineno"> 3284</span> </div>
<div class="foldopen" id="foldopen03285" data-start="{" data-end="}">
<div class="line"><a id="l03285" name="l03285"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a4cf33faaf1686335bd3e3a7e72813dd6"> 3285</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4cf33faaf1686335bd3e3a7e72813dd6">close</a>()</div>
<div class="line"><a id="l03286" name="l03286"></a><span class="lineno"> 3286</span> {</div>
<div class="line"><a id="l03287" name="l03287"></a><span class="lineno"> 3287</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#aca812d996b5b60660fa121787e4c0e68">m_manage</a> &amp;&amp; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a>)</div>
<div class="line"><a id="l03288" name="l03288"></a><span class="lineno"> 3288</span> free(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a>);</div>
<div class="line"><a id="l03289" name="l03289"></a><span class="lineno"> 3289</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l03290" name="l03290"></a><span class="lineno"> 3290</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#aca812d996b5b60660fa121787e4c0e68">m_manage</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l03291" name="l03291"></a><span class="lineno"> 3291</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = 0;</div>
<div class="line"><a id="l03292" name="l03292"></a><span class="lineno"> 3292</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a> = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c">m_reserved</a> = 0;</div>
<div class="line"><a id="l03293" name="l03293"></a><span class="lineno"> 3293</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03294" name="l03294"></a><span class="lineno"> 3294</span> m_ctime = m_atime = m_mtime = time_point::min();</div>
<div class="line"><a id="l03295" name="l03295"></a><span class="lineno"> 3295</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03296" name="l03296"></a><span class="lineno"> 3296</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03297" name="l03297"></a><span class="lineno"> 3297</span> }</div>
</div>
<div class="line"><a id="l03298" name="l03298"></a><span class="lineno"> 3298</span> </div>
<div class="foldopen" id="foldopen03299" data-start="{" data-end="}">
<div class="line"><a id="l03299" name="l03299"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a9e67e40e9e3c0f7b002fcdab5220b4e7"> 3299</a></span> <span class="keyword">virtual</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a9e67e40e9e3c0f7b002fcdab5220b4e7">seek</a>(_In_ foff_t offset, _In_ seek_t how = seek_t::beg)</div>
<div class="line"><a id="l03300" name="l03300"></a><span class="lineno"> 3300</span> {</div>
<div class="line"><a id="l03301" name="l03301"></a><span class="lineno"> 3301</span> fpos_t target;</div>
<div class="line"><a id="l03302" name="l03302"></a><span class="lineno"> 3302</span> <span class="keywordflow">switch</span> (how) {</div>
<div class="line"><a id="l03303" name="l03303"></a><span class="lineno"> 3303</span> <span class="keywordflow">case</span> seek_t::beg: target = offset; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l03304" name="l03304"></a><span class="lineno"> 3304</span> <span class="keywordflow">case</span> seek_t::cur: target = <span class="keyword">static_cast&lt;</span>fpos_t<span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>) + offset; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l03305" name="l03305"></a><span class="lineno"> 3305</span> <span class="keywordflow">case</span> seek_t::end: target = <span class="keyword">static_cast&lt;</span>fpos_t<span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>) + offset; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l03306" name="l03306"></a><span class="lineno"> 3306</span> <span class="keywordflow">default</span>: <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;unknown seek origin&quot;</span>);</div>
<div class="line"><a id="l03307" name="l03307"></a><span class="lineno"> 3307</span> }</div>
<div class="line"><a id="l03308" name="l03308"></a><span class="lineno"> 3308</span> <span class="keywordflow">if</span> (target &lt;= SIZE_MAX) {</div>
<div class="line"><a id="l03309" name="l03309"></a><span class="lineno"> 3309</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03310" name="l03310"></a><span class="lineno"> 3310</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a> = <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(target);</div>
<div class="line"><a id="l03311" name="l03311"></a><span class="lineno"> 3311</span> }</div>
<div class="line"><a id="l03312" name="l03312"></a><span class="lineno"> 3312</span> m_state = state_t::fail;</div>
<div class="line"><a id="l03313" name="l03313"></a><span class="lineno"> 3313</span> <span class="keywordflow">return</span> fpos_max;</div>
<div class="line"><a id="l03314" name="l03314"></a><span class="lineno"> 3314</span> }</div>
</div>
<div class="line"><a id="l03315" name="l03315"></a><span class="lineno"> 3315</span> </div>
<div class="foldopen" id="foldopen03316" data-start="{" data-end="}">
<div class="line"><a id="l03316" name="l03316"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a665d78bdb906762139530035ba6013fa"> 3316</a></span> <span class="keyword">virtual</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a665d78bdb906762139530035ba6013fa">tell</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l03317" name="l03317"></a><span class="lineno"> 3317</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l03318" name="l03318"></a><span class="lineno"> 3318</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>;</div>
<div class="line"><a id="l03319" name="l03319"></a><span class="lineno"> 3319</span> }</div>
</div>
<div class="line"><a id="l03320" name="l03320"></a><span class="lineno"> 3320</span> </div>
<div class="foldopen" id="foldopen03321" data-start="{" data-end="}">
<div class="line"><a id="l03321" name="l03321"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c"> 3321</a></span> <span class="keyword">virtual</span> fsize_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">size</a>()</div>
<div class="line"><a id="l03322" name="l03322"></a><span class="lineno"> 3322</span> {</div>
<div class="line"><a id="l03323" name="l03323"></a><span class="lineno"> 3323</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>;</div>
<div class="line"><a id="l03324" name="l03324"></a><span class="lineno"> 3324</span> }</div>
</div>
<div class="line"><a id="l03325" name="l03325"></a><span class="lineno"> 3325</span> </div>
<div class="foldopen" id="foldopen03326" data-start="{" data-end="}">
<div class="line"><a id="l03326" name="l03326"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#aa35db1681e5c56046eaf0c70068b0d42"> 3326</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aa35db1681e5c56046eaf0c70068b0d42">truncate</a>()</div>
<div class="line"><a id="l03327" name="l03327"></a><span class="lineno"> 3327</span> {</div>
<div class="line"><a id="l03328" name="l03328"></a><span class="lineno"> 3328</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03329" name="l03329"></a><span class="lineno"> 3329</span> m_atime = m_mtime = time_point::now();</div>
<div class="line"><a id="l03330" name="l03330"></a><span class="lineno"> 3330</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03331" name="l03331"></a><span class="lineno"> 3331</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a> = <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>;</div>
<div class="line"><a id="l03332" name="l03332"></a><span class="lineno"> 3332</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a6b59e4dd13195dd91211ece4c680cb9b">reserve</a>(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>);</div>
<div class="line"><a id="l03333" name="l03333"></a><span class="lineno"> 3333</span> }</div>
</div>
<div class="line"><a id="l03334" name="l03334"></a><span class="lineno"> 3334</span> </div>
<div class="line"><a id="l03335" name="l03335"></a><span class="lineno"> 3335</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03336" name="l03336"></a><span class="lineno"> 3336</span> <span class="keyword">virtual</span> time_point <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a3c02c83246c43ed868dab1dd5a5d698d">ctime</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l03337" name="l03337"></a><span class="lineno"> 3337</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l03338" name="l03338"></a><span class="lineno"> 3338</span> <span class="keywordflow">return</span> m_ctime;</div>
<div class="line"><a id="l03339" name="l03339"></a><span class="lineno"> 3339</span> }</div>
<div class="line"><a id="l03340" name="l03340"></a><span class="lineno"> 3340</span> </div>
<div class="line"><a id="l03341" name="l03341"></a><span class="lineno"> 3341</span> <span class="keyword">virtual</span> time_point <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a84936e230100934793aad8a516efa826">atime</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l03342" name="l03342"></a><span class="lineno"> 3342</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l03343" name="l03343"></a><span class="lineno"> 3343</span> <span class="keywordflow">return</span> m_atime;</div>
<div class="line"><a id="l03344" name="l03344"></a><span class="lineno"> 3344</span> }</div>
<div class="line"><a id="l03345" name="l03345"></a><span class="lineno"> 3345</span> </div>
<div class="line"><a id="l03346" name="l03346"></a><span class="lineno"> 3346</span> <span class="keyword">virtual</span> time_point <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ae10432137e01b7ce7c254c2a455c719e">mtime</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l03347" name="l03347"></a><span class="lineno"> 3347</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l03348" name="l03348"></a><span class="lineno"> 3348</span> <span class="keywordflow">return</span> m_mtime;</div>
<div class="line"><a id="l03349" name="l03349"></a><span class="lineno"> 3349</span> }</div>
<div class="line"><a id="l03350" name="l03350"></a><span class="lineno"> 3350</span> </div>
<div class="line"><a id="l03351" name="l03351"></a><span class="lineno"> 3351</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#aba668e53fc4709cd545f12a49521ed56">set_ctime</a>(time_point date)</div>
<div class="line"><a id="l03352" name="l03352"></a><span class="lineno"> 3352</span> {</div>
<div class="line"><a id="l03353" name="l03353"></a><span class="lineno"> 3353</span> m_ctime = date;</div>
<div class="line"><a id="l03354" name="l03354"></a><span class="lineno"> 3354</span> }</div>
<div class="line"><a id="l03355" name="l03355"></a><span class="lineno"> 3355</span> </div>
<div class="line"><a id="l03356" name="l03356"></a><span class="lineno"> 3356</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#ae76436514ac66d88bbd584ea07d879d0">set_atime</a>(time_point date)</div>
<div class="line"><a id="l03357" name="l03357"></a><span class="lineno"> 3357</span> {</div>
<div class="line"><a id="l03358" name="l03358"></a><span class="lineno"> 3358</span> m_atime = date;</div>
<div class="line"><a id="l03359" name="l03359"></a><span class="lineno"> 3359</span> }</div>
<div class="line"><a id="l03360" name="l03360"></a><span class="lineno"> 3360</span> </div>
<div class="line"><a id="l03361" name="l03361"></a><span class="lineno"> 3361</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1basic__file.html#a814a080cb6da2041013749cc125bfd2b">set_mtime</a>(time_point date)</div>
<div class="line"><a id="l03362" name="l03362"></a><span class="lineno"> 3362</span> {</div>
<div class="line"><a id="l03363" name="l03363"></a><span class="lineno"> 3363</span> m_mtime = date;</div>
<div class="line"><a id="l03364" name="l03364"></a><span class="lineno"> 3364</span> }</div>
<div class="line"><a id="l03365" name="l03365"></a><span class="lineno"> 3365</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03366" name="l03366"></a><span class="lineno"> 3366</span> </div>
<div class="line"><a id="l03367" name="l03367"></a><span class="lineno"> 3367</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l03375" name="l03375"></a><span class="lineno"> 3375</span> <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="foldopen" id="foldopen03376" data-start="{" data-end="}">
<div class="line"><a id="l03376" name="l03376"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571"> 3376</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">set</a>(_In_ fpos_t offset, _In_ <span class="keyword">const</span> T <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>)</div>
<div class="line"><a id="l03377" name="l03377"></a><span class="lineno"> 3377</span> {</div>
<div class="line"><a id="l03378" name="l03378"></a><span class="lineno"> 3378</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03379" name="l03379"></a><span class="lineno"> 3379</span> m_atime = m_mtime = time_point::now();</div>
<div class="line"><a id="l03380" name="l03380"></a><span class="lineno"> 3380</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03381" name="l03381"></a><span class="lineno"> 3381</span> assert(offset + <span class="keyword">sizeof</span>(T) &lt; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>);</div>
<div class="line"><a id="l03382" name="l03382"></a><span class="lineno"> 3382</span> (*<span class="keyword">reinterpret_cast&lt;</span>T*<span class="keyword">&gt;</span>(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + offset)) = HE2LE(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>);</div>
<div class="line"><a id="l03383" name="l03383"></a><span class="lineno"> 3383</span> }</div>
</div>
<div class="line"><a id="l03384" name="l03384"></a><span class="lineno"> 3384</span> </div>
<div class="line"><a id="l03385" name="l03385"></a><span class="lineno"> 3385</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l03386" name="l03386"></a><span class="lineno"> 3386</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">set</a>(_In_ fpos_t offset, _In_ <span class="keyword">const</span> int8_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { set&lt;int8_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03387" name="l03387"></a><span class="lineno"> 3387</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">set</a>(_In_ fpos_t offset, _In_ <span class="keyword">const</span> int16_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { set&lt;int16_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03388" name="l03388"></a><span class="lineno"> 3388</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">set</a>(_In_ fpos_t offset, _In_ <span class="keyword">const</span> int32_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { set&lt;int32_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03389" name="l03389"></a><span class="lineno"> 3389</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">set</a>(_In_ fpos_t offset, _In_ <span class="keyword">const</span> int64_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { set&lt;int64_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03390" name="l03390"></a><span class="lineno"> 3390</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">set</a>(_In_ fpos_t offset, _In_ <span class="keyword">const</span> uint8_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { set&lt;uint8_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03391" name="l03391"></a><span class="lineno"> 3391</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">set</a>(_In_ fpos_t offset, _In_ <span class="keyword">const</span> uint16_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { set&lt;uint16_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03392" name="l03392"></a><span class="lineno"> 3392</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">set</a>(_In_ fpos_t offset, _In_ <span class="keyword">const</span> uint32_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { set&lt;uint32_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03393" name="l03393"></a><span class="lineno"> 3393</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">set</a>(_In_ fpos_t offset, _In_ <span class="keyword">const</span> uint64_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { set&lt;uint64_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03394" name="l03394"></a><span class="lineno"> 3394</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">set</a>(_In_ fpos_t offset, _In_ <span class="keyword">const</span> <span class="keywordtype">float</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { set&lt;float&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03395" name="l03395"></a><span class="lineno"> 3395</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">set</a>(_In_ fpos_t offset, _In_ <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { set&lt;double&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03396" name="l03396"></a><span class="lineno"> 3396</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">set</a>(_In_ fpos_t offset, _In_ <span class="keyword">const</span> <span class="keywordtype">char</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { set&lt;char&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03397" name="l03397"></a><span class="lineno"> 3397</span><span class="preprocessor">#ifdef _NATIVE_WCHAR_T_DEFINED</span></div>
<div class="line"><a id="l03398" name="l03398"></a><span class="lineno"> 3398</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">set</a>(_In_ fpos_t offset, _In_ <span class="keyword">const</span> <span class="keywordtype">wchar_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { set&lt;wchar_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03399" name="l03399"></a><span class="lineno"> 3399</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03400" name="l03400"></a><span class="lineno"> 3400</span> </div>
<div class="line"><a id="l03408" name="l03408"></a><span class="lineno"> 3408</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l03409" name="l03409"></a><span class="lineno"> 3409</span> <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="foldopen" id="foldopen03410" data-start="{" data-end="}">
<div class="line"><a id="l03410" name="l03410"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1"> 3410</a></span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">get</a>(_In_ fpos_t offset, _Out_ T &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>)</div>
<div class="line"><a id="l03411" name="l03411"></a><span class="lineno"> 3411</span> {</div>
<div class="line"><a id="l03412" name="l03412"></a><span class="lineno"> 3412</span> assert(offset + <span class="keyword">sizeof</span>(T) &lt; <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>);</div>
<div class="line"><a id="l03413" name="l03413"></a><span class="lineno"> 3413</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a> = LE2HE(*(T*)(<a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a> + offset));</div>
<div class="line"><a id="l03414" name="l03414"></a><span class="lineno"> 3414</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03415" name="l03415"></a><span class="lineno"> 3415</span> m_atime = time_point::now();</div>
<div class="line"><a id="l03416" name="l03416"></a><span class="lineno"> 3416</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03417" name="l03417"></a><span class="lineno"> 3417</span> }</div>
</div>
<div class="line"><a id="l03418" name="l03418"></a><span class="lineno"> 3418</span> </div>
<div class="line"><a id="l03419" name="l03419"></a><span class="lineno"> 3419</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l03420" name="l03420"></a><span class="lineno"> 3420</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">get</a>(_In_ fpos_t offset, _Out_ int8_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { get&lt;int8_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03421" name="l03421"></a><span class="lineno"> 3421</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">get</a>(_In_ fpos_t offset, _Out_ int16_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { get&lt;int16_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03422" name="l03422"></a><span class="lineno"> 3422</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">get</a>(_In_ fpos_t offset, _Out_ int32_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { get&lt;int32_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03423" name="l03423"></a><span class="lineno"> 3423</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">get</a>(_In_ fpos_t offset, _Out_ int64_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { get&lt;int64_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03424" name="l03424"></a><span class="lineno"> 3424</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">get</a>(_In_ fpos_t offset, _Out_ uint8_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { get&lt;uint8_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03425" name="l03425"></a><span class="lineno"> 3425</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">get</a>(_In_ fpos_t offset, _Out_ uint16_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { get&lt;uint16_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03426" name="l03426"></a><span class="lineno"> 3426</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">get</a>(_In_ fpos_t offset, _Out_ uint32_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { get&lt;uint32_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03427" name="l03427"></a><span class="lineno"> 3427</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">get</a>(_In_ fpos_t offset, _Out_ uint64_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { get&lt;uint64_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03428" name="l03428"></a><span class="lineno"> 3428</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">get</a>(_In_ fpos_t offset, _Out_ <span class="keywordtype">float</span>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { get&lt;float&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03429" name="l03429"></a><span class="lineno"> 3429</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">get</a>(_In_ fpos_t offset, _Out_ <span class="keywordtype">double</span>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { get&lt;double&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03430" name="l03430"></a><span class="lineno"> 3430</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">get</a>(_In_ fpos_t offset, _Out_ <span class="keywordtype">char</span>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { get&lt;char&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03431" name="l03431"></a><span class="lineno"> 3431</span><span class="preprocessor">#ifdef _NATIVE_WCHAR_T_DEFINED</span></div>
<div class="line"><a id="l03432" name="l03432"></a><span class="lineno"> 3432</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">get</a>(_In_ fpos_t offset, _Out_ <span class="keywordtype">wchar_t</span>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { get&lt;wchar_t&gt;(offset, <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03433" name="l03433"></a><span class="lineno"> 3433</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03434" name="l03434"></a><span class="lineno"> 3434</span> </div>
<div class="line"><a id="l03435" name="l03435"></a><span class="lineno"> 3435</span> <span class="keyword">inline</span> memory_file&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> int8_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">write_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03436" name="l03436"></a><span class="lineno"> 3436</span> <span class="keyword">inline</span> memory_file&amp; operator &gt;&gt;(_Out_ int8_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">read_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03437" name="l03437"></a><span class="lineno"> 3437</span> <span class="keyword">inline</span> memory_file&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> int16_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">write_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03438" name="l03438"></a><span class="lineno"> 3438</span> <span class="keyword">inline</span> memory_file&amp; operator &gt;&gt;(_Out_ int16_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">read_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03439" name="l03439"></a><span class="lineno"> 3439</span> <span class="keyword">inline</span> memory_file&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> int32_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">write_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03440" name="l03440"></a><span class="lineno"> 3440</span> <span class="keyword">inline</span> memory_file&amp; operator &gt;&gt;(_Out_ int32_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">read_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03441" name="l03441"></a><span class="lineno"> 3441</span> <span class="keyword">inline</span> memory_file&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> int64_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">write_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03442" name="l03442"></a><span class="lineno"> 3442</span> <span class="keyword">inline</span> memory_file&amp; operator &gt;&gt;(_Out_ int64_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">read_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03443" name="l03443"></a><span class="lineno"> 3443</span> <span class="keyword">inline</span> memory_file&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> uint8_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">write_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03444" name="l03444"></a><span class="lineno"> 3444</span> <span class="keyword">inline</span> memory_file&amp; operator &gt;&gt;(_Out_ uint8_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">read_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03445" name="l03445"></a><span class="lineno"> 3445</span> <span class="keyword">inline</span> memory_file&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> uint16_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">write_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03446" name="l03446"></a><span class="lineno"> 3446</span> <span class="keyword">inline</span> memory_file&amp; operator &gt;&gt;(_Out_ uint16_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">read_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03447" name="l03447"></a><span class="lineno"> 3447</span> <span class="keyword">inline</span> memory_file&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> uint32_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">write_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03448" name="l03448"></a><span class="lineno"> 3448</span> <span class="keyword">inline</span> memory_file&amp; operator &gt;&gt;(_Out_ uint32_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">read_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03449" name="l03449"></a><span class="lineno"> 3449</span> <span class="keyword">inline</span> memory_file&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> uint64_t <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">write_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03450" name="l03450"></a><span class="lineno"> 3450</span> <span class="keyword">inline</span> memory_file&amp; operator &gt;&gt;(_Out_ uint64_t &amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">read_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03451" name="l03451"></a><span class="lineno"> 3451</span> <span class="keyword">inline</span> memory_file&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> <span class="keywordtype">float</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">write_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03452" name="l03452"></a><span class="lineno"> 3452</span> <span class="keyword">inline</span> memory_file&amp; operator &gt;&gt;(_Out_ <span class="keywordtype">float</span>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">read_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03453" name="l03453"></a><span class="lineno"> 3453</span> <span class="keyword">inline</span> memory_file&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">write_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03454" name="l03454"></a><span class="lineno"> 3454</span> <span class="keyword">inline</span> memory_file&amp; operator &gt;&gt;(_Out_ <span class="keywordtype">double</span>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">read_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03455" name="l03455"></a><span class="lineno"> 3455</span> <span class="keyword">inline</span> memory_file&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> <span class="keywordtype">char</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">write_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03456" name="l03456"></a><span class="lineno"> 3456</span> <span class="keyword">inline</span> memory_file&amp; operator &gt;&gt;(_Out_ <span class="keywordtype">char</span>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">read_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03457" name="l03457"></a><span class="lineno"> 3457</span><span class="preprocessor">#ifdef _NATIVE_WCHAR_T_DEFINED</span></div>
<div class="line"><a id="l03458" name="l03458"></a><span class="lineno"> 3458</span> <span class="keyword">inline</span> memory_file&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> <span class="keywordtype">wchar_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">write_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03459" name="l03459"></a><span class="lineno"> 3459</span> <span class="keyword">inline</span> memory_file&amp; operator &gt;&gt;(_Out_ <span class="keywordtype">wchar_t</span>&amp; <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">read_data</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03460" name="l03460"></a><span class="lineno"> 3460</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03461" name="l03461"></a><span class="lineno"> 3461</span> <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div>
<div class="line"><a id="l03462" name="l03462"></a><span class="lineno"> 3462</span> <span class="keyword">inline</span> memory_file&amp; operator &lt;&lt;(_In_ <span class="keyword">const</span> T * <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#ab8326c16c06548801982b07c930d7dfd">write_str</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03463" name="l03463"></a><span class="lineno"> 3463</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Elem, <span class="keyword">class</span> _Traits = std::<span class="keywordtype">char</span>_traits&lt;_Elem&gt;, <span class="keyword">class</span> _Ax = std::allocator&lt;_Elem&gt;&gt;</div>
<div class="line"><a id="l03464" name="l03464"></a><span class="lineno"> 3464</span> <span class="keyword">inline</span> memory_file&amp; operator &gt;&gt;(_Inout_ std::basic_string&lt;_Elem, _Traits, _Ax&gt;&amp;<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>) { <span class="keywordflow">return</span> <a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#a7a8abbdd7f86e10ffb711621015645f6">read_str</a>(<a class="code hl_function" href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">data</a>); }</div>
<div class="line"><a id="l03465" name="l03465"></a><span class="lineno"> 3465</span> </div>
<div class="line"><a id="l03466" name="l03466"></a><span class="lineno"> 3466</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l03467" name="l03467"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b"> 3467</a></span> uint8_t* <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">m_data</a>; </div>
<div class="line"><a id="l03468" name="l03468"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#aca812d996b5b60660fa121787e4c0e68"> 3468</a></span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#aca812d996b5b60660fa121787e4c0e68">m_manage</a>; </div>
<div class="line"><a id="l03469" name="l03469"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d"> 3469</a></span> <span class="keywordtype">size_t</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">m_offset</a>; </div>
<div class="line"><a id="l03470" name="l03470"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3"> 3470</a></span> <span class="keywordtype">size_t</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">m_size</a>; </div>
<div class="line"><a id="l03471" name="l03471"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c"> 3471</a></span> <span class="keywordtype">size_t</span> <a class="code hl_variable" href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c">m_reserved</a>; </div>
<div class="line"><a id="l03472" name="l03472"></a><span class="lineno"> 3472</span><span class="preprocessor">#if SET_FILE_OP_TIMES</span></div>
<div class="line"><a id="l03473" name="l03473"></a><span class="lineno"> 3473</span> time_point</div>
<div class="line"><a id="l03474" name="l03474"></a><span class="lineno"> 3474</span> m_ctime,</div>
<div class="line"><a id="l03475" name="l03475"></a><span class="lineno"> 3475</span> m_atime,</div>
<div class="line"><a id="l03476" name="l03476"></a><span class="lineno"> 3476</span> m_mtime;</div>
<div class="line"><a id="l03477" name="l03477"></a><span class="lineno"> 3477</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l03478" name="l03478"></a><span class="lineno"> 3478</span> };</div>
</div>
<div class="line"><a id="l03479" name="l03479"></a><span class="lineno"> 3479</span> </div>
<div class="foldopen" id="foldopen03483" data-start="{" data-end="};">
<div class="line"><a id="l03483" name="l03483"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1fifo.html"> 3483</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1fifo.html">fifo</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a> {</div>
<div class="line"><a id="l03484" name="l03484"></a><span class="lineno"> 3484</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l03485" name="l03485"></a><span class="lineno"> 3485</span> <a class="code hl_class" href="classstdex_1_1stream_1_1fifo.html">fifo</a>() :</div>
<div class="line"><a id="l03486" name="l03486"></a><span class="lineno"> 3486</span> m_offset(0),</div>
<div class="line"><a id="l03487" name="l03487"></a><span class="lineno"> 3487</span> m_size(0),</div>
<div class="line"><a id="l03488" name="l03488"></a><span class="lineno"> 3488</span> m_head(<span class="keyword">nullptr</span>),</div>
<div class="line"><a id="l03489" name="l03489"></a><span class="lineno"> 3489</span> m_tail(<span class="keyword">nullptr</span>)</div>
<div class="line"><a id="l03490" name="l03490"></a><span class="lineno"> 3490</span> {}</div>
<div class="line"><a id="l03491" name="l03491"></a><span class="lineno"> 3491</span> </div>
<div class="line"><a id="l03492" name="l03492"></a><span class="lineno"> 3492</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classstdex_1_1stream_1_1fifo.html">~fifo</a>()</div>
<div class="line"><a id="l03493" name="l03493"></a><span class="lineno"> 3493</span> {</div>
<div class="line"><a id="l03494" name="l03494"></a><span class="lineno"> 3494</span> <span class="keywordflow">while</span> (m_head) {</div>
<div class="line"><a id="l03495" name="l03495"></a><span class="lineno"> 3495</span> <span class="keyword">auto</span> p = m_head;</div>
<div class="line"><a id="l03496" name="l03496"></a><span class="lineno"> 3496</span> m_head = p-&gt;next;</div>
<div class="line"><a id="l03497" name="l03497"></a><span class="lineno"> 3497</span> <span class="keyword">delete</span> p;</div>
<div class="line"><a id="l03498" name="l03498"></a><span class="lineno"> 3498</span> }</div>
<div class="line"><a id="l03499" name="l03499"></a><span class="lineno"> 3499</span> }</div>
<div class="line"><a id="l03500" name="l03500"></a><span class="lineno"> 3500</span> </div>
<div class="line"><a id="l03501" name="l03501"></a><span class="lineno"> 3501</span><span class="preprocessor">#pragma warning(suppress: 6101) </span><span class="comment">// See [2] below</span></div>
<div class="foldopen" id="foldopen03502" data-start="{" data-end="}">
<div class="line"><a id="l03502" name="l03502"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1fifo.html#a84357513740c64a8317370b289c34e40"> 3502</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1fifo.html#a84357513740c64a8317370b289c34e40">read</a>(</div>
<div class="line"><a id="l03503" name="l03503"></a><span class="lineno"> 3503</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l03504" name="l03504"></a><span class="lineno"> 3504</span> {</div>
<div class="line"><a id="l03505" name="l03505"></a><span class="lineno"> 3505</span> assert(data || !length);</div>
<div class="line"><a id="l03506" name="l03506"></a><span class="lineno"> 3506</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> to_read = length;;) {</div>
<div class="line"><a id="l03507" name="l03507"></a><span class="lineno"> 3507</span> <span class="keywordflow">if</span> (!m_head) _Unlikely_ {</div>
<div class="line"><a id="l03508" name="l03508"></a><span class="lineno"> 3508</span> <span class="comment">// [1] Code analysis misses length - to_read bytes were written to data in previous loop iterations.</span></div>
<div class="line"><a id="l03509" name="l03509"></a><span class="lineno"> 3509</span> m_state = to_read &lt; length || !length ? state_t::ok : state_t::eof;</div>
<div class="line"><a id="l03510" name="l03510"></a><span class="lineno"> 3510</span> <span class="keywordflow">return</span> length - to_read;</div>
<div class="line"><a id="l03511" name="l03511"></a><span class="lineno"> 3511</span> }</div>
<div class="line"><a id="l03512" name="l03512"></a><span class="lineno"> 3512</span> <span class="keywordtype">size_t</span> remaining = m_head-&gt;size - m_offset;</div>
<div class="line"><a id="l03513" name="l03513"></a><span class="lineno"> 3513</span> <span class="keywordflow">if</span> (remaining &gt; to_read) {</div>
<div class="line"><a id="l03514" name="l03514"></a><span class="lineno"> 3514</span> memcpy(data, m_head-&gt;data + m_offset, to_read);</div>
<div class="line"><a id="l03515" name="l03515"></a><span class="lineno"> 3515</span> m_offset += to_read;</div>
<div class="line"><a id="l03516" name="l03516"></a><span class="lineno"> 3516</span> m_size -= to_read;</div>
<div class="line"><a id="l03517" name="l03517"></a><span class="lineno"> 3517</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03518" name="l03518"></a><span class="lineno"> 3518</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l03519" name="l03519"></a><span class="lineno"> 3519</span> }</div>
<div class="line"><a id="l03520" name="l03520"></a><span class="lineno"> 3520</span> memcpy(data, m_head-&gt;data + m_offset, remaining);</div>
<div class="line"><a id="l03521" name="l03521"></a><span class="lineno"> 3521</span> m_offset = 0;</div>
<div class="line"><a id="l03522" name="l03522"></a><span class="lineno"> 3522</span> m_size -= remaining;</div>
<div class="line"><a id="l03523" name="l03523"></a><span class="lineno"> 3523</span> <span class="keyword">reinterpret_cast&lt;</span>uint8_t*&amp;<span class="keyword">&gt;</span>(data) += remaining;</div>
<div class="line"><a id="l03524" name="l03524"></a><span class="lineno"> 3524</span> to_read -= remaining;</div>
<div class="line"><a id="l03525" name="l03525"></a><span class="lineno"> 3525</span> <span class="keyword">auto</span> p = m_head;</div>
<div class="line"><a id="l03526" name="l03526"></a><span class="lineno"> 3526</span> m_head = p-&gt;next;</div>
<div class="line"><a id="l03527" name="l03527"></a><span class="lineno"> 3527</span> <span class="keyword">delete</span> p;</div>
<div class="line"><a id="l03528" name="l03528"></a><span class="lineno"> 3528</span> }</div>
<div class="line"><a id="l03529" name="l03529"></a><span class="lineno"> 3529</span> }</div>
</div>
<div class="line"><a id="l03530" name="l03530"></a><span class="lineno"> 3530</span> </div>
<div class="foldopen" id="foldopen03531" data-start="{" data-end="}">
<div class="line"><a id="l03531" name="l03531"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1fifo.html#a30c7adb43b6f4bd0cb5d9c72f15fe9bf"> 3531</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1fifo.html#a30c7adb43b6f4bd0cb5d9c72f15fe9bf">write</a>(</div>
<div class="line"><a id="l03532" name="l03532"></a><span class="lineno"> 3532</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l03533" name="l03533"></a><span class="lineno"> 3533</span> {</div>
<div class="line"><a id="l03534" name="l03534"></a><span class="lineno"> 3534</span> assert(data || !length);</div>
<div class="line"><a id="l03535" name="l03535"></a><span class="lineno"> 3535</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l03536" name="l03536"></a><span class="lineno"> 3536</span> std::unique_ptr&lt;node_t&gt; n(<span class="keyword">reinterpret_cast&lt;</span><a class="code hl_struct" href="structstdex_1_1stream_1_1fifo_1_1node__t.html">node_t</a>*<span class="keyword">&gt;</span>(<span class="keyword">new</span> uint8_t[<span class="keyword">sizeof</span>(<a class="code hl_struct" href="structstdex_1_1stream_1_1fifo_1_1node__t.html">node_t</a>) + length]));</div>
<div class="line"><a id="l03537" name="l03537"></a><span class="lineno"> 3537</span> n-&gt;next = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l03538" name="l03538"></a><span class="lineno"> 3538</span> n-&gt;size = length;</div>
<div class="line"><a id="l03539" name="l03539"></a><span class="lineno"> 3539</span> memcpy(n-&gt;data, data, length);</div>
<div class="line"><a id="l03540" name="l03540"></a><span class="lineno"> 3540</span> m_size += length;</div>
<div class="line"><a id="l03541" name="l03541"></a><span class="lineno"> 3541</span> <span class="keywordflow">if</span> (m_head)</div>
<div class="line"><a id="l03542" name="l03542"></a><span class="lineno"> 3542</span> m_tail = m_tail-&gt;next = n.release();</div>
<div class="line"><a id="l03543" name="l03543"></a><span class="lineno"> 3543</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l03544" name="l03544"></a><span class="lineno"> 3544</span> m_head = m_tail = n.release();</div>
<div class="line"><a id="l03545" name="l03545"></a><span class="lineno"> 3545</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03546" name="l03546"></a><span class="lineno"> 3546</span> <span class="keywordflow">return</span> length;</div>
<div class="line"><a id="l03547" name="l03547"></a><span class="lineno"> 3547</span> }</div>
<div class="line"><a id="l03548" name="l03548"></a><span class="lineno"> 3548</span> <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::bad_alloc&amp;) {</div>
<div class="line"><a id="l03549" name="l03549"></a><span class="lineno"> 3549</span> m_state = state_t::fail;</div>
<div class="line"><a id="l03550" name="l03550"></a><span class="lineno"> 3550</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l03551" name="l03551"></a><span class="lineno"> 3551</span> }</div>
<div class="line"><a id="l03552" name="l03552"></a><span class="lineno"> 3552</span> }</div>
</div>
<div class="line"><a id="l03553" name="l03553"></a><span class="lineno"> 3553</span> </div>
<div class="foldopen" id="foldopen03554" data-start="{" data-end="}">
<div class="line"><a id="l03554" name="l03554"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1fifo.html#a29e0a95836f4e2692bea3783acaf692d"> 3554</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1fifo.html#a29e0a95836f4e2692bea3783acaf692d">close</a>()</div>
<div class="line"><a id="l03555" name="l03555"></a><span class="lineno"> 3555</span> {</div>
<div class="line"><a id="l03556" name="l03556"></a><span class="lineno"> 3556</span> m_size = m_offset = 0;</div>
<div class="line"><a id="l03557" name="l03557"></a><span class="lineno"> 3557</span> <span class="keywordflow">while</span> (m_head) {</div>
<div class="line"><a id="l03558" name="l03558"></a><span class="lineno"> 3558</span> <span class="keyword">auto</span> p = m_head;</div>
<div class="line"><a id="l03559" name="l03559"></a><span class="lineno"> 3559</span> m_head = p-&gt;next;</div>
<div class="line"><a id="l03560" name="l03560"></a><span class="lineno"> 3560</span> <span class="keyword">delete</span> p;</div>
<div class="line"><a id="l03561" name="l03561"></a><span class="lineno"> 3561</span> }</div>
<div class="line"><a id="l03562" name="l03562"></a><span class="lineno"> 3562</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03563" name="l03563"></a><span class="lineno"> 3563</span> }</div>
</div>
<div class="line"><a id="l03564" name="l03564"></a><span class="lineno"> 3564</span> </div>
<div class="line"><a id="l03568" name="l03568"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1fifo.html#a3272bc89573fe75fe0e6de2600967c10"> 3568</a></span> <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code hl_function" href="classstdex_1_1stream_1_1fifo.html#a3272bc89573fe75fe0e6de2600967c10">size</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_size; };</div>
<div class="line"><a id="l03569" name="l03569"></a><span class="lineno"> 3569</span> </div>
<div class="line"><a id="l03570" name="l03570"></a><span class="lineno"> 3570</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l03571" name="l03571"></a><span class="lineno"> 3571</span> <span class="keywordtype">size_t</span> m_offset, m_size;</div>
<div class="foldopen" id="foldopen03572" data-start="{" data-end="};">
<div class="line"><a id="l03572" name="l03572"></a><span class="lineno"><a class="line" href="structstdex_1_1stream_1_1fifo_1_1node__t.html"> 3572</a></span> <span class="keyword">struct </span><a class="code hl_struct" href="structstdex_1_1stream_1_1fifo_1_1node__t.html">node_t</a> {</div>
<div class="line"><a id="l03573" name="l03573"></a><span class="lineno"> 3573</span> <a class="code hl_struct" href="structstdex_1_1stream_1_1fifo_1_1node__t.html">node_t</a>* next;</div>
<div class="line"><a id="l03574" name="l03574"></a><span class="lineno"> 3574</span> <span class="keywordtype">size_t</span> size;</div>
<div class="line"><a id="l03575" name="l03575"></a><span class="lineno"> 3575</span><span class="preprocessor">#pragma warning(suppress:4200)</span></div>
<div class="line"><a id="l03576" name="l03576"></a><span class="lineno"> 3576</span> uint8_t data[0];</div>
<div class="line"><a id="l03577" name="l03577"></a><span class="lineno"> 3577</span> } *m_head, * m_tail;</div>
</div>
<div class="line"><a id="l03578" name="l03578"></a><span class="lineno"> 3578</span> };</div>
</div>
<div class="line"><a id="l03579" name="l03579"></a><span class="lineno"> 3579</span> </div>
<div class="foldopen" id="foldopen03583" data-start="{" data-end="};">
<div class="line"><a id="l03583" name="l03583"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1diag__file.html"> 3583</a></span> <span class="keyword">class </span><a class="code hl_class" href="classstdex_1_1stream_1_1diag__file.html">diag_file</a> : <span class="keyword">public</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic__file.html">basic_file</a> {</div>
<div class="line"><a id="l03584" name="l03584"></a><span class="lineno"> 3584</span> <span class="keyword">public</span>:</div>
<div class="line"><a id="l03585" name="l03585"></a><span class="lineno"> 3585</span> <a class="code hl_class" href="classstdex_1_1stream_1_1diag__file.html">diag_file</a>(_In_count_(num_files) <a class="code hl_class" href="classstdex_1_1stream_1_1basic__file.html">basic_file</a>* <span class="keyword">const</span>* files, _In_ <span class="keywordtype">size_t</span> num_files) :</div>
<div class="line"><a id="l03586" name="l03586"></a><span class="lineno"> 3586</span> <a class="code hl_class" href="classstdex_1_1stream_1_1basic.html">basic</a>(num_files ? files[0]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>() : state_t::fail),</div>
<div class="line"><a id="l03587" name="l03587"></a><span class="lineno"> 3587</span> m_files(files, files + num_files)</div>
<div class="line"><a id="l03588" name="l03588"></a><span class="lineno"> 3588</span> {</div>
<div class="line"><a id="l03589" name="l03589"></a><span class="lineno"> 3589</span> }</div>
<div class="line"><a id="l03590" name="l03590"></a><span class="lineno"> 3590</span> </div>
<div class="foldopen" id="foldopen03591" data-start="{" data-end="}">
<div class="line"><a id="l03591" name="l03591"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1diag__file.html#ac1eaf4a0cfce7e4426cff5f32fc33e6e"> 3591</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0 || length == 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#ac1eaf4a0cfce7e4426cff5f32fc33e6e">read</a>(</div>
<div class="line"><a id="l03592" name="l03592"></a><span class="lineno"> 3592</span> _Out_writes_bytes_to_opt_(length, return) <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l03593" name="l03593"></a><span class="lineno"> 3593</span> {</div>
<div class="line"><a id="l03594" name="l03594"></a><span class="lineno"> 3594</span> assert(data || !length);</div>
<div class="line"><a id="l03595" name="l03595"></a><span class="lineno"> 3595</span> <span class="keywordflow">if</span> (m_files.empty()) {</div>
<div class="line"><a id="l03596" name="l03596"></a><span class="lineno"> 3596</span> m_state = state_t::fail;</div>
<div class="line"><a id="l03597" name="l03597"></a><span class="lineno"> 3597</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l03598" name="l03598"></a><span class="lineno"> 3598</span> }</div>
<div class="line"><a id="l03599" name="l03599"></a><span class="lineno"> 3599</span> <span class="keywordtype">size_t</span> result = m_files[0]-&gt;read(data, length);</div>
<div class="line"><a id="l03600" name="l03600"></a><span class="lineno"> 3600</span> _Analysis_assume_(result &lt;= length);</div>
<div class="line"><a id="l03601" name="l03601"></a><span class="lineno"> 3601</span> m_state = m_files[0]-&gt;state();</div>
<div class="line"><a id="l03602" name="l03602"></a><span class="lineno"> 3602</span> <span class="keywordflow">if</span> (length &gt; m_tmp.size())</div>
<div class="line"><a id="l03603" name="l03603"></a><span class="lineno"> 3603</span> m_tmp.resize(length);</div>
<div class="line"><a id="l03604" name="l03604"></a><span class="lineno"> 3604</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1, n = m_files.size(); i &lt; n; ++i) {</div>
<div class="line"><a id="l03605" name="l03605"></a><span class="lineno"> 3605</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#ac1eaf4a0cfce7e4426cff5f32fc33e6e">read</a>(m_tmp.data(), length) != result ||</div>
<div class="line"><a id="l03606" name="l03606"></a><span class="lineno"> 3606</span> memcmp(m_tmp.data(), data, result))</div>
<div class="line"><a id="l03607" name="l03607"></a><span class="lineno"> 3607</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;read mismatch&quot;</span>);</div>
<div class="line"><a id="l03608" name="l03608"></a><span class="lineno"> 3608</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>() != m_state)</div>
<div class="line"><a id="l03609" name="l03609"></a><span class="lineno"> 3609</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;state mismatch&quot;</span>);</div>
<div class="line"><a id="l03610" name="l03610"></a><span class="lineno"> 3610</span> }</div>
<div class="line"><a id="l03611" name="l03611"></a><span class="lineno"> 3611</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l03612" name="l03612"></a><span class="lineno"> 3612</span> }</div>
</div>
<div class="line"><a id="l03613" name="l03613"></a><span class="lineno"> 3613</span> </div>
<div class="foldopen" id="foldopen03614" data-start="{" data-end="}">
<div class="line"><a id="l03614" name="l03614"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1diag__file.html#a3157aee8e9c754b02e876897fcb82236"> 3614</a></span> <span class="keyword">virtual</span> _Success_(<span class="keywordflow">return</span> != 0) size_t <a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#a3157aee8e9c754b02e876897fcb82236">write</a>(</div>
<div class="line"><a id="l03615" name="l03615"></a><span class="lineno"> 3615</span> _In_reads_bytes_opt_(length) const <span class="keywordtype">void</span>* data, _In_ <span class="keywordtype">size_t</span> length)</div>
<div class="line"><a id="l03616" name="l03616"></a><span class="lineno"> 3616</span> {</div>
<div class="line"><a id="l03617" name="l03617"></a><span class="lineno"> 3617</span> <span class="keywordflow">if</span> (m_files.empty()) {</div>
<div class="line"><a id="l03618" name="l03618"></a><span class="lineno"> 3618</span> m_state = state_t::fail;</div>
<div class="line"><a id="l03619" name="l03619"></a><span class="lineno"> 3619</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l03620" name="l03620"></a><span class="lineno"> 3620</span> }</div>
<div class="line"><a id="l03621" name="l03621"></a><span class="lineno"> 3621</span> <span class="keywordtype">size_t</span> result = m_files[0]-&gt;write(data, length);</div>
<div class="line"><a id="l03622" name="l03622"></a><span class="lineno"> 3622</span> m_state = m_files[0]-&gt;state();</div>
<div class="line"><a id="l03623" name="l03623"></a><span class="lineno"> 3623</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1, n = m_files.size(); i &lt; n; ++i) {</div>
<div class="line"><a id="l03624" name="l03624"></a><span class="lineno"> 3624</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#a3157aee8e9c754b02e876897fcb82236">write</a>(data, length) != result)</div>
<div class="line"><a id="l03625" name="l03625"></a><span class="lineno"> 3625</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;write mismatch&quot;</span>);</div>
<div class="line"><a id="l03626" name="l03626"></a><span class="lineno"> 3626</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>() != m_state)</div>
<div class="line"><a id="l03627" name="l03627"></a><span class="lineno"> 3627</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;state mismatch&quot;</span>);</div>
<div class="line"><a id="l03628" name="l03628"></a><span class="lineno"> 3628</span> }</div>
<div class="line"><a id="l03629" name="l03629"></a><span class="lineno"> 3629</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l03630" name="l03630"></a><span class="lineno"> 3630</span> }</div>
</div>
<div class="line"><a id="l03631" name="l03631"></a><span class="lineno"> 3631</span> </div>
<div class="foldopen" id="foldopen03632" data-start="{" data-end="}">
<div class="line"><a id="l03632" name="l03632"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1diag__file.html#aadb3e9de2c84e317bf454ae764d8fcdf"> 3632</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#aadb3e9de2c84e317bf454ae764d8fcdf">flush</a>()</div>
<div class="line"><a id="l03633" name="l03633"></a><span class="lineno"> 3633</span> {</div>
<div class="line"><a id="l03634" name="l03634"></a><span class="lineno"> 3634</span> <span class="keywordflow">if</span> (m_files.empty()) {</div>
<div class="line"><a id="l03635" name="l03635"></a><span class="lineno"> 3635</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03636" name="l03636"></a><span class="lineno"> 3636</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l03637" name="l03637"></a><span class="lineno"> 3637</span> }</div>
<div class="line"><a id="l03638" name="l03638"></a><span class="lineno"> 3638</span> m_files[0]-&gt;flush();</div>
<div class="line"><a id="l03639" name="l03639"></a><span class="lineno"> 3639</span> m_state = m_files[0]-&gt;state();</div>
<div class="line"><a id="l03640" name="l03640"></a><span class="lineno"> 3640</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1, n = m_files.size(); i &lt; n; ++i) {</div>
<div class="line"><a id="l03641" name="l03641"></a><span class="lineno"> 3641</span> m_files[i]-&gt;flush();</div>
<div class="line"><a id="l03642" name="l03642"></a><span class="lineno"> 3642</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>() != m_state)</div>
<div class="line"><a id="l03643" name="l03643"></a><span class="lineno"> 3643</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;state mismatch&quot;</span>);</div>
<div class="line"><a id="l03644" name="l03644"></a><span class="lineno"> 3644</span> }</div>
<div class="line"><a id="l03645" name="l03645"></a><span class="lineno"> 3645</span> }</div>
</div>
<div class="line"><a id="l03646" name="l03646"></a><span class="lineno"> 3646</span> </div>
<div class="foldopen" id="foldopen03647" data-start="{" data-end="}">
<div class="line"><a id="l03647" name="l03647"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1diag__file.html#a4367a6d2840c1a2c5d9ab2ab3483ed2c"> 3647</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#a4367a6d2840c1a2c5d9ab2ab3483ed2c">close</a>()</div>
<div class="line"><a id="l03648" name="l03648"></a><span class="lineno"> 3648</span> {</div>
<div class="line"><a id="l03649" name="l03649"></a><span class="lineno"> 3649</span> <span class="keywordflow">if</span> (m_files.empty()) {</div>
<div class="line"><a id="l03650" name="l03650"></a><span class="lineno"> 3650</span> m_state = state_t::ok;</div>
<div class="line"><a id="l03651" name="l03651"></a><span class="lineno"> 3651</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l03652" name="l03652"></a><span class="lineno"> 3652</span> }</div>
<div class="line"><a id="l03653" name="l03653"></a><span class="lineno"> 3653</span> m_files[0]-&gt;close();</div>
<div class="line"><a id="l03654" name="l03654"></a><span class="lineno"> 3654</span> m_state = m_files[0]-&gt;state();</div>
<div class="line"><a id="l03655" name="l03655"></a><span class="lineno"> 3655</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1, n = m_files.size(); i &lt; n; ++i) {</div>
<div class="line"><a id="l03656" name="l03656"></a><span class="lineno"> 3656</span> m_files[i]-&gt;close();</div>
<div class="line"><a id="l03657" name="l03657"></a><span class="lineno"> 3657</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>() != m_state)</div>
<div class="line"><a id="l03658" name="l03658"></a><span class="lineno"> 3658</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;state mismatch&quot;</span>);</div>
<div class="line"><a id="l03659" name="l03659"></a><span class="lineno"> 3659</span> }</div>
<div class="line"><a id="l03660" name="l03660"></a><span class="lineno"> 3660</span> m_tmp.clear();</div>
<div class="line"><a id="l03661" name="l03661"></a><span class="lineno"> 3661</span> m_tmp.shrink_to_fit();</div>
<div class="line"><a id="l03662" name="l03662"></a><span class="lineno"> 3662</span> }</div>
</div>
<div class="line"><a id="l03663" name="l03663"></a><span class="lineno"> 3663</span> </div>
<div class="foldopen" id="foldopen03664" data-start="{" data-end="}">
<div class="line"><a id="l03664" name="l03664"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1diag__file.html#a9f616580a2547b37beccd7d114ed06d0"> 3664</a></span> <span class="keyword">virtual</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#a9f616580a2547b37beccd7d114ed06d0">seek</a>(_In_ foff_t offset, _In_ seek_t how = seek_t::beg)</div>
<div class="line"><a id="l03665" name="l03665"></a><span class="lineno"> 3665</span> {</div>
<div class="line"><a id="l03666" name="l03666"></a><span class="lineno"> 3666</span> <span class="keywordflow">if</span> (m_files.empty()) {</div>
<div class="line"><a id="l03667" name="l03667"></a><span class="lineno"> 3667</span> m_state = state_t::fail;</div>
<div class="line"><a id="l03668" name="l03668"></a><span class="lineno"> 3668</span> <span class="keywordflow">return</span> fpos_max;</div>
<div class="line"><a id="l03669" name="l03669"></a><span class="lineno"> 3669</span> }</div>
<div class="line"><a id="l03670" name="l03670"></a><span class="lineno"> 3670</span> fpos_t result = m_files[0]-&gt;seek(offset, how);</div>
<div class="line"><a id="l03671" name="l03671"></a><span class="lineno"> 3671</span> m_state = m_files[0]-&gt;state();</div>
<div class="line"><a id="l03672" name="l03672"></a><span class="lineno"> 3672</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1, n = m_files.size(); i &lt; n; ++i) {</div>
<div class="line"><a id="l03673" name="l03673"></a><span class="lineno"> 3673</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#a9f616580a2547b37beccd7d114ed06d0">seek</a>(offset, how) != result)</div>
<div class="line"><a id="l03674" name="l03674"></a><span class="lineno"> 3674</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;seek mismatch&quot;</span>);</div>
<div class="line"><a id="l03675" name="l03675"></a><span class="lineno"> 3675</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>() != m_state)</div>
<div class="line"><a id="l03676" name="l03676"></a><span class="lineno"> 3676</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;state mismatch&quot;</span>);</div>
<div class="line"><a id="l03677" name="l03677"></a><span class="lineno"> 3677</span> }</div>
<div class="line"><a id="l03678" name="l03678"></a><span class="lineno"> 3678</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l03679" name="l03679"></a><span class="lineno"> 3679</span> }</div>
</div>
<div class="line"><a id="l03680" name="l03680"></a><span class="lineno"> 3680</span> </div>
<div class="foldopen" id="foldopen03681" data-start="{" data-end="}">
<div class="line"><a id="l03681" name="l03681"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1diag__file.html#aa4ea6e5ca1ff91a6f5c9726f4251f3ce"> 3681</a></span> <span class="keyword">virtual</span> fpos_t <a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#aa4ea6e5ca1ff91a6f5c9726f4251f3ce">tell</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l03682" name="l03682"></a><span class="lineno"> 3682</span><span class="keyword"> </span>{</div>
<div class="line"><a id="l03683" name="l03683"></a><span class="lineno"> 3683</span> <span class="keywordflow">if</span> (m_files.empty())</div>
<div class="line"><a id="l03684" name="l03684"></a><span class="lineno"> 3684</span> <span class="keywordflow">return</span> fpos_max;</div>
<div class="line"><a id="l03685" name="l03685"></a><span class="lineno"> 3685</span> fpos_t result = m_files[0]-&gt;tell();</div>
<div class="line"><a id="l03686" name="l03686"></a><span class="lineno"> 3686</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1, n = m_files.size(); i &lt; n; ++i) {</div>
<div class="line"><a id="l03687" name="l03687"></a><span class="lineno"> 3687</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#aa4ea6e5ca1ff91a6f5c9726f4251f3ce">tell</a>() != result)</div>
<div class="line"><a id="l03688" name="l03688"></a><span class="lineno"> 3688</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;tell mismatch&quot;</span>);</div>
<div class="line"><a id="l03689" name="l03689"></a><span class="lineno"> 3689</span> }</div>
<div class="line"><a id="l03690" name="l03690"></a><span class="lineno"> 3690</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l03691" name="l03691"></a><span class="lineno"> 3691</span> }</div>
</div>
<div class="line"><a id="l03692" name="l03692"></a><span class="lineno"> 3692</span> </div>
<div class="foldopen" id="foldopen03693" data-start="{" data-end="}">
<div class="line"><a id="l03693" name="l03693"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1diag__file.html#a5d4bcde718ef182590c742f0c600e54b"> 3693</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#a5d4bcde718ef182590c742f0c600e54b">lock</a>(_In_ fpos_t offset, _In_ fsize_t length)</div>
<div class="line"><a id="l03694" name="l03694"></a><span class="lineno"> 3694</span> {</div>
<div class="line"><a id="l03695" name="l03695"></a><span class="lineno"> 3695</span> <span class="keywordflow">if</span> (m_files.empty())</div>
<div class="line"><a id="l03696" name="l03696"></a><span class="lineno"> 3696</span> m_state = state_t::fail;</div>
<div class="line"><a id="l03697" name="l03697"></a><span class="lineno"> 3697</span> m_files[0]-&gt;lock(offset, length);</div>
<div class="line"><a id="l03698" name="l03698"></a><span class="lineno"> 3698</span> m_state = m_files[0]-&gt;state();</div>
<div class="line"><a id="l03699" name="l03699"></a><span class="lineno"> 3699</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1, n = m_files.size(); i &lt; n; ++i) {</div>
<div class="line"><a id="l03700" name="l03700"></a><span class="lineno"> 3700</span> m_files[i]-&gt;lock(offset, length);</div>
<div class="line"><a id="l03701" name="l03701"></a><span class="lineno"> 3701</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>() != m_state)</div>
<div class="line"><a id="l03702" name="l03702"></a><span class="lineno"> 3702</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;state mismatch&quot;</span>);</div>
<div class="line"><a id="l03703" name="l03703"></a><span class="lineno"> 3703</span> }</div>
<div class="line"><a id="l03704" name="l03704"></a><span class="lineno"> 3704</span> }</div>
</div>
<div class="line"><a id="l03705" name="l03705"></a><span class="lineno"> 3705</span> </div>
<div class="foldopen" id="foldopen03706" data-start="{" data-end="}">
<div class="line"><a id="l03706" name="l03706"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1diag__file.html#a9f0c158f4875c862f981282b818e7296"> 3706</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#a9f0c158f4875c862f981282b818e7296">unlock</a>(_In_ fpos_t offset, _In_ fsize_t length)</div>
<div class="line"><a id="l03707" name="l03707"></a><span class="lineno"> 3707</span> {</div>
<div class="line"><a id="l03708" name="l03708"></a><span class="lineno"> 3708</span> <span class="keywordflow">if</span> (m_files.empty())</div>
<div class="line"><a id="l03709" name="l03709"></a><span class="lineno"> 3709</span> m_state = state_t::fail;</div>
<div class="line"><a id="l03710" name="l03710"></a><span class="lineno"> 3710</span> m_files[0]-&gt;unlock(offset, length);</div>
<div class="line"><a id="l03711" name="l03711"></a><span class="lineno"> 3711</span> m_state = m_files[0]-&gt;state();</div>
<div class="line"><a id="l03712" name="l03712"></a><span class="lineno"> 3712</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1, n = m_files.size(); i &lt; n; ++i) {</div>
<div class="line"><a id="l03713" name="l03713"></a><span class="lineno"> 3713</span> m_files[i]-&gt;unlock(offset, length);</div>
<div class="line"><a id="l03714" name="l03714"></a><span class="lineno"> 3714</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>() != m_state)</div>
<div class="line"><a id="l03715" name="l03715"></a><span class="lineno"> 3715</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;state mismatch&quot;</span>);</div>
<div class="line"><a id="l03716" name="l03716"></a><span class="lineno"> 3716</span> }</div>
<div class="line"><a id="l03717" name="l03717"></a><span class="lineno"> 3717</span> }</div>
</div>
<div class="line"><a id="l03718" name="l03718"></a><span class="lineno"> 3718</span> </div>
<div class="foldopen" id="foldopen03719" data-start="{" data-end="}">
<div class="line"><a id="l03719" name="l03719"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1diag__file.html#a0797e4eba9f702022e1c467694302871"> 3719</a></span> <span class="keyword">virtual</span> fsize_t <a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#a0797e4eba9f702022e1c467694302871">size</a>()</div>
<div class="line"><a id="l03720" name="l03720"></a><span class="lineno"> 3720</span> {</div>
<div class="line"><a id="l03721" name="l03721"></a><span class="lineno"> 3721</span> <span class="keywordflow">if</span> (m_files.empty()) {</div>
<div class="line"><a id="l03722" name="l03722"></a><span class="lineno"> 3722</span> m_state = state_t::fail;</div>
<div class="line"><a id="l03723" name="l03723"></a><span class="lineno"> 3723</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l03724" name="l03724"></a><span class="lineno"> 3724</span> }</div>
<div class="line"><a id="l03725" name="l03725"></a><span class="lineno"> 3725</span> fsize_t result = m_files[0]-&gt;size();</div>
<div class="line"><a id="l03726" name="l03726"></a><span class="lineno"> 3726</span> m_state = m_files[0]-&gt;state();</div>
<div class="line"><a id="l03727" name="l03727"></a><span class="lineno"> 3727</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1, n = m_files.size(); i &lt; n; ++i) {</div>
<div class="line"><a id="l03728" name="l03728"></a><span class="lineno"> 3728</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#a0797e4eba9f702022e1c467694302871">size</a>() != result)</div>
<div class="line"><a id="l03729" name="l03729"></a><span class="lineno"> 3729</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;size mismatch&quot;</span>);</div>
<div class="line"><a id="l03730" name="l03730"></a><span class="lineno"> 3730</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>() != m_state)</div>
<div class="line"><a id="l03731" name="l03731"></a><span class="lineno"> 3731</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;state mismatch&quot;</span>);</div>
<div class="line"><a id="l03732" name="l03732"></a><span class="lineno"> 3732</span> }</div>
<div class="line"><a id="l03733" name="l03733"></a><span class="lineno"> 3733</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l03734" name="l03734"></a><span class="lineno"> 3734</span> }</div>
</div>
<div class="line"><a id="l03735" name="l03735"></a><span class="lineno"> 3735</span> </div>
<div class="foldopen" id="foldopen03736" data-start="{" data-end="}">
<div class="line"><a id="l03736" name="l03736"></a><span class="lineno"><a class="line" href="classstdex_1_1stream_1_1diag__file.html#a1d0824a191f261a1c552b71a92584745"> 3736</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classstdex_1_1stream_1_1diag__file.html#a1d0824a191f261a1c552b71a92584745">truncate</a>()</div>
<div class="line"><a id="l03737" name="l03737"></a><span class="lineno"> 3737</span> {</div>
<div class="line"><a id="l03738" name="l03738"></a><span class="lineno"> 3738</span> <span class="keywordflow">if</span> (m_files.empty())</div>
<div class="line"><a id="l03739" name="l03739"></a><span class="lineno"> 3739</span> m_state = state_t::fail;</div>
<div class="line"><a id="l03740" name="l03740"></a><span class="lineno"> 3740</span> m_files[0]-&gt;truncate();</div>
<div class="line"><a id="l03741" name="l03741"></a><span class="lineno"> 3741</span> m_state = m_files[0]-&gt;state();</div>
<div class="line"><a id="l03742" name="l03742"></a><span class="lineno"> 3742</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 1, n = m_files.size(); i &lt; n; ++i) {</div>
<div class="line"><a id="l03743" name="l03743"></a><span class="lineno"> 3743</span> m_files[i]-&gt;truncate();</div>
<div class="line"><a id="l03744" name="l03744"></a><span class="lineno"> 3744</span> <span class="keywordflow">if</span> (m_files[i]-&gt;<a class="code hl_function" href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">state</a>() != m_state)</div>
<div class="line"><a id="l03745" name="l03745"></a><span class="lineno"> 3745</span> <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">&quot;state mismatch&quot;</span>);</div>
<div class="line"><a id="l03746" name="l03746"></a><span class="lineno"> 3746</span> }</div>
<div class="line"><a id="l03747" name="l03747"></a><span class="lineno"> 3747</span> }</div>
</div>
<div class="line"><a id="l03748" name="l03748"></a><span class="lineno"> 3748</span> </div>
<div class="line"><a id="l03749" name="l03749"></a><span class="lineno"> 3749</span> <span class="keyword">protected</span>:</div>
<div class="line"><a id="l03750" name="l03750"></a><span class="lineno"> 3750</span> std::vector&lt;basic_file*&gt; m_files;</div>
<div class="line"><a id="l03751" name="l03751"></a><span class="lineno"> 3751</span> std::vector&lt;uint8_t&gt; m_tmp;</div>
<div class="line"><a id="l03752" name="l03752"></a><span class="lineno"> 3752</span> };</div>
</div>
<div class="line"><a id="l03753" name="l03753"></a><span class="lineno"> 3753</span> }</div>
<div class="line"><a id="l03754" name="l03754"></a><span class="lineno"> 3754</span>}</div>
<div class="ttc" id="aclassstdex_1_1stream_1_1async__reader_html"><div class="ttname"><a href="classstdex_1_1stream_1_1async__reader.html">stdex::stream::async_reader</a></div><div class="ttdoc">Provides read-ahead stream capability.</div><div class="ttdef"><b>Definition</b> stream.hpp:1118</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1async__reader_html_a841c1e3cb01cb96df94701465086a529"><div class="ttname"><a href="classstdex_1_1stream_1_1async__reader.html#a841c1e3cb01cb96df94701465086a529">stdex::stream::async_reader::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1132</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1async__writer_html"><div class="ttname"><a href="classstdex_1_1stream_1_1async__writer.html">stdex::stream::async_writer</a></div><div class="ttdoc">Provides write-back stream capability.</div><div class="ttdef"><b>Definition</b> stream.hpp:1186</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1async__writer_html_a25c72d3b2edaba300eb158d06dfd03d2"><div class="ttname"><a href="classstdex_1_1stream_1_1async__writer.html#a25c72d3b2edaba300eb158d06dfd03d2">stdex::stream::async_writer::flush</a></div><div class="ttdeci">virtual void flush()</div><div class="ttdoc">Persists volatile element data.</div><div class="ttdef"><b>Definition</b> stream.hpp:1223</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1async__writer_html_a39d3fc4fffb8aa9b971fa15beaa8149b"><div class="ttname"><a href="classstdex_1_1stream_1_1async__writer.html#a39d3fc4fffb8aa9b971fa15beaa8149b">stdex::stream::async_writer::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1199</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html">stdex::stream::basic_file</a></div><div class="ttdoc">Basic seekable stream operations.</div><div class="ttdef"><b>Definition</b> stream.hpp:696</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_a15a1e6a778adefea421f32d14c8178dd"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#a15a1e6a778adefea421f32d14c8178dd">stdex::stream::basic_file::skip</a></div><div class="ttdeci">virtual void skip(fsize_t amount)</div><div class="ttdoc">Skips given amount of bytes of data on the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:739</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_a3c02c83246c43ed868dab1dd5a5d698d"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#a3c02c83246c43ed868dab1dd5a5d698d">stdex::stream::basic_file::ctime</a></div><div class="ttdeci">virtual time_point ctime() const</div><div class="ttdoc">Returns file creation time.</div><div class="ttdef"><b>Definition</b> stream.hpp:786</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_a484ec74004fe0b4528c11675b91161e0"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#a484ec74004fe0b4528c11675b91161e0">stdex::stream::basic_file::lock</a></div><div class="ttdeci">virtual void lock(fpos_t offset, fsize_t length)</div><div class="ttdoc">Locks file section for exclusive access.</div><div class="ttdef"><b>Definition</b> stream.hpp:755</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_a522305da60cc442ca3cd6b7aa2214d6e"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#a522305da60cc442ca3cd6b7aa2214d6e">stdex::stream::basic_file::truncate</a></div><div class="ttdeci">virtual void truncate()=0</div><div class="ttdoc">Sets file size - truncates the remainder of file content from the current file position to the end of...</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_a6a3bc2c76e78363a2232eff12dd5e370"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#a6a3bc2c76e78363a2232eff12dd5e370">stdex::stream::basic_file::read_charset</a></div><div class="ttdeci">charset_id read_charset(charset_id default_charset=charset_id::system)</div><div class="ttdoc">Attempts to detect textfile charset based on UTF16 or UTF8 BOM.</div><div class="ttdef"><b>Definition</b> stream.hpp:859</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_a6a8da9a1b0a3926b9bc453bf0209ee5e"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#a6a8da9a1b0a3926b9bc453bf0209ee5e">stdex::stream::basic_file::seekbeg</a></div><div class="ttdeci">fpos_t seekbeg(fpos_t offset)</div><div class="ttdoc">Seeks to absolute file position.</div><div class="ttdef"><b>Definition</b> stream.hpp:723</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_a72aa16169eea2156e83053ba9bd91cd8"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#a72aa16169eea2156e83053ba9bd91cd8">stdex::stream::basic_file::read_remainder</a></div><div class="ttdeci">virtual std::vector&lt; uint8_t &gt; read_remainder(size_t max_length=SIZE_MAX)</div><div class="ttdoc">Reads and returns remainder of the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:698</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_a814a080cb6da2041013749cc125bfd2b"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#a814a080cb6da2041013749cc125bfd2b">stdex::stream::basic_file::set_mtime</a></div><div class="ttdeci">virtual void set_mtime(time_point date)</div><div class="ttdoc">Sets file modification time.</div><div class="ttdef"><b>Definition</b> stream.hpp:828</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_a8158cb89ef54a737b7bcfed635c215d6"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#a8158cb89ef54a737b7bcfed635c215d6">stdex::stream::basic_file::seekcur</a></div><div class="ttdeci">fpos_t seekcur(foff_t offset)</div><div class="ttdoc">Seeks to relative from current file position.</div><div class="ttdef"><b>Definition</b> stream.hpp:730</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_a84936e230100934793aad8a516efa826"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#a84936e230100934793aad8a516efa826">stdex::stream::basic_file::atime</a></div><div class="ttdeci">virtual time_point atime() const</div><div class="ttdoc">Returns file access time.</div><div class="ttdef"><b>Definition</b> stream.hpp:794</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_aba668e53fc4709cd545f12a49521ed56"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#aba668e53fc4709cd545f12a49521ed56">stdex::stream::basic_file::set_ctime</a></div><div class="ttdeci">virtual void set_ctime(time_point date)</div><div class="ttdoc">Sets file create time.</div><div class="ttdef"><b>Definition</b> stream.hpp:810</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_ad868d7c25aa45cefc95dd54a24febf2f"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#ad868d7c25aa45cefc95dd54a24febf2f">stdex::stream::basic_file::size</a></div><div class="ttdeci">virtual fsize_t size()=0</div><div class="ttdoc">Returns file size Should the file size cannot be determined, the method returns fsize_max and it does...</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_adf1a39e7aec3f14fedf6ce5c0984a791"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#adf1a39e7aec3f14fedf6ce5c0984a791">stdex::stream::basic_file::unlock</a></div><div class="ttdeci">virtual void unlock(fpos_t offset, fsize_t length)</div><div class="ttdoc">Unlocks file section for exclusive access.</div><div class="ttdef"><b>Definition</b> stream.hpp:765</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_ae072990f9c42b372048045717de438c3"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#ae072990f9c42b372048045717de438c3">stdex::stream::basic_file::tell</a></div><div class="ttdeci">virtual fpos_t tell() const =0</div><div class="ttdoc">Returns absolute file position in file or fpos_max if fails. This method does not update stream state...</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_ae10432137e01b7ce7c254c2a455c719e"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#ae10432137e01b7ce7c254c2a455c719e">stdex::stream::basic_file::mtime</a></div><div class="ttdeci">virtual time_point mtime() const</div><div class="ttdoc">Returns file modification time.</div><div class="ttdef"><b>Definition</b> stream.hpp:802</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_ae13b5941415b3dbb9883c1da9bcd39c7"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#ae13b5941415b3dbb9883c1da9bcd39c7">stdex::stream::basic_file::seekend</a></div><div class="ttdeci">fpos_t seekend(foff_t offset)</div><div class="ttdoc">Seeks to relative from end file position.</div><div class="ttdef"><b>Definition</b> stream.hpp:737</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_ae76436514ac66d88bbd584ea07d879d0"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#ae76436514ac66d88bbd584ea07d879d0">stdex::stream::basic_file::set_atime</a></div><div class="ttdeci">virtual void set_atime(time_point date)</div><div class="ttdoc">Sets file access time.</div><div class="ttdef"><b>Definition</b> stream.hpp:819</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__file_html_afcaac612398bd7d02d8d146dcad74465"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__file.html#afcaac612398bd7d02d8d146dcad74465">stdex::stream::basic_file::seek</a></div><div class="ttdeci">virtual fpos_t seek(foff_t offset, seek_t how=seek_t::beg)=0</div><div class="ttdoc">Seeks to specified relative file position.</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__sys_html"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__sys.html">stdex::stream::basic_sys</a></div><div class="ttdoc">OS data stream (file, pipe, socket...)</div><div class="ttdef"><b>Definition</b> stream.hpp:2064</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__sys_html_a06666e09bf1e7486d277996267b51618"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__sys.html#a06666e09bf1e7486d277996267b51618">stdex::stream::basic_sys::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:2121</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__sys_html_a6eae9769feea69fa9ce8b127ca2f7891"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__sys.html#a6eae9769feea69fa9ce8b127ca2f7891">stdex::stream::basic_sys::flush</a></div><div class="ttdeci">virtual void flush()</div><div class="ttdoc">Persists volatile element data.</div><div class="ttdef"><b>Definition</b> stream.hpp:2179</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__sys_html_ad5daf3c776b615dcfbb0b0891afdb9d0"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__sys.html#ad5daf3c776b615dcfbb0b0891afdb9d0">stdex::stream::basic_sys::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:2071</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic__sys_html_aee56fbeb8b576a4337cb205ae865fafc"><div class="ttname"><a href="classstdex_1_1stream_1_1basic__sys.html#aee56fbeb8b576a4337cb205ae865fafc">stdex::stream::basic_sys::close</a></div><div class="ttdeci">virtual void close()</div><div class="ttdoc">Closes the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:2168</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html">stdex::stream::basic</a></div><div class="ttdoc">UTF-8 byte-order-mark</div><div class="ttdef"><b>Definition</b> stream.hpp:76</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a0295e4efe18eef2a8962680274957ac1"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a0295e4efe18eef2a8962680274957ac1">stdex::stream::basic::ok</a></div><div class="ttdeci">bool ok() const</div><div class="ttdoc">Returns true if the stream state is clean i.e. previous operation was succesful.</div><div class="ttdef"><b>Definition</b> stream.hpp:170</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a14931af91db2bab8204d6352a59c1bf7"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a14931af91db2bab8204d6352a59c1bf7">stdex::stream::basic::write_vsprintf</a></div><div class="ttdeci">size_t write_vsprintf(_Printf_format_string_params_(2) const char *format, locale_t locale, va_list params)</div><div class="ttdoc">Writes formatted string to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:600</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a248d5e688633f04139ee36aacc0258ad"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a248d5e688633f04139ee36aacc0258ad">stdex::stream::basic::write_array</a></div><div class="ttdeci">size_t write_array(_In_reads_or_z_opt_(num_chars) const wchar_t *wstr, size_t num_chars, charset_id charset)</div><div class="ttdoc">Writes array of characters to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:430</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a2aa36b007017c2052a0118c1df4910d0"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a2aa36b007017c2052a0118c1df4910d0">stdex::stream::basic::state</a></div><div class="ttdeci">state_t state() const</div><div class="ttdoc">Returns stream state after last operation.</div><div class="ttdef"><b>Definition</b> stream.hpp:165</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a2fece103fa6ca15dfe093fe90ceae65e"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a2fece103fa6ca15dfe093fe90ceae65e">stdex::stream::basic::read_str</a></div><div class="ttdeci">basic &amp; read_str(std::basic_string&lt; _Elem, _Traits, _Ax &gt; &amp;data)</div><div class="ttdoc">Reads length-prefixed string from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:474</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a32f854944dc108d99c5ea5e87b19db7e"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a32f854944dc108d99c5ea5e87b19db7e">stdex::stream::basic::write_sprintf</a></div><div class="ttdeci">size_t write_sprintf(_Printf_format_string_params_(2) const wchar_t *format, locale_t locale,...)</div><div class="ttdoc">Writes formatted string to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:586</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a3a7ac9211cd81b2203b55f1a2f131bc1"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a3a7ac9211cd81b2203b55f1a2f131bc1">stdex::stream::basic::write_vsprintf</a></div><div class="ttdeci">size_t write_vsprintf(_Printf_format_string_params_(2) const wchar_t *format, locale_t locale, va_list params)</div><div class="ttdoc">Writes formatted string to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:613</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a46c70519f3e4b1f3436e85a6623555dc"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a46c70519f3e4b1f3436e85a6623555dc">stdex::stream::basic::flush</a></div><div class="ttdeci">virtual void flush()</div><div class="ttdoc">Persists volatile element data.</div><div class="ttdef"><b>Definition</b> stream.hpp:121</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a52ce3bdf28a9a7fc5a881616c8db2da4"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a52ce3bdf28a9a7fc5a881616c8db2da4">stdex::stream::basic::skip</a></div><div class="ttdeci">virtual void skip(fsize_t amount)</div><div class="ttdoc">Skips given amount of bytes of data on the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:137</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a5392748c19b5799da94a5fe031f7ec3b"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a5392748c19b5799da94a5fe031f7ec3b">stdex::stream::basic::close</a></div><div class="ttdeci">virtual void close()</div><div class="ttdoc">Closes the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:129</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a600e123c10d6f0604d58ae0e9be95f0b"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a600e123c10d6f0604d58ae0e9be95f0b">stdex::stream::basic::read_byte</a></div><div class="ttdeci">uint8_t read_byte()</div><div class="ttdoc">Reads one byte of data.</div><div class="ttdef"><b>Definition</b> stream.hpp:205</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a6148810b1d873b9f5a3496b06b1aa90b"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a6148810b1d873b9f5a3496b06b1aa90b">stdex::stream::basic::read_remainder</a></div><div class="ttdeci">virtual std::vector&lt; uint8_t &gt; read_remainder(size_t max_length=SIZE_MAX)</div><div class="ttdoc">Reads and returns remainder of the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:179</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a63528d1cf030257c9d7f24d0d1d668f7"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a63528d1cf030257c9d7f24d0d1d668f7">stdex::stream::basic::write_sprintf</a></div><div class="ttdeci">size_t write_sprintf(_Printf_format_string_params_(2) const char *format, locale_t locale,...)</div><div class="ttdoc">Writes formatted string to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:572</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a6386d7eb1316122d6403bcb83b7edfc9"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a6386d7eb1316122d6403bcb83b7edfc9">stdex::stream::basic::readln_and_attach</a></div><div class="ttdeci">size_t readln_and_attach(std::basic_string&lt; wchar_t, _Traits, _Ax &gt; &amp;wstr, charset_id charset)</div><div class="ttdoc">Reads stream to the end-of-line or end-of-file and append to str.</div><div class="ttdef"><b>Definition</b> stream.hpp:363</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a674d87b6ac5ca7b50cb0498a7ffcefcb"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a674d87b6ac5ca7b50cb0498a7ffcefcb">stdex::stream::basic::readln</a></div><div class="ttdeci">size_t readln(std::basic_string&lt; char, _Traits, _Ax &gt; &amp;str)</div><div class="ttdoc">Reads stream to the end-of-line or end-of-file.</div><div class="ttdef"><b>Definition</b> stream.hpp:301</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a6e67bf06f20bc1743cd75622c4b83892"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a6e67bf06f20bc1743cd75622c4b83892">stdex::stream::basic::readln_and_attach</a></div><div class="ttdeci">size_t readln_and_attach(std::basic_string&lt; _Elem, _Traits, _Ax &gt; &amp;str)</div><div class="ttdoc">Reads stream to the end-of-line or end-of-file and append to str.</div><div class="ttdef"><b>Definition</b> stream.hpp:342</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a7723ae23bc35c2ffb74380eab5b0a9ba"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a7723ae23bc35c2ffb74380eab5b0a9ba">stdex::stream::basic::read_array</a></div><div class="ttdeci">size_t read_array(_Out_writes_bytes_(size *count) void *array, size_t size, size_t count)</div><div class="ttdoc">Reads an array of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:378</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_a815369ef1a8ba07b289b8236fce018ac"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#a815369ef1a8ba07b289b8236fce018ac">stdex::stream::basic::write_str</a></div><div class="ttdeci">basic &amp; write_str(const T *data)</div><div class="ttdoc">Writes string to the stream length-prefixed.</div><div class="ttdef"><b>Definition</b> stream.hpp:499</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_aa5d4693fd583cd7ef0ffa9b846136a5a"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#aa5d4693fd583cd7ef0ffa9b846136a5a">stdex::stream::basic::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:91</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_aa8ab653a03de90f7e60242915c3b5378"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#aa8ab653a03de90f7e60242915c3b5378">stdex::stream::basic::readln</a></div><div class="ttdeci">size_t readln(std::basic_string&lt; wchar_t, _Traits, _Ax &gt; &amp;wstr)</div><div class="ttdoc">Reads stream to the end-of-line or end-of-file.</div><div class="ttdef"><b>Definition</b> stream.hpp:313</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_ab61abc19936554288ea929e0eb299144"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#ab61abc19936554288ea929e0eb299144">stdex::stream::basic::write_charset</a></div><div class="ttdeci">void write_charset(charset_id charset)</div><div class="ttdoc">Writes UTF8 or UTF-16 byte-order-mark.</div><div class="ttdef"><b>Definition</b> stream.hpp:559</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_ab93d06a993faf3b5f5026c0f5da326a1"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#ab93d06a993faf3b5f5026c0f5da326a1">stdex::stream::basic::readln</a></div><div class="ttdeci">size_t readln(std::basic_string&lt; wchar_t, _Traits, _Ax &gt; &amp;wstr, charset_id charset)</div><div class="ttdoc">Reads stream to the end-of-line or end-of-file.</div><div class="ttdef"><b>Definition</b> stream.hpp:325</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_aca55a448ce9bec6b50be680f1ac63b09"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#aca55a448ce9bec6b50be680f1ac63b09">stdex::stream::basic::write_array</a></div><div class="ttdeci">size_t write_array(const wchar_t *wstr, charset_id charset)</div><div class="ttdoc">Writes array of characters to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:409</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_acabab42a910d149fec6ef60090a34aab"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab">stdex::stream::basic::write_data</a></div><div class="ttdeci">basic &amp; write_data(const T data)</div><div class="ttdoc">Writes one primitive data type.</div><div class="ttdef"><b>Definition</b> stream.hpp:282</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_ad28b193e6afa1352a00864bd28193cc2"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#ad28b193e6afa1352a00864bd28193cc2">stdex::stream::basic::write_stream</a></div><div class="ttdeci">fsize_t write_stream(basic &amp;stream, fsize_t amount=fsize_max)</div><div class="ttdoc">Writes content of another stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:534</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_ad8af0444273509eb36ad81046ac92081"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081">stdex::stream::basic::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:109</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_ae7e725d1bfe3b7a08a87c969ce441a7a"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#ae7e725d1bfe3b7a08a87c969ce441a7a">stdex::stream::basic::write_array</a></div><div class="ttdeci">size_t write_array(const std::basic_string&lt; wchar_t, _Traits, _Ax &gt; &amp;wstr, charset_id charset)</div><div class="ttdoc">Writes array of characters to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:451</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_af6c10ec4ab181b5ed5b061d115059b7a"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a">stdex::stream::basic::write_array</a></div><div class="ttdeci">size_t write_array(_In_reads_bytes_opt_(size *count) const void *array, size_t size, size_t count)</div><div class="ttdoc">Writes an array of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:396</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_af83cd6902f3f3bf18df2f08045570603"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#af83cd6902f3f3bf18df2f08045570603">stdex::stream::basic::write_byte</a></div><div class="ttdeci">void write_byte(uint8_t byte, fsize_t amount=1)</div><div class="ttdoc">Writes a byte of data.</div><div class="ttdef"><b>Definition</b> stream.hpp:216</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1basic_html_afd5a1268365027ed8c5108183dc498df"><div class="ttname"><a href="classstdex_1_1stream_1_1basic.html#afd5a1268365027ed8c5108183dc498df">stdex::stream::basic::read_data</a></div><div class="ttdeci">basic &amp; read_data(T &amp;data)</div><div class="ttdoc">Reads one primitive data type.</div><div class="ttdef"><b>Definition</b> stream.hpp:254</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1buffer_html"><div class="ttname"><a href="classstdex_1_1stream_1_1buffer.html">stdex::stream::buffer</a></div><div class="ttdoc">Buffered read/write stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1257</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1buffer_html_a18f9edc9af41f3a71d84f7eb4e7d5332"><div class="ttname"><a href="classstdex_1_1stream_1_1buffer.html#a18f9edc9af41f3a71d84f7eb4e7d5332">stdex::stream::buffer::flush</a></div><div class="ttdeci">virtual void flush()</div><div class="ttdoc">Persists volatile element data.</div><div class="ttdef"><b>Definition</b> stream.hpp:1367</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1buffer_html_a2ef05f2df784dce1d1c4319a98cd22e0"><div class="ttname"><a href="classstdex_1_1stream_1_1buffer.html#a2ef05f2df784dce1d1c4319a98cd22e0">stdex::stream::buffer::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1285</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1buffer_html_a489a01a4c187e85f06ebe10314a891ae"><div class="ttname"><a href="classstdex_1_1stream_1_1buffer.html#a489a01a4c187e85f06ebe10314a891ae">stdex::stream::buffer::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1321</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1buffered__sys_html"><div class="ttname"><a href="classstdex_1_1stream_1_1buffered__sys.html">stdex::stream::buffered_sys</a></div><div class="ttdoc">Buffered OS data stream (file, pipe, socket...)</div><div class="ttdef"><b>Definition</b> stream.hpp:2193</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html">stdex::stream::cache</a></div><div class="ttdoc">Cached file.</div><div class="ttdef"><b>Definition</b> stream.hpp:1684</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_a0306f70f169f924f41306c71646c9276"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#a0306f70f169f924f41306c71646c9276">stdex::stream::cache::ctime</a></div><div class="ttdeci">virtual time_point ctime() const</div><div class="ttdoc">Returns file creation time.</div><div class="ttdef"><b>Definition</b> stream.hpp:1936</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_a1132b6554bec05e4da1d493d18516640"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#a1132b6554bec05e4da1d493d18516640">stdex::stream::cache::m_offset</a></div><div class="ttdeci">fpos_t m_offset</div><div class="ttdoc">Logical absolute file position.</div><div class="ttdef"><b>Definition</b> stream.hpp:2052</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_a2e19026e55cda14db786948b66d63aba"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#a2e19026e55cda14db786948b66d63aba">stdex::stream::cache::truncate</a></div><div class="ttdeci">virtual void truncate()</div><div class="ttdoc">Sets file size - truncates the remainder of file content from the current file position to the end of...</div><div class="ttdef"><b>Definition</b> stream.hpp:1915</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_a43dd464dd032888de79f5cd606adffa9"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#a43dd464dd032888de79f5cd606adffa9">stdex::stream::cache::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1741</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_a5fd8962b5a49d549a36d96f3e8919cd7"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#a5fd8962b5a49d549a36d96f3e8919cd7">stdex::stream::cache::atime</a></div><div class="ttdeci">virtual time_point atime() const</div><div class="ttdoc">Returns file access time.</div><div class="ttdef"><b>Definition</b> stream.hpp:1941</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_a769034b8641a17210a916091b112af2d"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#a769034b8641a17210a916091b112af2d">stdex::stream::cache::size</a></div><div class="ttdeci">virtual fsize_t size()</div><div class="ttdoc">Returns file size Should the file size cannot be determined, the method returns fsize_max and it does...</div><div class="ttdef"><b>Definition</b> stream.hpp:1908</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_a7a15ab17abc847b380b13b43b4f1d12e"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#a7a15ab17abc847b380b13b43b4f1d12e">stdex::stream::cache::unlock</a></div><div class="ttdeci">virtual void unlock(fpos_t offset, fsize_t length)</div><div class="ttdoc">Unlocks file section for exclusive access.</div><div class="ttdef"><b>Definition</b> stream.hpp:1902</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_a8350e6c158982e5511da18ed122bf24d"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#a8350e6c158982e5511da18ed122bf24d">stdex::stream::cache::mtime</a></div><div class="ttdeci">virtual time_point mtime() const</div><div class="ttdoc">Returns file modification time.</div><div class="ttdef"><b>Definition</b> stream.hpp:1950</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_aa88074bb669bcb654e027b76e32a2799"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#aa88074bb669bcb654e027b76e32a2799">stdex::stream::cache::close</a></div><div class="ttdeci">virtual void close()</div><div class="ttdoc">Closes the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1856</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_aafad7bfb4c03d0d56854b4c148ae0ee1"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#aafad7bfb4c03d0d56854b4c148ae0ee1">stdex::stream::cache::set_mtime</a></div><div class="ttdeci">virtual void set_mtime(time_point date)</div><div class="ttdoc">Sets file modification time.</div><div class="ttdef"><b>Definition</b> stream.hpp:1972</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_ac1ca25b572574b35cd4895964e835204"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#ac1ca25b572574b35cd4895964e835204">stdex::stream::cache::lock</a></div><div class="ttdeci">virtual void lock(fpos_t offset, fsize_t length)</div><div class="ttdoc">Locks file section for exclusive access.</div><div class="ttdef"><b>Definition</b> stream.hpp:1896</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_ac33e763d8103ad8e910b75085a4cf3ac"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#ac33e763d8103ad8e910b75085a4cf3ac">stdex::stream::cache::flush</a></div><div class="ttdeci">virtual void flush()</div><div class="ttdoc">Persists volatile element data.</div><div class="ttdef"><b>Definition</b> stream.hpp:1865</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_ac436fbcac7eddf95b6e25d6368da3fb7"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#ac436fbcac7eddf95b6e25d6368da3fb7">stdex::stream::cache::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1803</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_ae62a75156ff79910e1b9afc506e38e44"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#ae62a75156ff79910e1b9afc506e38e44">stdex::stream::cache::set_ctime</a></div><div class="ttdeci">virtual void set_ctime(time_point date)</div><div class="ttdoc">Sets file create time.</div><div class="ttdef"><b>Definition</b> stream.hpp:1959</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_ae790c5f526771cfe2cb3b28d38a11dd9"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#ae790c5f526771cfe2cb3b28d38a11dd9">stdex::stream::cache::tell</a></div><div class="ttdeci">virtual fpos_t tell() const</div><div class="ttdoc">Returns absolute file position in file or fpos_max if fails. This method does not update stream state...</div><div class="ttdef"><b>Definition</b> stream.hpp:1891</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_af026881969ee78e2aef1bf02922aea93"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#af026881969ee78e2aef1bf02922aea93">stdex::stream::cache::set_atime</a></div><div class="ttdeci">virtual void set_atime(time_point date)</div><div class="ttdoc">Sets file access time.</div><div class="ttdef"><b>Definition</b> stream.hpp:1964</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cache_html_af2979118bdeca35cbfd84a8a2be00f8a"><div class="ttname"><a href="classstdex_1_1stream_1_1cache.html#af2979118bdeca35cbfd84a8a2be00f8a">stdex::stream::cache::seek</a></div><div class="ttdeci">virtual fpos_t seek(foff_t offset, seek_t how=seek_t::beg)</div><div class="ttdoc">Seeks to specified relative file position.</div><div class="ttdef"><b>Definition</b> stream.hpp:1876</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cached__file_html"><div class="ttname"><a href="classstdex_1_1stream_1_1cached__file.html">stdex::stream::cached_file</a></div><div class="ttdoc">Cached file-system file.</div><div class="ttdef"><b>Definition</b> stream.hpp:2751</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cached__file_html_a8a1ac6ccd8e1d321112412d346eec0e1"><div class="ttname"><a href="classstdex_1_1stream_1_1cached__file.html#a8a1ac6ccd8e1d321112412d346eec0e1">stdex::stream::cached_file::open</a></div><div class="ttdeci">void open(const schar_t *filename, int mode)</div><div class="ttdoc">Opens file.</div><div class="ttdef"><b>Definition</b> stream.hpp:2785</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1cached__file_html_aa53149a79b463450f64223f45285dc02"><div class="ttname"><a href="classstdex_1_1stream_1_1cached__file.html#aa53149a79b463450f64223f45285dc02">stdex::stream::cached_file::cached_file</a></div><div class="ttdeci">cached_file(const schar_t *filename, int mode, size_t cache_size=default_cache_size)</div><div class="ttdoc">Opens file.</div><div class="ttdef"><b>Definition</b> stream.hpp:2767</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1converter_html"><div class="ttname"><a href="classstdex_1_1stream_1_1converter.html">stdex::stream::converter</a></div><div class="ttdoc">Modifies data on the fly when reading from/writing to a source stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:889</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1converter_html_a0d6af4c223625bc8ab677978b225d06e"><div class="ttname"><a href="classstdex_1_1stream_1_1converter.html#a0d6af4c223625bc8ab677978b225d06e">stdex::stream::converter::flush</a></div><div class="ttdeci">virtual void flush()</div><div class="ttdoc">Persists volatile element data.</div><div class="ttdef"><b>Definition</b> stream.hpp:935</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1converter_html_a96c368204acf32239318a026762cd22c"><div class="ttname"><a href="classstdex_1_1stream_1_1converter.html#a96c368204acf32239318a026762cd22c">stdex::stream::converter::close</a></div><div class="ttdeci">virtual void close()</div><div class="ttdoc">Closes the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:929</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1converter_html_abdca66af4847c6f8b6d87a0909fc061f"><div class="ttname"><a href="classstdex_1_1stream_1_1converter.html#abdca66af4847c6f8b6d87a0909fc061f">stdex::stream::converter::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:913</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1converter_html_ae84a5c8d64942dbaa81ed54a181b3d7a"><div class="ttname"><a href="classstdex_1_1stream_1_1converter.html#ae84a5c8d64942dbaa81ed54a181b3d7a">stdex::stream::converter::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:921</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1diag__file_html"><div class="ttname"><a href="classstdex_1_1stream_1_1diag__file.html">stdex::stream::diag_file</a></div><div class="ttdoc">Compares multiple files to perform the same.</div><div class="ttdef"><b>Definition</b> stream.hpp:3583</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1diag__file_html_a0797e4eba9f702022e1c467694302871"><div class="ttname"><a href="classstdex_1_1stream_1_1diag__file.html#a0797e4eba9f702022e1c467694302871">stdex::stream::diag_file::size</a></div><div class="ttdeci">virtual fsize_t size()</div><div class="ttdoc">Returns file size Should the file size cannot be determined, the method returns fsize_max and it does...</div><div class="ttdef"><b>Definition</b> stream.hpp:3719</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1diag__file_html_a1d0824a191f261a1c552b71a92584745"><div class="ttname"><a href="classstdex_1_1stream_1_1diag__file.html#a1d0824a191f261a1c552b71a92584745">stdex::stream::diag_file::truncate</a></div><div class="ttdeci">virtual void truncate()</div><div class="ttdoc">Sets file size - truncates the remainder of file content from the current file position to the end of...</div><div class="ttdef"><b>Definition</b> stream.hpp:3736</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1diag__file_html_a3157aee8e9c754b02e876897fcb82236"><div class="ttname"><a href="classstdex_1_1stream_1_1diag__file.html#a3157aee8e9c754b02e876897fcb82236">stdex::stream::diag_file::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:3614</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1diag__file_html_a4367a6d2840c1a2c5d9ab2ab3483ed2c"><div class="ttname"><a href="classstdex_1_1stream_1_1diag__file.html#a4367a6d2840c1a2c5d9ab2ab3483ed2c">stdex::stream::diag_file::close</a></div><div class="ttdeci">virtual void close()</div><div class="ttdoc">Closes the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:3647</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1diag__file_html_a5d4bcde718ef182590c742f0c600e54b"><div class="ttname"><a href="classstdex_1_1stream_1_1diag__file.html#a5d4bcde718ef182590c742f0c600e54b">stdex::stream::diag_file::lock</a></div><div class="ttdeci">virtual void lock(fpos_t offset, fsize_t length)</div><div class="ttdoc">Locks file section for exclusive access.</div><div class="ttdef"><b>Definition</b> stream.hpp:3693</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1diag__file_html_a9f0c158f4875c862f981282b818e7296"><div class="ttname"><a href="classstdex_1_1stream_1_1diag__file.html#a9f0c158f4875c862f981282b818e7296">stdex::stream::diag_file::unlock</a></div><div class="ttdeci">virtual void unlock(fpos_t offset, fsize_t length)</div><div class="ttdoc">Unlocks file section for exclusive access.</div><div class="ttdef"><b>Definition</b> stream.hpp:3706</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1diag__file_html_a9f616580a2547b37beccd7d114ed06d0"><div class="ttname"><a href="classstdex_1_1stream_1_1diag__file.html#a9f616580a2547b37beccd7d114ed06d0">stdex::stream::diag_file::seek</a></div><div class="ttdeci">virtual fpos_t seek(foff_t offset, seek_t how=seek_t::beg)</div><div class="ttdoc">Seeks to specified relative file position.</div><div class="ttdef"><b>Definition</b> stream.hpp:3664</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1diag__file_html_aa4ea6e5ca1ff91a6f5c9726f4251f3ce"><div class="ttname"><a href="classstdex_1_1stream_1_1diag__file.html#aa4ea6e5ca1ff91a6f5c9726f4251f3ce">stdex::stream::diag_file::tell</a></div><div class="ttdeci">virtual fpos_t tell() const</div><div class="ttdoc">Returns absolute file position in file or fpos_max if fails. This method does not update stream state...</div><div class="ttdef"><b>Definition</b> stream.hpp:3681</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1diag__file_html_aadb3e9de2c84e317bf454ae764d8fcdf"><div class="ttname"><a href="classstdex_1_1stream_1_1diag__file.html#aadb3e9de2c84e317bf454ae764d8fcdf">stdex::stream::diag_file::flush</a></div><div class="ttdeci">virtual void flush()</div><div class="ttdoc">Persists volatile element data.</div><div class="ttdef"><b>Definition</b> stream.hpp:3632</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1diag__file_html_ac1eaf4a0cfce7e4426cff5f32fc33e6e"><div class="ttname"><a href="classstdex_1_1stream_1_1diag__file.html#ac1eaf4a0cfce7e4426cff5f32fc33e6e">stdex::stream::diag_file::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:3591</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1fifo_html"><div class="ttname"><a href="classstdex_1_1stream_1_1fifo.html">stdex::stream::fifo</a></div><div class="ttdoc">In-memory FIFO queue.</div><div class="ttdef"><b>Definition</b> stream.hpp:3483</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1fifo_html_a29e0a95836f4e2692bea3783acaf692d"><div class="ttname"><a href="classstdex_1_1stream_1_1fifo.html#a29e0a95836f4e2692bea3783acaf692d">stdex::stream::fifo::close</a></div><div class="ttdeci">virtual void close()</div><div class="ttdoc">Closes the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:3554</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1fifo_html_a30c7adb43b6f4bd0cb5d9c72f15fe9bf"><div class="ttname"><a href="classstdex_1_1stream_1_1fifo.html#a30c7adb43b6f4bd0cb5d9c72f15fe9bf">stdex::stream::fifo::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:3531</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1fifo_html_a3272bc89573fe75fe0e6de2600967c10"><div class="ttname"><a href="classstdex_1_1stream_1_1fifo.html#a3272bc89573fe75fe0e6de2600967c10">stdex::stream::fifo::size</a></div><div class="ttdeci">size_t size() const</div><div class="ttdoc">Returns total size of pending data in the queue.</div><div class="ttdef"><b>Definition</b> stream.hpp:3568</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1fifo_html_a84357513740c64a8317370b289c34e40"><div class="ttname"><a href="classstdex_1_1stream_1_1fifo.html#a84357513740c64a8317370b289c34e40">stdex::stream::fifo::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:3502</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file__window_html"><div class="ttname"><a href="classstdex_1_1stream_1_1file__window.html">stdex::stream::file_window</a></div><div class="ttdoc">Limits file reading/writing to a predefined window.</div><div class="ttdef"><b>Definition</b> stream.hpp:1574</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file__window_html_a10f67434e8f3784933e3f7fddd20ce54"><div class="ttname"><a href="classstdex_1_1stream_1_1file__window.html#a10f67434e8f3784933e3f7fddd20ce54">stdex::stream::file_window::truncate</a></div><div class="ttdeci">virtual void truncate()</div><div class="ttdoc">Sets file size - truncates the remainder of file content from the current file position to the end of...</div><div class="ttdef"><b>Definition</b> stream.hpp:1667</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file__window_html_a2a2b88934b073b456da579ca3e3b43ff"><div class="ttname"><a href="classstdex_1_1stream_1_1file__window.html#a2a2b88934b073b456da579ca3e3b43ff">stdex::stream::file_window::flush</a></div><div class="ttdeci">virtual void flush()</div><div class="ttdoc">Persists volatile element data.</div><div class="ttdef"><b>Definition</b> stream.hpp:1617</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file__window_html_a4202fcc2b9e69e40bf15aaa3b5f50dda"><div class="ttname"><a href="classstdex_1_1stream_1_1file__window.html#a4202fcc2b9e69e40bf15aaa3b5f50dda">stdex::stream::file_window::skip</a></div><div class="ttdeci">virtual void skip(fsize_t amount)</div><div class="ttdoc">Skips given amount of bytes of data on the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1630</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file__window_html_a53a12a1979b770030c0de05b349f1e55"><div class="ttname"><a href="classstdex_1_1stream_1_1file__window.html#a53a12a1979b770030c0de05b349f1e55">stdex::stream::file_window::seek</a></div><div class="ttdeci">virtual fpos_t seek(foff_t offset, seek_t how=seek_t::beg)</div><div class="ttdoc">Seeks to specified relative file position.</div><div class="ttdef"><b>Definition</b> stream.hpp:1623</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file__window_html_a70d596dd863a5265303aab11db59768e"><div class="ttname"><a href="classstdex_1_1stream_1_1file__window.html#a70d596dd863a5265303aab11db59768e">stdex::stream::file_window::size</a></div><div class="ttdeci">virtual fsize_t size()</div><div class="ttdoc">Returns file size Should the file size cannot be determined, the method returns fsize_max and it does...</div><div class="ttdef"><b>Definition</b> stream.hpp:1662</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file__window_html_a7a264381cf344fcd6fa70e0a4964cc93"><div class="ttname"><a href="classstdex_1_1stream_1_1file__window.html#a7a264381cf344fcd6fa70e0a4964cc93">stdex::stream::file_window::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1597</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file__window_html_a820fea50931a0769161f617a524f72c6"><div class="ttname"><a href="classstdex_1_1stream_1_1file__window.html#a820fea50931a0769161f617a524f72c6">stdex::stream::file_window::lock</a></div><div class="ttdeci">virtual void lock(fpos_t offset, fsize_t length)</div><div class="ttdoc">Locks file section for exclusive access.</div><div class="ttdef"><b>Definition</b> stream.hpp:1642</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file__window_html_a9cdfe9f40ccb1f84e121b1b949a21246"><div class="ttname"><a href="classstdex_1_1stream_1_1file__window.html#a9cdfe9f40ccb1f84e121b1b949a21246">stdex::stream::file_window::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1583</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file__window_html_ac3d9a3cf3636010b43612d2c298e7c3d"><div class="ttname"><a href="classstdex_1_1stream_1_1file__window.html#ac3d9a3cf3636010b43612d2c298e7c3d">stdex::stream::file_window::unlock</a></div><div class="ttdeci">virtual void unlock(fpos_t offset, fsize_t length)</div><div class="ttdoc">Unlocks file section for exclusive access.</div><div class="ttdef"><b>Definition</b> stream.hpp:1652</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file__window_html_ac5977ca09563126e2976abb356cb3b36"><div class="ttname"><a href="classstdex_1_1stream_1_1file__window.html#ac5977ca09563126e2976abb356cb3b36">stdex::stream::file_window::tell</a></div><div class="ttdeci">virtual fpos_t tell() const</div><div class="ttdoc">Returns absolute file position in file or fpos_max if fails. This method does not update stream state...</div><div class="ttdef"><b>Definition</b> stream.hpp:1636</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file__window_html_acace60a7ba95a139852f85aa4232bb14"><div class="ttname"><a href="classstdex_1_1stream_1_1file__window.html#acace60a7ba95a139852f85aa4232bb14">stdex::stream::file_window::close</a></div><div class="ttdeci">virtual void close()</div><div class="ttdoc">Closes the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1611</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html">stdex::stream::file</a></div><div class="ttdoc">File-system file.</div><div class="ttdef"><b>Definition</b> stream.hpp:2434</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_a23e1061f6a9473241ef8af99f6a3f08f"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#a23e1061f6a9473241ef8af99f6a3f08f">stdex::stream::file::mtime</a></div><div class="ttdeci">virtual time_point mtime() const</div><div class="ttdoc">Returns file modification time.</div><div class="ttdef"><b>Definition</b> stream.hpp:2682</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_a28e6d46e4183e094ef9fdcf591ebec46"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#a28e6d46e4183e094ef9fdcf591ebec46">stdex::stream::file::unlock</a></div><div class="ttdeci">virtual void unlock(fpos_t offset, fsize_t length)</div><div class="ttdoc">Unlocks file section for exclusive access.</div><div class="ttdef"><b>Definition</b> stream.hpp:2575</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_a31e46e58ec40db989b36c3553b09084f"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#a31e46e58ec40db989b36c3553b09084f">stdex::stream::file::file</a></div><div class="ttdeci">file(const schar_t *filename, int mode)</div><div class="ttdoc">Opens file.</div><div class="ttdef"><b>Definition</b> stream.hpp:2444</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_a337a27cd63975e155b6ba29a18ed9a23"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#a337a27cd63975e155b6ba29a18ed9a23">stdex::stream::file::set_ctime</a></div><div class="ttdeci">virtual void set_ctime(time_point date)</div><div class="ttdoc">Sets file create time.</div><div class="ttdef"><b>Definition</b> stream.hpp:2696</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_a4b5cdfe6c9dccd20726df867e34f4af3"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#a4b5cdfe6c9dccd20726df867e34f4af3">stdex::stream::file::atime</a></div><div class="ttdeci">virtual time_point atime() const</div><div class="ttdoc">Returns file access time.</div><div class="ttdef"><b>Definition</b> stream.hpp:2668</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_a556c4cff7086d5f258dcdf914556084a"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#a556c4cff7086d5f258dcdf914556084a">stdex::stream::file::open</a></div><div class="ttdeci">void open(const schar_t *filename, int mode)</div><div class="ttdoc">Opens file.</div><div class="ttdef"><b>Definition</b> stream.hpp:2455</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_a567620d1eb84032e460f3e173f9bd762"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#a567620d1eb84032e460f3e173f9bd762">stdex::stream::file::set_mtime</a></div><div class="ttdeci">virtual void set_mtime(time_point date)</div><div class="ttdoc">Sets file modification time.</div><div class="ttdef"><b>Definition</b> stream.hpp:2727</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_a64ded627a8843c155ea3a59b94c225f6"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#a64ded627a8843c155ea3a59b94c225f6">stdex::stream::file::set_atime</a></div><div class="ttdeci">virtual void set_atime(time_point date)</div><div class="ttdoc">Sets file access time.</div><div class="ttdef"><b>Definition</b> stream.hpp:2708</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_a74fdb70cb8ce4d0ee73f6db9d7051d86"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#a74fdb70cb8ce4d0ee73f6db9d7051d86">stdex::stream::file::lock</a></div><div class="ttdeci">virtual void lock(fpos_t offset, fsize_t length)</div><div class="ttdoc">Locks file section for exclusive access.</div><div class="ttdef"><b>Definition</b> stream.hpp:2552</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_aa1c4de0bca72ddc02db4e8328cefcf17"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#aa1c4de0bca72ddc02db4e8328cefcf17">stdex::stream::file::truncate</a></div><div class="ttdeci">virtual void truncate()</div><div class="ttdoc">Sets file size - truncates the remainder of file content from the current file position to the end of...</div><div class="ttdef"><b>Definition</b> stream.hpp:2618</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_aa54131619fe782de419ed74bab377dd5"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#aa54131619fe782de419ed74bab377dd5">stdex::stream::file::ctime</a></div><div class="ttdeci">virtual time_point ctime() const</div><div class="ttdoc">Returns file creation time.</div><div class="ttdef"><b>Definition</b> stream.hpp:2658</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_acc591c2378e51340b7af7fbf12d1a98f"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#acc591c2378e51340b7af7fbf12d1a98f">stdex::stream::file::size</a></div><div class="ttdeci">virtual fsize_t size()</div><div class="ttdoc">Returns file size Should the file size cannot be determined, the method returns fsize_max and it does...</div><div class="ttdef"><b>Definition</b> stream.hpp:2600</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_acdfc1dc079ebeaeb05312e03925485ff"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#acdfc1dc079ebeaeb05312e03925485ff">stdex::stream::file::seek</a></div><div class="ttdeci">virtual fpos_t seek(foff_t offset, seek_t how=seek_t::beg)</div><div class="ttdoc">Seeks to specified relative file position.</div><div class="ttdef"><b>Definition</b> stream.hpp:2513</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1file_html_aead21702bfdb09193a202afbce35421b"><div class="ttname"><a href="classstdex_1_1stream_1_1file.html#aead21702bfdb09193a202afbce35421b">stdex::stream::file::tell</a></div><div class="ttdeci">virtual fpos_t tell() const</div><div class="ttdoc">Returns absolute file position in file or fpos_max if fails. This method does not update stream state...</div><div class="ttdef"><b>Definition</b> stream.hpp:2534</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1limiter_html"><div class="ttname"><a href="classstdex_1_1stream_1_1limiter.html">stdex::stream::limiter</a></div><div class="ttdoc">Limits reading from/writing to stream to a predefined number of bytes.</div><div class="ttdef"><b>Definition</b> stream.hpp:1415</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1limiter_html_a455a9e38efe1e7473e501dd00fb3d7f0"><div class="ttname"><a href="classstdex_1_1stream_1_1limiter.html#a455a9e38efe1e7473e501dd00fb3d7f0">stdex::stream::limiter::read_limit</a></div><div class="ttdeci">fsize_t read_limit</div><div class="ttdoc">Number of bytes left that may be read from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1475</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1limiter_html_a80b68f1b4a8fb8c72c09b1313e9d02ed"><div class="ttname"><a href="classstdex_1_1stream_1_1limiter.html#a80b68f1b4a8fb8c72c09b1313e9d02ed">stdex::stream::limiter::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1423</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1limiter_html_a8fe783b504f019e29034c0572cec7834"><div class="ttname"><a href="classstdex_1_1stream_1_1limiter.html#a8fe783b504f019e29034c0572cec7834">stdex::stream::limiter::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1448</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1limiter_html_af3d8db598efea694c0274b5420787873"><div class="ttname"><a href="classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873">stdex::stream::limiter::write_limit</a></div><div class="ttdeci">fsize_t write_limit</div><div class="ttdoc">Number of bytes left, that can be written to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1476</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html">stdex::stream::memory_file</a></div><div class="ttdoc">In-memory file.</div><div class="ttdef"><b>Definition</b> stream.hpp:2813</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a0bb7b9759667e810c91b3e58c1771d91"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a0bb7b9759667e810c91b3e58c1771d91">stdex::stream::memory_file::memory_file</a></div><div class="ttdeci">memory_file(const schar_t *filename, int mode)</div><div class="ttdoc">Loads content from file-system file.</div><div class="ttdef"><b>Definition</b> stream.hpp:2891</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a41121ff122745e109c1b9851632abce3"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a41121ff122745e109c1b9851632abce3">stdex::stream::memory_file::m_size</a></div><div class="ttdeci">size_t m_size</div><div class="ttdoc">file size</div><div class="ttdef"><b>Definition</b> stream.hpp:3470</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a41124fc38a3439c4407ea1c9ef4962b1"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1">stdex::stream::memory_file::get</a></div><div class="ttdeci">void get(fpos_t offset, T &amp;data)</div><div class="ttdoc">Reads data from specified file location This does not move file pointer. It checks for data size asse...</div><div class="ttdef"><b>Definition</b> stream.hpp:3410</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a4216e7ae6e306170357aef1ea1c304c7"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a4216e7ae6e306170357aef1ea1c304c7">stdex::stream::memory_file::write_stream</a></div><div class="ttdeci">size_t write_stream(basic &amp;stream, size_t amount=SIZE_MAX)</div><div class="ttdoc">Writes content of another stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:3235</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a4a2082f1017478d1ce940d8dcd6e234b"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a4a2082f1017478d1ce940d8dcd6e234b">stdex::stream::memory_file::m_data</a></div><div class="ttdeci">uint8_t * m_data</div><div class="ttdoc">file data</div><div class="ttdef"><b>Definition</b> stream.hpp:3467</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a4aa784758856b70a2b6f2b7ca0ffa72b"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a4aa784758856b70a2b6f2b7ca0ffa72b">stdex::stream::memory_file::read_data</a></div><div class="ttdeci">memory_file &amp; read_data(T &amp;data)</div><div class="ttdoc">Reads one primitive data type.</div><div class="ttdef"><b>Definition</b> stream.hpp:3034</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a4cf33faaf1686335bd3e3a7e72813dd6"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a4cf33faaf1686335bd3e3a7e72813dd6">stdex::stream::memory_file::close</a></div><div class="ttdeci">virtual void close()</div><div class="ttdoc">Closes the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:3285</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a62a05e7dfb1f374dff881f922543e601"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a62a05e7dfb1f374dff881f922543e601">stdex::stream::memory_file::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:2995</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a665d78bdb906762139530035ba6013fa"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a665d78bdb906762139530035ba6013fa">stdex::stream::memory_file::tell</a></div><div class="ttdeci">virtual fpos_t tell() const</div><div class="ttdoc">Returns absolute file position in file or fpos_max if fails. This method does not update stream state...</div><div class="ttdef"><b>Definition</b> stream.hpp:3316</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a6aa8c2deeabc66f065c858ba399d911c"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a6aa8c2deeabc66f065c858ba399d911c">stdex::stream::memory_file::m_reserved</a></div><div class="ttdeci">size_t m_reserved</div><div class="ttdoc">reserved file size</div><div class="ttdef"><b>Definition</b> stream.hpp:3471</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a6b4b9daa088fb20678a502e81553c745"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a6b4b9daa088fb20678a502e81553c745">stdex::stream::memory_file::memory_file</a></div><div class="ttdeci">memory_file(size_t size, state_t state=state_t::ok)</div><div class="ttdoc">Creates an empty file of reserved size.</div><div class="ttdef"><b>Definition</b> stream.hpp:2834</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a6b59e4dd13195dd91211ece4c680cb9b"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a6b59e4dd13195dd91211ece4c680cb9b">stdex::stream::memory_file::reserve</a></div><div class="ttdeci">void reserve(size_t required, bool tight=false) noexcept</div><div class="ttdoc">Reallocates memory.</div><div class="ttdef"><b>Definition</b> stream.hpp:2908</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a7a8abbdd7f86e10ffb711621015645f6"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a7a8abbdd7f86e10ffb711621015645f6">stdex::stream::memory_file::read_str</a></div><div class="ttdeci">memory_file &amp; read_str(std::basic_string&lt; _Elem, _Traits, _Ax &gt; &amp;data)</div><div class="ttdoc">Reads length-prefixed string from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:3074</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a7d2187e9f98729b2c711a9cd242b7fc2"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a7d2187e9f98729b2c711a9cd242b7fc2">stdex::stream::memory_file::write_byte</a></div><div class="ttdeci">void write_byte(uint8_t byte, size_t amount=1)</div><div class="ttdoc">Writes a byte of data.</div><div class="ttdef"><b>Definition</b> stream.hpp:3129</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a8ccb02a23999882255d5c16c83f91571"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571">stdex::stream::memory_file::set</a></div><div class="ttdeci">void set(fpos_t offset, const T data)</div><div class="ttdoc">Writes data to specified file location This does not move file pointer nor update file size....</div><div class="ttdef"><b>Definition</b> stream.hpp:3376</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a91ca49273fc49d70b98180fc828d5b5d"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a91ca49273fc49d70b98180fc828d5b5d">stdex::stream::memory_file::m_offset</a></div><div class="ttdeci">size_t m_offset</div><div class="ttdoc">file pointer</div><div class="ttdef"><b>Definition</b> stream.hpp:3469</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a96210fbbca48af7097ddad7cc9bf6cb5"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a96210fbbca48af7097ddad7cc9bf6cb5">stdex::stream::memory_file::save</a></div><div class="ttdeci">void save(const schar_t *filename, int mode)</div><div class="ttdoc">Saves content to a file-system file.</div><div class="ttdef"><b>Definition</b> stream.hpp:2970</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a98f0a5ecb59b4e50d5990aa505b658c2"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a98f0a5ecb59b4e50d5990aa505b658c2">stdex::stream::memory_file::load</a></div><div class="ttdeci">void load(const schar_t *filename, int mode)</div><div class="ttdoc">Loads content from a file-system file.</div><div class="ttdef"><b>Definition</b> stream.hpp:2937</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a99b32855f1f85ccc7c08d71786c17a1c"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a99b32855f1f85ccc7c08d71786c17a1c">stdex::stream::memory_file::size</a></div><div class="ttdeci">virtual fsize_t size()</div><div class="ttdoc">Returns file size Should the file size cannot be determined, the method returns fsize_max and it does...</div><div class="ttdef"><b>Definition</b> stream.hpp:3321</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_a9e67e40e9e3c0f7b002fcdab5220b4e7"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#a9e67e40e9e3c0f7b002fcdab5220b4e7">stdex::stream::memory_file::seek</a></div><div class="ttdeci">virtual fpos_t seek(foff_t offset, seek_t how=seek_t::beg)</div><div class="ttdoc">Seeks to specified relative file position.</div><div class="ttdef"><b>Definition</b> stream.hpp:3299</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_aa35db1681e5c56046eaf0c70068b0d42"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#aa35db1681e5c56046eaf0c70068b0d42">stdex::stream::memory_file::truncate</a></div><div class="ttdeci">virtual void truncate()</div><div class="ttdoc">Sets file size - truncates the remainder of file content from the current file position to the end of...</div><div class="ttdef"><b>Definition</b> stream.hpp:3326</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_ab0bcf389dd3540a5f978ef13dff5d332"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332">stdex::stream::memory_file::write_data</a></div><div class="ttdeci">memory_file &amp; write_data(const T data)</div><div class="ttdoc">Writes one primitive data type.</div><div class="ttdef"><b>Definition</b> stream.hpp:3162</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_ab8326c16c06548801982b07c930d7dfd"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#ab8326c16c06548801982b07c930d7dfd">stdex::stream::memory_file::write_str</a></div><div class="ttdeci">memory_file &amp; write_str(const T *data)</div><div class="ttdoc">Writes string to the stream length-prefixed.</div><div class="ttdef"><b>Definition</b> stream.hpp:3200</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_aca812d996b5b60660fa121787e4c0e68"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#aca812d996b5b60660fa121787e4c0e68">stdex::stream::memory_file::m_manage</a></div><div class="ttdeci">bool m_manage</div><div class="ttdoc">may reallocate m_data?</div><div class="ttdef"><b>Definition</b> stream.hpp:3468</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_ad0da8c8758672af312026957e2556b60"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#ad0da8c8758672af312026957e2556b60">stdex::stream::memory_file::memory_file</a></div><div class="ttdeci">memory_file(void *data, size_t size, bool manage=false, state_t state=state_t::ok)</div><div class="ttdoc">Creates a file based on available data.</div><div class="ttdef"><b>Definition</b> stream.hpp:2881</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_ae5b6602e176f1053ab2eef88d8312b49"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#ae5b6602e176f1053ab2eef88d8312b49">stdex::stream::memory_file::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:3105</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_af7fdc0b7ffcd3713487a75cfd9c1704f"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#af7fdc0b7ffcd3713487a75cfd9c1704f">stdex::stream::memory_file::memory_file</a></div><div class="ttdeci">memory_file(void *data, size_t size, size_t reserved, bool manage=false, state_t state=state_t::ok)</div><div class="ttdoc">Creates a file based on available data.</div><div class="ttdef"><b>Definition</b> stream.hpp:2858</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1memory__file_html_aff374fc64c7453dc0cef22f19bc400ce"><div class="ttname"><a href="classstdex_1_1stream_1_1memory__file.html#aff374fc64c7453dc0cef22f19bc400ce">stdex::stream::memory_file::data</a></div><div class="ttdeci">const void * data() const</div><div class="ttdoc">Returns pointer to data.</div><div class="ttdef"><b>Definition</b> stream.hpp:2993</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1replicator_1_1worker_html"><div class="ttname"><a href="classstdex_1_1stream_1_1replicator_1_1worker.html">stdex::stream::replicator::worker</a></div><div class="ttdef"><b>Definition</b> stream.hpp:1032</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1replicator_1_1worker_html_a9ddd37c6da22d559f6deb46102833f31"><div class="ttname"><a href="classstdex_1_1stream_1_1replicator_1_1worker.html#a9ddd37c6da22d559f6deb46102833f31">stdex::stream::replicator::worker::op</a></div><div class="ttdeci">enum stdex::stream::replicator::worker::op_t op</div><div class="ttdoc">Operation to perform.</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1replicator_1_1worker_html_acd6595e01accdb9d3c8d97f8f19b8cf1"><div class="ttname"><a href="classstdex_1_1stream_1_1replicator_1_1worker.html#acd6595e01accdb9d3c8d97f8f19b8cf1">stdex::stream::replicator::worker::num_written</a></div><div class="ttdeci">size_t num_written</div><div class="ttdoc">Number of bytes written.</div><div class="ttdef"><b>Definition</b> stream.hpp:1080</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1replicator_1_1worker_html_acdf8a4a4f07271bc7bd4f634640e7f5a"><div class="ttname"><a href="classstdex_1_1stream_1_1replicator_1_1worker.html#acdf8a4a4f07271bc7bd4f634640e7f5a">stdex::stream::replicator::worker::length</a></div><div class="ttdeci">size_t length</div><div class="ttdoc">Byte limit of data to write.</div><div class="ttdef"><b>Definition</b> stream.hpp:1079</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1replicator_1_1worker_html_af37e1df8c6e0189e856a2bb38dd603bf"><div class="ttname"><a href="classstdex_1_1stream_1_1replicator_1_1worker.html#af37e1df8c6e0189e856a2bb38dd603bf">stdex::stream::replicator::worker::data</a></div><div class="ttdeci">const void * data</div><div class="ttdoc">Data to write.</div><div class="ttdef"><b>Definition</b> stream.hpp:1078</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1replicator_html"><div class="ttname"><a href="classstdex_1_1stream_1_1replicator.html">stdex::stream::replicator</a></div><div class="ttdoc">Replicates writing of the same data to multiple streams.</div><div class="ttdef"><b>Definition</b> stream.hpp:949</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1replicator_html_a26a983c6d340261ef1c55af0e9916701"><div class="ttname"><a href="classstdex_1_1stream_1_1replicator.html#a26a983c6d340261ef1c55af0e9916701">stdex::stream::replicator::push_back</a></div><div class="ttdeci">void push_back(basic *source)</div><div class="ttdoc">Adds stream on the list.</div><div class="ttdef"><b>Definition</b> stream.hpp:968</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1replicator_html_a77d2ddda29ef5dfb835453ff1dd90f2e"><div class="ttname"><a href="classstdex_1_1stream_1_1replicator.html#a77d2ddda29ef5dfb835453ff1dd90f2e">stdex::stream::replicator::flush</a></div><div class="ttdeci">virtual void flush()</div><div class="ttdoc">Persists volatile element data.</div><div class="ttdef"><b>Definition</b> stream.hpp:1025</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1replicator_html_a7916a391dfa9484df02b1202c0a03edf"><div class="ttname"><a href="classstdex_1_1stream_1_1replicator.html#a7916a391dfa9484df02b1202c0a03edf">stdex::stream::replicator::remove</a></div><div class="ttdeci">void remove(basic *source)</div><div class="ttdoc">Removes stream from the list.</div><div class="ttdef"><b>Definition</b> stream.hpp:976</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1replicator_html_abbbaa912a887b00a4a7a5d518079f5ec"><div class="ttname"><a href="classstdex_1_1stream_1_1replicator.html#abbbaa912a887b00a4a7a5d518079f5ec">stdex::stream::replicator::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:993</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1replicator_html_afa3e2cec6e254e7bb53cc5e1b1ea0f90"><div class="ttname"><a href="classstdex_1_1stream_1_1replicator.html#afa3e2cec6e254e7bb53cc5e1b1ea0f90">stdex::stream::replicator::close</a></div><div class="ttdeci">virtual void close()</div><div class="ttdoc">Closes the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1020</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1window_html"><div class="ttname"><a href="classstdex_1_1stream_1_1window.html">stdex::stream::window</a></div><div class="ttdoc">Limits reading from/writing to stream to a predefined window.</div><div class="ttdef"><b>Definition</b> stream.hpp:1483</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1window_html_a01d191d653be7a6d218c7feffa1b0ec3"><div class="ttname"><a href="classstdex_1_1stream_1_1window.html#a01d191d653be7a6d218c7feffa1b0ec3">stdex::stream::window::write_offset</a></div><div class="ttdeci">fpos_t write_offset</div><div class="ttdoc">Number of bytes to discard on write.</div><div class="ttdef"><b>Definition</b> stream.hpp:1567</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1window_html_a06f05191c35fdbadebc49e05a19d9f3c"><div class="ttname"><a href="classstdex_1_1stream_1_1window.html#a06f05191c35fdbadebc49e05a19d9f3c">stdex::stream::window::write</a></div><div class="ttdeci">virtual size_t write(_In_reads_bytes_opt_(length) const void *data, size_t length)</div><div class="ttdoc">Writes block of data to the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1524</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1window_html_a45f2420dfc94c07e101186ae2e541e13"><div class="ttname"><a href="classstdex_1_1stream_1_1window.html#a45f2420dfc94c07e101186ae2e541e13">stdex::stream::window::read</a></div><div class="ttdeci">virtual size_t read(_Out_writes_bytes_to_opt_(length, return) void *data, size_t length)</div><div class="ttdoc">Reads block of data from the stream.</div><div class="ttdef"><b>Definition</b> stream.hpp:1491</div></div>
<div class="ttc" id="aclassstdex_1_1stream_1_1window_html_acff67a2931b8f1a85f12806002e7e131"><div class="ttname"><a href="classstdex_1_1stream_1_1window.html#acff67a2931b8f1a85f12806002e7e131">stdex::stream::window::read_offset</a></div><div class="ttdeci">fpos_t read_offset</div><div class="ttdoc">Number of bytes to skip on read.</div><div class="ttdef"><b>Definition</b> stream.hpp:1566</div></div>
<div class="ttc" id="aclassstdex_1_1sys__object_html"><div class="ttname"><a href="classstdex_1_1sys__object.html">stdex::sys_object</a></div><div class="ttdoc">Operating system object (file, pipe, anything with an OS handle etc.)</div><div class="ttdef"><b>Definition</b> system.hpp:88</div></div>
<div class="ttc" id="aclassstdex_1_1sys__object_html_ab8c0119bc4958f78f51ef2f3b7c91f66"><div class="ttname"><a href="classstdex_1_1sys__object.html#ab8c0119bc4958f78f51ef2f3b7c91f66">stdex::sys_object::close</a></div><div class="ttdeci">virtual void close()</div><div class="ttdoc">Closes object.</div><div class="ttdef"><b>Definition</b> system.hpp:129</div></div>
<div class="ttc" id="astructstdex_1_1interval_html"><div class="ttname"><a href="structstdex_1_1interval.html">stdex::interval</a></div><div class="ttdoc">Numerical interval.</div><div class="ttdef"><b>Definition</b> interval.hpp:18</div></div>
<div class="ttc" id="astructstdex_1_1interval_html_a1624ca77e8c9cb45cef61f7f8b532222"><div class="ttname"><a href="structstdex_1_1interval.html#a1624ca77e8c9cb45cef61f7f8b532222">stdex::interval::contains</a></div><div class="ttdeci">bool contains(T x) const</div><div class="ttdoc">Is value in interval?</div><div class="ttdef"><b>Definition</b> interval.hpp:70</div></div>
<div class="ttc" id="astructstdex_1_1interval_html_a1fa5153f1f7707e21dc41c31197659a4"><div class="ttname"><a href="structstdex_1_1interval.html#a1fa5153f1f7707e21dc41c31197659a4">stdex::interval::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdoc">Is interval empty?</div><div class="ttdef"><b>Definition</b> interval.hpp:54</div></div>
<div class="ttc" id="astructstdex_1_1interval_html_a8c5222bc73fc66ba78bfabc1b985c864"><div class="ttname"><a href="structstdex_1_1interval.html#a8c5222bc73fc66ba78bfabc1b985c864">stdex::interval::size</a></div><div class="ttdeci">T size() const</div><div class="ttdoc">Returns interval size.</div><div class="ttdef"><b>Definition</b> interval.hpp:47</div></div>
<div class="ttc" id="astructstdex_1_1interval_html_a9b92e2b20290d8ac5a9b00209f25e27a"><div class="ttname"><a href="structstdex_1_1interval.html#a9b92e2b20290d8ac5a9b00209f25e27a">stdex::interval::end</a></div><div class="ttdeci">T end</div><div class="ttdoc">interval end</div><div class="ttdef"><b>Definition</b> interval.hpp:20</div></div>
<div class="ttc" id="astructstdex_1_1interval_html_ab6a104de0f15b29bea77fe181b49c40b"><div class="ttname"><a href="structstdex_1_1interval.html#ab6a104de0f15b29bea77fe181b49c40b">stdex::interval::start</a></div><div class="ttdeci">T start</div><div class="ttdoc">interval start</div><div class="ttdef"><b>Definition</b> interval.hpp:19</div></div>
<div class="ttc" id="astructstdex_1_1stream_1_1buffer_1_1buffer__t_html"><div class="ttname"><a href="structstdex_1_1stream_1_1buffer_1_1buffer__t.html">stdex::stream::buffer::buffer_t</a></div><div class="ttdef"><b>Definition</b> stream.hpp:1392</div></div>
<div class="ttc" id="astructstdex_1_1stream_1_1cache_1_1cache__t_html"><div class="ttname"><a href="structstdex_1_1stream_1_1cache_1_1cache__t.html">stdex::stream::cache::cache_t</a></div><div class="ttdef"><b>Definition</b> stream.hpp:2030</div></div>
<div class="ttc" id="astructstdex_1_1stream_1_1cache_1_1cache__t_html_ae4bbbd45000cca2b17d32c0d4b3609db"><div class="ttname"><a href="structstdex_1_1stream_1_1cache_1_1cache__t.html#ae4bbbd45000cca2b17d32c0d4b3609db">stdex::stream::cache::cache_t::region</a></div><div class="ttdeci">interval&lt; fpos_t &gt; region</div><div class="ttdoc">valid data region</div><div class="ttdef"><b>Definition</b> stream.hpp:2038</div></div>
<div class="ttc" id="astructstdex_1_1stream_1_1fifo_1_1node__t_html"><div class="ttname"><a href="structstdex_1_1stream_1_1fifo_1_1node__t.html">stdex::stream::fifo::node_t</a></div><div class="ttdef"><b>Definition</b> stream.hpp:3572</div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Thu Sep 14 2023 14:10:43 for stdex by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>