cereal/assets/doxygen/portable__binary_8hpp_source.html
2022-02-27 19:48:38 -08:00

381 lines
63 KiB
HTML

<!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">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>cereal: portable_binary.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 style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">cereal
</div>
<div id="projectbrief">A C++11 library for serialization</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @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:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- 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">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</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_d445d0c097210746bce3afd9a77bcad9.html">cereal</a></li><li class="navelem"><a class="el" href="dir_897bf859d07ca0c5bf51a1d2c31d0ee1.html">archives</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">portable_binary.hpp</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160; </div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> Copyright (c) 2014, Randolph Voorhies, Shane Grant</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> All rights reserved.</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> Redistribution and use in source and binary forms, with or without</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> modification, are permitted provided that the following conditions are met:</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> * Redistributions of source code must retain the above copyright</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> notice, this list of conditions and the following disclaimer.</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> * Redistributions in binary form must reproduce the above copyright</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> notice, this list of conditions and the following disclaimer in the</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> documentation and/or other materials provided with the distribution.</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> * Neither the name of the copyright holder nor the</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> names of its contributors may be used to endorse or promote products</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> derived from this software without specific prior written permission.</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment"> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment"> ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment"> WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment"> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;<span class="comment"> DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="comment"> (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment"> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"> ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment"> (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment"> SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment">*/</span></div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#ifndef CEREAL_ARCHIVES_PORTABLE_BINARY_HPP_</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#define CEREAL_ARCHIVES_PORTABLE_BINARY_HPP_</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; </div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="cereal_8hpp.html">cereal/cereal.hpp</a>&quot;</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &lt;sstream&gt;</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &lt;limits&gt;</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; </div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="keyword">namespace </span>cereal</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;{</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="keyword">namespace </span>portable_binary_detail</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; {</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; </div>
<div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="group__Internal.html#gaf6b38e7a8684beae31e15212978d7c14"> 42</a></span>&#160; <span class="keyword">inline</span> std::uint8_t <a class="code" href="group__Internal.html#gaf6b38e7a8684beae31e15212978d7c14">is_little_endian</a>()</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; {</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keyword">static</span> std::int32_t test = 1;</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <span class="keywordflow">return</span> *<span class="keyword">reinterpret_cast&lt;</span>std::int8_t*<span class="keyword">&gt;</span>( &amp;test ) == 1;</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; }</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; </div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; </div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keyword">template</span> &lt;std::<span class="keywordtype">size_t</span> DataSize&gt;</div>
<div class="line"><a name="l00053"></a><span class="lineno"><a class="line" href="group__Internal.html#ga91b73b5db765823861316afa20228a7b"> 53</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__Internal.html#ga91b73b5db765823861316afa20228a7b">swap_bytes</a>( std::uint8_t * data )</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; {</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keywordflow">for</span>( std::size_t i = 0, end = DataSize / 2; i &lt; end; ++i )</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; std::swap( data[i], data[DataSize - i - 1] );</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; }</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; } <span class="comment">// end namespace portable_binary_detail</span></div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; </div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="comment">// ######################################################################</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00078"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryOutputArchive.html"> 78</a></span>&#160; <span class="keyword">class </span><a class="code" href="classcereal_1_1PortableBinaryOutputArchive.html">PortableBinaryOutputArchive</a> : <span class="keyword">public</span> <a class="code" href="classcereal_1_1OutputArchive.html">OutputArchive</a>&lt;PortableBinaryOutputArchive, AllowEmptyClassElision&gt;</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; {</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00082"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html"> 82</a></span>&#160; <span class="keyword">class </span><a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html">Options</a></div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; {</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#ae2a21b6c39ca3520f070c8484c40f534"> 86</a></span>&#160; <span class="keyword">enum class</span> <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#ae2a21b6c39ca3520f070c8484c40f534">Endianness</a> : std::uint8_t</div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; { big, little };</div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; </div>
<div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a98642199679b45167f773b9c6f4f3ac2"> 90</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html">Options</a> <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a98642199679b45167f773b9c6f4f3ac2">Default</a>(){ <span class="keywordflow">return</span> <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a4d1a04340ee609126fa20e25397e1e9f">Options</a>(); }</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; </div>
<div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a7ad926cd9e8e50f5795807ec14cc0e8e"> 93</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html">Options</a> <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a7ad926cd9e8e50f5795807ec14cc0e8e">LittleEndian</a>(){ <span class="keywordflow">return</span> <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a4d1a04340ee609126fa20e25397e1e9f">Options</a>( Endianness::little ); }</div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; </div>
<div class="line"><a name="l00096"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a16c01f4198a9d3b2df4f0b1c29582fa6"> 96</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html">Options</a> <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a16c01f4198a9d3b2df4f0b1c29582fa6">BigEndian</a>(){ <span class="keywordflow">return</span> <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a4d1a04340ee609126fa20e25397e1e9f">Options</a>( Endianness::big ); }</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; </div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; </div>
<div class="line"><a name="l00100"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a4d1a04340ee609126fa20e25397e1e9f"> 100</a></span>&#160; <span class="keyword">explicit</span> <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a4d1a04340ee609126fa20e25397e1e9f">Options</a>( <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#ae2a21b6c39ca3520f070c8484c40f534">Endianness</a> outputEndian = getEndianness() ) :</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; itsOutputEndianness( outputEndian ) { }</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; </div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="keyword">inline</span> <span class="keyword">static</span> <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#ae2a21b6c39ca3520f070c8484c40f534">Endianness</a> getEndianness()</div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; { <span class="keywordflow">return</span> <a class="code" href="group__Internal.html#gaf6b38e7a8684beae31e15212978d7c14">portable_binary_detail::is_little_endian</a>() ? Endianness::little : Endianness::big; }</div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; </div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keyword">inline</span> std::uint8_t is_little_endian()<span class="keyword"> const</span></div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;<span class="keyword"> </span>{ <span class="keywordflow">return</span> itsOutputEndianness == Endianness::little; }</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; </div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span>PortableBinaryOutputArchive;</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#ae2a21b6c39ca3520f070c8484c40f534">Endianness</a> itsOutputEndianness;</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; };</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; </div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; </div>
<div class="line"><a name="l00120"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryOutputArchive.html#adf9a65bdf31ed3a829eec529a0ec3fd3"> 120</a></span>&#160; <a class="code" href="classcereal_1_1PortableBinaryOutputArchive.html#adf9a65bdf31ed3a829eec529a0ec3fd3">PortableBinaryOutputArchive</a>(std::ostream &amp; stream, <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html">Options</a> <span class="keyword">const</span> &amp; options = <a class="code" href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a98642199679b45167f773b9c6f4f3ac2">Options::Default</a>()) :</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <a class="code" href="classcereal_1_1OutputArchive.html">OutputArchive</a>&lt;<a class="code" href="classcereal_1_1PortableBinaryOutputArchive.html">PortableBinaryOutputArchive</a>, AllowEmptyClassElision&gt;(this),</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; itsStream(stream),</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; itsConvertEndianness( portable_binary_detail::<a class="code" href="group__Internal.html#gaf6b38e7a8684beae31e15212978d7c14">is_little_endian</a>() ^ options.<a class="code" href="group__Internal.html#gaf6b38e7a8684beae31e15212978d7c14">is_little_endian</a>() )</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; {</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; this-&gt;<a class="code" href="classcereal_1_1OutputArchive.html#abef67f45c79d199c690359715905987b">operator()</a>( options.is_little_endian() );</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; }</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; </div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; ~<a class="code" href="classcereal_1_1PortableBinaryOutputArchive.html">PortableBinaryOutputArchive</a>() <a class="code" href="macros_8hpp.html#a6c37b2307b83bbe2a3de58d78a2b8c0b">CEREAL_NOEXCEPT</a> = default;</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; </div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; template &lt;std::streamsize DataSize&gt; inline</div>
<div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryOutputArchive.html#a594ed9401ba2f79fafa4b63f473d6516"> 132</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classcereal_1_1PortableBinaryOutputArchive.html#a594ed9401ba2f79fafa4b63f473d6516">saveBinary</a>( const <span class="keywordtype">void</span> * data, std::streamsize size )</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; {</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; std::streamsize writtenSize = 0;</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; </div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keywordflow">if</span>( itsConvertEndianness )</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; {</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; <span class="keywordflow">for</span>( std::streamsize i = 0; i &lt; size; i += DataSize )</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="keywordflow">for</span>( std::streamsize j = 0; j &lt; DataSize; ++j )</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; writtenSize += itsStream.rdbuf()-&gt;sputn( <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">char</span>*<span class="keyword">&gt;</span>( data ) + DataSize - j - 1 + i, 1 );</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; }</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; writtenSize = itsStream.rdbuf()-&gt;sputn( <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">char</span>*<span class="keyword">&gt;</span>( data ), size );</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; </div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">if</span>(writtenSize != size)</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordflow">throw</span> <a class="code" href="structcereal_1_1Exception.html">Exception</a>(<span class="stringliteral">&quot;Failed to write &quot;</span> + std::to_string(size) + <span class="stringliteral">&quot; bytes to output stream! Wrote &quot;</span> + std::to_string(writtenSize));</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; }</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; </div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; std::ostream &amp; itsStream;</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="keyword">const</span> uint8_t itsConvertEndianness; </div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; };</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; </div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="comment">// ######################################################################</span></div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;<span class="comment"></span> </div>
<div class="line"><a name="l00180"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryInputArchive.html"> 180</a></span>&#160; <span class="keyword">class </span><a class="code" href="classcereal_1_1PortableBinaryInputArchive.html">PortableBinaryInputArchive</a> : <span class="keyword">public</span> <a class="code" href="classcereal_1_1InputArchive.html">InputArchive</a>&lt;PortableBinaryInputArchive, AllowEmptyClassElision&gt;</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; {</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00184"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html"> 184</a></span>&#160; <span class="keyword">class </span><a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html">Options</a></div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; {</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00188"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#ae81663827b6e75d37a19c616e1abba6c"> 188</a></span>&#160; <span class="keyword">enum class</span> <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#ae81663827b6e75d37a19c616e1abba6c">Endianness</a> : std::uint8_t</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; { big, little };</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; </div>
<div class="line"><a name="l00192"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a965f5ff5784f38bbd080c30984bbd12a"> 192</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html">Options</a> <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a965f5ff5784f38bbd080c30984bbd12a">Default</a>(){ <span class="keywordflow">return</span> <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a299a0069acdca43dedb3778f65ce624a">Options</a>(); }</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; </div>
<div class="line"><a name="l00195"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a85b0a94d5678e872e4b4fbf8b61a8df6"> 195</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html">Options</a> <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a85b0a94d5678e872e4b4fbf8b61a8df6">LittleEndian</a>(){ <span class="keywordflow">return</span> <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a299a0069acdca43dedb3778f65ce624a">Options</a>( Endianness::little ); }</div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; </div>
<div class="line"><a name="l00198"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a578a84e69ff03c6a87e2f67f9824c11c"> 198</a></span>&#160; <span class="keyword">static</span> <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html">Options</a> <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a578a84e69ff03c6a87e2f67f9824c11c">BigEndian</a>(){ <span class="keywordflow">return</span> <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a299a0069acdca43dedb3778f65ce624a">Options</a>( Endianness::big ); }</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; </div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; </div>
<div class="line"><a name="l00202"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a299a0069acdca43dedb3778f65ce624a"> 202</a></span>&#160; <span class="keyword">explicit</span> <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a299a0069acdca43dedb3778f65ce624a">Options</a>( <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#ae81663827b6e75d37a19c616e1abba6c">Endianness</a> inputEndian = getEndianness() ) :</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; itsInputEndianness( inputEndian ) { }</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; </div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="keyword">inline</span> <span class="keyword">static</span> <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#ae81663827b6e75d37a19c616e1abba6c">Endianness</a> getEndianness()</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; { <span class="keywordflow">return</span> <a class="code" href="group__Internal.html#gaf6b38e7a8684beae31e15212978d7c14">portable_binary_detail::is_little_endian</a>() ? Endianness::little : Endianness::big; }</div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; </div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keyword">inline</span> std::uint8_t is_little_endian()<span class="keyword"> const</span></div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160;<span class="keyword"> </span>{ <span class="keywordflow">return</span> itsInputEndianness == Endianness::little; }</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; </div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span>PortableBinaryInputArchive;</div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#ae81663827b6e75d37a19c616e1abba6c">Endianness</a> itsInputEndianness;</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; };</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; </div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; </div>
<div class="line"><a name="l00222"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryInputArchive.html#a4a6ae3ee7ee953859822ba98346e16b5"> 222</a></span>&#160; <a class="code" href="classcereal_1_1PortableBinaryInputArchive.html#a4a6ae3ee7ee953859822ba98346e16b5">PortableBinaryInputArchive</a>(std::istream &amp; stream, <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html">Options</a> <span class="keyword">const</span> &amp; options = <a class="code" href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a965f5ff5784f38bbd080c30984bbd12a">Options::Default</a>()) :</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <a class="code" href="classcereal_1_1InputArchive.html">InputArchive</a>&lt;<a class="code" href="classcereal_1_1PortableBinaryInputArchive.html">PortableBinaryInputArchive</a>, AllowEmptyClassElision&gt;(this),</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; itsStream(stream),</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; itsConvertEndianness( false )</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; {</div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; uint8_t streamLittleEndian;</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; this-&gt;<a class="code" href="classcereal_1_1InputArchive.html#a21bf0587ab9749e2afde4bb51d8988ec">operator()</a>( streamLittleEndian );</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; itsConvertEndianness = options.is_little_endian() ^ streamLittleEndian;</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; }</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; </div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; ~<a class="code" href="classcereal_1_1PortableBinaryInputArchive.html">PortableBinaryInputArchive</a>() <a class="code" href="macros_8hpp.html#a6c37b2307b83bbe2a3de58d78a2b8c0b">CEREAL_NOEXCEPT</a> = default;</div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; </div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; </div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; template &lt;std::streamsize DataSize&gt; inline</div>
<div class="line"><a name="l00239"></a><span class="lineno"><a class="line" href="classcereal_1_1PortableBinaryInputArchive.html#ac4f71b625bb06db5fd0fec7b12a2cd97"> 239</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classcereal_1_1PortableBinaryInputArchive.html#ac4f71b625bb06db5fd0fec7b12a2cd97">loadBinary</a>( <span class="keywordtype">void</span> * const data, std::streamsize size )</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; {</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="comment">// load data</span></div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keyword">auto</span> <span class="keyword">const</span> readSize = itsStream.rdbuf()-&gt;sgetn( <span class="keyword">reinterpret_cast&lt;</span><span class="keywordtype">char</span>*<span class="keyword">&gt;</span>( data ), size );</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; </div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="keywordflow">if</span>(readSize != size)</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="keywordflow">throw</span> <a class="code" href="structcereal_1_1Exception.html">Exception</a>(<span class="stringliteral">&quot;Failed to read &quot;</span> + std::to_string(size) + <span class="stringliteral">&quot; bytes from input stream! Read &quot;</span> + std::to_string(readSize));</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; </div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <span class="comment">// flip bits if needed</span></div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; <span class="keywordflow">if</span>( itsConvertEndianness )</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; {</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; std::uint8_t * ptr = <span class="keyword">reinterpret_cast&lt;</span>std::uint8_t*<span class="keyword">&gt;</span>( data );</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keywordflow">for</span>( std::streamsize i = 0; i &lt; size; i += DataSize )</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; portable_binary_detail::swap_bytes&lt;DataSize&gt;( ptr + i );</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; }</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; }</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; </div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; std::istream &amp; itsStream;</div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; uint8_t itsConvertEndianness; </div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; };</div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; </div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="comment">// ######################################################################</span></div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="comment">// Common BinaryArchive serialization functions</span></div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; </div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span></div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="keyword">typename</span> std::enable_if&lt;std::is_arithmetic&lt;T&gt;::value, <span class="keywordtype">void</span>&gt;::type</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <a class="code" href="macros_8hpp.html#a85b7884671ac5a804b66ec7c34d0ca71">CEREAL_SAVE_FUNCTION_NAME</a>(PortableBinaryOutputArchive &amp; ar, T <span class="keyword">const</span> &amp; t)</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; {</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; static_assert( !std::is_floating_point&lt;T&gt;::value ||</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; (std::is_floating_point&lt;T&gt;::value &amp;&amp; std::numeric_limits&lt;T&gt;::is_iec559),</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <span class="stringliteral">&quot;Portable binary only supports IEEE 754 standardized floating point&quot;</span> );</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; ar.template saveBinary&lt;sizeof(T)&gt;(std::addressof(t), <span class="keyword">sizeof</span>(t));</div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; }</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; </div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span></div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="keyword">typename</span> std::enable_if&lt;std::is_arithmetic&lt;T&gt;::value, <span class="keywordtype">void</span>&gt;::type</div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <a class="code" href="macros_8hpp.html#a854de4fbe2b80753b27264b7dda740e8">CEREAL_LOAD_FUNCTION_NAME</a>(PortableBinaryInputArchive &amp; ar, T &amp; t)</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; {</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; static_assert( !std::is_floating_point&lt;T&gt;::value ||</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; (std::is_floating_point&lt;T&gt;::value &amp;&amp; std::numeric_limits&lt;T&gt;::is_iec559),</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="stringliteral">&quot;Portable binary only supports IEEE 754 standardized floating point&quot;</span> );</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; ar.template loadBinary&lt;sizeof(T)&gt;(std::addressof(t), <span class="keyword">sizeof</span>(t));</div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; }</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; </div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Archive, <span class="keyword">class</span> T&gt; <span class="keyword">inline</span></div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <a class="code" href="traits_8hpp.html#a29490687675183194498a843f7beeb8b">CEREAL_ARCHIVE_RESTRICT</a>(PortableBinaryInputArchive, PortableBinaryOutputArchive)</div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <a class="code" href="macros_8hpp.html#ad6b40d3472fa3d7f2148657c5bd6a07a">CEREAL_SERIALIZE_FUNCTION_NAME</a>( Archive &amp; ar, NameValuePair&lt;T&gt; &amp; t )</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; {</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; ar( t.value );</div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; }</div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; </div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> Archive, <span class="keyword">class</span> T&gt; <span class="keyword">inline</span></div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <a class="code" href="traits_8hpp.html#a29490687675183194498a843f7beeb8b">CEREAL_ARCHIVE_RESTRICT</a>(PortableBinaryInputArchive, PortableBinaryOutputArchive)</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; <a class="code" href="macros_8hpp.html#ad6b40d3472fa3d7f2148657c5bd6a07a">CEREAL_SERIALIZE_FUNCTION_NAME</a>( Archive &amp; ar, SizeTag&lt;T&gt; &amp; t )</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; {</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; ar( t.size );</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; }</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; </div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span></div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="keywordtype">void</span> <a class="code" href="macros_8hpp.html#a85b7884671ac5a804b66ec7c34d0ca71">CEREAL_SAVE_FUNCTION_NAME</a>(PortableBinaryOutputArchive &amp; ar, BinaryData&lt;T&gt; <span class="keyword">const</span> &amp; bd)</div>
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; {</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> std::remove_pointer&lt;T&gt;::type TT;</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; static_assert( !std::is_floating_point&lt;TT&gt;::value ||</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; (std::is_floating_point&lt;TT&gt;::value &amp;&amp; std::numeric_limits&lt;TT&gt;::is_iec559),</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <span class="stringliteral">&quot;Portable binary only supports IEEE 754 standardized floating point&quot;</span> );</div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; </div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; ar.template saveBinary&lt;sizeof(TT)&gt;( bd.data, <span class="keyword">static_cast&lt;</span>std::streamsize<span class="keyword">&gt;</span>( bd.size ) );</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; }</div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; </div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span></div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keywordtype">void</span> <a class="code" href="macros_8hpp.html#a854de4fbe2b80753b27264b7dda740e8">CEREAL_LOAD_FUNCTION_NAME</a>(PortableBinaryInputArchive &amp; ar, BinaryData&lt;T&gt; &amp; bd)</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; {</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> std::remove_pointer&lt;T&gt;::type TT;</div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; static_assert( !std::is_floating_point&lt;TT&gt;::value ||</div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; (std::is_floating_point&lt;TT&gt;::value &amp;&amp; std::numeric_limits&lt;TT&gt;::is_iec559),</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="stringliteral">&quot;Portable binary only supports IEEE 754 standardized floating point&quot;</span> );</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; </div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; ar.template loadBinary&lt;sizeof(TT)&gt;( bd.data, <span class="keyword">static_cast&lt;</span>std::streamsize<span class="keyword">&gt;</span>( bd.size ) );</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; }</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160;} <span class="comment">// namespace cereal</span></div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; </div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160;<span class="comment">// register archives for polymorphic support</span></div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160;<a class="code" href="group__Internal.html#ga80fe42796f7a4d6132ade9cb632cb1d1">CEREAL_REGISTER_ARCHIVE</a>(<a class="code" href="classcereal_1_1PortableBinaryOutputArchive.html">cereal::PortableBinaryOutputArchive</a>)</div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160;<a class="code" href="group__Internal.html#ga80fe42796f7a4d6132ade9cb632cb1d1">CEREAL_REGISTER_ARCHIVE</a>(<a class="code" href="classcereal_1_1PortableBinaryInputArchive.html">cereal::PortableBinaryInputArchive</a>)</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; </div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160;<span class="comment">// tie input and output archives together</span></div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160;<a class="code" href="traits_8hpp.html#a039bc7d4a3e8994d3fd7eedf5cae1666">CEREAL_SETUP_ARCHIVE_TRAITS</a>(<a class="code" href="classcereal_1_1PortableBinaryInputArchive.html">cereal::PortableBinaryInputArchive</a>, <a class="code" href="classcereal_1_1PortableBinaryOutputArchive.html">cereal::PortableBinaryOutputArchive</a>)</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; </div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160;<span class="preprocessor">#endif // CEREAL_ARCHIVES_PORTABLE_BINARY_HPP_</span></div>
</div><!-- fragment --></div><!-- contents -->
<div class="ttc" id="aclasscereal_1_1InputArchive_html"><div class="ttname"><a href="classcereal_1_1InputArchive.html">cereal::InputArchive</a></div><div class="ttdoc">The base input archive class.</div><div class="ttdef"><b>Definition:</b> cereal.hpp:710</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryOutputArchive_1_1Options_html_a98642199679b45167f773b9c6f4f3ac2"><div class="ttname"><a href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a98642199679b45167f773b9c6f4f3ac2">cereal::PortableBinaryOutputArchive::Options::Default</a></div><div class="ttdeci">static Options Default()</div><div class="ttdoc">Default options, preserve system endianness.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:90</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryInputArchive_html_ac4f71b625bb06db5fd0fec7b12a2cd97"><div class="ttname"><a href="classcereal_1_1PortableBinaryInputArchive.html#ac4f71b625bb06db5fd0fec7b12a2cd97">cereal::PortableBinaryInputArchive::loadBinary</a></div><div class="ttdeci">void loadBinary(void *const data, std::streamsize size)</div><div class="ttdoc">Reads size bytes of data from the input stream.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:239</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryInputArchive_1_1Options_html_ae81663827b6e75d37a19c616e1abba6c"><div class="ttname"><a href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#ae81663827b6e75d37a19c616e1abba6c">cereal::PortableBinaryInputArchive::Options::Endianness</a></div><div class="ttdeci">Endianness</div><div class="ttdoc">Represents desired endianness.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:188</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryOutputArchive_html_adf9a65bdf31ed3a829eec529a0ec3fd3"><div class="ttname"><a href="classcereal_1_1PortableBinaryOutputArchive.html#adf9a65bdf31ed3a829eec529a0ec3fd3">cereal::PortableBinaryOutputArchive::PortableBinaryOutputArchive</a></div><div class="ttdeci">PortableBinaryOutputArchive(std::ostream &amp;stream, Options const &amp;options=Options::Default())</div><div class="ttdoc">Construct, outputting to the provided stream.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:120</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryInputArchive_html_a4a6ae3ee7ee953859822ba98346e16b5"><div class="ttname"><a href="classcereal_1_1PortableBinaryInputArchive.html#a4a6ae3ee7ee953859822ba98346e16b5">cereal::PortableBinaryInputArchive::PortableBinaryInputArchive</a></div><div class="ttdeci">PortableBinaryInputArchive(std::istream &amp;stream, Options const &amp;options=Options::Default())</div><div class="ttdoc">Construct, loading from the provided stream.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:222</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryInputArchive_1_1Options_html_a965f5ff5784f38bbd080c30984bbd12a"><div class="ttname"><a href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a965f5ff5784f38bbd080c30984bbd12a">cereal::PortableBinaryInputArchive::Options::Default</a></div><div class="ttdeci">static Options Default()</div><div class="ttdoc">Default options, preserve system endianness.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:192</div></div>
<div class="ttc" id="aclasscereal_1_1InputArchive_html_a21bf0587ab9749e2afde4bb51d8988ec"><div class="ttname"><a href="classcereal_1_1InputArchive.html#a21bf0587ab9749e2afde4bb51d8988ec">cereal::InputArchive&lt; PortableBinaryInputArchive, AllowEmptyClassElision &gt;::operator()</a></div><div class="ttdeci">PortableBinaryInputArchive &amp; operator()(Types &amp;&amp;... args)</div><div class="ttdoc">Serializes all passed in data.</div><div class="ttdef"><b>Definition:</b> cereal.hpp:728</div></div>
<div class="ttc" id="atraits_8hpp_html_a29490687675183194498a843f7beeb8b"><div class="ttname"><a href="traits_8hpp.html#a29490687675183194498a843f7beeb8b">CEREAL_ARCHIVE_RESTRICT</a></div><div class="ttdeci">#define CEREAL_ARCHIVE_RESTRICT(INTYPE, OUTTYPE)</div><div class="ttdoc">A macro to use to restrict which types of archives your function will work for.</div><div class="ttdef"><b>Definition:</b> traits.hpp:1315</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryInputArchive_html"><div class="ttname"><a href="classcereal_1_1PortableBinaryInputArchive.html">cereal::PortableBinaryInputArchive</a></div><div class="ttdoc">An input archive designed to load data saved using PortableBinaryOutputArchive.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:180</div></div>
<div class="ttc" id="amacros_8hpp_html_ad6b40d3472fa3d7f2148657c5bd6a07a"><div class="ttname"><a href="macros_8hpp.html#ad6b40d3472fa3d7f2148657c5bd6a07a">CEREAL_SERIALIZE_FUNCTION_NAME</a></div><div class="ttdeci">#define CEREAL_SERIALIZE_FUNCTION_NAME</div><div class="ttdoc">The serialization/deserialization function name to search for.</div><div class="ttdef"><b>Definition:</b> macros.hpp:78</div></div>
<div class="ttc" id="amacros_8hpp_html_a854de4fbe2b80753b27264b7dda740e8"><div class="ttname"><a href="macros_8hpp.html#a854de4fbe2b80753b27264b7dda740e8">CEREAL_LOAD_FUNCTION_NAME</a></div><div class="ttdeci">#define CEREAL_LOAD_FUNCTION_NAME</div><div class="ttdoc">The deserialization (load) function name to search for.</div><div class="ttdef"><b>Definition:</b> macros.hpp:85</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryInputArchive_1_1Options_html_a299a0069acdca43dedb3778f65ce624a"><div class="ttname"><a href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a299a0069acdca43dedb3778f65ce624a">cereal::PortableBinaryInputArchive::Options::Options</a></div><div class="ttdeci">Options(Endianness inputEndian=getEndianness())</div><div class="ttdoc">Specify specific options for the PortableBinaryInputArchive.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:202</div></div>
<div class="ttc" id="agroup__Internal_html_ga80fe42796f7a4d6132ade9cb632cb1d1"><div class="ttname"><a href="group__Internal.html#ga80fe42796f7a4d6132ade9cb632cb1d1">CEREAL_REGISTER_ARCHIVE</a></div><div class="ttdeci">#define CEREAL_REGISTER_ARCHIVE(Archive)</div><div class="ttdoc">Registers a specific Archive type with cereal.</div><div class="ttdef"><b>Definition:</b> cereal.hpp:195</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryOutputArchive_1_1Options_html_a7ad926cd9e8e50f5795807ec14cc0e8e"><div class="ttname"><a href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a7ad926cd9e8e50f5795807ec14cc0e8e">cereal::PortableBinaryOutputArchive::Options::LittleEndian</a></div><div class="ttdeci">static Options LittleEndian()</div><div class="ttdoc">Save as little endian.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:93</div></div>
<div class="ttc" id="aclasscereal_1_1OutputArchive_html"><div class="ttname"><a href="classcereal_1_1OutputArchive.html">cereal::OutputArchive</a></div><div class="ttdoc">The base output archive class.</div><div class="ttdef"><b>Definition:</b> cereal.hpp:318</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryInputArchive_1_1Options_html_a578a84e69ff03c6a87e2f67f9824c11c"><div class="ttname"><a href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a578a84e69ff03c6a87e2f67f9824c11c">cereal::PortableBinaryInputArchive::Options::BigEndian</a></div><div class="ttdeci">static Options BigEndian()</div><div class="ttdoc">Load into big endian.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:198</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryOutputArchive_html_a594ed9401ba2f79fafa4b63f473d6516"><div class="ttname"><a href="classcereal_1_1PortableBinaryOutputArchive.html#a594ed9401ba2f79fafa4b63f473d6516">cereal::PortableBinaryOutputArchive::saveBinary</a></div><div class="ttdeci">void saveBinary(const void *data, std::streamsize size)</div><div class="ttdoc">Writes size bytes of data to the output stream.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:132</div></div>
<div class="ttc" id="amacros_8hpp_html_a85b7884671ac5a804b66ec7c34d0ca71"><div class="ttname"><a href="macros_8hpp.html#a85b7884671ac5a804b66ec7c34d0ca71">CEREAL_SAVE_FUNCTION_NAME</a></div><div class="ttdeci">#define CEREAL_SAVE_FUNCTION_NAME</div><div class="ttdoc">The serialization (save) function name to search for.</div><div class="ttdef"><b>Definition:</b> macros.hpp:92</div></div>
<div class="ttc" id="atraits_8hpp_html_a039bc7d4a3e8994d3fd7eedf5cae1666"><div class="ttname"><a href="traits_8hpp.html#a039bc7d4a3e8994d3fd7eedf5cae1666">CEREAL_SETUP_ARCHIVE_TRAITS</a></div><div class="ttdeci">#define CEREAL_SETUP_ARCHIVE_TRAITS(InputArchive, OutputArchive)</div><div class="ttdoc">Sets up traits that relate an input archive to an output archive.</div><div class="ttdef"><b>Definition:</b> traits.hpp:169</div></div>
<div class="ttc" id="amacros_8hpp_html_a6c37b2307b83bbe2a3de58d78a2b8c0b"><div class="ttname"><a href="macros_8hpp.html#a6c37b2307b83bbe2a3de58d78a2b8c0b">CEREAL_NOEXCEPT</a></div><div class="ttdeci">#define CEREAL_NOEXCEPT</div><div class="ttdoc">Defines the CEREAL_NOEXCEPT macro to use instead of noexcept.</div><div class="ttdef"><b>Definition:</b> macros.hpp:130</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryOutputArchive_1_1Options_html_a16c01f4198a9d3b2df4f0b1c29582fa6"><div class="ttname"><a href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a16c01f4198a9d3b2df4f0b1c29582fa6">cereal::PortableBinaryOutputArchive::Options::BigEndian</a></div><div class="ttdeci">static Options BigEndian()</div><div class="ttdoc">Save as big endian.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:96</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryInputArchive_1_1Options_html"><div class="ttname"><a href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html">cereal::PortableBinaryInputArchive::Options</a></div><div class="ttdoc">A class containing various advanced options for the PortableBinaryInput archive.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:184</div></div>
<div class="ttc" id="agroup__Internal_html_gaf6b38e7a8684beae31e15212978d7c14"><div class="ttname"><a href="group__Internal.html#gaf6b38e7a8684beae31e15212978d7c14">cereal::portable_binary_detail::is_little_endian</a></div><div class="ttdeci">std::uint8_t is_little_endian()</div><div class="ttdoc">Returns true if the current machine is little endian.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:42</div></div>
<div class="ttc" id="agroup__Internal_html_ga91b73b5db765823861316afa20228a7b"><div class="ttname"><a href="group__Internal.html#ga91b73b5db765823861316afa20228a7b">cereal::portable_binary_detail::swap_bytes</a></div><div class="ttdeci">void swap_bytes(std::uint8_t *data)</div><div class="ttdoc">Swaps the order of bytes for some chunk of memory.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:53</div></div>
<div class="ttc" id="acereal_8hpp_html"><div class="ttname"><a href="cereal_8hpp.html">cereal.hpp</a></div><div class="ttdoc">Main cereal functionality.</div></div>
<div class="ttc" id="astructcereal_1_1Exception_html"><div class="ttname"><a href="structcereal_1_1Exception.html">cereal::Exception</a></div><div class="ttdoc">An exception class thrown when things go wrong at runtime.</div><div class="ttdef"><b>Definition:</b> helpers.hpp:48</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryOutputArchive_1_1Options_html_a4d1a04340ee609126fa20e25397e1e9f"><div class="ttname"><a href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#a4d1a04340ee609126fa20e25397e1e9f">cereal::PortableBinaryOutputArchive::Options::Options</a></div><div class="ttdeci">Options(Endianness outputEndian=getEndianness())</div><div class="ttdoc">Specify specific options for the PortableBinaryOutputArchive.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:100</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryOutputArchive_1_1Options_html_ae2a21b6c39ca3520f070c8484c40f534"><div class="ttname"><a href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html#ae2a21b6c39ca3520f070c8484c40f534">cereal::PortableBinaryOutputArchive::Options::Endianness</a></div><div class="ttdeci">Endianness</div><div class="ttdoc">Represents desired endianness.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:86</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryOutputArchive_html"><div class="ttname"><a href="classcereal_1_1PortableBinaryOutputArchive.html">cereal::PortableBinaryOutputArchive</a></div><div class="ttdoc">An output archive designed to save data in a compact binary representation portable over different ar...</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:78</div></div>
<div class="ttc" id="aclasscereal_1_1OutputArchive_html_abef67f45c79d199c690359715905987b"><div class="ttname"><a href="classcereal_1_1OutputArchive.html#abef67f45c79d199c690359715905987b">cereal::OutputArchive&lt; PortableBinaryOutputArchive, AllowEmptyClassElision &gt;::operator()</a></div><div class="ttdeci">PortableBinaryOutputArchive &amp; operator()(Types &amp;&amp;... args)</div><div class="ttdoc">Serializes all passed in data.</div><div class="ttdef"><b>Definition:</b> cereal.hpp:331</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryInputArchive_1_1Options_html_a85b0a94d5678e872e4b4fbf8b61a8df6"><div class="ttname"><a href="classcereal_1_1PortableBinaryInputArchive_1_1Options.html#a85b0a94d5678e872e4b4fbf8b61a8df6">cereal::PortableBinaryInputArchive::Options::LittleEndian</a></div><div class="ttdeci">static Options LittleEndian()</div><div class="ttdoc">Load into little endian.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:195</div></div>
<div class="ttc" id="aclasscereal_1_1PortableBinaryOutputArchive_1_1Options_html"><div class="ttname"><a href="classcereal_1_1PortableBinaryOutputArchive_1_1Options.html">cereal::PortableBinaryOutputArchive::Options</a></div><div class="ttdoc">A class containing various advanced options for the PortableBinaryOutput archive.</div><div class="ttdef"><b>Definition:</b> portable_binary.hpp:82</div></div>
<!-- HTML footer for doxygen 1.8.3.1-->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Sun Feb 27 2022 19:46:46 for cereal by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.17
</small></address>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-42360142-1', 'uscilab.github.io');
ga('send', 'pageview');
</script>
</body>
</html>