blob: 10b619856d419c451cf496f26ef22459bd5660f6 [file] [log] [blame]
<!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.15"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Apache Geode Native C++ Reference: DataInput.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="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(initResizable);
/* @license-end */</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">Apache Geode Native C++ Reference
&#160;<span id="projectnumber">1.13.1</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.15 -->
<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>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('a00104_source.html','');});
/* @license-end */
</script>
<div id="doc-content">
<!-- 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 class="header">
<div class="headertitle">
<div class="title">DataInput.hpp</div> </div>
</div><!--header-->
<div class="contents">
<a href="a00104.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> * Licensed to the Apache Software Foundation (ASF) under one or more</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> * contributor license agreements. See the NOTICE file distributed with</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * this work for additional information regarding copyright ownership.</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * The ASF licenses this file to You under the Apache License, Version 2.0</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * (the &quot;License&quot;); you may not use this file except in compliance with</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> * the License. You may obtain a copy of the License at</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> * http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> * Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> * See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> * limitations under the License.</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#pragma once</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="preprocessor">#ifndef GEODE_DATAINPUT_H_</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="preprocessor">#define GEODE_DATAINPUT_H_</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="preprocessor">#include &lt;iosfwd&gt;</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="preprocessor">#include &lt;memory&gt;</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &quot;ExceptionTypes.hpp&quot;</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;internal/DSCode.hpp&quot;</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;internal/geode_globals.hpp&quot;</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="preprocessor">#define _GEODE_CHECK_BUFFER_SIZE(x) _checkBufferSize(x, __LINE__)</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="keyword">namespace </span>apache {</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;<span class="keyword">namespace </span>geode {</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="keyword">namespace </span>client {</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="keyword">class </span>Cache;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="keyword">class </span>CacheableString;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="keyword">class </span>DataInput;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="keyword">class </span>Serializable;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="keyword">class </span>SerializationRegistry;</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="keyword">class </span>CacheImpl;</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="keyword">class </span>DataInputInternal;</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="keyword">class </span>Pool;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;</div><div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="a00435.html"> 59</a></span>&#160;<span class="keyword">class </span>APACHE_GEODE_EXPORT <a class="code" href="a00435.html">DataInput</a> {</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="a00435.html#add454175eca2ec881b129182c299cc39"> 66</a></span>&#160; <span class="keyword">inline</span> int8_t <a class="code" href="a00435.html#add454175eca2ec881b129182c299cc39">read</a>() {</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; _GEODE_CHECK_BUFFER_SIZE(1);</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="keywordflow">return</span> readNoCheck();</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; }</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;</div><div class="line"><a name="l00076"></a><span class="lineno"><a class="line" href="a00435.html#a5f860fcaeef277767a02a672c6185514"> 76</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="a00435.html#a5f860fcaeef277767a02a672c6185514">readBoolean</a>() {</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; _GEODE_CHECK_BUFFER_SIZE(1);</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="keywordflow">return</span> *(m_buf++) == 1 ? <span class="keyword">true</span> : <span class="keyword">false</span>;</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;</div><div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="a00435.html#a34e84b07fa99174486d77ac7df5b6280"> 91</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00435.html#a34e84b07fa99174486d77ac7df5b6280">readBytesOnly</a>(uint8_t* buffer, <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">if</span> (len &gt; 0) {</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; _GEODE_CHECK_BUFFER_SIZE(len);</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; std::memcpy(buffer, m_buf, len);</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; m_buf += len;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; }</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; }</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;</div><div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="a00435.html#a22ff16ad8a71e5d01f88246227f7a114"> 109</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00435.html#a22ff16ad8a71e5d01f88246227f7a114">readBytesOnly</a>(int8_t* buffer, <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordflow">if</span> (len &gt; 0) {</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; _GEODE_CHECK_BUFFER_SIZE(len);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; std::memcpy(buffer, m_buf, len);</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; m_buf += len;</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="l00116"></a><span class="lineno"> 116</span>&#160;</div><div class="line"><a name="l00127"></a><span class="lineno"><a class="line" href="a00435.html#a16511ecd595c84f0aceeff1a23529c0c"> 127</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00435.html#a16511ecd595c84f0aceeff1a23529c0c">readBytes</a>(uint8_t** bytes, int32_t* len) {</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keyword">auto</span> length = readArrayLength();</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; *len = length;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; uint8_t* buffer = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <span class="keywordflow">if</span> (length &gt; 0) {</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; _GEODE_CHECK_BUFFER_SIZE(length);</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; _GEODE_NEW(buffer, uint8_t[length]);</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; std::memcpy(buffer, m_buf, length);</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; m_buf += length;</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; }</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; *bytes = buffer;</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; }</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;</div><div class="line"><a name="l00150"></a><span class="lineno"><a class="line" href="a00435.html#a3d6b01df5b555e5d0f3cd456e3fa3cd6"> 150</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00435.html#a3d6b01df5b555e5d0f3cd456e3fa3cd6">readBytes</a>(int8_t** bytes, int32_t* len) {</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="keyword">auto</span> length = readArrayLength();</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; *len = length;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; int8_t* buffer = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="keywordflow">if</span> (length &gt; 0) {</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; _GEODE_CHECK_BUFFER_SIZE(length);</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; _GEODE_NEW(buffer, int8_t[length]);</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; std::memcpy(buffer, m_buf, length);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; m_buf += length;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; }</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; *bytes = buffer;</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; }</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno"><a class="line" href="a00435.html#a586a3ed064481c2027a4474b5b5599d9"> 168</a></span>&#160; <span class="keyword">inline</span> int16_t <a class="code" href="a00435.html#a586a3ed064481c2027a4474b5b5599d9">readInt16</a>() {</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; _GEODE_CHECK_BUFFER_SIZE(2);</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="keywordflow">return</span> readInt16NoCheck();</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; }</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;</div><div class="line"><a name="l00179"></a><span class="lineno"><a class="line" href="a00435.html#affecd40e102e0eed02d4fd22b892eb73"> 179</a></span>&#160; <span class="keyword">inline</span> int32_t <a class="code" href="a00435.html#affecd40e102e0eed02d4fd22b892eb73">readInt32</a>() {</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; _GEODE_CHECK_BUFFER_SIZE(4);</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; int32_t tmp = *(m_buf++);</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; tmp = (tmp &lt;&lt; 8) | *(m_buf++);</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; tmp = (tmp &lt;&lt; 8) | *(m_buf++);</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; tmp = (tmp &lt;&lt; 8) | *(m_buf++);</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keywordflow">return</span> tmp;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; }</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160;</div><div class="line"><a name="l00194"></a><span class="lineno"><a class="line" href="a00435.html#a517781ff83d5f021b0c2abf5bb4cd5b9"> 194</a></span>&#160; <span class="keyword">inline</span> int64_t <a class="code" href="a00435.html#a517781ff83d5f021b0c2abf5bb4cd5b9">readInt64</a>() {</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; _GEODE_CHECK_BUFFER_SIZE(8);</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; int64_t tmp;</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; tmp = *(m_buf++);</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; tmp = (tmp &lt;&lt; 8) | *(m_buf++);</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; tmp = (tmp &lt;&lt; 8) | *(m_buf++);</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; tmp = (tmp &lt;&lt; 8) | *(m_buf++);</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; tmp = (tmp &lt;&lt; 8) | *(m_buf++);</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; tmp = (tmp &lt;&lt; 8) | *(m_buf++);</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; tmp = (tmp &lt;&lt; 8) | *(m_buf++);</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; tmp = (tmp &lt;&lt; 8) | *(m_buf++);</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordflow">return</span> tmp;</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; }</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno"><a class="line" href="a00435.html#a3aec0ac7bb1b552f7a264803998c24dd"> 216</a></span>&#160; <span class="keyword">inline</span> int32_t <a class="code" href="a00435.html#a3aec0ac7bb1b552f7a264803998c24dd">readArrayLength</a>() {</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="keyword">const</span> uint8_t code = read();</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="keywordflow">if</span> (code == 0xFF) {</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; int32_t result = code;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordflow">if</span> (result &gt; 252) { <span class="comment">// 252 is java&#39;s ((byte)-4 &amp;&amp; 0xFF)</span></div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="keywordflow">if</span> (code == 0xFE) {</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; uint16_t val = readInt16();</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; result = val;</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (code == 0xFD) {</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; uint32_t val = readInt32();</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; result = val;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">throw</span> <a class="code" href="a00475.html">IllegalStateException</a>(<span class="stringliteral">&quot;unexpected array length code&quot;</span>);</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; }</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; }</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; }</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160;</div><div class="line"><a name="l00243"></a><span class="lineno"><a class="line" href="a00435.html#a3272acc6204369006c0a20e650413ba8"> 243</a></span>&#160; <span class="keyword">inline</span> int64_t <a class="code" href="a00435.html#a3272acc6204369006c0a20e650413ba8">readUnsignedVL</a>() {</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; int32_t shift = 0;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; int64_t result = 0;</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; <span class="keywordflow">while</span> (shift &lt; 64) {</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> b = read();</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; result |= static_cast&lt;int64_t&gt;(b &amp; 0x7F) &lt;&lt; shift;</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; <span class="keywordflow">if</span> ((b &amp; 0x80) == 0) {</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; }</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; shift += 7;</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; <span class="keywordflow">throw</span> <a class="code" href="a00475.html">IllegalStateException</a>(<span class="stringliteral">&quot;Malformed variable length integer&quot;</span>);</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;</div><div class="line"><a name="l00262"></a><span class="lineno"><a class="line" href="a00435.html#ae1ac0dfa80098bd1bebdcf7bf8f1ea9f"> 262</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">float</span> <a class="code" href="a00435.html#ae1ac0dfa80098bd1bebdcf7bf8f1ea9f">readFloat</a>() {</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; _GEODE_CHECK_BUFFER_SIZE(4);</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="keyword">union </span>float_uint32_t {</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="keywordtype">float</span> f;</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; uint32_t u;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; } v;</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; v.u = readInt32();</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keywordflow">return</span> v.f;</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; }</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160;</div><div class="line"><a name="l00278"></a><span class="lineno"><a class="line" href="a00435.html#a94e42d17eb4c9e5b3ac4561504b02d7c"> 278</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="a00435.html#a94e42d17eb4c9e5b3ac4561504b02d7c">readDouble</a>() {</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; _GEODE_CHECK_BUFFER_SIZE(8);</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keyword">union </span>double_uint64_t {</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; <span class="keywordtype">double</span> d;</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; uint64_t ll;</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; } v;</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; v.ll = readInt64();</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="keywordflow">return</span> v.d;</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; }</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class </span>CharT = char, <span class="keyword">class</span>... Tail&gt;</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="keyword">inline</span> std::basic_string&lt;CharT, Tail...&gt; readUTF() {</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; std::basic_string&lt;CharT, Tail...&gt; value;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; readJavaModifiedUtf8(value);</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="keywordflow">return</span> value;</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; }</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</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>CharT = char, <span class="keyword">class</span>... Tail&gt;</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="keyword">inline</span> std::basic_string&lt;CharT, Tail...&gt; readString() {</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; std::basic_string&lt;CharT, Tail...&gt; value;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keyword">auto</span> type = static_cast&lt;internal::DSCode&gt;(read());</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; <span class="keywordflow">switch</span> (type) {</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <span class="keywordflow">case</span> internal::DSCode::CacheableString:</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; readJavaModifiedUtf8(value);</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <span class="keywordflow">case</span> internal::DSCode::CacheableStringHuge:</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; readUtf16Huge(value);</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="keywordflow">case</span> internal::DSCode::CacheableASCIIString:</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; readAscii(value);</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <span class="keywordflow">case</span> internal::DSCode::CacheableASCIIStringHuge:</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; readAsciiHuge(value);</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="keywordflow">case</span> internal::DSCode::CacheableNullString:</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="comment">// empty string</span></div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="comment">// TODO: What&#39;s the right response here?</span></div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keywordflow">default</span>:</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; }</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="keywordflow">return</span> value;</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; }</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160;</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> readNativeBool() {</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; read(); <span class="comment">// ignore type id</span></div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="keywordflow">return</span> readBoolean();</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; }</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="keyword">inline</span> int32_t readNativeInt32() {</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; read(); <span class="comment">// ignore type id</span></div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="keywordflow">return</span> readInt32();</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;</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keyword">inline</span> std::shared_ptr&lt;Serializable&gt; readDirectObject(int8_t typeId = -1) {</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="keywordflow">return</span> readObjectInternal(typeId);</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; }</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160;</div><div class="line"><a name="l00341"></a><span class="lineno"><a class="line" href="a00435.html#acf90a7fa8a62cc4c23ac1e36f5646f03"> 341</a></span>&#160; <span class="keyword">inline</span> std::shared_ptr&lt;Serializable&gt; <a class="code" href="a00435.html#acf90a7fa8a62cc4c23ac1e36f5646f03">readObject</a>() {</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="keywordflow">return</span> readObjectInternal();</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; }</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160;</div><div class="line"><a name="l00349"></a><span class="lineno"><a class="line" href="a00435.html#aab988e6fb7d418d2b92fe320a8f22a93"> 349</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00435.html#aab988e6fb7d418d2b92fe320a8f22a93">readObject</a>(std::shared_ptr&lt;Serializable&gt;&amp; ptr) {</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; ptr = readObjectInternal();</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; }</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160;</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readObject(char16_t* value) { *value = readInt16(); }</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readObject(<span class="keywordtype">bool</span>* value) { *value = readBoolean(); }</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readObject(int8_t* value) { *value = read(); }</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160;</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readObject(int16_t* value) { *value = readInt16(); }</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160;</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readObject(int32_t* value) { *value = readInt32(); }</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160;</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readObject(int64_t* value) { *value = readInt64(); }</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160;</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readObject(<span class="keywordtype">float</span>* value) { *value = readFloat(); }</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readObject(<span class="keywordtype">double</span>* value) { *value = readDouble(); }</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160;</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="keyword">inline</span> std::vector&lt;char16_t&gt; readCharArray() { <span class="keywordflow">return</span> readArray&lt;char16_t&gt;(); }</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160;</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keyword">inline</span> std::vector&lt;bool&gt; readBooleanArray() { <span class="keywordflow">return</span> readArray&lt;bool&gt;(); }</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160;</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="keyword">inline</span> std::vector&lt;int8_t&gt; readByteArray() { <span class="keywordflow">return</span> readArray&lt;int8_t&gt;(); }</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160;</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="keyword">inline</span> std::vector&lt;int16_t&gt; readShortArray() { <span class="keywordflow">return</span> readArray&lt;int16_t&gt;(); }</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160;</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; <span class="keyword">inline</span> std::vector&lt;int32_t&gt; readIntArray() { <span class="keywordflow">return</span> readArray&lt;int32_t&gt;(); }</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="keyword">inline</span> std::vector&lt;int64_t&gt; readLongArray() { <span class="keywordflow">return</span> readArray&lt;int64_t&gt;(); }</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160;</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="keyword">inline</span> std::vector&lt;float&gt; readFloatArray() { <span class="keywordflow">return</span> readArray&lt;float&gt;(); }</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160;</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="keyword">inline</span> std::vector&lt;double&gt; readDoubleArray() { <span class="keywordflow">return</span> readArray&lt;double&gt;(); }</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160;</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keyword">inline</span> std::vector&lt;std::string&gt; readStringArray() {</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; std::vector&lt;std::string&gt; value;</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <span class="keyword">auto</span> arrLen = readArrayLength();</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; <span class="keywordflow">if</span> (arrLen &gt; 0) {</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; value.reserve(arrLen);</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; arrLen; i++) {</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; value.push_back(readString());</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; }</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; }</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keywordflow">return</span> value;</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; }</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160;</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readArrayOfByteArrays(int8_t*** arrayofBytearr,</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; int32_t&amp; arrayLength,</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; int32_t** elementLength) {</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="keyword">auto</span> arrLen = readArrayLength();</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; arrayLength = arrLen;</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160;</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="keywordflow">if</span> (arrLen == -1) {</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; *arrayofBytearr = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; int8_t** tmpArray;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; int32_t* tmpLengtharr;</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; _GEODE_NEW(tmpArray, int8_t * [arrLen]);</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; _GEODE_NEW(tmpLengtharr, int32_t[arrLen]);</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; arrLen; i++) {</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; readBytes(&amp;tmpArray[i], &amp;tmpLengtharr[i]);</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; }</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; *arrayofBytearr = tmpArray;</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; *elementLength = tmpLengtharr;</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; }</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; }</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160;</div><div class="line"><a name="l00426"></a><span class="lineno"><a class="line" href="a00435.html#a41e206930823fb431f2b775fc46563a6"> 426</a></span>&#160; <span class="keyword">inline</span> <span class="keyword">const</span> uint8_t* <a class="code" href="a00435.html#a41e206930823fb431f2b775fc46563a6">currentBufferPosition</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_buf; }</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160;</div><div class="line"><a name="l00429"></a><span class="lineno"><a class="line" href="a00435.html#a8cefce9299023ce99b9a783010a614d8"> 429</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code" href="a00435.html#a8cefce9299023ce99b9a783010a614d8">getBytesRead</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_buf - m_bufHead; }</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160;</div><div class="line"><a name="l00432"></a><span class="lineno"><a class="line" href="a00435.html#ad57bcfd9694466b9ed6d3ace2ce94923"> 432</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">size_t</span> <a class="code" href="a00435.html#ad57bcfd9694466b9ed6d3ace2ce94923">getBytesRemaining</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keywordflow">return</span> (m_bufLength - getBytesRead());</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; }</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160;</div><div class="line"><a name="l00437"></a><span class="lineno"><a class="line" href="a00435.html#a7383e1983b2128d8edb85ef6a8330759"> 437</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00435.html#a7383e1983b2128d8edb85ef6a8330759">advanceCursor</a>(<span class="keywordtype">size_t</span> offset) { m_buf += offset; }</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160;</div><div class="line"><a name="l00440"></a><span class="lineno"><a class="line" href="a00435.html#a1bb6aebefb7638e491013cc430b91239"> 440</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00435.html#a1bb6aebefb7638e491013cc430b91239">rewindCursor</a>(<span class="keywordtype">size_t</span> offset) { m_buf -= offset; }</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160;</div><div class="line"><a name="l00443"></a><span class="lineno"><a class="line" href="a00435.html#aeee1be5c4a6544f384ee0b588787ae55"> 443</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00435.html#aeee1be5c4a6544f384ee0b588787ae55">reset</a>() { m_buf = m_bufHead; }</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160;</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> setBuffer() {</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; m_buf = currentBufferPosition();</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; m_bufLength = getBytesRemaining();</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; }</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160;</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> resetPdx(<span class="keywordtype">size_t</span> offset) { m_buf = m_bufHead + offset; }</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160;</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">size_t</span> getPdxBytes()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_bufLength; }</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160;</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <span class="keyword">static</span> uint8_t* getBufferCopy(<span class="keyword">const</span> uint8_t* from, <span class="keywordtype">size_t</span> length) {</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; uint8_t* result;</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; _GEODE_NEW(result, uint8_t[length]);</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; std::memcpy(result, from, length);</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160;</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; }</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160;</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> reset(<span class="keywordtype">size_t</span> offset) { m_buf = m_bufHead + offset; }</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160;</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; uint8_t* getBufferCopyFrom(<span class="keyword">const</span> uint8_t* from, <span class="keywordtype">size_t</span> length) {</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; uint8_t* result;</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; _GEODE_NEW(result, uint8_t[length]);</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; std::memcpy(result, from, length);</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160;</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; }</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160;</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <span class="keyword">virtual</span> Cache* getCache() <span class="keyword">const</span>;</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160;</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; DataInput() = <span class="keyword">delete</span>;</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <span class="keyword">virtual</span> ~DataInput() noexcept = default;</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; DataInput(const DataInput&amp;) = delete;</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; DataInput&amp; operator=(const DataInput&amp;) = delete;</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; DataInput(DataInput&amp;&amp;) = default;</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; DataInput&amp; operator=(DataInput&amp;&amp;) = default;</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160;</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; protected:</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; DataInput(const uint8_t* buffer, <span class="keywordtype">size_t</span> len, const CacheImpl* cache,</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; Pool* pool);</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160;</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; virtual const SerializationRegistry&amp; getSerializationRegistry() const;</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160;</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; private:</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; const uint8_t* m_buf;</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; const uint8_t* m_bufHead;</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; <span class="keywordtype">size_t</span> m_bufLength;</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; Pool* m_pool;</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; const CacheImpl* m_cache;</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160;</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; std::shared_ptr&lt;Serializable&gt; readObjectInternal(int8_t typeId = -1);</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160;</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; template &lt;typename mType&gt;</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; <span class="keywordtype">void</span> readObject(mType** value, int32_t&amp; length) {</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="keyword">auto</span> arrayLen = readArrayLength();</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; length = arrayLen;</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; mType* objArray;</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <span class="keywordflow">if</span> (arrayLen &gt; 0) {</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; objArray = <span class="keyword">new</span> mType[arrayLen];</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="keywordtype">int</span> i = 0;</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; <span class="keywordflow">for</span> (i = 0; i &lt; arrayLen; i++) {</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; mType tmp = 0;</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; readObject(&amp;tmp);</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; objArray[i] = tmp; <span class="comment">//*value[i] = tmp;</span></div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; }</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; *value = objArray;</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; }</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; }</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160;</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; std::vector&lt;T&gt; readArray() {</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="keyword">auto</span> arrayLen = readArrayLength();</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; std::vector&lt;T&gt; objArray;</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keywordflow">if</span> (arrayLen &gt;= 0) {</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; objArray.reserve(arrayLen);</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="keywordtype">int</span> i = 0;</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="keywordflow">for</span> (i = 0; i &lt; arrayLen; i++) {</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; T tmp = 0;</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; readObject(&amp;tmp);</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; objArray.push_back(tmp);</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; }</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; }</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <span class="keywordflow">return</span> objArray;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; }</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160;</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">char</span> readPdxChar() { <span class="keywordflow">return</span> static_cast&lt;char&gt;(readInt16()); }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160;</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> _checkBufferSize(<span class="keywordtype">size_t</span> size, int32_t line) {</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; <span class="keywordflow">if</span> ((m_bufLength - (m_buf - m_bufHead)) &lt; size) {</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; <span class="keywordflow">throw</span> OutOfRangeException(</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <span class="stringliteral">&quot;DataInput: attempt to read beyond buffer at line &quot;</span> +</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; std::to_string(line) + <span class="stringliteral">&quot;: available buffer size &quot;</span> +</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; std::to_string(m_bufLength - (m_buf - m_bufHead)) +</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="stringliteral">&quot;, attempted read of size &quot;</span> + std::to_string(size));</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; }</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; }</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160;</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <span class="keyword">inline</span> int8_t readNoCheck() { <span class="keywordflow">return</span> *(m_buf++); }</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160;</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <span class="keyword">inline</span> int16_t readInt16NoCheck() {</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; int16_t tmp = *(m_buf++);</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; tmp = static_cast&lt;int16_t&gt;((tmp &lt;&lt; 8) | *(m_buf++));</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <span class="keywordflow">return</span> tmp;</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; }</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160;</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class </span>CharT, <span class="keyword">class</span>... Tail&gt;</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readAscii(std::basic_string&lt;CharT, Tail...&gt;&amp; value,</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <span class="keywordtype">size_t</span> length) {</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; _GEODE_CHECK_BUFFER_SIZE(length);</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; value.reserve(length);</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="keywordflow">while</span> (length-- &gt; 0) {</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="comment">// blindly assumes ASCII so mask off 7 bits</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; value += readNoCheck() &amp; 0x7F;</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; }</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; }</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160;</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class </span>CharT, <span class="keyword">class</span>... Tail&gt;</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readAscii(std::basic_string&lt;CharT, Tail...&gt;&amp; value) {</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; readAscii(value, static_cast&lt;uint16_t&gt;(readInt16()));</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; }</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160;</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class </span>CharT, <span class="keyword">class</span>... Tail&gt;</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readAsciiHuge(std::basic_string&lt;CharT, Tail...&gt;&amp; value) {</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; readAscii(value, static_cast&lt;uint32_t&gt;(readInt32()));</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; }</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160;</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _CharT, <span class="keyword">class</span> _Traits, <span class="keyword">class</span> _Allocator&gt;</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; <span class="keywordtype">void</span> readJavaModifiedUtf8(</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; std::basic_string&lt;_CharT, _Traits, _Allocator&gt;&amp; value);</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160;</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Traits, <span class="keyword">class</span> _Allocator&gt;</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <span class="keywordtype">void</span> readJavaModifiedUtf8(</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; std::basic_string&lt;char16_t, _Traits, _Allocator&gt;&amp; value);</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160;</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Traits, <span class="keyword">class</span> _Allocator&gt;</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; <span class="keywordtype">void</span> readJavaModifiedUtf8(</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; std::basic_string&lt;char, _Traits, _Allocator&gt;&amp; value);</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160;</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Traits, <span class="keyword">class</span> _Allocator&gt;</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="keywordtype">void</span> readJavaModifiedUtf8(</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; std::basic_string&lt;char32_t, _Traits, _Allocator&gt;&amp; value);</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160;</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Traits, <span class="keyword">class</span> _Allocator&gt;</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readJavaModifiedUtf8(</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; std::basic_string&lt;wchar_t, _Traits, _Allocator&gt;&amp; value) {</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <span class="comment">// TODO string optimize</span></div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="keyword">typedef</span> std::conditional&lt;</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; <span class="keyword">sizeof</span>(wchar_t) == <span class="keyword">sizeof</span>(char16_t), char16_t,</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; std::conditional&lt;<span class="keyword">sizeof</span>(wchar_t) == <span class="keyword">sizeof</span>(char32_t), char32_t,</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="keywordtype">char</span>&gt;::type&gt;::type _WcharT;</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; <span class="keyword">auto</span> tmp = std::basic_string&lt;_WcharT&gt;();</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; readJavaModifiedUtf8(tmp);</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; value.assign(reinterpret_cast&lt;const wchar_t*&gt;(tmp.data()), tmp.length());</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; }</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160;</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _CharT, <span class="keyword">class</span> _Traits, <span class="keyword">class</span> _Allocator&gt;</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; <span class="keywordtype">void</span> readUtf16Huge(std::basic_string&lt;_CharT, _Traits, _Allocator&gt;&amp; value);</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160;</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Traits, <span class="keyword">class</span> _Allocator&gt;</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readUtf16Huge(</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; std::basic_string&lt;char16_t, _Traits, _Allocator&gt;&amp; value) {</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; uint32_t length = readInt32();</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; _GEODE_CHECK_BUFFER_SIZE(length);</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; value.reserve(length);</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; <span class="keywordflow">while</span> (length-- &gt; 0) {</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; value += readInt16NoCheck();</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; }</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; }</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160;</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Traits, <span class="keyword">class</span> _Allocator&gt;</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; <span class="keywordtype">void</span> readUtf16Huge(std::basic_string&lt;char, _Traits, _Allocator&gt;&amp; value);</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160;</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Traits, <span class="keyword">class</span> _Allocator&gt;</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; <span class="keywordtype">void</span> readUtf16Huge(std::basic_string&lt;char32_t, _Traits, _Allocator&gt;&amp; value);</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160;</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Traits, <span class="keyword">class</span> _Allocator&gt;</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> readUtf16Huge(</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; std::basic_string&lt;wchar_t, _Traits, _Allocator&gt;&amp; value) {</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; <span class="comment">// TODO string optimize</span></div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; <span class="keyword">typedef</span> std::conditional&lt;</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <span class="keyword">sizeof</span>(wchar_t) == <span class="keyword">sizeof</span>(char16_t), char16_t,</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; std::conditional&lt;<span class="keyword">sizeof</span>(wchar_t) == <span class="keyword">sizeof</span>(char32_t), char32_t,</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; <span class="keywordtype">char</span>&gt;::type&gt;::type _WcharT;</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160;</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <span class="keyword">auto</span> tmp = std::basic_string&lt;_WcharT&gt;();</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; readUtf16Huge(tmp);</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; value.assign(reinterpret_cast&lt;const wchar_t*&gt;(tmp.data()), tmp.length());</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; }</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160;</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; Pool* getPool()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pool; }</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160;</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; <span class="keyword">friend</span> Cache;</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; <span class="keyword">friend</span> CacheImpl;</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; <span class="keyword">friend</span> DataInputInternal;</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; <span class="keyword">friend</span> CacheableString;</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160;};</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160;} <span class="comment">// namespace client</span></div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160;} <span class="comment">// namespace geode</span></div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160;} <span class="comment">// namespace apache</span></div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160;</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160;<span class="preprocessor">#endif // GEODE_DATAINPUT_H_</span></div><div class="ttc" id="a00435_html_a5f860fcaeef277767a02a672c6185514"><div class="ttname"><a href="a00435.html#a5f860fcaeef277767a02a672c6185514">apache::geode::client::DataInput::readBoolean</a></div><div class="ttdeci">bool readBoolean()</div><div class="ttdoc">Read a boolean value from the DataInput.</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:76</div></div>
<div class="ttc" id="a00435_html_a517781ff83d5f021b0c2abf5bb4cd5b9"><div class="ttname"><a href="a00435.html#a517781ff83d5f021b0c2abf5bb4cd5b9">apache::geode::client::DataInput::readInt64</a></div><div class="ttdeci">int64_t readInt64()</div><div class="ttdoc">Read a 64-bit signed integer from the DataInput.</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:194</div></div>
<div class="ttc" id="a00435_html_aeee1be5c4a6544f384ee0b588787ae55"><div class="ttname"><a href="a00435.html#aeee1be5c4a6544f384ee0b588787ae55">apache::geode::client::DataInput::reset</a></div><div class="ttdeci">void reset()</div><div class="ttdoc">reset the cursor to the start of buffer</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:443</div></div>
<div class="ttc" id="a00435_html_a3aec0ac7bb1b552f7a264803998c24dd"><div class="ttname"><a href="a00435.html#a3aec0ac7bb1b552f7a264803998c24dd">apache::geode::client::DataInput::readArrayLength</a></div><div class="ttdeci">int32_t readArrayLength()</div><div class="ttdoc">Read a 32-bit signed integer array length value from the DataInput in a manner compatible with java s...</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:216</div></div>
<div class="ttc" id="a00435_html_a1bb6aebefb7638e491013cc430b91239"><div class="ttname"><a href="a00435.html#a1bb6aebefb7638e491013cc430b91239">apache::geode::client::DataInput::rewindCursor</a></div><div class="ttdeci">void rewindCursor(size_t offset)</div><div class="ttdoc">rewind the cursor by given offset</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:440</div></div>
<div class="ttc" id="a00435_html"><div class="ttname"><a href="a00435.html">apache::geode::client::DataInput</a></div><div class="ttdoc">Provide operations for reading primitive data values, byte arrays, strings, Serializable objects from...</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:59</div></div>
<div class="ttc" id="a00435_html_a41e206930823fb431f2b775fc46563a6"><div class="ttname"><a href="a00435.html#a41e206930823fb431f2b775fc46563a6">apache::geode::client::DataInput::currentBufferPosition</a></div><div class="ttdeci">const uint8_t * currentBufferPosition() const</div><div class="ttdoc">Get the pointer to current buffer position.</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:426</div></div>
<div class="ttc" id="a00435_html_a3272acc6204369006c0a20e650413ba8"><div class="ttname"><a href="a00435.html#a3272acc6204369006c0a20e650413ba8">apache::geode::client::DataInput::readUnsignedVL</a></div><div class="ttdeci">int64_t readUnsignedVL()</div><div class="ttdoc">Decode a 64 bit integer as a variable length array.</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:243</div></div>
<div class="ttc" id="a00435_html_add454175eca2ec881b129182c299cc39"><div class="ttname"><a href="a00435.html#add454175eca2ec881b129182c299cc39">apache::geode::client::DataInput::read</a></div><div class="ttdeci">int8_t read()</div><div class="ttdoc">Read a signed byte from the DataInput.</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:66</div></div>
<div class="ttc" id="a00435_html_ae1ac0dfa80098bd1bebdcf7bf8f1ea9f"><div class="ttname"><a href="a00435.html#ae1ac0dfa80098bd1bebdcf7bf8f1ea9f">apache::geode::client::DataInput::readFloat</a></div><div class="ttdeci">float readFloat()</div><div class="ttdoc">Read a float from the DataInput.</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:262</div></div>
<div class="ttc" id="a00475_html"><div class="ttname"><a href="a00475.html">apache::geode::client::IllegalStateException</a></div><div class="ttdoc">Thrown when the state of cache is manipulated to be illegal.</div><div class="ttdef"><b>Definition:</b> ExceptionTypes.hpp:64</div></div>
<div class="ttc" id="a00435_html_a22ff16ad8a71e5d01f88246227f7a114"><div class="ttname"><a href="a00435.html#a22ff16ad8a71e5d01f88246227f7a114">apache::geode::client::DataInput::readBytesOnly</a></div><div class="ttdeci">void readBytesOnly(int8_t *buffer, size_t len)</div><div class="ttdoc">Read the given number of signed bytes from the DataInput.</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:109</div></div>
<div class="ttc" id="a00435_html_ad57bcfd9694466b9ed6d3ace2ce94923"><div class="ttname"><a href="a00435.html#ad57bcfd9694466b9ed6d3ace2ce94923">apache::geode::client::DataInput::getBytesRemaining</a></div><div class="ttdeci">size_t getBytesRemaining() const</div><div class="ttdoc">get the number of bytes remaining to be read in the buffer</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:432</div></div>
<div class="ttc" id="a00435_html_a3d6b01df5b555e5d0f3cd456e3fa3cd6"><div class="ttname"><a href="a00435.html#a3d6b01df5b555e5d0f3cd456e3fa3cd6">apache::geode::client::DataInput::readBytes</a></div><div class="ttdeci">void readBytes(int8_t **bytes, int32_t *len)</div><div class="ttdoc">Read an array of signed bytes from the DataInput expecting to find the length of array in the stream ...</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:150</div></div>
<div class="ttc" id="a00435_html_a94e42d17eb4c9e5b3ac4561504b02d7c"><div class="ttname"><a href="a00435.html#a94e42d17eb4c9e5b3ac4561504b02d7c">apache::geode::client::DataInput::readDouble</a></div><div class="ttdeci">double readDouble()</div><div class="ttdoc">Read a double precision number from the DataInput.</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:278</div></div>
<div class="ttc" id="a00435_html_a34e84b07fa99174486d77ac7df5b6280"><div class="ttname"><a href="a00435.html#a34e84b07fa99174486d77ac7df5b6280">apache::geode::client::DataInput::readBytesOnly</a></div><div class="ttdeci">void readBytesOnly(uint8_t *buffer, size_t len)</div><div class="ttdoc">Read the given number of unsigned bytes from the DataInput.</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:91</div></div>
<div class="ttc" id="a00435_html_aab988e6fb7d418d2b92fe320a8f22a93"><div class="ttname"><a href="a00435.html#aab988e6fb7d418d2b92fe320a8f22a93">apache::geode::client::DataInput::readObject</a></div><div class="ttdeci">void readObject(std::shared_ptr&lt; Serializable &gt; &amp;ptr)</div><div class="ttdoc">Read a Serializable object from the DataInput.</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:349</div></div>
<div class="ttc" id="a00435_html_acf90a7fa8a62cc4c23ac1e36f5646f03"><div class="ttname"><a href="a00435.html#acf90a7fa8a62cc4c23ac1e36f5646f03">apache::geode::client::DataInput::readObject</a></div><div class="ttdeci">std::shared_ptr&lt; Serializable &gt; readObject()</div><div class="ttdoc">Read a Serializable object from the DataInput.</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:341</div></div>
<div class="ttc" id="a00435_html_a586a3ed064481c2027a4474b5b5599d9"><div class="ttname"><a href="a00435.html#a586a3ed064481c2027a4474b5b5599d9">apache::geode::client::DataInput::readInt16</a></div><div class="ttdeci">int16_t readInt16()</div><div class="ttdoc">Read a 16-bit signed integer from the DataInput.</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:168</div></div>
<div class="ttc" id="a00435_html_a8cefce9299023ce99b9a783010a614d8"><div class="ttname"><a href="a00435.html#a8cefce9299023ce99b9a783010a614d8">apache::geode::client::DataInput::getBytesRead</a></div><div class="ttdeci">size_t getBytesRead() const</div><div class="ttdoc">get the number of bytes read in the buffer</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:429</div></div>
<div class="ttc" id="a00435_html_a7383e1983b2128d8edb85ef6a8330759"><div class="ttname"><a href="a00435.html#a7383e1983b2128d8edb85ef6a8330759">apache::geode::client::DataInput::advanceCursor</a></div><div class="ttdeci">void advanceCursor(size_t offset)</div><div class="ttdoc">advance the cursor by given offset</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:437</div></div>
<div class="ttc" id="a00435_html_affecd40e102e0eed02d4fd22b892eb73"><div class="ttname"><a href="a00435.html#affecd40e102e0eed02d4fd22b892eb73">apache::geode::client::DataInput::readInt32</a></div><div class="ttdeci">int32_t readInt32()</div><div class="ttdoc">Read a 32-bit signed integer from the DataInput.g.</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:179</div></div>
<div class="ttc" id="a00435_html_a16511ecd595c84f0aceeff1a23529c0c"><div class="ttname"><a href="a00435.html#a16511ecd595c84f0aceeff1a23529c0c">apache::geode::client::DataInput::readBytes</a></div><div class="ttdeci">void readBytes(uint8_t **bytes, int32_t *len)</div><div class="ttdoc">Read an array of unsigned bytes from the DataInput expecting to find the length of array in the strea...</div><div class="ttdef"><b>Definition:</b> DataInput.hpp:127</div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<HR><address style="align: right;"><small>Apache Geode C++ Cache API Documentation</small></address>