diff --git a/classflatbuffers_1_1_flat_buffer_builder-members.html b/classflatbuffers_1_1_flat_buffer_builder-members.html index ccf8234ff11e529eec891ad152f0c5e90c79b99f..b8c1bf9f5ba79472f5f080072d24997666a1e340 100644 --- a/classflatbuffers_1_1_flat_buffer_builder-members.html +++ b/classflatbuffers_1_1_flat_buffer_builder-members.html @@ -148,7 +148,9 @@ $(document).ready(function(){initNavTree('classflatbuffers_1_1_flat_buffer_build <tr class="even"><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">CreateVectorOfSortedTables</a>(std::vector< Offset< T >> *v)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> <tr><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6">CreateVectorOfStrings</a>(const std::vector< std::string > &v)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> <tr class="even"><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7">CreateVectorOfStructs</a>(const T *v, size_t len)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> - <tr><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1">CreateVectorOfStructs</a>(const std::vector< T > &v)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> + <tr><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72">CreateVectorOfStructs</a>(size_t vector_size, const std::function< void(size_t i, T *)> &filler)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> + <tr class="even"><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1">CreateVectorOfStructs</a>(const std::vector< T > &v)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> + <tr><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961">DedupVtables</a>(bool dedup)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> <tr class="even"><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">Finish</a>(Offset< T > root, const char *file_identifier=nullptr)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> <tr><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220">FinishSizePrefixed</a>(Offset< T > root, const char *file_identifier=nullptr)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a></td><td class="entry"><span class="mlabel">inline</span></td></tr> <tr class="even"><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#ac72b54a75e0c329e0ce0b8fab758e256">FlatBufferBuilder</a>(uoffset_t initial_size=1024, const simple_allocator *allocator=nullptr)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">explicit</span></td></tr> diff --git a/classflatbuffers_1_1_flat_buffer_builder.html b/classflatbuffers_1_1_flat_buffer_builder.html index 21831d85fd701f2e8dcd8ca109edd40e83126ad6..911927f309d708568cbff0317ffdc2b4c156c62f 100644 --- a/classflatbuffers_1_1_flat_buffer_builder.html +++ b/classflatbuffers_1_1_flat_buffer_builder.html @@ -206,10 +206,17 @@ Offset< Vector< uint8_t > > </td><td class="memItemRight" valig <tr class="memitem:afede51fd9c32d146cbb1832f57c5e1b7"><td class="memTemplItemLeft" align="right" valign="top">Offset< Vector< const T * > > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7">CreateVectorOfStructs</a> (const T *v, size_t len)</td></tr> <tr class="memdesc:afede51fd9c32d146cbb1832f57c5e1b7"><td class="mdescLeft"> </td><td class="mdescRight">Serialize an array of structs into a FlatBuffer <code>vector</code>. <a href="#afede51fd9c32d146cbb1832f57c5e1b7">More...</a><br /></td></tr> <tr class="separator:afede51fd9c32d146cbb1832f57c5e1b7"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a6e90ada59d9553636f72ce8e4a892f72"><td class="memTemplParams" colspan="2">template<typename T > </td></tr> +<tr class="memitem:a6e90ada59d9553636f72ce8e4a892f72"><td class="memTemplItemLeft" align="right" valign="top">Offset< Vector< const T * > > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72">CreateVectorOfStructs</a> (size_t vector_size, const std::function< void(size_t i, T *)> &filler)</td></tr> +<tr class="memdesc:a6e90ada59d9553636f72ce8e4a892f72"><td class="mdescLeft"> </td><td class="mdescRight">Serialize an array of structs into a FlatBuffer <code>vector</code>. <a href="#a6e90ada59d9553636f72ce8e4a892f72">More...</a><br /></td></tr> +<tr class="separator:a6e90ada59d9553636f72ce8e4a892f72"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:a8704709a2e25ad04679212ee4126b1a1"><td class="memTemplParams" colspan="2">template<typename T > </td></tr> <tr class="memitem:a8704709a2e25ad04679212ee4126b1a1"><td class="memTemplItemLeft" align="right" valign="top">Offset< Vector< const T * > > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1">CreateVectorOfStructs</a> (const std::vector< T > &v)</td></tr> <tr class="memdesc:a8704709a2e25ad04679212ee4126b1a1"><td class="mdescLeft"> </td><td class="mdescRight">Serialize a <code>std::vector</code> of structs into a FlatBuffer <code>vector</code>. <a href="#a8704709a2e25ad04679212ee4126b1a1">More...</a><br /></td></tr> <tr class="separator:a8704709a2e25ad04679212ee4126b1a1"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:aa905b29dce19a1795c7bce375cf29961"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961">DedupVtables</a> (bool dedup)</td></tr> +<tr class="memdesc:aa905b29dce19a1795c7bce375cf29961"><td class="mdescLeft"> </td><td class="mdescRight">By default vtables are deduped in order to save space. <a href="#aa905b29dce19a1795c7bce375cf29961">More...</a><br /></td></tr> +<tr class="separator:aa905b29dce19a1795c7bce375cf29961"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:a0c9e507b373d598b51052fab4fa34912"><td class="memTemplParams" colspan="2">template<typename T > </td></tr> <tr class="memitem:a0c9e507b373d598b51052fab4fa34912"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">Finish</a> (Offset< T > root, const char *file_identifier=nullptr)</td></tr> <tr class="memdesc:a0c9e507b373d598b51052fab4fa34912"><td class="mdescLeft"> </td><td class="mdescRight">Finish serializing a buffer by writing the root offset. <a href="#a0c9e507b373d598b51052fab4fa34912">More...</a><br /></td></tr> @@ -1024,6 +1031,57 @@ template<typename T > </div> </dl> <dl class="section return"><dt>Returns</dt><dd>Returns a typed <code>Offset</code> into the serialized data indicating where the vector is stored. </dd></dl> +</div> +</div> +<a class="anchor" id="a6e90ada59d9553636f72ce8e4a892f72"></a> +<div class="memitem"> +<div class="memproto"> +<div class="memtemplate"> +template<typename T > </div> +<table class="mlabels"> + <tr> + <td class="mlabels-left"> + <table class="memname"> + <tr> + <td class="memname">Offset<Vector<const T *> > flatbuffers::FlatBufferBuilder::CreateVectorOfStructs </td> + <td>(</td> + <td class="paramtype">size_t </td> + <td class="paramname"><em>vector_size</em>, </td> + </tr> + <tr> + <td class="paramkey"></td> + <td></td> + <td class="paramtype">const std::function< void(size_t i, T *)> & </td> + <td class="paramname"><em>filler</em> </td> + </tr> + <tr> + <td></td> + <td>)</td> + <td></td><td></td> + </tr> + </table> + </td> + <td class="mlabels-right"> +<span class="mlabels"><span class="mlabel">inline</span></span> </td> + </tr> +</table> +</div><div class="memdoc"> + +<p>Serialize an array of structs into a FlatBuffer <code>vector</code>. </p> +<dl class="tparams"><dt>Template Parameters</dt><dd> + <table class="tparams"> + <tr><td class="paramname">T</td><td>The data type of the struct array elements. </td></tr> + </table> + </dd> +</dl> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">f</td><td>A function that takes the current iteration 0..vector_size-1 and a pointer to the struct that must be filled. </td></tr> + </table> + </dd> +</dl> +<dl class="section return"><dt>Returns</dt><dd>Returns a typed <code>Offset</code> into the serialized data indicating where the vector is stored. This is mostly useful when flatbuffers are generated with mutation accessors. </dd></dl> + </div> </div> <a class="anchor" id="a8704709a2e25ad04679212ee4126b1a1"></a> @@ -1065,6 +1123,38 @@ template<typename T > </div> </dl> <dl class="section return"><dt>Returns</dt><dd>Returns a typed <code>Offset</code> into the serialized data indicating where the vector is stored. </dd></dl> +</div> +</div> +<a class="anchor" id="aa905b29dce19a1795c7bce375cf29961"></a> +<div class="memitem"> +<div class="memproto"> +<table class="mlabels"> + <tr> + <td class="mlabels-left"> + <table class="memname"> + <tr> + <td class="memname">void flatbuffers::FlatBufferBuilder::DedupVtables </td> + <td>(</td> + <td class="paramtype">bool </td> + <td class="paramname"><em>dedup</em></td><td>)</td> + <td></td> + </tr> + </table> + </td> + <td class="mlabels-right"> +<span class="mlabels"><span class="mlabel">inline</span></span> </td> + </tr> +</table> +</div><div class="memdoc"> + +<p>By default vtables are deduped in order to save space. </p> +<dl class="params"><dt>Parameters</dt><dd> + <table class="params"> + <tr><td class="paramdir">[in]</td><td class="paramname">bool</td><td>dedup When set to <code>true</code>, dedup vtables. </td></tr> + </table> + </dd> +</dl> + </div> </div> <a class="anchor" id="a0c9e507b373d598b51052fab4fa34912"></a> diff --git a/classflatbuffers_1_1_flat_buffer_builder.js b/classflatbuffers_1_1_flat_buffer_builder.js index d838ccfcce3ac5752b2c80e0c4d43762778cf262..f199ec56c95634f3e6da1079bcfcdc445b847b94 100644 --- a/classflatbuffers_1_1_flat_buffer_builder.js +++ b/classflatbuffers_1_1_flat_buffer_builder.js @@ -21,7 +21,9 @@ var classflatbuffers_1_1_flat_buffer_builder = [ "CreateVectorOfSortedTables", "classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135", null ], [ "CreateVectorOfStrings", "classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6", null ], [ "CreateVectorOfStructs", "classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7", null ], + [ "CreateVectorOfStructs", "classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72", null ], [ "CreateVectorOfStructs", "classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1", null ], + [ "DedupVtables", "classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961", null ], [ "Finish", "classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912", null ], [ "FinishSizePrefixed", "classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220", null ], [ "ForceDefaults", "classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a", null ], diff --git a/flatbuffers_8h_source.html b/flatbuffers_8h_source.html index cd5ae277e8604033d7401a429937fcd35b178364..038caa7e85f86c3b9e47d4365d776607dc9ce3ef 100644 --- a/flatbuffers_8h_source.html +++ b/flatbuffers_8h_source.html @@ -654,1303 +654,1350 @@ $(document).ready(function(){initNavTree('flatbuffers_8h_source.html','');}); <div class="line"><a name="l00539"></a><span class="lineno"> 539</span> </div> <div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  uint8_t *make_space(<span class="keywordtype">size_t</span> len) {</div> <div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <span class="keywordflow">if</span> (len > static_cast<size_t>(cur_ - buf_)) {</div> -<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keyword">auto</span> old_size = size();</div> -<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  <span class="keyword">auto</span> largest_align = AlignOf<largest_scalar_t>();</div> -<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  reserved_ += (std::max)(len, growth_policy(reserved_));</div> -<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  <span class="comment">// Round up to avoid undefined behavior from unaligned loads and stores.</span></div> -<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  reserved_ = (reserved_ + (largest_align - 1)) & ~(largest_align - 1);</div> -<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="keyword">auto</span> new_buf = allocator_.allocate(reserved_);</div> -<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keyword">auto</span> new_cur = new_buf + reserved_ - old_size;</div> -<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  memcpy(new_cur, cur_, old_size);</div> -<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  cur_ = new_cur;</div> -<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  allocator_.deallocate(buf_);</div> -<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  buf_ = new_buf;</div> -<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  }</div> -<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  cur_ -= len;</div> -<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <span class="comment">// Beyond this, signed offsets may not have enough range:</span></div> -<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  <span class="comment">// (FlatBuffers > 2GB not supported).</span></div> -<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  assert(size() < FLATBUFFERS_MAX_BUFFER_SIZE);</div> +<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  reallocate(len);</div> +<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  }</div> +<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  cur_ -= len;</div> +<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  <span class="comment">// Beyond this, signed offsets may not have enough range:</span></div> +<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="comment">// (FlatBuffers > 2GB not supported).</span></div> +<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  assert(size() < FLATBUFFERS_MAX_BUFFER_SIZE);</div> +<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keywordflow">return</span> cur_;</div> +<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  }</div> +<div class="line"><a name="l00550"></a><span class="lineno"> 550</span> </div> +<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  uoffset_t size()<span class="keyword"> const </span>{</div> +<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  assert(cur_ != <span class="keyword">nullptr</span> && buf_ != <span class="keyword">nullptr</span>);</div> +<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>uoffset_t<span class="keyword">></span>(reserved_ - (cur_ - buf_));</div> +<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  }</div> +<div class="line"><a name="l00555"></a><span class="lineno"> 555</span> </div> +<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  uint8_t *data()<span class="keyword"> const </span>{</div> +<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  assert(cur_ != <span class="keyword">nullptr</span>);</div> <div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <span class="keywordflow">return</span> cur_;</div> <div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  }</div> <div class="line"><a name="l00560"></a><span class="lineno"> 560</span> </div> -<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  uoffset_t size()<span class="keyword"> const </span>{</div> -<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  assert(cur_ != <span class="keyword">nullptr</span> && buf_ != <span class="keyword">nullptr</span>);</div> -<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>uoffset_t<span class="keyword">></span>(reserved_ - (cur_ - buf_));</div> -<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  }</div> -<div class="line"><a name="l00565"></a><span class="lineno"> 565</span> </div> -<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  uint8_t *data()<span class="keyword"> const </span>{</div> -<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  assert(cur_ != <span class="keyword">nullptr</span>);</div> -<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <span class="keywordflow">return</span> cur_;</div> -<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  }</div> -<div class="line"><a name="l00570"></a><span class="lineno"> 570</span> </div> -<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  uint8_t *data_at(<span class="keywordtype">size_t</span> offset)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> buf_ + reserved_ - offset; }</div> -<div class="line"><a name="l00572"></a><span class="lineno"> 572</span> </div> -<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  <span class="comment">// push() & fill() are most frequently called with small byte counts (<= 4),</span></div> -<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <span class="comment">// which is why we're using loops rather than calling memcpy/memset.</span></div> -<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <span class="keywordtype">void</span> push(<span class="keyword">const</span> uint8_t *bytes, <span class="keywordtype">size_t</span> num) {</div> -<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <span class="keyword">auto</span> dest = make_space(num);</div> -<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < num; i++) dest[i] = bytes[i];</div> -<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  }</div> -<div class="line"><a name="l00579"></a><span class="lineno"> 579</span> </div> -<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="keywordtype">void</span> fill(<span class="keywordtype">size_t</span> zero_pad_bytes) {</div> -<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  <span class="keyword">auto</span> dest = make_space(zero_pad_bytes);</div> -<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < zero_pad_bytes; i++) dest[i] = 0;</div> -<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  }</div> -<div class="line"><a name="l00584"></a><span class="lineno"> 584</span> </div> -<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <span class="keywordtype">void</span> pop(<span class="keywordtype">size_t</span> bytes_to_remove) { cur_ += bytes_to_remove; }</div> +<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  uint8_t *data_at(<span class="keywordtype">size_t</span> offset)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> buf_ + reserved_ - offset; }</div> +<div class="line"><a name="l00562"></a><span class="lineno"> 562</span> </div> +<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <span class="keywordtype">void</span> push(<span class="keyword">const</span> uint8_t *bytes, <span class="keywordtype">size_t</span> num) {</div> +<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="keyword">auto</span> dest = make_space(num);</div> +<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  memcpy(dest, bytes, num);</div> +<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  }</div> +<div class="line"><a name="l00567"></a><span class="lineno"> 567</span> </div> +<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <span class="comment">// Specialized version of push() that avoids memcpy call for small data.</span></div> +<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> push_small(T little_endian_t) {</div> +<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <span class="keyword">auto</span> dest = make_space(<span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  *<span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(dest) = little_endian_t;</div> +<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  }</div> +<div class="line"><a name="l00573"></a><span class="lineno"> 573</span> </div> +<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <span class="comment">// fill() is most frequently called with small byte counts (<= 4),</span></div> +<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <span class="comment">// which is why we're using loops rather than calling memset.</span></div> +<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <span class="keywordtype">void</span> fill(<span class="keywordtype">size_t</span> zero_pad_bytes) {</div> +<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <span class="keyword">auto</span> dest = make_space(zero_pad_bytes);</div> +<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < zero_pad_bytes; i++) dest[i] = 0;</div> +<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  }</div> +<div class="line"><a name="l00580"></a><span class="lineno"> 580</span> </div> +<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  <span class="comment">// Version for when we know the size is larger.</span></div> +<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  <span class="keywordtype">void</span> fill_big(<span class="keywordtype">size_t</span> zero_pad_bytes) {</div> +<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="keyword">auto</span> dest = make_space(zero_pad_bytes);</div> +<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  memset(dest, 0, zero_pad_bytes);</div> +<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  }</div> <div class="line"><a name="l00586"></a><span class="lineno"> 586</span> </div> -<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  <span class="comment">// You shouldn't really be copying instances of this class.</span></div> -<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  vector_downward(<span class="keyword">const</span> vector_downward &);</div> -<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  vector_downward &operator=(<span class="keyword">const</span> vector_downward &);</div> -<div class="line"><a name="l00591"></a><span class="lineno"> 591</span> </div> -<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keywordtype">size_t</span> reserved_;</div> -<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  uint8_t *buf_;</div> -<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  uint8_t *cur_; <span class="comment">// Points at location between empty (below) and used (above).</span></div> -<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="keyword">const</span> simple_allocator &allocator_;</div> -<div class="line"><a name="l00596"></a><span class="lineno"> 596</span> };</div> -<div class="line"><a name="l00597"></a><span class="lineno"> 597</span> </div> -<div class="line"><a name="l00598"></a><span class="lineno"> 598</span> <span class="comment">// Converts a Field ID to a virtual table offset.</span></div> -<div class="line"><a name="l00599"></a><span class="lineno"> 599</span> <span class="keyword">inline</span> voffset_t FieldIndexToOffset(voffset_t field_id) {</div> -<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <span class="comment">// Should correspond to what EndTable() below builds up.</span></div> -<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  <span class="keyword">const</span> <span class="keywordtype">int</span> fixed_fields = 2; <span class="comment">// Vtable size and Object Size.</span></div> -<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>voffset_t<span class="keyword">></span>((field_id + fixed_fields) * <span class="keyword">sizeof</span>(voffset_t));</div> -<div class="line"><a name="l00603"></a><span class="lineno"> 603</span> }</div> -<div class="line"><a name="l00604"></a><span class="lineno"> 604</span> </div> -<div class="line"><a name="l00605"></a><span class="lineno"> 605</span> <span class="comment">// Computes how many bytes you'd have to pad to be able to write an</span></div> -<div class="line"><a name="l00606"></a><span class="lineno"> 606</span> <span class="comment">// "scalar_size" scalar if the buffer had grown to "buf_size" (downwards in</span></div> -<div class="line"><a name="l00607"></a><span class="lineno"> 607</span> <span class="comment">// memory).</span></div> -<div class="line"><a name="l00608"></a><span class="lineno"> 608</span> <span class="keyword">inline</span> <span class="keywordtype">size_t</span> PaddingBytes(<span class="keywordtype">size_t</span> buf_size, <span class="keywordtype">size_t</span> scalar_size) {</div> -<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="keywordflow">return</span> ((~buf_size) + 1) & (scalar_size - 1);</div> -<div class="line"><a name="l00610"></a><span class="lineno"> 610</span> }</div> -<div class="line"><a name="l00611"></a><span class="lineno"> 611</span> </div> -<div class="line"><a name="l00612"></a><span class="lineno"> 612</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keyword">const</span> T* data(<span class="keyword">const</span> std::vector<T> &v) {</div> -<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <span class="keywordflow">return</span> v.empty() ? <span class="keyword">nullptr</span> : &v.front();</div> -<div class="line"><a name="l00614"></a><span class="lineno"> 614</span> }</div> -<div class="line"><a name="l00615"></a><span class="lineno"> 615</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> T* data(std::vector<T> &v) {</div> -<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <span class="keywordflow">return</span> v.empty() ? <span class="keyword">nullptr</span> : &v.front();</div> -<div class="line"><a name="l00617"></a><span class="lineno"> 617</span> }</div> -<div class="line"><a name="l00618"></a><span class="lineno"> 618</span> <span class="comment"></span></div> -<div class="line"><a name="l00619"></a><span class="lineno"> 619</span> <span class="comment">/// @endcond</span></div> -<div class="line"><a name="l00620"></a><span class="lineno"> 620</span> <span class="comment"></span><span class="comment"></span></div> -<div class="line"><a name="l00621"></a><span class="lineno"> 621</span> <span class="comment">/// @addtogroup flatbuffers_cpp_api</span></div> -<div class="line"><a name="l00622"></a><span class="lineno"> 622</span> <span class="comment">/// @{</span></div> -<div class="line"><a name="l00623"></a><span class="lineno"> 623</span> <span class="comment">/// @class FlatBufferBuilder</span></div> -<div class="line"><a name="l00624"></a><span class="lineno"> 624</span> <span class="comment">/// @brief Helper class to hold data needed in creation of a FlatBuffer.</span></div> -<div class="line"><a name="l00625"></a><span class="lineno"> 625</span> <span class="comment">/// To serialize data, you typically call one of the `Create*()` functions in</span></div> -<div class="line"><a name="l00626"></a><span class="lineno"> 626</span> <span class="comment">/// the generated code, which in turn call a sequence of `StartTable`/</span></div> -<div class="line"><a name="l00627"></a><span class="lineno"> 627</span> <span class="comment">/// `PushElement`/`AddElement`/`EndTable`, or the builtin `CreateString`/</span></div> -<div class="line"><a name="l00628"></a><span class="lineno"> 628</span> <span class="comment">/// `CreateVector` functions. Do this is depth-first order to build up a tree to</span></div> -<div class="line"><a name="l00629"></a><span class="lineno"> 629</span> <span class="comment">/// the root. `Finish()` wraps up the buffer ready for transport.</span></div> -<div class="line"><a name="l00630"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html"> 630</a></span> <span class="comment"></span><span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a><span class="comment"></span></div> -<div class="line"><a name="l00631"></a><span class="lineno"> 631</span> <span class="comment">/// @cond FLATBUFFERS_INTERNAL</span></div> -<div class="line"><a name="l00632"></a><span class="lineno"> 632</span> <span class="comment"></span>FLATBUFFERS_FINAL_CLASS<span class="comment"></span></div> -<div class="line"><a name="l00633"></a><span class="lineno"> 633</span> <span class="comment">/// @endcond</span></div> -<div class="line"><a name="l00634"></a><span class="lineno"> 634</span> <span class="comment"></span>{</div> -<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keyword">public</span>:<span class="comment"></span></div> -<div class="line"><a name="l00636"></a><span class="lineno"> 636</span> <span class="comment"> /// @brief Default constructor for FlatBufferBuilder.</span></div> -<div class="line"><a name="l00637"></a><span class="lineno"> 637</span> <span class="comment"> /// @param[in] initial_size The initial size of the buffer, in bytes. Defaults</span></div> -<div class="line"><a name="l00638"></a><span class="lineno"> 638</span> <span class="comment"> /// to`1024`.</span></div> -<div class="line"><a name="l00639"></a><span class="lineno"> 639</span> <span class="comment"> /// @param[in] allocator A pointer to the `simple_allocator` that should be</span></div> -<div class="line"><a name="l00640"></a><span class="lineno"> 640</span> <span class="comment"> /// used. Defaults to `nullptr`, which means the `default_allocator` will be</span></div> -<div class="line"><a name="l00641"></a><span class="lineno"> 641</span> <span class="comment"> /// be used.</span></div> -<div class="line"><a name="l00642"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac72b54a75e0c329e0ce0b8fab758e256"> 642</a></span> <span class="comment"></span> <span class="keyword">explicit</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac72b54a75e0c329e0ce0b8fab758e256">FlatBufferBuilder</a>(uoffset_t initial_size = 1024,</div> -<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <span class="keyword">const</span> simple_allocator *allocator = <span class="keyword">nullptr</span>)</div> -<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  : buf_(initial_size, allocator ? *allocator : default_allocator),</div> -<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  nested(false), finished(false), minalign_(1), force_defaults_(false),</div> -<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  string_pool(nullptr) {</div> -<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  offsetbuf_.reserve(16); <span class="comment">// Avoid first few reallocs.</span></div> -<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  vtables_.reserve(16);</div> -<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  EndianCheck();</div> -<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  }</div> -<div class="line"><a name="l00651"></a><span class="lineno"> 651</span> </div> -<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  ~<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a>() {</div> -<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  <span class="keywordflow">if</span> (string_pool) <span class="keyword">delete</span> string_pool;</div> -<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  }</div> -<div class="line"><a name="l00655"></a><span class="lineno"> 655</span> <span class="comment"></span></div> -<div class="line"><a name="l00656"></a><span class="lineno"> 656</span> <span class="comment"> /// @brief Reset all the state in this FlatBufferBuilder so it can be reused</span></div> -<div class="line"><a name="l00657"></a><span class="lineno"> 657</span> <span class="comment"> /// to construct another buffer.</span></div> -<div class="line"><a name="l00658"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412"> 658</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412">Clear</a>() {</div> -<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  buf_.clear();</div> -<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  offsetbuf_.clear();</div> -<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  nested = <span class="keyword">false</span>;</div> -<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  finished = <span class="keyword">false</span>;</div> -<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  vtables_.clear();</div> -<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  minalign_ = 1;</div> -<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  <span class="keywordflow">if</span> (string_pool) string_pool->clear();</div> +<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="keywordtype">void</span> pop(<span class="keywordtype">size_t</span> bytes_to_remove) { cur_ += bytes_to_remove; }</div> +<div class="line"><a name="l00588"></a><span class="lineno"> 588</span> </div> +<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="comment">// You shouldn't really be copying instances of this class.</span></div> +<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  vector_downward(<span class="keyword">const</span> vector_downward &);</div> +<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  vector_downward &operator=(<span class="keyword">const</span> vector_downward &);</div> +<div class="line"><a name="l00593"></a><span class="lineno"> 593</span> </div> +<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <span class="keywordtype">size_t</span> reserved_;</div> +<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  uint8_t *buf_;</div> +<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  uint8_t *cur_; <span class="comment">// Points at location between empty (below) and used (above).</span></div> +<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <span class="keyword">const</span> simple_allocator &allocator_;</div> +<div class="line"><a name="l00598"></a><span class="lineno"> 598</span> </div> +<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordtype">void</span> reallocate(<span class="keywordtype">size_t</span> len) {</div> +<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <span class="keyword">auto</span> old_size = size();</div> +<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  <span class="keyword">auto</span> largest_align = AlignOf<largest_scalar_t>();</div> +<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  reserved_ += (std::max)(len, growth_policy(reserved_));</div> +<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  <span class="comment">// Round up to avoid undefined behavior from unaligned loads and stores.</span></div> +<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  reserved_ = (reserved_ + (largest_align - 1)) & ~(largest_align - 1);</div> +<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <span class="keyword">auto</span> new_buf = allocator_.allocate(reserved_);</div> +<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="keyword">auto</span> new_cur = new_buf + reserved_ - old_size;</div> +<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  memcpy(new_cur, cur_, old_size);</div> +<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  cur_ = new_cur;</div> +<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  allocator_.deallocate(buf_);</div> +<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  buf_ = new_buf;</div> +<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  }</div> +<div class="line"><a name="l00612"></a><span class="lineno"> 612</span> };</div> +<div class="line"><a name="l00613"></a><span class="lineno"> 613</span> </div> +<div class="line"><a name="l00614"></a><span class="lineno"> 614</span> <span class="comment">// Converts a Field ID to a virtual table offset.</span></div> +<div class="line"><a name="l00615"></a><span class="lineno"> 615</span> <span class="keyword">inline</span> voffset_t FieldIndexToOffset(voffset_t field_id) {</div> +<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <span class="comment">// Should correspond to what EndTable() below builds up.</span></div> +<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  <span class="keyword">const</span> <span class="keywordtype">int</span> fixed_fields = 2; <span class="comment">// Vtable size and Object Size.</span></div> +<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>voffset_t<span class="keyword">></span>((field_id + fixed_fields) * <span class="keyword">sizeof</span>(voffset_t));</div> +<div class="line"><a name="l00619"></a><span class="lineno"> 619</span> }</div> +<div class="line"><a name="l00620"></a><span class="lineno"> 620</span> </div> +<div class="line"><a name="l00621"></a><span class="lineno"> 621</span> <span class="comment">// Computes how many bytes you'd have to pad to be able to write an</span></div> +<div class="line"><a name="l00622"></a><span class="lineno"> 622</span> <span class="comment">// "scalar_size" scalar if the buffer had grown to "buf_size" (downwards in</span></div> +<div class="line"><a name="l00623"></a><span class="lineno"> 623</span> <span class="comment">// memory).</span></div> +<div class="line"><a name="l00624"></a><span class="lineno"> 624</span> <span class="keyword">inline</span> <span class="keywordtype">size_t</span> PaddingBytes(<span class="keywordtype">size_t</span> buf_size, <span class="keywordtype">size_t</span> scalar_size) {</div> +<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="keywordflow">return</span> ((~buf_size) + 1) & (scalar_size - 1);</div> +<div class="line"><a name="l00626"></a><span class="lineno"> 626</span> }</div> +<div class="line"><a name="l00627"></a><span class="lineno"> 627</span> </div> +<div class="line"><a name="l00628"></a><span class="lineno"> 628</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> <span class="keyword">const</span> T* data(<span class="keyword">const</span> std::vector<T> &v) {</div> +<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <span class="keywordflow">return</span> v.empty() ? <span class="keyword">nullptr</span> : &v.front();</div> +<div class="line"><a name="l00630"></a><span class="lineno"> 630</span> }</div> +<div class="line"><a name="l00631"></a><span class="lineno"> 631</span> <span class="keyword">template</span> <<span class="keyword">typename</span> T> T* data(std::vector<T> &v) {</div> +<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  <span class="keywordflow">return</span> v.empty() ? <span class="keyword">nullptr</span> : &v.front();</div> +<div class="line"><a name="l00633"></a><span class="lineno"> 633</span> }</div> +<div class="line"><a name="l00634"></a><span class="lineno"> 634</span> <span class="comment"></span></div> +<div class="line"><a name="l00635"></a><span class="lineno"> 635</span> <span class="comment">/// @endcond</span></div> +<div class="line"><a name="l00636"></a><span class="lineno"> 636</span> <span class="comment"></span><span class="comment"></span></div> +<div class="line"><a name="l00637"></a><span class="lineno"> 637</span> <span class="comment">/// @addtogroup flatbuffers_cpp_api</span></div> +<div class="line"><a name="l00638"></a><span class="lineno"> 638</span> <span class="comment">/// @{</span></div> +<div class="line"><a name="l00639"></a><span class="lineno"> 639</span> <span class="comment">/// @class FlatBufferBuilder</span></div> +<div class="line"><a name="l00640"></a><span class="lineno"> 640</span> <span class="comment">/// @brief Helper class to hold data needed in creation of a FlatBuffer.</span></div> +<div class="line"><a name="l00641"></a><span class="lineno"> 641</span> <span class="comment">/// To serialize data, you typically call one of the `Create*()` functions in</span></div> +<div class="line"><a name="l00642"></a><span class="lineno"> 642</span> <span class="comment">/// the generated code, which in turn call a sequence of `StartTable`/</span></div> +<div class="line"><a name="l00643"></a><span class="lineno"> 643</span> <span class="comment">/// `PushElement`/`AddElement`/`EndTable`, or the builtin `CreateString`/</span></div> +<div class="line"><a name="l00644"></a><span class="lineno"> 644</span> <span class="comment">/// `CreateVector` functions. Do this is depth-first order to build up a tree to</span></div> +<div class="line"><a name="l00645"></a><span class="lineno"> 645</span> <span class="comment">/// the root. `Finish()` wraps up the buffer ready for transport.</span></div> +<div class="line"><a name="l00646"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html"> 646</a></span> <span class="comment"></span><span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a><span class="comment"></span></div> +<div class="line"><a name="l00647"></a><span class="lineno"> 647</span> <span class="comment">/// @cond FLATBUFFERS_INTERNAL</span></div> +<div class="line"><a name="l00648"></a><span class="lineno"> 648</span> <span class="comment"></span>FLATBUFFERS_FINAL_CLASS<span class="comment"></span></div> +<div class="line"><a name="l00649"></a><span class="lineno"> 649</span> <span class="comment">/// @endcond</span></div> +<div class="line"><a name="l00650"></a><span class="lineno"> 650</span> <span class="comment"></span>{</div> +<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <span class="keyword">public</span>:<span class="comment"></span></div> +<div class="line"><a name="l00652"></a><span class="lineno"> 652</span> <span class="comment"> /// @brief Default constructor for FlatBufferBuilder.</span></div> +<div class="line"><a name="l00653"></a><span class="lineno"> 653</span> <span class="comment"> /// @param[in] initial_size The initial size of the buffer, in bytes. Defaults</span></div> +<div class="line"><a name="l00654"></a><span class="lineno"> 654</span> <span class="comment"> /// to`1024`.</span></div> +<div class="line"><a name="l00655"></a><span class="lineno"> 655</span> <span class="comment"> /// @param[in] allocator A pointer to the `simple_allocator` that should be</span></div> +<div class="line"><a name="l00656"></a><span class="lineno"> 656</span> <span class="comment"> /// used. Defaults to `nullptr`, which means the `default_allocator` will be</span></div> +<div class="line"><a name="l00657"></a><span class="lineno"> 657</span> <span class="comment"> /// be used.</span></div> +<div class="line"><a name="l00658"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac72b54a75e0c329e0ce0b8fab758e256"> 658</a></span> <span class="comment"></span> <span class="keyword">explicit</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac72b54a75e0c329e0ce0b8fab758e256">FlatBufferBuilder</a>(uoffset_t initial_size = 1024,</div> +<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <span class="keyword">const</span> simple_allocator *allocator = <span class="keyword">nullptr</span>)</div> +<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  : buf_(initial_size, allocator ? *allocator : default_allocator),</div> +<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  nested(false), finished(false), minalign_(1), force_defaults_(false),</div> +<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  dedup_vtables_(true), string_pool(nullptr) {</div> +<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  offsetbuf_.reserve(16); <span class="comment">// Avoid first few reallocs.</span></div> +<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  vtables_.reserve(16);</div> +<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  EndianCheck();</div> <div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  }</div> -<div class="line"><a name="l00667"></a><span class="lineno"> 667</span> <span class="comment"></span></div> -<div class="line"><a name="l00668"></a><span class="lineno"> 668</span> <span class="comment"> /// @brief The current size of the serialized buffer, counting from the end.</span></div> -<div class="line"><a name="l00669"></a><span class="lineno"> 669</span> <span class="comment"> /// @return Returns an `uoffset_t` with the current size of the buffer.</span></div> -<div class="line"><a name="l00670"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63"> 670</a></span> <span class="comment"></span> uoffset_t <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> buf_.size(); }</div> +<div class="line"><a name="l00667"></a><span class="lineno"> 667</span> </div> +<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  ~<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a>() {</div> +<div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <span class="keywordflow">if</span> (string_pool) <span class="keyword">delete</span> string_pool;</div> +<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  }</div> <div class="line"><a name="l00671"></a><span class="lineno"> 671</span> <span class="comment"></span></div> -<div class="line"><a name="l00672"></a><span class="lineno"> 672</span> <span class="comment"> /// @brief Get the serialized buffer (after you call `Finish()`).</span></div> -<div class="line"><a name="l00673"></a><span class="lineno"> 673</span> <span class="comment"> /// @return Returns an `uint8_t` pointer to the FlatBuffer data inside the</span></div> -<div class="line"><a name="l00674"></a><span class="lineno"> 674</span> <span class="comment"> /// buffer.</span></div> -<div class="line"><a name="l00675"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a8dc35f792179df4ca850492c1796d8b8"> 675</a></span> <span class="comment"></span> uint8_t *<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a8dc35f792179df4ca850492c1796d8b8">GetBufferPointer</a>()<span class="keyword"> const </span>{</div> -<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  Finished();</div> -<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  <span class="keywordflow">return</span> buf_.data();</div> -<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  }</div> -<div class="line"><a name="l00679"></a><span class="lineno"> 679</span> <span class="comment"></span></div> -<div class="line"><a name="l00680"></a><span class="lineno"> 680</span> <span class="comment"> /// @brief Get a pointer to an unfinished buffer.</span></div> -<div class="line"><a name="l00681"></a><span class="lineno"> 681</span> <span class="comment"> /// @return Returns a `uint8_t` pointer to the unfinished buffer.</span></div> -<div class="line"><a name="l00682"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a3f4252e9bc005ba6c700469544fdccc9"> 682</a></span> <span class="comment"></span> uint8_t *<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a3f4252e9bc005ba6c700469544fdccc9">GetCurrentBufferPointer</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> buf_.data(); }</div> -<div class="line"><a name="l00683"></a><span class="lineno"> 683</span> </div> -<div class="line"><a name="l00684"></a><span class="lineno"> 684</span> <span class="preprocessor"> #ifndef FLATBUFFERS_CPP98_STL</span></div> -<div class="line"><a name="l00685"></a><span class="lineno"> 685</span> <span class="comment"> /// @brief Get the released pointer to the serialized buffer.</span></div> -<div class="line"><a name="l00686"></a><span class="lineno"> 686</span> <span class="comment"></span><span class="comment"> /// @warning Do NOT attempt to use this FlatBufferBuilder afterwards!</span></div> -<div class="line"><a name="l00687"></a><span class="lineno"> 687</span> <span class="comment"></span><span class="comment"> /// @return The `unique_ptr` returned has a special allocator that knows how</span></div> -<div class="line"><a name="l00688"></a><span class="lineno"> 688</span> <span class="comment"></span><span class="comment"> /// to deallocate this pointer (since it points to the middle of an</span></div> -<div class="line"><a name="l00689"></a><span class="lineno"> 689</span> <span class="comment"></span><span class="comment"> /// allocation). Thus, do not mix this pointer with other `unique_ptr`'s, or</span></div> -<div class="line"><a name="l00690"></a><span class="lineno"> 690</span> <span class="comment"></span><span class="comment"> /// call `release()`/`reset()` on it.</span></div> -<div class="line"><a name="l00691"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a21c7f933d7ff1212f2090763ef9f0c44"> 691</a></span> <span class="comment"></span> unique_ptr_t <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a21c7f933d7ff1212f2090763ef9f0c44">ReleaseBufferPointer</a>() {</div> +<div class="line"><a name="l00672"></a><span class="lineno"> 672</span> <span class="comment"> /// @brief Reset all the state in this FlatBufferBuilder so it can be reused</span></div> +<div class="line"><a name="l00673"></a><span class="lineno"> 673</span> <span class="comment"> /// to construct another buffer.</span></div> +<div class="line"><a name="l00674"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412"> 674</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412">Clear</a>() {</div> +<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  buf_.clear();</div> +<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  offsetbuf_.clear();</div> +<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  nested = <span class="keyword">false</span>;</div> +<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  finished = <span class="keyword">false</span>;</div> +<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  vtables_.clear();</div> +<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  minalign_ = 1;</div> +<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  <span class="keywordflow">if</span> (string_pool) string_pool->clear();</div> +<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  }</div> +<div class="line"><a name="l00683"></a><span class="lineno"> 683</span> <span class="comment"></span></div> +<div class="line"><a name="l00684"></a><span class="lineno"> 684</span> <span class="comment"> /// @brief The current size of the serialized buffer, counting from the end.</span></div> +<div class="line"><a name="l00685"></a><span class="lineno"> 685</span> <span class="comment"> /// @return Returns an `uoffset_t` with the current size of the buffer.</span></div> +<div class="line"><a name="l00686"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63"> 686</a></span> <span class="comment"></span> uoffset_t <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> buf_.size(); }</div> +<div class="line"><a name="l00687"></a><span class="lineno"> 687</span> <span class="comment"></span></div> +<div class="line"><a name="l00688"></a><span class="lineno"> 688</span> <span class="comment"> /// @brief Get the serialized buffer (after you call `Finish()`).</span></div> +<div class="line"><a name="l00689"></a><span class="lineno"> 689</span> <span class="comment"> /// @return Returns an `uint8_t` pointer to the FlatBuffer data inside the</span></div> +<div class="line"><a name="l00690"></a><span class="lineno"> 690</span> <span class="comment"> /// buffer.</span></div> +<div class="line"><a name="l00691"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a8dc35f792179df4ca850492c1796d8b8"> 691</a></span> <span class="comment"></span> uint8_t *<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a8dc35f792179df4ca850492c1796d8b8">GetBufferPointer</a>()<span class="keyword"> const </span>{</div> <div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  Finished();</div> -<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  <span class="keywordflow">return</span> buf_.release();</div> +<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  <span class="keywordflow">return</span> buf_.data();</div> <div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  }</div> -<div class="line"><a name="l00695"></a><span class="lineno"> 695</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l00696"></a><span class="lineno"> 696</span> <span class="comment"></span></div> -<div class="line"><a name="l00697"></a><span class="lineno"> 697</span> <span class="comment"> /// @brief get the minimum alignment this buffer needs to be accessed</span></div> -<div class="line"><a name="l00698"></a><span class="lineno"> 698</span> <span class="comment"> /// properly. This is only known once all elements have been written (after</span></div> -<div class="line"><a name="l00699"></a><span class="lineno"> 699</span> <span class="comment"> /// you call Finish()). You can use this information if you need to embed</span></div> -<div class="line"><a name="l00700"></a><span class="lineno"> 700</span> <span class="comment"> /// a FlatBuffer in some other buffer, such that you can later read it</span></div> -<div class="line"><a name="l00701"></a><span class="lineno"> 701</span> <span class="comment"> /// without first having to copy it into its own buffer.</span></div> -<div class="line"><a name="l00702"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b"> 702</a></span> <span class="comment"></span> <span class="keywordtype">size_t</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b">GetBufferMinAlignment</a>() {</div> -<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  Finished();</div> -<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="keywordflow">return</span> minalign_;</div> -<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  }</div> -<div class="line"><a name="l00706"></a><span class="lineno"> 706</span> <span class="comment"></span></div> -<div class="line"><a name="l00707"></a><span class="lineno"> 707</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div> -<div class="line"><a name="l00708"></a><span class="lineno"> 708</span> <span class="comment"></span> <span class="keywordtype">void</span> Finished()<span class="keyword"> const </span>{</div> -<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="comment">// If you get this assert, you're attempting to get access a buffer</span></div> -<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <span class="comment">// which hasn't been finished yet. Be sure to call</span></div> -<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  <span class="comment">// FlatBufferBuilder::Finish with your root table.</span></div> -<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <span class="comment">// If you really need to access an unfinished buffer, call</span></div> -<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="comment">// GetCurrentBufferPointer instead.</span></div> -<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  assert(finished);</div> -<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  }<span class="comment"></span></div> -<div class="line"><a name="l00716"></a><span class="lineno"> 716</span> <span class="comment"> /// @endcond</span></div> -<div class="line"><a name="l00717"></a><span class="lineno"> 717</span> <span class="comment"></span><span class="comment"></span></div> -<div class="line"><a name="l00718"></a><span class="lineno"> 718</span> <span class="comment"> /// @brief In order to save space, fields that are set to their default value</span></div> -<div class="line"><a name="l00719"></a><span class="lineno"> 719</span> <span class="comment"> /// don't get serialized into the buffer.</span></div> -<div class="line"><a name="l00720"></a><span class="lineno"> 720</span> <span class="comment"> /// @param[in] bool fd When set to `true`, always serializes default values.</span></div> -<div class="line"><a name="l00721"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a"> 721</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a">ForceDefaults</a>(<span class="keywordtype">bool</span> fd) { force_defaults_ = fd; }</div> +<div class="line"><a name="l00695"></a><span class="lineno"> 695</span> <span class="comment"></span></div> +<div class="line"><a name="l00696"></a><span class="lineno"> 696</span> <span class="comment"> /// @brief Get a pointer to an unfinished buffer.</span></div> +<div class="line"><a name="l00697"></a><span class="lineno"> 697</span> <span class="comment"> /// @return Returns a `uint8_t` pointer to the unfinished buffer.</span></div> +<div class="line"><a name="l00698"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a3f4252e9bc005ba6c700469544fdccc9"> 698</a></span> <span class="comment"></span> uint8_t *<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a3f4252e9bc005ba6c700469544fdccc9">GetCurrentBufferPointer</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> buf_.data(); }</div> +<div class="line"><a name="l00699"></a><span class="lineno"> 699</span> </div> +<div class="line"><a name="l00700"></a><span class="lineno"> 700</span> <span class="preprocessor"> #ifndef FLATBUFFERS_CPP98_STL</span></div> +<div class="line"><a name="l00701"></a><span class="lineno"> 701</span> <span class="comment"> /// @brief Get the released pointer to the serialized buffer.</span></div> +<div class="line"><a name="l00702"></a><span class="lineno"> 702</span> <span class="comment"></span><span class="comment"> /// @warning Do NOT attempt to use this FlatBufferBuilder afterwards!</span></div> +<div class="line"><a name="l00703"></a><span class="lineno"> 703</span> <span class="comment"></span><span class="comment"> /// @return The `unique_ptr` returned has a special allocator that knows how</span></div> +<div class="line"><a name="l00704"></a><span class="lineno"> 704</span> <span class="comment"></span><span class="comment"> /// to deallocate this pointer (since it points to the middle of an</span></div> +<div class="line"><a name="l00705"></a><span class="lineno"> 705</span> <span class="comment"></span><span class="comment"> /// allocation). Thus, do not mix this pointer with other `unique_ptr`'s, or</span></div> +<div class="line"><a name="l00706"></a><span class="lineno"> 706</span> <span class="comment"></span><span class="comment"> /// call `release()`/`reset()` on it.</span></div> +<div class="line"><a name="l00707"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a21c7f933d7ff1212f2090763ef9f0c44"> 707</a></span> <span class="comment"></span> unique_ptr_t <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a21c7f933d7ff1212f2090763ef9f0c44">ReleaseBufferPointer</a>() {</div> +<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  Finished();</div> +<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="keywordflow">return</span> buf_.release();</div> +<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  }</div> +<div class="line"><a name="l00711"></a><span class="lineno"> 711</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l00712"></a><span class="lineno"> 712</span> <span class="comment"></span></div> +<div class="line"><a name="l00713"></a><span class="lineno"> 713</span> <span class="comment"> /// @brief get the minimum alignment this buffer needs to be accessed</span></div> +<div class="line"><a name="l00714"></a><span class="lineno"> 714</span> <span class="comment"> /// properly. This is only known once all elements have been written (after</span></div> +<div class="line"><a name="l00715"></a><span class="lineno"> 715</span> <span class="comment"> /// you call Finish()). You can use this information if you need to embed</span></div> +<div class="line"><a name="l00716"></a><span class="lineno"> 716</span> <span class="comment"> /// a FlatBuffer in some other buffer, such that you can later read it</span></div> +<div class="line"><a name="l00717"></a><span class="lineno"> 717</span> <span class="comment"> /// without first having to copy it into its own buffer.</span></div> +<div class="line"><a name="l00718"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b"> 718</a></span> <span class="comment"></span> <span class="keywordtype">size_t</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b">GetBufferMinAlignment</a>() {</div> +<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  Finished();</div> +<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <span class="keywordflow">return</span> minalign_;</div> +<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  }</div> <div class="line"><a name="l00722"></a><span class="lineno"> 722</span> <span class="comment"></span></div> <div class="line"><a name="l00723"></a><span class="lineno"> 723</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div> -<div class="line"><a name="l00724"></a><span class="lineno"> 724</span> <span class="comment"></span> <span class="keywordtype">void</span> Pad(<span class="keywordtype">size_t</span> num_bytes) { buf_.fill(num_bytes); }</div> -<div class="line"><a name="l00725"></a><span class="lineno"> 725</span> </div> -<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <span class="keywordtype">void</span> Align(<span class="keywordtype">size_t</span> elem_size) {</div> -<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="keywordflow">if</span> (elem_size > minalign_) minalign_ = elem_size;</div> -<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  buf_.fill(PaddingBytes(buf_.size(), elem_size));</div> -<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  }</div> -<div class="line"><a name="l00730"></a><span class="lineno"> 730</span> </div> -<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  <span class="keywordtype">void</span> PushFlatBuffer(<span class="keyword">const</span> uint8_t *bytes, <span class="keywordtype">size_t</span> size) {</div> -<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  PushBytes(bytes, size);</div> -<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  finished = <span class="keyword">true</span>;</div> -<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  }</div> -<div class="line"><a name="l00735"></a><span class="lineno"> 735</span> </div> -<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  <span class="keywordtype">void</span> PushBytes(<span class="keyword">const</span> uint8_t *bytes, <span class="keywordtype">size_t</span> size) {</div> -<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  buf_.push(bytes, size);</div> -<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  }</div> -<div class="line"><a name="l00739"></a><span class="lineno"> 739</span> </div> -<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  <span class="keywordtype">void</span> PopBytes(<span class="keywordtype">size_t</span> amount) { buf_.pop(amount); }</div> -<div class="line"><a name="l00741"></a><span class="lineno"> 741</span> </div> -<div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AssertScalarT() {</div> -<div class="line"><a name="l00743"></a><span class="lineno"> 743</span> <span class="preprocessor"> #ifndef FLATBUFFERS_CPP98_STL</span></div> -<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  <span class="comment">// The code assumes power of 2 sizes and endian-swap-ability.</span></div> -<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  static_assert(std::is_scalar<T>::value</div> -<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  <span class="comment">// The Offset<T> type is essentially a scalar but fails is_scalar.</span></div> -<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  || <span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(Offset<void>),</div> -<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  <span class="stringliteral">"T must be a scalar type"</span>);</div> -<div class="line"><a name="l00749"></a><span class="lineno"> 749</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  }</div> -<div class="line"><a name="l00751"></a><span class="lineno"> 751</span> </div> -<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <span class="comment">// Write a single aligned scalar to the buffer</span></div> -<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> uoffset_t PushElement(T element) {</div> -<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  AssertScalarT<T>();</div> -<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  T litle_endian_element = EndianScalar(element);</div> -<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  Align(<span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  PushBytes(reinterpret_cast<uint8_t *>(&litle_endian_element), <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>();</div> -<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  }</div> -<div class="line"><a name="l00760"></a><span class="lineno"> 760</span> </div> -<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> uoffset_t PushElement(Offset<T> off) {</div> -<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  <span class="comment">// Special case for offsets: see ReferTo below.</span></div> -<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  <span class="keywordflow">return</span> PushElement(ReferTo(off.o));</div> -<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  }</div> -<div class="line"><a name="l00765"></a><span class="lineno"> 765</span> </div> -<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  <span class="comment">// When writing fields, we track where they are, so we can create correct</span></div> -<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="comment">// vtables later.</span></div> -<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="keywordtype">void</span> TrackField(voffset_t field, uoffset_t off) {</div> -<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  FieldLoc fl = { off, field };</div> -<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  offsetbuf_.push_back(fl);</div> -<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  }</div> -<div class="line"><a name="l00772"></a><span class="lineno"> 772</span> </div> -<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <span class="comment">// Like PushElement, but additionally tracks the field this represents.</span></div> -<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AddElement(voffset_t field, T e, T def) {</div> -<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <span class="comment">// We don't serialize values equal to the default.</span></div> -<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  <span class="keywordflow">if</span> (e == def && !force_defaults_) <span class="keywordflow">return</span>;</div> -<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  <span class="keyword">auto</span> off = PushElement(e);</div> -<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  TrackField(field, off);</div> +<div class="line"><a name="l00724"></a><span class="lineno"> 724</span> <span class="comment"></span> <span class="keywordtype">void</span> Finished()<span class="keyword"> const </span>{</div> +<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  <span class="comment">// If you get this assert, you're attempting to get access a buffer</span></div> +<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <span class="comment">// which hasn't been finished yet. Be sure to call</span></div> +<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="comment">// FlatBufferBuilder::Finish with your root table.</span></div> +<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  <span class="comment">// If you really need to access an unfinished buffer, call</span></div> +<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  <span class="comment">// GetCurrentBufferPointer instead.</span></div> +<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  assert(finished);</div> +<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  }<span class="comment"></span></div> +<div class="line"><a name="l00732"></a><span class="lineno"> 732</span> <span class="comment"> /// @endcond</span></div> +<div class="line"><a name="l00733"></a><span class="lineno"> 733</span> <span class="comment"></span><span class="comment"></span></div> +<div class="line"><a name="l00734"></a><span class="lineno"> 734</span> <span class="comment"> /// @brief In order to save space, fields that are set to their default value</span></div> +<div class="line"><a name="l00735"></a><span class="lineno"> 735</span> <span class="comment"> /// don't get serialized into the buffer.</span></div> +<div class="line"><a name="l00736"></a><span class="lineno"> 736</span> <span class="comment"> /// @param[in] bool fd When set to `true`, always serializes default values.</span></div> +<div class="line"><a name="l00737"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a"> 737</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a">ForceDefaults</a>(<span class="keywordtype">bool</span> fd) { force_defaults_ = fd; }</div> +<div class="line"><a name="l00738"></a><span class="lineno"> 738</span> <span class="comment"></span></div> +<div class="line"><a name="l00739"></a><span class="lineno"> 739</span> <span class="comment"> /// @brief By default vtables are deduped in order to save space.</span></div> +<div class="line"><a name="l00740"></a><span class="lineno"> 740</span> <span class="comment"> /// @param[in] bool dedup When set to `true`, dedup vtables.</span></div> +<div class="line"><a name="l00741"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961"> 741</a></span> <span class="comment"></span> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961">DedupVtables</a>(<span class="keywordtype">bool</span> dedup) { dedup_vtables_ = dedup; }</div> +<div class="line"><a name="l00742"></a><span class="lineno"> 742</span> <span class="comment"></span></div> +<div class="line"><a name="l00743"></a><span class="lineno"> 743</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div> +<div class="line"><a name="l00744"></a><span class="lineno"> 744</span> <span class="comment"></span> <span class="keywordtype">void</span> Pad(<span class="keywordtype">size_t</span> num_bytes) { buf_.fill(num_bytes); }</div> +<div class="line"><a name="l00745"></a><span class="lineno"> 745</span> </div> +<div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  <span class="keywordtype">void</span> Align(<span class="keywordtype">size_t</span> elem_size) {</div> +<div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="keywordflow">if</span> (elem_size > minalign_) minalign_ = elem_size;</div> +<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  buf_.fill(PaddingBytes(buf_.size(), elem_size));</div> +<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  }</div> +<div class="line"><a name="l00750"></a><span class="lineno"> 750</span> </div> +<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="keywordtype">void</span> PushFlatBuffer(<span class="keyword">const</span> uint8_t *bytes, <span class="keywordtype">size_t</span> size) {</div> +<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  PushBytes(bytes, size);</div> +<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  finished = <span class="keyword">true</span>;</div> +<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  }</div> +<div class="line"><a name="l00755"></a><span class="lineno"> 755</span> </div> +<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  <span class="keywordtype">void</span> PushBytes(<span class="keyword">const</span> uint8_t *bytes, <span class="keywordtype">size_t</span> size) {</div> +<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  buf_.push(bytes, size);</div> +<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  }</div> +<div class="line"><a name="l00759"></a><span class="lineno"> 759</span> </div> +<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  <span class="keywordtype">void</span> PopBytes(<span class="keywordtype">size_t</span> amount) { buf_.pop(amount); }</div> +<div class="line"><a name="l00761"></a><span class="lineno"> 761</span> </div> +<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AssertScalarT() {</div> +<div class="line"><a name="l00763"></a><span class="lineno"> 763</span> <span class="preprocessor"> #ifndef FLATBUFFERS_CPP98_STL</span></div> +<div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  <span class="comment">// The code assumes power of 2 sizes and endian-swap-ability.</span></div> +<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  static_assert(std::is_scalar<T>::value</div> +<div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  <span class="comment">// The Offset<T> type is essentially a scalar but fails is_scalar.</span></div> +<div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  || <span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(Offset<void>),</div> +<div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="stringliteral">"T must be a scalar type"</span>);</div> +<div class="line"><a name="l00769"></a><span class="lineno"> 769</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  }</div> +<div class="line"><a name="l00771"></a><span class="lineno"> 771</span> </div> +<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  <span class="comment">// Write a single aligned scalar to the buffer</span></div> +<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> uoffset_t PushElement(T element) {</div> +<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  AssertScalarT<T>();</div> +<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  T litle_endian_element = EndianScalar(element);</div> +<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  Align(<span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  buf_.push_small(litle_endian_element);</div> +<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>();</div> <div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  }</div> <div class="line"><a name="l00780"></a><span class="lineno"> 780</span> </div> -<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AddOffset(voffset_t field, Offset<T> off) {</div> -<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  <span class="keywordflow">if</span> (!off.o) <span class="keywordflow">return</span>; <span class="comment">// An offset of 0 means NULL, don't store.</span></div> -<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  AddElement(field, ReferTo(off.o), static_cast<uoffset_t>(0));</div> +<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> uoffset_t PushElement(Offset<T> off) {</div> +<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  <span class="comment">// Special case for offsets: see ReferTo below.</span></div> +<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  <span class="keywordflow">return</span> PushElement(ReferTo(off.o));</div> <div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  }</div> <div class="line"><a name="l00785"></a><span class="lineno"> 785</span> </div> -<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AddStruct(voffset_t field, <span class="keyword">const</span> T *structptr) {</div> -<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  <span class="keywordflow">if</span> (!structptr) <span class="keywordflow">return</span>; <span class="comment">// Default, don't store.</span></div> -<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  Align(AlignOf<T>());</div> -<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  PushBytes(reinterpret_cast<const uint8_t *>(structptr), <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  TrackField(field, <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>());</div> +<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  <span class="comment">// When writing fields, we track where they are, so we can create correct</span></div> +<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  <span class="comment">// vtables later.</span></div> +<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  <span class="keywordtype">void</span> TrackField(voffset_t field, uoffset_t off) {</div> +<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  FieldLoc fl = { off, field };</div> +<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  offsetbuf_.push_back(fl);</div> <div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  }</div> <div class="line"><a name="l00792"></a><span class="lineno"> 792</span> </div> -<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  <span class="keywordtype">void</span> AddStructOffset(voffset_t field, uoffset_t off) {</div> -<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  TrackField(field, off);</div> -<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  }</div> -<div class="line"><a name="l00796"></a><span class="lineno"> 796</span> </div> -<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  <span class="comment">// Offsets initially are relative to the end of the buffer (downwards).</span></div> -<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <span class="comment">// This function converts them to be relative to the current location</span></div> -<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  <span class="comment">// in the buffer (when stored here), pointing upwards.</span></div> -<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  uoffset_t ReferTo(uoffset_t off) {</div> -<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  <span class="comment">// Align to ensure GetSize() below is correct.</span></div> -<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  Align(<span class="keyword">sizeof</span>(uoffset_t));</div> -<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  <span class="comment">// Offset must refer to something already in buffer.</span></div> -<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  assert(off && off <= <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>());</div> -<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>() - off + <span class="keyword">static_cast<</span>uoffset_t<span class="keyword">></span>(<span class="keyword">sizeof</span>(uoffset_t));</div> -<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>  }</div> -<div class="line"><a name="l00807"></a><span class="lineno"> 807</span> </div> -<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  <span class="keywordtype">void</span> NotNested() {</div> -<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  <span class="comment">// If you hit this, you're trying to construct a Table/Vector/String</span></div> -<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  <span class="comment">// during the construction of its parent table (between the MyTableBuilder</span></div> -<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  <span class="comment">// and table.Finish().</span></div> -<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  <span class="comment">// Move the creation of these sub-objects to above the MyTableBuilder to</span></div> -<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <span class="comment">// not get this assert.</span></div> -<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  <span class="comment">// Ignoring this assert may appear to work in simple cases, but the reason</span></div> -<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  <span class="comment">// it is here is that storing objects in-line may cause vtable offsets</span></div> -<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  <span class="comment">// to not fit anymore. It also leads to vtable duplication.</span></div> -<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  assert(!nested);</div> -<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  }</div> -<div class="line"><a name="l00819"></a><span class="lineno"> 819</span> </div> -<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  <span class="comment">// From generated code (or from the parser), we call StartTable/EndTable</span></div> -<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  <span class="comment">// with a sequence of AddElement calls in between.</span></div> -<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  uoffset_t StartTable() {</div> -<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  NotNested();</div> -<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  nested = <span class="keyword">true</span>;</div> -<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>();</div> +<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  <span class="comment">// Like PushElement, but additionally tracks the field this represents.</span></div> +<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AddElement(voffset_t field, T e, T def) {</div> +<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  <span class="comment">// We don't serialize values equal to the default.</span></div> +<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  <span class="keywordflow">if</span> (e == def && !force_defaults_) <span class="keywordflow">return</span>;</div> +<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  <span class="keyword">auto</span> off = PushElement(e);</div> +<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  TrackField(field, off);</div> +<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  }</div> +<div class="line"><a name="l00800"></a><span class="lineno"> 800</span> </div> +<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AddOffset(voffset_t field, Offset<T> off) {</div> +<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  <span class="keywordflow">if</span> (!off.o) <span class="keywordflow">return</span>; <span class="comment">// An offset of 0 means NULL, don't store.</span></div> +<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  AddElement(field, ReferTo(off.o), static_cast<uoffset_t>(0));</div> +<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  }</div> +<div class="line"><a name="l00805"></a><span class="lineno"> 805</span> </div> +<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> AddStruct(voffset_t field, <span class="keyword">const</span> T *structptr) {</div> +<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  <span class="keywordflow">if</span> (!structptr) <span class="keywordflow">return</span>; <span class="comment">// Default, don't store.</span></div> +<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  Align(AlignOf<T>());</div> +<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  buf_.push_small(*structptr);</div> +<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  TrackField(field, <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>());</div> +<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  }</div> +<div class="line"><a name="l00812"></a><span class="lineno"> 812</span> </div> +<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <span class="keywordtype">void</span> AddStructOffset(voffset_t field, uoffset_t off) {</div> +<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  TrackField(field, off);</div> +<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  }</div> +<div class="line"><a name="l00816"></a><span class="lineno"> 816</span> </div> +<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  <span class="comment">// Offsets initially are relative to the end of the buffer (downwards).</span></div> +<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  <span class="comment">// This function converts them to be relative to the current location</span></div> +<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  <span class="comment">// in the buffer (when stored here), pointing upwards.</span></div> +<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  uoffset_t ReferTo(uoffset_t off) {</div> +<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  <span class="comment">// Align to ensure GetSize() below is correct.</span></div> +<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  Align(<span class="keyword">sizeof</span>(uoffset_t));</div> +<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  <span class="comment">// Offset must refer to something already in buffer.</span></div> +<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  assert(off && off <= <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>());</div> +<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>() - off + <span class="keyword">static_cast<</span>uoffset_t<span class="keyword">></span>(<span class="keyword">sizeof</span>(uoffset_t));</div> <div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  }</div> <div class="line"><a name="l00827"></a><span class="lineno"> 827</span> </div> -<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  <span class="comment">// This finishes one serialized object by generating the vtable if it's a</span></div> -<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  <span class="comment">// table, comparing it against existing vtables, and writing the</span></div> -<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  <span class="comment">// resulting vtable offset.</span></div> -<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  uoffset_t EndTable(uoffset_t start, voffset_t numfields) {</div> -<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  <span class="comment">// If you get this assert, a corresponding StartTable wasn't called.</span></div> -<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  assert(nested);</div> -<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  <span class="comment">// Write the vtable offset, which is the start of any Table.</span></div> -<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  <span class="comment">// We fill it's value later.</span></div> -<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  <span class="keyword">auto</span> vtableoffsetloc = PushElement<soffset_t>(0);</div> -<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  <span class="comment">// Write a vtable, which consists entirely of voffset_t elements.</span></div> -<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  <span class="comment">// It starts with the number of offsets, followed by a type id, followed</span></div> -<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  <span class="comment">// by the offsets themselves. In reverse:</span></div> -<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  buf_.fill(numfields * <span class="keyword">sizeof</span>(voffset_t));</div> -<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  <span class="keyword">auto</span> table_object_size = vtableoffsetloc - start;</div> -<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  assert(table_object_size < 0x10000); <span class="comment">// Vtable use 16bit offsets.</span></div> -<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  PushElement<voffset_t>(<span class="keyword">static_cast<</span>voffset_t<span class="keyword">></span>(table_object_size));</div> -<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  PushElement<voffset_t>(FieldIndexToOffset(numfields));</div> -<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  <span class="comment">// Write the offsets into the table</span></div> -<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> field_location = offsetbuf_.begin();</div> -<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  field_location != offsetbuf_.end();</div> -<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  ++field_location) {</div> -<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  <span class="keyword">auto</span> pos = <span class="keyword">static_cast<</span>voffset_t<span class="keyword">></span>(vtableoffsetloc - field_location->off);</div> -<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  <span class="comment">// If this asserts, it means you've set a field twice.</span></div> -<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  assert(!ReadScalar<voffset_t>(buf_.data() + field_location->id));</div> -<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  WriteScalar<voffset_t>(buf_.data() + field_location->id, pos);</div> -<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  }</div> -<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  offsetbuf_.clear();</div> -<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="keyword">auto</span> vt1 = <span class="keyword">reinterpret_cast<</span>voffset_t *<span class="keyword">></span>(buf_.data());</div> -<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="keyword">auto</span> vt1_size = ReadScalar<voffset_t>(vt1);</div> -<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="keyword">auto</span> vt_use = <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>();</div> -<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  <span class="comment">// See if we already have generated a vtable with this exact same</span></div> -<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="comment">// layout before. If so, make it point to the old one, remove this one.</span></div> -<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = vtables_.begin(); it != vtables_.end(); ++it) {</div> -<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <span class="keyword">auto</span> vt2 = <span class="keyword">reinterpret_cast<</span>voffset_t *<span class="keyword">></span>(buf_.data_at(*it));</div> -<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  <span class="keyword">auto</span> vt2_size = *vt2;</div> -<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="keywordflow">if</span> (vt1_size != vt2_size || memcmp(vt2, vt1, vt1_size)) <span class="keywordflow">continue</span>;</div> -<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  vt_use = *it;</div> -<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  buf_.pop(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>() - vtableoffsetloc);</div> -<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="keywordflow">break</span>;</div> -<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  }</div> -<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  <span class="comment">// If this is a new vtable, remember it.</span></div> -<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  <span class="keywordflow">if</span> (vt_use == <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>()) {</div> -<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  vtables_.push_back(vt_use);</div> -<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  }</div> -<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  <span class="comment">// Fill the vtable offset we created above.</span></div> -<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="comment">// The offset points from the beginning of the object to where the</span></div> -<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  <span class="comment">// vtable is stored.</span></div> -<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <span class="comment">// Offsets default direction is downward in memory for future format</span></div> -<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="comment">// flexibility (storing all vtables at the start of the file).</span></div> -<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  WriteScalar(buf_.data_at(vtableoffsetloc),</div> -<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <span class="keyword">static_cast<</span>soffset_t<span class="keyword">></span>(vt_use) -</div> -<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  static_cast<soffset_t>(vtableoffsetloc));</div> -<div class="line"><a name="l00880"></a><span class="lineno"> 880</span> </div> -<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  nested = <span class="keyword">false</span>;</div> -<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  <span class="keywordflow">return</span> vtableoffsetloc;</div> -<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  }</div> -<div class="line"><a name="l00884"></a><span class="lineno"> 884</span> </div> -<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  <span class="comment">// This checks a required field has been set in a given table that has</span></div> -<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  <span class="comment">// just been constructed.</span></div> -<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> Required(Offset<T> table, voffset_t field) {</div> -<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  <span class="keyword">auto</span> table_ptr = buf_.data_at(table.o);</div> -<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  <span class="keyword">auto</span> vtable_ptr = table_ptr - ReadScalar<soffset_t>(table_ptr);</div> -<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <span class="keywordtype">bool</span> ok = ReadScalar<voffset_t>(vtable_ptr + field) != 0;</div> -<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  <span class="comment">// If this fails, the caller will show what field needs to be set.</span></div> -<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  assert(ok);</div> -<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  (void)ok;</div> -<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  }</div> -<div class="line"><a name="l00895"></a><span class="lineno"> 895</span> </div> -<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  uoffset_t StartStruct(<span class="keywordtype">size_t</span> alignment) {</div> -<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  Align(alignment);</div> -<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>();</div> -<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  }</div> -<div class="line"><a name="l00900"></a><span class="lineno"> 900</span> </div> -<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  uoffset_t EndStruct() { <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>(); }</div> +<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  <span class="keywordtype">void</span> NotNested() {</div> +<div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  <span class="comment">// If you hit this, you're trying to construct a Table/Vector/String</span></div> +<div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  <span class="comment">// during the construction of its parent table (between the MyTableBuilder</span></div> +<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  <span class="comment">// and table.Finish().</span></div> +<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  <span class="comment">// Move the creation of these sub-objects to above the MyTableBuilder to</span></div> +<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  <span class="comment">// not get this assert.</span></div> +<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  <span class="comment">// Ignoring this assert may appear to work in simple cases, but the reason</span></div> +<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  <span class="comment">// it is here is that storing objects in-line may cause vtable offsets</span></div> +<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  <span class="comment">// to not fit anymore. It also leads to vtable duplication.</span></div> +<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  assert(!nested);</div> +<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  }</div> +<div class="line"><a name="l00839"></a><span class="lineno"> 839</span> </div> +<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  <span class="comment">// From generated code (or from the parser), we call StartTable/EndTable</span></div> +<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  <span class="comment">// with a sequence of AddElement calls in between.</span></div> +<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  uoffset_t StartTable() {</div> +<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  NotNested();</div> +<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  nested = <span class="keyword">true</span>;</div> +<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>();</div> +<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  }</div> +<div class="line"><a name="l00847"></a><span class="lineno"> 847</span> </div> +<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  <span class="comment">// This finishes one serialized object by generating the vtable if it's a</span></div> +<div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  <span class="comment">// table, comparing it against existing vtables, and writing the</span></div> +<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  <span class="comment">// resulting vtable offset.</span></div> +<div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  uoffset_t EndTable(uoffset_t start, voffset_t numfields) {</div> +<div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  <span class="comment">// If you get this assert, a corresponding StartTable wasn't called.</span></div> +<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  assert(nested);</div> +<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <span class="comment">// Write the vtable offset, which is the start of any Table.</span></div> +<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="comment">// We fill it's value later.</span></div> +<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="keyword">auto</span> vtableoffsetloc = PushElement<soffset_t>(0);</div> +<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="comment">// Write a vtable, which consists entirely of voffset_t elements.</span></div> +<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  <span class="comment">// It starts with the number of offsets, followed by a type id, followed</span></div> +<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="comment">// by the offsets themselves. In reverse:</span></div> +<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  buf_.fill_big(numfields * <span class="keyword">sizeof</span>(voffset_t));</div> +<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <span class="keyword">auto</span> table_object_size = vtableoffsetloc - start;</div> +<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  assert(table_object_size < 0x10000); <span class="comment">// Vtable use 16bit offsets.</span></div> +<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  PushElement<voffset_t>(<span class="keyword">static_cast<</span>voffset_t<span class="keyword">></span>(table_object_size));</div> +<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  PushElement<voffset_t>(FieldIndexToOffset(numfields));</div> +<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  <span class="comment">// Write the offsets into the table</span></div> +<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> field_location = offsetbuf_.begin();</div> +<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  field_location != offsetbuf_.end();</div> +<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  ++field_location) {</div> +<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  <span class="keyword">auto</span> pos = <span class="keyword">static_cast<</span>voffset_t<span class="keyword">></span>(vtableoffsetloc - field_location->off);</div> +<div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  <span class="comment">// If this asserts, it means you've set a field twice.</span></div> +<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  assert(!ReadScalar<voffset_t>(buf_.data() + field_location->id));</div> +<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  WriteScalar<voffset_t>(buf_.data() + field_location->id, pos);</div> +<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  }</div> +<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  offsetbuf_.clear();</div> +<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <span class="keyword">auto</span> vt1 = <span class="keyword">reinterpret_cast<</span>voffset_t *<span class="keyword">></span>(buf_.data());</div> +<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="keyword">auto</span> vt1_size = ReadScalar<voffset_t>(vt1);</div> +<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  <span class="keyword">auto</span> vt_use = <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>();</div> +<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <span class="comment">// See if we already have generated a vtable with this exact same</span></div> +<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  <span class="comment">// layout before. If so, make it point to the old one, remove this one.</span></div> +<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  <span class="keywordflow">if</span> (dedup_vtables_) {</div> +<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = vtables_.begin(); it != vtables_.end(); ++it) {</div> +<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  <span class="keyword">auto</span> vt2 = <span class="keyword">reinterpret_cast<</span>voffset_t *<span class="keyword">></span>(buf_.data_at(*it));</div> +<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  <span class="keyword">auto</span> vt2_size = *vt2;</div> +<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  <span class="keywordflow">if</span> (vt1_size != vt2_size || memcmp(vt2, vt1, vt1_size)) <span class="keywordflow">continue</span>;</div> +<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  vt_use = *it;</div> +<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  buf_.pop(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>() - vtableoffsetloc);</div> +<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  <span class="keywordflow">break</span>;</div> +<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  }</div> +<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  }</div> +<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <span class="comment">// If this is a new vtable, remember it.</span></div> +<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  <span class="keywordflow">if</span> (vt_use == <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>()) {</div> +<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  vtables_.push_back(vt_use);</div> +<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  }</div> +<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  <span class="comment">// Fill the vtable offset we created above.</span></div> +<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  <span class="comment">// The offset points from the beginning of the object to where the</span></div> +<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  <span class="comment">// vtable is stored.</span></div> +<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  <span class="comment">// Offsets default direction is downward in memory for future format</span></div> +<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  <span class="comment">// flexibility (storing all vtables at the start of the file).</span></div> +<div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  WriteScalar(buf_.data_at(vtableoffsetloc),</div> +<div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  <span class="keyword">static_cast<</span>soffset_t<span class="keyword">></span>(vt_use) -</div> +<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  static_cast<soffset_t>(vtableoffsetloc));</div> <div class="line"><a name="l00902"></a><span class="lineno"> 902</span> </div> -<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  <span class="keywordtype">void</span> ClearOffsets() { offsetbuf_.clear(); }</div> -<div class="line"><a name="l00904"></a><span class="lineno"> 904</span> </div> -<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  <span class="comment">// Aligns such that when "len" bytes are written, an object can be written</span></div> -<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  <span class="comment">// after it with "alignment" without padding.</span></div> -<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  <span class="keywordtype">void</span> PreAlign(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> alignment) {</div> -<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  buf_.fill(PaddingBytes(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>() + len, alignment));</div> -<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  }</div> -<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> PreAlign(<span class="keywordtype">size_t</span> len) {</div> -<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  AssertScalarT<T>();</div> -<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  PreAlign(len, <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  }<span class="comment"></span></div> -<div class="line"><a name="l00914"></a><span class="lineno"> 914</span> <span class="comment"> /// @endcond</span></div> -<div class="line"><a name="l00915"></a><span class="lineno"> 915</span> <span class="comment"></span><span class="comment"></span></div> -<div class="line"><a name="l00916"></a><span class="lineno"> 916</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div> -<div class="line"><a name="l00917"></a><span class="lineno"> 917</span> <span class="comment"> /// @param[in] str A const char pointer to the data to be stored as a string.</span></div> -<div class="line"><a name="l00918"></a><span class="lineno"> 918</span> <span class="comment"> /// @param[in] len The number of bytes that should be stored from `str`.</span></div> -<div class="line"><a name="l00919"></a><span class="lineno"> 919</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div> -<div class="line"><a name="l00920"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe"> 920</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">CreateString</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str, <span class="keywordtype">size_t</span> len) {</div> -<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  NotNested();</div> -<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  PreAlign<uoffset_t>(len + 1); <span class="comment">// Always 0-terminated.</span></div> -<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  buf_.fill(1);</div> -<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  PushBytes(reinterpret_cast<const uint8_t *>(str), len);</div> -<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  PushElement(static_cast<uoffset_t>(len));</div> -<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  <span class="keywordflow">return</span> Offset<String>(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>());</div> -<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  }</div> -<div class="line"><a name="l00928"></a><span class="lineno"> 928</span> <span class="comment"></span></div> -<div class="line"><a name="l00929"></a><span class="lineno"> 929</span> <span class="comment"> /// @brief Store a string in the buffer, which is null-terminated.</span></div> -<div class="line"><a name="l00930"></a><span class="lineno"> 930</span> <span class="comment"> /// @param[in] str A const char pointer to a C-string to add to the buffer.</span></div> -<div class="line"><a name="l00931"></a><span class="lineno"> 931</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div> -<div class="line"><a name="l00932"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5"> 932</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5">CreateString</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str) {</div> -<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">CreateString</a>(str, strlen(str));</div> -<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  }</div> -<div class="line"><a name="l00935"></a><span class="lineno"> 935</span> <span class="comment"></span></div> -<div class="line"><a name="l00936"></a><span class="lineno"> 936</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div> -<div class="line"><a name="l00937"></a><span class="lineno"> 937</span> <span class="comment"> /// @param[in] str A const reference to a std::string to store in the buffer.</span></div> -<div class="line"><a name="l00938"></a><span class="lineno"> 938</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div> -<div class="line"><a name="l00939"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f"> 939</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f">CreateString</a>(<span class="keyword">const</span> std::string &str) {</div> -<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">CreateString</a>(str.c_str(), str.length());</div> -<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  }</div> -<div class="line"><a name="l00942"></a><span class="lineno"> 942</span> <span class="comment"></span></div> -<div class="line"><a name="l00943"></a><span class="lineno"> 943</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div> -<div class="line"><a name="l00944"></a><span class="lineno"> 944</span> <span class="comment"> /// @param[in] str A const pointer to a `String` struct to add to the buffer.</span></div> -<div class="line"><a name="l00945"></a><span class="lineno"> 945</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts</span></div> -<div class="line"><a name="l00946"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506"> 946</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506">CreateString</a>(<span class="keyword">const</span> String *str) {</div> -<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  <span class="keywordflow">return</span> str ? <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">CreateString</a>(str->c_str(), str->Length()) : 0;</div> -<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  }</div> -<div class="line"><a name="l00949"></a><span class="lineno"> 949</span> <span class="comment"></span></div> -<div class="line"><a name="l00950"></a><span class="lineno"> 950</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div> -<div class="line"><a name="l00951"></a><span class="lineno"> 951</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div> -<div class="line"><a name="l00952"></a><span class="lineno"> 952</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div> -<div class="line"><a name="l00953"></a><span class="lineno"> 953</span> <span class="comment"> /// @param[in] str A const char pointer to the data to be stored as a string.</span></div> -<div class="line"><a name="l00954"></a><span class="lineno"> 954</span> <span class="comment"> /// @param[in] len The number of bytes that should be stored from `str`.</span></div> -<div class="line"><a name="l00955"></a><span class="lineno"> 955</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div> -<div class="line"><a name="l00956"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1"> 956</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1">CreateSharedString</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str, <span class="keywordtype">size_t</span> len) {</div> -<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  <span class="keywordflow">if</span> (!string_pool)</div> -<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  string_pool = <span class="keyword">new</span> StringOffsetMap(StringOffsetCompare(buf_));</div> -<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  <span class="keyword">auto</span> size_before_string = buf_.size();</div> -<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  <span class="comment">// Must first serialize the string, since the set is all offsets into</span></div> -<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  <span class="comment">// buffer.</span></div> -<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  <span class="keyword">auto</span> off = <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">CreateString</a>(str, len);</div> -<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  <span class="keyword">auto</span> it = string_pool->find(off);</div> -<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  <span class="comment">// If it exists we reuse existing serialized data!</span></div> -<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  <span class="keywordflow">if</span> (it != string_pool->end()) {</div> -<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  <span class="comment">// We can remove the string we serialized.</span></div> -<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  buf_.pop(buf_.size() - size_before_string);</div> -<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  <span class="keywordflow">return</span> *it;</div> -<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  }</div> -<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  <span class="comment">// Record this string for future use.</span></div> -<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  string_pool->insert(off);</div> -<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  <span class="keywordflow">return</span> off;</div> -<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  }</div> -<div class="line"><a name="l00974"></a><span class="lineno"> 974</span> <span class="comment"></span></div> -<div class="line"><a name="l00975"></a><span class="lineno"> 975</span> <span class="comment"> /// @brief Store a string in the buffer, which null-terminated.</span></div> -<div class="line"><a name="l00976"></a><span class="lineno"> 976</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div> -<div class="line"><a name="l00977"></a><span class="lineno"> 977</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div> -<div class="line"><a name="l00978"></a><span class="lineno"> 978</span> <span class="comment"> /// @param[in] str A const char pointer to a C-string to add to the buffer.</span></div> -<div class="line"><a name="l00979"></a><span class="lineno"> 979</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div> -<div class="line"><a name="l00980"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7"> 980</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7">CreateSharedString</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str) {</div> -<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1">CreateSharedString</a>(str, strlen(str));</div> -<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  }</div> -<div class="line"><a name="l00983"></a><span class="lineno"> 983</span> <span class="comment"></span></div> -<div class="line"><a name="l00984"></a><span class="lineno"> 984</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div> -<div class="line"><a name="l00985"></a><span class="lineno"> 985</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div> -<div class="line"><a name="l00986"></a><span class="lineno"> 986</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div> -<div class="line"><a name="l00987"></a><span class="lineno"> 987</span> <span class="comment"> /// @param[in] str A const reference to a std::string to store in the buffer.</span></div> -<div class="line"><a name="l00988"></a><span class="lineno"> 988</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div> -<div class="line"><a name="l00989"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9"> 989</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9">CreateSharedString</a>(<span class="keyword">const</span> std::string &str) {</div> -<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1">CreateSharedString</a>(str.c_str(), str.length());</div> -<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  }</div> -<div class="line"><a name="l00992"></a><span class="lineno"> 992</span> <span class="comment"></span></div> -<div class="line"><a name="l00993"></a><span class="lineno"> 993</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div> -<div class="line"><a name="l00994"></a><span class="lineno"> 994</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div> -<div class="line"><a name="l00995"></a><span class="lineno"> 995</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div> -<div class="line"><a name="l00996"></a><span class="lineno"> 996</span> <span class="comment"> /// @param[in] str A const pointer to a `String` struct to add to the buffer.</span></div> -<div class="line"><a name="l00997"></a><span class="lineno"> 997</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts</span></div> -<div class="line"><a name="l00998"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3"> 998</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3">CreateSharedString</a>(<span class="keyword">const</span> String *str) {</div> -<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1">CreateSharedString</a>(str->c_str(), str->Length());</div> -<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  }</div> -<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span> <span class="comment"></span></div> -<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div> -<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span> <span class="comment"></span> uoffset_t EndVector(<span class="keywordtype">size_t</span> len) {</div> -<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  assert(nested); <span class="comment">// Hit if no corresponding StartVector.</span></div> -<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  nested = <span class="keyword">false</span>;</div> -<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  <span class="keywordflow">return</span> PushElement(static_cast<uoffset_t>(len));</div> -<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  }</div> -<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span> </div> -<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  <span class="keywordtype">void</span> StartVector(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize) {</div> -<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  NotNested();</div> -<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  nested = <span class="keyword">true</span>;</div> -<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  PreAlign<uoffset_t>(len * elemsize);</div> -<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  PreAlign(len * elemsize, elemsize); <span class="comment">// Just in case elemsize > uoffset_t.</span></div> -<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  }</div> -<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span> </div> -<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  <span class="comment">// Call this right before StartVector/CreateVector if you want to force the</span></div> -<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  <span class="comment">// alignment to be something different than what the element size would</span></div> -<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  <span class="comment">// normally dictate.</span></div> -<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  <span class="comment">// This is useful when storing a nested_flatbuffer in a vector of bytes,</span></div> -<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  <span class="comment">// or when storing SIMD floats, etc.</span></div> -<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  <span class="keywordtype">void</span> ForceVectorAlignment(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize, <span class="keywordtype">size_t</span> alignment) {</div> -<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  PreAlign(len * elemsize, alignment);</div> -<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  }</div> -<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span> </div> -<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  uint8_t *ReserveElements(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize) {</div> -<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  <span class="keywordflow">return</span> buf_.make_space(len * elemsize);</div> -<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  }<span class="comment"></span></div> -<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span> <span class="comment"> /// @endcond</span></div> -<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span> <span class="comment"></span><span class="comment"></span></div> -<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span> <span class="comment"> /// @brief Serialize an array into a FlatBuffer `vector`.</span></div> -<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span> <span class="comment"> /// @tparam T The data type of the array elements.</span></div> -<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span> <span class="comment"> /// @param[in] v A pointer to the array of type `T` to serialize into the</span></div> -<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span> <span class="comment"> /// buffer as a `vector`.</span></div> -<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div> -<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> -<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span> <span class="comment"> /// where the vector is stored.</span></div> -<div class="line"><a name="l01037"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3"> 1037</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<T>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</a>(<span class="keyword">const</span> T *v, <span class="keywordtype">size_t</span> len) {</div> -<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  StartVector(len, <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = len; i > 0; ) {</div> -<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>  PushElement(v[--i]);</div> -<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  }</div> -<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  <span class="keywordflow">return</span> Offset<Vector<T>>(EndVector(len));</div> -<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  }</div> -<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span> <span class="comment"></span></div> -<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span> <span class="comment"> /// @brief Serialize a `std::vector` into a FlatBuffer `vector`.</span></div> -<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span> <span class="comment"> /// @tparam T The data type of the `std::vector` elements.</span></div> -<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span> <span class="comment"> /// @param v A const reference to the `std::vector` to serialize into the</span></div> -<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span> <span class="comment"> /// buffer as a `vector`.</span></div> -<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> -<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span> <span class="comment"> /// where the vector is stored.</span></div> -<div class="line"><a name="l01051"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207"> 1051</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<T>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207">CreateVector</a>(<span class="keyword">const</span> std::vector<T> &v) {</div> -<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</a>(data(v), v.size());</div> -<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  }</div> -<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span> </div> -<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <span class="comment">// vector<bool> may be implemented using a bit-set, so we can't access it as</span></div> -<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  <span class="comment">// an array. Instead, read elements manually.</span></div> -<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  <span class="comment">// Background: https://isocpp.org/blog/2012/11/on-vectorbool</span></div> -<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  Offset<Vector<uint8_t>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</a>(<span class="keyword">const</span> std::vector<bool> &v) {</div> -<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  StartVector(v.size(), <span class="keyword">sizeof</span>(uint8_t));</div> -<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = v.size(); i > 0; ) {</div> -<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  PushElement(static_cast<uint8_t>(v[--i]));</div> -<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  }</div> -<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  <span class="keywordflow">return</span> Offset<Vector<uint8_t>>(EndVector(v.size()));</div> -<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  }</div> -<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span> </div> -<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span> <span class="preprocessor"> #ifndef FLATBUFFERS_CPP98_STL</span></div> -<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span> <span class="comment"> /// @brief Serialize values returned by a function into a FlatBuffer `vector`.</span></div> -<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span> <span class="comment"></span><span class="comment"> /// This is a convenience function that takes care of iteration for you.</span></div> -<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span> <span class="comment"></span><span class="comment"> /// @tparam T The data type of the `std::vector` elements.</span></div> -<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span> <span class="comment"></span><span class="comment"> /// @param f A function that takes the current iteration 0..vector_size-1 and</span></div> -<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span> <span class="comment"></span><span class="comment"> /// returns any type that you can construct a FlatBuffers vector out of.</span></div> -<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span> <span class="comment"></span><span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> -<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span> <span class="comment"></span><span class="comment"> /// where the vector is stored.</span></div> -<div class="line"><a name="l01074"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b"> 1074</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<T>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b">CreateVector</a>(<span class="keywordtype">size_t</span> vector_size,</div> -<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  <span class="keyword">const</span> std::function<T (<span class="keywordtype">size_t</span> i)> &f) {</div> -<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  std::vector<T> elems(vector_size);</div> -<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < vector_size; i++) elems[i] = f(i);</div> -<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</a>(elems);</div> -<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  }</div> -<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span> <span class="comment"></span></div> -<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span> <span class="comment"> /// @brief Serialize a `std::vector<std::string>` into a FlatBuffer `vector`.</span></div> -<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span> <span class="comment"> /// This is a convenience function for a common case.</span></div> -<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span> <span class="comment"> /// @param v A const reference to the `std::vector` to serialize into the</span></div> -<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span> <span class="comment"> /// buffer as a `vector`.</span></div> -<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> -<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span> <span class="comment"> /// where the vector is stored.</span></div> -<div class="line"><a name="l01088"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6"> 1088</a></span> <span class="comment"></span> Offset<Vector<Offset<String>>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6">CreateVectorOfStrings</a>(</div> -<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  <span class="keyword">const</span> std::vector<std::string> &v) {</div> -<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  std::vector<Offset<String>> offsets(v.size());</div> -<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < v.size(); i++) offsets[i] = <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">CreateString</a>(v[i]);</div> -<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</a>(offsets);</div> -<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>  }</div> -<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span> <span class="comment"></span></div> -<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span> <span class="comment"> /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div> -<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span> <span class="comment"> /// @tparam T The data type of the struct array elements.</span></div> -<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span> <span class="comment"> /// @param[in] v A pointer to the array of type `T` to serialize into the</span></div> -<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span> <span class="comment"> /// buffer as a `vector`.</span></div> -<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div> -<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> -<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span> <span class="comment"> /// where the vector is stored.</span></div> -<div class="line"><a name="l01102"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7"> 1102</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<const T *>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7">CreateVectorOfStructs</a>(</div> -<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>  <span class="keyword">const</span> T *v, <span class="keywordtype">size_t</span> len) {</div> -<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  StartVector(len * <span class="keyword">sizeof</span>(T) / AlignOf<T>(), AlignOf<T>());</div> -<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  PushBytes(reinterpret_cast<const uint8_t *>(v), <span class="keyword">sizeof</span>(T) * len);</div> -<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  <span class="keywordflow">return</span> Offset<Vector<const T *>>(EndVector(len));</div> -<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  }</div> -<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span> <span class="comment"></span></div> -<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span> <span class="comment"> /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`.</span></div> -<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span> <span class="comment"> /// @tparam T The data type of the `std::vector` struct elements.</span></div> -<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span> <span class="comment"> /// @param[in]] v A const reference to the `std::vector` of structs to</span></div> -<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span> <span class="comment"> /// serialize into the buffer as a `vector`.</span></div> -<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> -<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span> <span class="comment"> /// where the vector is stored.</span></div> -<div class="line"><a name="l01115"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1"> 1115</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<const T *>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1">CreateVectorOfStructs</a>(</div> -<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>  <span class="keyword">const</span> std::vector<T> &v) {</div> -<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7">CreateVectorOfStructs</a>(data(v), v.size());</div> -<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  }</div> -<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span> <span class="comment"></span></div> -<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div> -<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> -<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>  <span class="keyword">struct </span>TableKeyComparator {</div> -<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>  TableKeyComparator(vector_downward& buf) : buf_(buf) {}</div> -<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> Offset<T> &a, <span class="keyword">const</span> Offset<T> &b)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  <span class="keyword">auto</span> table_a = <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(buf_.data_at(a.o));</div> -<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  <span class="keyword">auto</span> table_b = <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(buf_.data_at(b.o));</div> -<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>  <span class="keywordflow">return</span> table_a->KeyCompareLessThan(table_b);</div> -<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  }</div> -<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>  vector_downward& buf_;</div> +<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  nested = <span class="keyword">false</span>;</div> +<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  <span class="keywordflow">return</span> vtableoffsetloc;</div> +<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  }</div> +<div class="line"><a name="l00906"></a><span class="lineno"> 906</span> </div> +<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  <span class="comment">// This checks a required field has been set in a given table that has</span></div> +<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  <span class="comment">// just been constructed.</span></div> +<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> Required(Offset<T> table, voffset_t field) {</div> +<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  <span class="keyword">auto</span> table_ptr = buf_.data_at(table.o);</div> +<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  <span class="keyword">auto</span> vtable_ptr = table_ptr - ReadScalar<soffset_t>(table_ptr);</div> +<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  <span class="keywordtype">bool</span> ok = ReadScalar<voffset_t>(vtable_ptr + field) != 0;</div> +<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  <span class="comment">// If this fails, the caller will show what field needs to be set.</span></div> +<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  assert(ok);</div> +<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  (void)ok;</div> +<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  }</div> +<div class="line"><a name="l00917"></a><span class="lineno"> 917</span> </div> +<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  uoffset_t StartStruct(<span class="keywordtype">size_t</span> alignment) {</div> +<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  Align(alignment);</div> +<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>();</div> +<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  }</div> +<div class="line"><a name="l00922"></a><span class="lineno"> 922</span> </div> +<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  uoffset_t EndStruct() { <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>(); }</div> +<div class="line"><a name="l00924"></a><span class="lineno"> 924</span> </div> +<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  <span class="keywordtype">void</span> ClearOffsets() { offsetbuf_.clear(); }</div> +<div class="line"><a name="l00926"></a><span class="lineno"> 926</span> </div> +<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  <span class="comment">// Aligns such that when "len" bytes are written, an object can be written</span></div> +<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  <span class="comment">// after it with "alignment" without padding.</span></div> +<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  <span class="keywordtype">void</span> PreAlign(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> alignment) {</div> +<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  buf_.fill(PaddingBytes(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>() + len, alignment));</div> +<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  }</div> +<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> PreAlign(<span class="keywordtype">size_t</span> len) {</div> +<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  AssertScalarT<T>();</div> +<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  PreAlign(len, <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  }<span class="comment"></span></div> +<div class="line"><a name="l00936"></a><span class="lineno"> 936</span> <span class="comment"> /// @endcond</span></div> +<div class="line"><a name="l00937"></a><span class="lineno"> 937</span> <span class="comment"></span><span class="comment"></span></div> +<div class="line"><a name="l00938"></a><span class="lineno"> 938</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div> +<div class="line"><a name="l00939"></a><span class="lineno"> 939</span> <span class="comment"> /// @param[in] str A const char pointer to the data to be stored as a string.</span></div> +<div class="line"><a name="l00940"></a><span class="lineno"> 940</span> <span class="comment"> /// @param[in] len The number of bytes that should be stored from `str`.</span></div> +<div class="line"><a name="l00941"></a><span class="lineno"> 941</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div> +<div class="line"><a name="l00942"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe"> 942</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">CreateString</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str, <span class="keywordtype">size_t</span> len) {</div> +<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  NotNested();</div> +<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  PreAlign<uoffset_t>(len + 1); <span class="comment">// Always 0-terminated.</span></div> +<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  buf_.fill(1);</div> +<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  PushBytes(reinterpret_cast<const uint8_t *>(str), len);</div> +<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  PushElement(static_cast<uoffset_t>(len));</div> +<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  <span class="keywordflow">return</span> Offset<String>(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>());</div> +<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  }</div> +<div class="line"><a name="l00950"></a><span class="lineno"> 950</span> <span class="comment"></span></div> +<div class="line"><a name="l00951"></a><span class="lineno"> 951</span> <span class="comment"> /// @brief Store a string in the buffer, which is null-terminated.</span></div> +<div class="line"><a name="l00952"></a><span class="lineno"> 952</span> <span class="comment"> /// @param[in] str A const char pointer to a C-string to add to the buffer.</span></div> +<div class="line"><a name="l00953"></a><span class="lineno"> 953</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div> +<div class="line"><a name="l00954"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5"> 954</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5">CreateString</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str) {</div> +<div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">CreateString</a>(str, strlen(str));</div> +<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  }</div> +<div class="line"><a name="l00957"></a><span class="lineno"> 957</span> <span class="comment"></span></div> +<div class="line"><a name="l00958"></a><span class="lineno"> 958</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div> +<div class="line"><a name="l00959"></a><span class="lineno"> 959</span> <span class="comment"> /// @param[in] str A const reference to a std::string to store in the buffer.</span></div> +<div class="line"><a name="l00960"></a><span class="lineno"> 960</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div> +<div class="line"><a name="l00961"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f"> 961</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f">CreateString</a>(<span class="keyword">const</span> std::string &str) {</div> +<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">CreateString</a>(str.c_str(), str.length());</div> +<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  }</div> +<div class="line"><a name="l00964"></a><span class="lineno"> 964</span> <span class="comment"></span></div> +<div class="line"><a name="l00965"></a><span class="lineno"> 965</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div> +<div class="line"><a name="l00966"></a><span class="lineno"> 966</span> <span class="comment"> /// @param[in] str A const pointer to a `String` struct to add to the buffer.</span></div> +<div class="line"><a name="l00967"></a><span class="lineno"> 967</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts</span></div> +<div class="line"><a name="l00968"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506"> 968</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506">CreateString</a>(<span class="keyword">const</span> String *str) {</div> +<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  <span class="keywordflow">return</span> str ? <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">CreateString</a>(str->c_str(), str->Length()) : 0;</div> +<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  }</div> +<div class="line"><a name="l00971"></a><span class="lineno"> 971</span> <span class="comment"></span></div> +<div class="line"><a name="l00972"></a><span class="lineno"> 972</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div> +<div class="line"><a name="l00973"></a><span class="lineno"> 973</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div> +<div class="line"><a name="l00974"></a><span class="lineno"> 974</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div> +<div class="line"><a name="l00975"></a><span class="lineno"> 975</span> <span class="comment"> /// @param[in] str A const char pointer to the data to be stored as a string.</span></div> +<div class="line"><a name="l00976"></a><span class="lineno"> 976</span> <span class="comment"> /// @param[in] len The number of bytes that should be stored from `str`.</span></div> +<div class="line"><a name="l00977"></a><span class="lineno"> 977</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div> +<div class="line"><a name="l00978"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1"> 978</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1">CreateSharedString</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str, <span class="keywordtype">size_t</span> len) {</div> +<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  <span class="keywordflow">if</span> (!string_pool)</div> +<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  string_pool = <span class="keyword">new</span> StringOffsetMap(StringOffsetCompare(buf_));</div> +<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  <span class="keyword">auto</span> size_before_string = buf_.size();</div> +<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  <span class="comment">// Must first serialize the string, since the set is all offsets into</span></div> +<div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  <span class="comment">// buffer.</span></div> +<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  <span class="keyword">auto</span> off = <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">CreateString</a>(str, len);</div> +<div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  <span class="keyword">auto</span> it = string_pool->find(off);</div> +<div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  <span class="comment">// If it exists we reuse existing serialized data!</span></div> +<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  <span class="keywordflow">if</span> (it != string_pool->end()) {</div> +<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  <span class="comment">// We can remove the string we serialized.</span></div> +<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  buf_.pop(buf_.size() - size_before_string);</div> +<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  <span class="keywordflow">return</span> *it;</div> +<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  }</div> +<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  <span class="comment">// Record this string for future use.</span></div> +<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  string_pool->insert(off);</div> +<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  <span class="keywordflow">return</span> off;</div> +<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  }</div> +<div class="line"><a name="l00996"></a><span class="lineno"> 996</span> <span class="comment"></span></div> +<div class="line"><a name="l00997"></a><span class="lineno"> 997</span> <span class="comment"> /// @brief Store a string in the buffer, which null-terminated.</span></div> +<div class="line"><a name="l00998"></a><span class="lineno"> 998</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div> +<div class="line"><a name="l00999"></a><span class="lineno"> 999</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div> +<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span> <span class="comment"> /// @param[in] str A const char pointer to a C-string to add to the buffer.</span></div> +<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div> +<div class="line"><a name="l01002"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7"> 1002</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7">CreateSharedString</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *str) {</div> +<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1">CreateSharedString</a>(str, strlen(str));</div> +<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  }</div> +<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span> <span class="comment"></span></div> +<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div> +<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div> +<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div> +<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span> <span class="comment"> /// @param[in] str A const reference to a std::string to store in the buffer.</span></div> +<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts.</span></div> +<div class="line"><a name="l01011"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9"> 1011</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9">CreateSharedString</a>(<span class="keyword">const</span> std::string &str) {</div> +<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1">CreateSharedString</a>(str.c_str(), str.length());</div> +<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  }</div> +<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span> <span class="comment"></span></div> +<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span> <span class="comment"> /// @brief Store a string in the buffer, which can contain any binary data.</span></div> +<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span> <span class="comment"> /// If a string with this exact contents has already been serialized before,</span></div> +<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span> <span class="comment"> /// instead simply returns the offset of the existing string.</span></div> +<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span> <span class="comment"> /// @param[in] str A const pointer to a `String` struct to add to the buffer.</span></div> +<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span> <span class="comment"> /// @return Returns the offset in the buffer where the string starts</span></div> +<div class="line"><a name="l01020"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3"> 1020</a></span> <span class="comment"></span> Offset<String> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3">CreateSharedString</a>(<span class="keyword">const</span> String *str) {</div> +<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1">CreateSharedString</a>(str->c_str(), str->Length());</div> +<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  }</div> +<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span> <span class="comment"></span></div> +<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div> +<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span> <span class="comment"></span> uoffset_t EndVector(<span class="keywordtype">size_t</span> len) {</div> +<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  assert(nested); <span class="comment">// Hit if no corresponding StartVector.</span></div> +<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  nested = <span class="keyword">false</span>;</div> +<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  <span class="keywordflow">return</span> PushElement(static_cast<uoffset_t>(len));</div> +<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  }</div> +<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span> </div> +<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  <span class="keywordtype">void</span> StartVector(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize) {</div> +<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  NotNested();</div> +<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  nested = <span class="keyword">true</span>;</div> +<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  PreAlign<uoffset_t>(len * elemsize);</div> +<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  PreAlign(len * elemsize, elemsize); <span class="comment">// Just in case elemsize > uoffset_t.</span></div> +<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>  }</div> +<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span> </div> +<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  <span class="comment">// Call this right before StartVector/CreateVector if you want to force the</span></div> +<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  <span class="comment">// alignment to be something different than what the element size would</span></div> +<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>  <span class="comment">// normally dictate.</span></div> +<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  <span class="comment">// This is useful when storing a nested_flatbuffer in a vector of bytes,</span></div> +<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  <span class="comment">// or when storing SIMD floats, etc.</span></div> +<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  <span class="keywordtype">void</span> ForceVectorAlignment(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize, <span class="keywordtype">size_t</span> alignment) {</div> +<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  PreAlign(len * elemsize, alignment);</div> +<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>  }</div> +<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span> </div> +<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  uint8_t *ReserveElements(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize) {</div> +<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>  <span class="keywordflow">return</span> buf_.make_space(len * elemsize);</div> +<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  }<span class="comment"></span></div> +<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span> <span class="comment"> /// @endcond</span></div> +<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span> <span class="comment"></span><span class="comment"></span></div> +<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span> <span class="comment"> /// @brief Serialize an array into a FlatBuffer `vector`.</span></div> +<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span> <span class="comment"> /// @tparam T The data type of the array elements.</span></div> +<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span> <span class="comment"> /// @param[in] v A pointer to the array of type `T` to serialize into the</span></div> +<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span> <span class="comment"> /// buffer as a `vector`.</span></div> +<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div> +<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> +<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span> <span class="comment"> /// where the vector is stored.</span></div> +<div class="line"><a name="l01059"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3"> 1059</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<T>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</a>(<span class="keyword">const</span> T *v, <span class="keywordtype">size_t</span> len) {</div> +<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  StartVector(len, <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = len; i > 0; ) {</div> +<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  PushElement(v[--i]);</div> +<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  }</div> +<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  <span class="keywordflow">return</span> Offset<Vector<T>>(EndVector(len));</div> +<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>  }</div> +<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span> <span class="comment"></span></div> +<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span> <span class="comment"> /// @brief Serialize a `std::vector` into a FlatBuffer `vector`.</span></div> +<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span> <span class="comment"> /// @tparam T The data type of the `std::vector` elements.</span></div> +<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span> <span class="comment"> /// @param v A const reference to the `std::vector` to serialize into the</span></div> +<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span> <span class="comment"> /// buffer as a `vector`.</span></div> +<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> +<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span> <span class="comment"> /// where the vector is stored.</span></div> +<div class="line"><a name="l01073"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207"> 1073</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<T>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207">CreateVector</a>(<span class="keyword">const</span> std::vector<T> &v) {</div> +<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</a>(data(v), v.size());</div> +<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  }</div> +<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span> </div> +<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>  <span class="comment">// vector<bool> may be implemented using a bit-set, so we can't access it as</span></div> +<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  <span class="comment">// an array. Instead, read elements manually.</span></div> +<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  <span class="comment">// Background: https://isocpp.org/blog/2012/11/on-vectorbool</span></div> +<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  Offset<Vector<uint8_t>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</a>(<span class="keyword">const</span> std::vector<bool> &v) {</div> +<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>  StartVector(v.size(), <span class="keyword">sizeof</span>(uint8_t));</div> +<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = v.size(); i > 0; ) {</div> +<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>  PushElement(static_cast<uint8_t>(v[--i]));</div> +<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>  }</div> +<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>  <span class="keywordflow">return</span> Offset<Vector<uint8_t>>(EndVector(v.size()));</div> +<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  }</div> +<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span> </div> +<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span> <span class="preprocessor"> #ifndef FLATBUFFERS_CPP98_STL</span></div> +<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span> <span class="comment"> /// @brief Serialize values returned by a function into a FlatBuffer `vector`.</span></div> +<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span> <span class="comment"></span><span class="comment"> /// This is a convenience function that takes care of iteration for you.</span></div> +<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span> <span class="comment"></span><span class="comment"> /// @tparam T The data type of the `std::vector` elements.</span></div> +<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span> <span class="comment"></span><span class="comment"> /// @param f A function that takes the current iteration 0..vector_size-1 and</span></div> +<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span> <span class="comment"></span><span class="comment"> /// returns any type that you can construct a FlatBuffers vector out of.</span></div> +<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span> <span class="comment"></span><span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> +<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span> <span class="comment"></span><span class="comment"> /// where the vector is stored.</span></div> +<div class="line"><a name="l01096"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b"> 1096</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<T>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b">CreateVector</a>(<span class="keywordtype">size_t</span> vector_size,</div> +<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  <span class="keyword">const</span> std::function<T (<span class="keywordtype">size_t</span> i)> &f) {</div> +<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>  std::vector<T> elems(vector_size);</div> +<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < vector_size; i++) elems[i] = f(i);</div> +<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</a>(elems);</div> +<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  }</div> +<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span> <span class="comment"></span></div> +<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span> <span class="comment"> /// @brief Serialize a `std::vector<std::string>` into a FlatBuffer `vector`.</span></div> +<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span> <span class="comment"> /// This is a convenience function for a common case.</span></div> +<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span> <span class="comment"> /// @param v A const reference to the `std::vector` to serialize into the</span></div> +<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span> <span class="comment"> /// buffer as a `vector`.</span></div> +<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> +<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span> <span class="comment"> /// where the vector is stored.</span></div> +<div class="line"><a name="l01110"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6"> 1110</a></span> <span class="comment"></span> Offset<Vector<Offset<String>>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6">CreateVectorOfStrings</a>(</div> +<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  <span class="keyword">const</span> std::vector<std::string> &v) {</div> +<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  std::vector<Offset<String>> offsets(v.size());</div> +<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < v.size(); i++) offsets[i] = <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">CreateString</a>(v[i]);</div> +<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</a>(offsets);</div> +<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>  }</div> +<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span> <span class="comment"></span></div> +<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span> <span class="comment"> /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div> +<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span> <span class="comment"> /// @tparam T The data type of the struct array elements.</span></div> +<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span> <span class="comment"> /// @param[in] v A pointer to the array of type `T` to serialize into the</span></div> +<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span> <span class="comment"> /// buffer as a `vector`.</span></div> +<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span> <span class="comment"> /// @param[in] len The number of elements to serialize.</span></div> +<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> +<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span> <span class="comment"> /// where the vector is stored.</span></div> +<div class="line"><a name="l01124"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7"> 1124</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<const T *>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7">CreateVectorOfStructs</a>(</div> +<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  <span class="keyword">const</span> T *v, <span class="keywordtype">size_t</span> len) {</div> +<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  StartVector(len * <span class="keyword">sizeof</span>(T) / AlignOf<T>(), AlignOf<T>());</div> +<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>  PushBytes(reinterpret_cast<const uint8_t *>(v), <span class="keyword">sizeof</span>(T) * len);</div> +<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  <span class="keywordflow">return</span> Offset<Vector<const T *>>(EndVector(len));</div> +<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>  }</div> <div class="line"><a name="l01130"></a><span class="lineno"> 1130</span> </div> -<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>  TableKeyComparator& operator= (<span class="keyword">const</span> TableKeyComparator&);</div> -<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>  };<span class="comment"></span></div> -<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span> <span class="comment"> /// @endcond</span></div> -<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span> <span class="comment"></span><span class="comment"></span></div> -<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span> <span class="comment"> /// @brief Serialize an array of `table` offsets as a `vector` in the buffer</span></div> -<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span> <span class="comment"> /// in sorted order.</span></div> -<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span> <span class="comment"> /// @tparam T The data type that the offset refers to.</span></div> -<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span> <span class="comment"> /// @param[in] v An array of type `Offset<T>` that contains the `table`</span></div> -<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span> <span class="comment"> /// offsets to store in the buffer in sorted order.</span></div> -<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span> <span class="comment"> /// @param[in] len The number of elements to store in the `vector`.</span></div> -<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> -<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span> <span class="comment"> /// where the vector is stored.</span></div> -<div class="line"><a name="l01144"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6"> 1144</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<Offset<T>>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">CreateVectorOfSortedTables</a>(</div> -<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  Offset<T> *v, <span class="keywordtype">size_t</span> len) {</div> -<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  std::sort(v, v + len, TableKeyComparator<T>(buf_));</div> -<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</a>(v, len);</div> -<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>  }</div> -<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span> <span class="comment"></span></div> -<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span> <span class="comment"> /// @brief Serialize an array of `table` offsets as a `vector` in the buffer</span></div> -<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span> <span class="comment"> /// in sorted order.</span></div> -<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> <span class="comment"> /// @tparam T The data type that the offset refers to.</span></div> -<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span> <span class="comment"> /// @param[in] v An array of type `Offset<T>` that contains the `table`</span></div> -<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span> <span class="comment"> /// offsets to store in the buffer in sorted order.</span></div> -<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> -<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span> <span class="comment"> /// where the vector is stored.</span></div> -<div class="line"><a name="l01157"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135"> 1157</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<Offset<T>>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">CreateVectorOfSortedTables</a>(</div> -<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  std::vector<Offset<T>> *v) {</div> -<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">CreateVectorOfSortedTables</a>(data(*v), v->size());</div> -<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  }</div> -<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span> <span class="comment"></span></div> -<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span> <span class="comment"> /// @brief Specialized version of `CreateVector` for non-copying use cases.</span></div> -<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span> <span class="comment"> /// Write the data any time later to the returned buffer pointer `buf`.</span></div> -<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span> <span class="comment"> /// @param[in] len The number of elements to store in the `vector`.</span></div> -<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span> <span class="comment"> /// @param[in] elemsize The size of each element in the `vector`.</span></div> -<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span> <span class="comment"> /// @param[out] buf A pointer to a `uint8_t` pointer that can be</span></div> -<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span> <span class="comment"> /// written to at a later time to serialize the data into a `vector`</span></div> -<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span> <span class="comment"> /// in the buffer.</span></div> -<div class="line"><a name="l01169"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c"> 1169</a></span> <span class="comment"></span> uoffset_t <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c">CreateUninitializedVector</a>(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize,</div> -<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  uint8_t **buf) {</div> -<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  NotNested();</div> -<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  StartVector(len, elemsize);</div> -<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  buf_.make_space(len * elemsize);</div> -<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  <span class="keyword">auto</span> vec_start = <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>();</div> -<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  <span class="keyword">auto</span> vec_end = EndVector(len);</div> -<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  *buf = buf_.data_at(vec_start);</div> -<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>  <span class="keywordflow">return</span> vec_end;</div> -<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  }</div> -<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span> <span class="comment"></span></div> -<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span> <span class="comment"> /// @brief Specialized version of `CreateVector` for non-copying use cases.</span></div> -<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span> <span class="comment"> /// Write the data any time later to the returned buffer pointer `buf`.</span></div> -<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span> <span class="comment"> /// @tparam T The data type of the data that will be stored in the buffer</span></div> -<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> <span class="comment"> /// as a `vector`.</span></div> +<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span> <span class="preprocessor"> #ifndef FLATBUFFERS_CPP98_STL</span></div> +<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span> <span class="comment"> /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div> +<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span> <span class="comment"></span><span class="comment"> /// @tparam T The data type of the struct array elements.</span></div> +<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span> <span class="comment"></span><span class="comment"> /// @param[in] f A function that takes the current iteration 0..vector_size-1</span></div> +<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span> <span class="comment"></span><span class="comment"> /// and a pointer to the struct that must be filled.</span></div> +<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span> <span class="comment"></span><span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> +<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span> <span class="comment"></span><span class="comment"> /// where the vector is stored.</span></div> +<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span> <span class="comment"></span><span class="comment"> /// This is mostly useful when flatbuffers are generated with mutation</span></div> +<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span> <span class="comment"></span><span class="comment"> /// accessors.</span></div> +<div class="line"><a name="l01140"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72"> 1140</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<const T *>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72">CreateVectorOfStructs</a>(</div> +<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>  <span class="keywordtype">size_t</span> vector_size, <span class="keyword">const</span> std::function<<span class="keywordtype">void</span>(<span class="keywordtype">size_t</span> i, T *)> &filler) {</div> +<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  StartVector(vector_size * <span class="keyword">sizeof</span>(T) / AlignOf<T>(), AlignOf<T>());</div> +<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  T *structs = <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(buf_.make_space(vector_size * <span class="keyword">sizeof</span>(T)));</div> +<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < vector_size; i++) {</div> +<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  filler(i, structs);</div> +<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  structs++;</div> +<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  }</div> +<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>  <span class="keywordflow">return</span> Offset<Vector<const T *>>(EndVector(vector_size));</div> +<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  }</div> +<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span> <span class="comment"></span></div> +<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> <span class="comment"> /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`.</span></div> +<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span> <span class="comment"> /// @tparam T The data type of the `std::vector` struct elements.</span></div> +<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span> <span class="comment"> /// @param[in]] v A const reference to the `std::vector` of structs to</span></div> +<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span> <span class="comment"> /// serialize into the buffer as a `vector`.</span></div> +<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> +<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span> <span class="comment"> /// where the vector is stored.</span></div> +<div class="line"><a name="l01158"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1"> 1158</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<const T *>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1">CreateVectorOfStructs</a>(</div> +<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  <span class="keyword">const</span> std::vector<T> &v) {</div> +<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7">CreateVectorOfStructs</a>(data(v), v.size());</div> +<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  }</div> +<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span> <span class="comment"></span></div> +<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span> <span class="comment"> /// @cond FLATBUFFERS_INTERNAL</span></div> +<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T></div> +<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>  <span class="keyword">struct </span>TableKeyComparator {</div> +<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  TableKeyComparator(vector_downward& buf) : buf_(buf) {}</div> +<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>  <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> Offset<T> &a, <span class="keyword">const</span> Offset<T> &b)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  <span class="keyword">auto</span> table_a = <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(buf_.data_at(a.o));</div> +<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  <span class="keyword">auto</span> table_b = <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(buf_.data_at(b.o));</div> +<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  <span class="keywordflow">return</span> table_a->KeyCompareLessThan(table_b);</div> +<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  }</div> +<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  vector_downward& buf_;</div> +<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span> </div> +<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  TableKeyComparator& operator= (<span class="keyword">const</span> TableKeyComparator&);</div> +<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  };<span class="comment"></span></div> +<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span> <span class="comment"> /// @endcond</span></div> +<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span> <span class="comment"></span><span class="comment"></span></div> +<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span> <span class="comment"> /// @brief Serialize an array of `table` offsets as a `vector` in the buffer</span></div> +<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span> <span class="comment"> /// in sorted order.</span></div> +<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span> <span class="comment"> /// @tparam T The data type that the offset refers to.</span></div> +<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span> <span class="comment"> /// @param[in] v An array of type `Offset<T>` that contains the `table`</span></div> +<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> <span class="comment"> /// offsets to store in the buffer in sorted order.</span></div> <div class="line"><a name="l01184"></a><span class="lineno"> 1184</span> <span class="comment"> /// @param[in] len The number of elements to store in the `vector`.</span></div> -<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span> <span class="comment"> /// @param[out] buf A pointer to a pointer of type `T` that can be</span></div> -<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span> <span class="comment"> /// written to at a later time to serialize the data into a `vector`</span></div> -<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span> <span class="comment"> /// in the buffer.</span></div> -<div class="line"><a name="l01188"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50"> 1188</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<T>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50">CreateUninitializedVector</a>(</div> -<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>  <span class="keywordtype">size_t</span> len, T **buf) {</div> -<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c">CreateUninitializedVector</a>(len, <span class="keyword">sizeof</span>(T),</div> -<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>  reinterpret_cast<uint8_t **>(buf));</div> -<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>  }</div> -<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span> <span class="comment"></span></div> -<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span> <span class="comment"> /// @brief The length of a FlatBuffer file header.</span></div> -<div class="line"><a name="l01195"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19"> 1195</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">kFileIdentifierLength</a> = 4;</div> -<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span> <span class="comment"></span></div> -<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span> <span class="comment"> /// @brief Finish serializing a buffer by writing the root offset.</span></div> -<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span> <span class="comment"> /// @param[in] file_identifier If a `file_identifier` is given, the buffer</span></div> -<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> <span class="comment"> /// will be prefixed with a standard FlatBuffers file header.</span></div> -<div class="line"><a name="l01200"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912"> 1200</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">Finish</a>(Offset<T> root,</div> -<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *file_identifier = <span class="keyword">nullptr</span>) {</div> -<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span> </div> -<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">Finish</a>(root.o, file_identifier, <span class="keyword">false</span>);</div> -<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>  }</div> -<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span> <span class="comment"></span></div> -<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span> <span class="comment"> /// @brief Finish a buffer with a 32 bit size field pre-fixed (size of the</span></div> -<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span> <span class="comment"> /// buffer following the size field). These buffers are NOT compatible</span></div> -<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span> <span class="comment"> /// with standard buffers created by Finish, i.e. you can't call GetRoot</span></div> -<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span> <span class="comment"> /// on them, you have to use GetSizePrefixedRoot instead.</span></div> -<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span> <span class="comment"> /// All >32 bit quantities in this buffer will be aligned when the whole</span></div> -<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span> <span class="comment"> /// size pre-fixed buffer is aligned.</span></div> -<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span> <span class="comment"> /// These kinds of buffers are useful for creating a stream of FlatBuffers.</span></div> -<div class="line"><a name="l01213"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220"> 1213</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220">FinishSizePrefixed</a>(Offset<T> root,</div> -<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *file_identifier = <span class="keyword">nullptr</span>) {</div> -<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">Finish</a>(root.o, file_identifier, <span class="keyword">true</span>);</div> -<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>  }</div> -<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span> </div> -<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>  <span class="comment">// You shouldn't really be copying instances of this class.</span></div> -<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac72b54a75e0c329e0ce0b8fab758e256">FlatBufferBuilder</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &);</div> -<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &operator=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &);</div> -<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span> </div> -<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">Finish</a>(uoffset_t root, <span class="keyword">const</span> <span class="keywordtype">char</span> *file_identifier, <span class="keywordtype">bool</span> size_prefix) {</div> -<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  NotNested();</div> -<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>  <span class="comment">// This will cause the whole buffer to be aligned.</span></div> -<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>  PreAlign((size_prefix ? <span class="keyword">sizeof</span>(uoffset_t) : 0) +</div> -<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  <span class="keyword">sizeof</span>(uoffset_t) +</div> -<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>  (file_identifier ? <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">kFileIdentifierLength</a> : 0),</div> -<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  minalign_);</div> -<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>  <span class="keywordflow">if</span> (file_identifier) {</div> -<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  assert(strlen(file_identifier) == <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">kFileIdentifierLength</a>);</div> -<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  buf_.push(reinterpret_cast<const uint8_t *>(file_identifier),</div> -<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">kFileIdentifierLength</a>);</div> -<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  }</div> -<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>  PushElement(ReferTo(root)); <span class="comment">// Location of root.</span></div> -<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>  <span class="keywordflow">if</span> (size_prefix) {</div> -<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  PushElement(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>());</div> -<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>  }</div> -<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>  finished = <span class="keyword">true</span>;</div> -<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  }</div> -<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span> </div> -<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>  <span class="keyword">struct </span>FieldLoc {</div> -<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>  uoffset_t off;</div> -<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>  voffset_t id;</div> -<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  };</div> -<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span> </div> -<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>  simple_allocator default_allocator;</div> -<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span> </div> -<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>  vector_downward buf_;</div> -<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span> </div> -<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>  <span class="comment">// Accumulating offsets of table members while it is being built.</span></div> -<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>  std::vector<FieldLoc> offsetbuf_;</div> -<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span> </div> -<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>  <span class="comment">// Ensure objects are not nested.</span></div> -<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  <span class="keywordtype">bool</span> nested;</div> -<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span> </div> -<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <span class="comment">// Ensure the buffer is finished before it is being accessed.</span></div> -<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  <span class="keywordtype">bool</span> finished;</div> -<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span> </div> -<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>  std::vector<uoffset_t> vtables_; <span class="comment">// todo: Could make this into a map?</span></div> -<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span> </div> -<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  <span class="keywordtype">size_t</span> minalign_;</div> -<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span> </div> -<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  <span class="keywordtype">bool</span> force_defaults_; <span class="comment">// Serialize values equal to their defaults anyway.</span></div> +<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> +<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span> <span class="comment"> /// where the vector is stored.</span></div> +<div class="line"><a name="l01187"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6"> 1187</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<Offset<T>>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">CreateVectorOfSortedTables</a>(</div> +<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>  Offset<T> *v, <span class="keywordtype">size_t</span> len) {</div> +<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>  std::sort(v, v + len, TableKeyComparator<T>(buf_));</div> +<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</a>(v, len);</div> +<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>  }</div> +<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span> <span class="comment"></span></div> +<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span> <span class="comment"> /// @brief Serialize an array of `table` offsets as a `vector` in the buffer</span></div> +<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span> <span class="comment"> /// in sorted order.</span></div> +<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span> <span class="comment"> /// @tparam T The data type that the offset refers to.</span></div> +<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span> <span class="comment"> /// @param[in] v An array of type `Offset<T>` that contains the `table`</span></div> +<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span> <span class="comment"> /// offsets to store in the buffer in sorted order.</span></div> +<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span> <span class="comment"> /// @return Returns a typed `Offset` into the serialized data indicating</span></div> +<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> <span class="comment"> /// where the vector is stored.</span></div> +<div class="line"><a name="l01200"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135"> 1200</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<Offset<T>>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">CreateVectorOfSortedTables</a>(</div> +<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  std::vector<Offset<T>> *v) {</div> +<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">CreateVectorOfSortedTables</a>(data(*v), v->size());</div> +<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>  }</div> +<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span> <span class="comment"></span></div> +<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span> <span class="comment"> /// @brief Specialized version of `CreateVector` for non-copying use cases.</span></div> +<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span> <span class="comment"> /// Write the data any time later to the returned buffer pointer `buf`.</span></div> +<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span> <span class="comment"> /// @param[in] len The number of elements to store in the `vector`.</span></div> +<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span> <span class="comment"> /// @param[in] elemsize The size of each element in the `vector`.</span></div> +<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span> <span class="comment"> /// @param[out] buf A pointer to a `uint8_t` pointer that can be</span></div> +<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span> <span class="comment"> /// written to at a later time to serialize the data into a `vector`</span></div> +<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span> <span class="comment"> /// in the buffer.</span></div> +<div class="line"><a name="l01212"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c"> 1212</a></span> <span class="comment"></span> uoffset_t <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c">CreateUninitializedVector</a>(<span class="keywordtype">size_t</span> len, <span class="keywordtype">size_t</span> elemsize,</div> +<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  uint8_t **buf) {</div> +<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  NotNested();</div> +<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  StartVector(len, elemsize);</div> +<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>  buf_.make_space(len * elemsize);</div> +<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>  <span class="keyword">auto</span> vec_start = <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>();</div> +<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  <span class="keyword">auto</span> vec_end = EndVector(len);</div> +<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>  *buf = buf_.data_at(vec_start);</div> +<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  <span class="keywordflow">return</span> vec_end;</div> +<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  }</div> +<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span> <span class="comment"></span></div> +<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span> <span class="comment"> /// @brief Specialized version of `CreateVector` for non-copying use cases.</span></div> +<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span> <span class="comment"> /// Write the data any time later to the returned buffer pointer `buf`.</span></div> +<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span> <span class="comment"> /// @tparam T The data type of the data that will be stored in the buffer</span></div> +<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span> <span class="comment"> /// as a `vector`.</span></div> +<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span> <span class="comment"> /// @param[in] len The number of elements to store in the `vector`.</span></div> +<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span> <span class="comment"> /// @param[out] buf A pointer to a pointer of type `T` that can be</span></div> +<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span> <span class="comment"> /// written to at a later time to serialize the data into a `vector`</span></div> +<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span> <span class="comment"> /// in the buffer.</span></div> +<div class="line"><a name="l01231"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50"> 1231</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> Offset<Vector<T>> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50">CreateUninitializedVector</a>(</div> +<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  <span class="keywordtype">size_t</span> len, T **buf) {</div> +<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  <span class="keywordflow">return</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c">CreateUninitializedVector</a>(len, <span class="keyword">sizeof</span>(T),</div> +<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  reinterpret_cast<uint8_t **>(buf));</div> +<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>  }</div> +<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span> <span class="comment"></span></div> +<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span> <span class="comment"> /// @brief The length of a FlatBuffer file header.</span></div> +<div class="line"><a name="l01238"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19"> 1238</a></span> <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">kFileIdentifierLength</a> = 4;</div> +<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span> <span class="comment"></span></div> +<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span> <span class="comment"> /// @brief Finish serializing a buffer by writing the root offset.</span></div> +<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span> <span class="comment"> /// @param[in] file_identifier If a `file_identifier` is given, the buffer</span></div> +<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span> <span class="comment"> /// will be prefixed with a standard FlatBuffers file header.</span></div> +<div class="line"><a name="l01243"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912"> 1243</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">Finish</a>(Offset<T> root,</div> +<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *file_identifier = <span class="keyword">nullptr</span>) {</div> +<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span> </div> +<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">Finish</a>(root.o, file_identifier, <span class="keyword">false</span>);</div> +<div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>  }</div> +<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span> <span class="comment"></span></div> +<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span> <span class="comment"> /// @brief Finish a buffer with a 32 bit size field pre-fixed (size of the</span></div> +<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span> <span class="comment"> /// buffer following the size field). These buffers are NOT compatible</span></div> +<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span> <span class="comment"> /// with standard buffers created by Finish, i.e. you can't call GetRoot</span></div> +<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span> <span class="comment"> /// on them, you have to use GetSizePrefixedRoot instead.</span></div> +<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span> <span class="comment"> /// All >32 bit quantities in this buffer will be aligned when the whole</span></div> +<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span> <span class="comment"> /// size pre-fixed buffer is aligned.</span></div> +<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span> <span class="comment"> /// These kinds of buffers are useful for creating a stream of FlatBuffers.</span></div> +<div class="line"><a name="l01256"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220"> 1256</a></span> <span class="comment"></span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220">FinishSizePrefixed</a>(Offset<T> root,</div> +<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <span class="keyword">const</span> <span class="keywordtype">char</span> *file_identifier = <span class="keyword">nullptr</span>) {</div> +<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">Finish</a>(root.o, file_identifier, <span class="keyword">true</span>);</div> +<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>  }</div> +<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span> </div> +<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  <span class="comment">// You shouldn't really be copying instances of this class.</span></div> +<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac72b54a75e0c329e0ce0b8fab758e256">FlatBufferBuilder</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &);</div> +<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &operator=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &);</div> <div class="line"><a name="l01265"></a><span class="lineno"> 1265</span> </div> -<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  <span class="keyword">struct </span>StringOffsetCompare {</div> -<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>  StringOffsetCompare(<span class="keyword">const</span> vector_downward &buf) : buf_(&buf) {}</div> -<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  <span class="keywordtype">bool</span> operator() (<span class="keyword">const</span> Offset<String> &a, <span class="keyword">const</span> Offset<String> &b)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>  <span class="keyword">auto</span> stra = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>String *<span class="keyword">></span>(buf_->data_at(a.o));</div> -<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>  <span class="keyword">auto</span> strb = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>String *<span class="keyword">></span>(buf_->data_at(b.o));</div> -<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>  <span class="keywordflow">return</span> strncmp(stra->c_str(), strb->c_str(),</div> -<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>  std::min(stra->size(), strb->size()) + 1) < 0;</div> -<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>  }</div> -<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  <span class="keyword">const</span> vector_downward *buf_;</div> -<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>  };</div> -<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span> </div> -<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>  <span class="comment">// For use with CreateSharedString. Instantiated on first use only.</span></div> -<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>  <span class="keyword">typedef</span> std::set<Offset<String>, StringOffsetCompare> StringOffsetMap;</div> -<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>  StringOffsetMap *string_pool;</div> -<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span> };<span class="comment"></span></div> -<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span> <span class="comment">/// @}</span></div> -<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span> <span class="comment"></span><span class="comment"></span></div> -<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span> <span class="comment">/// @cond FLATBUFFERS_INTERNAL</span></div> -<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span> <span class="comment"></span><span class="comment">// Helpers to get a typed pointer to the root object contained in the buffer.</span></div> -<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> T *GetMutableRoot(<span class="keywordtype">void</span> *buf) {</div> -<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>  EndianCheck();</div> -<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(<span class="keyword">reinterpret_cast<</span>uint8_t *<span class="keyword">></span>(buf) +</div> -<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>  EndianScalar(*reinterpret_cast<uoffset_t *>(buf)));</div> -<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span> }</div> -<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span> </div> -<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">const</span> T *GetRoot(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf) {</div> -<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  <span class="keywordflow">return</span> GetMutableRoot<T>(<span class="keyword">const_cast<</span><span class="keywordtype">void</span> *<span class="keyword">></span>(buf));</div> -<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span> }</div> -<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span> </div> -<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">const</span> T *GetSizePrefixedRoot(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf) {</div> -<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  <span class="keywordflow">return</span> GetRoot<T>(<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(buf) + <span class="keyword">sizeof</span>(uoffset_t));</div> -<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span> }</div> -<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span> <span class="comment"></span></div> -<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span> <span class="comment">/// Helpers to get a typed pointer to objects that are currently being built.</span></div> -<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span> <span class="comment">/// @warning Creating new objects will lead to reallocations and invalidates</span></div> -<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span> <span class="comment">/// the pointer!</span></div> -<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span> <span class="comment"></span><span class="keyword">template</span><<span class="keyword">typename</span> T> T *GetMutableTemporaryPointer(FlatBufferBuilder &fbb,</div> -<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  Offset<T> offset) {</div> -<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(fbb.GetCurrentBufferPointer() +</div> -<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>  fbb.GetSize() - offset.o);</div> -<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span> }</div> -<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span> </div> -<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">const</span> T *GetTemporaryPointer(FlatBufferBuilder &fbb,</div> -<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  Offset<T> offset) {</div> -<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>  <span class="keywordflow">return</span> GetMutableTemporaryPointer<T>(fbb, offset);</div> -<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span> }</div> -<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span> </div> -<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span> <span class="comment">// Helper to see if the identifier in a buffer has the expected value.</span></div> -<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> BufferHasIdentifier(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf, <span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div> -<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  <span class="keywordflow">return</span> strncmp(reinterpret_cast<const char *>(buf) + <span class="keyword">sizeof</span>(uoffset_t),</div> -<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  identifier, <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">FlatBufferBuilder::kFileIdentifierLength</a>) == 0;</div> -<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span> }</div> -<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span> </div> -<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span> <span class="comment">// Helper class to verify the integrity of a FlatBuffer</span></div> -<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span> <span class="keyword">class </span>Verifier FLATBUFFERS_FINAL_CLASS {</div> -<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>  <span class="keyword">public</span>:</div> -<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>  Verifier(<span class="keyword">const</span> uint8_t *buf, <span class="keywordtype">size_t</span> buf_len, <span class="keywordtype">size_t</span> _max_depth = 64,</div> -<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  <span class="keywordtype">size_t</span> _max_tables = 1000000)</div> -<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>  : buf_(buf), end_(buf + buf_len), depth_(0), max_depth_(_max_depth),</div> -<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>  num_tables_(0), max_tables_(_max_tables)</div> -<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>  #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</div> -<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  , upper_bound_(buf)</div> -<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>  #endif</div> -<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>  {}</div> -<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span> </div> -<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>  <span class="comment">// Central location where any verification failures register.</span></div> -<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>  <span class="keywordtype">bool</span> Check(<span class="keywordtype">bool</span> ok)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span> <span class="preprocessor"> #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE</span></div> -<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>  assert(ok);</div> -<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div> -<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  <span class="keywordflow">if</span> (!ok)</div> -<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>  upper_bound_ = buf_;</div> -<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>  <span class="keywordflow">return</span> ok;</div> -<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  }</div> -<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span> </div> -<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  <span class="comment">// Verify any range within the buffer.</span></div> -<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> <span class="keywordtype">void</span> *elem, <span class="keywordtype">size_t</span> elem_len)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div> -<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  <span class="keyword">auto</span> upper_bound = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(elem) + elem_len;</div> -<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  <span class="keywordflow">if</span> (upper_bound_ < upper_bound)</div> -<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  upper_bound_ = upper_bound;</div> -<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  <span class="keywordflow">return</span> Check(elem_len <= (<span class="keywordtype">size_t</span>) (end_ - buf_) &&</div> -<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  elem >= buf_ &&</div> -<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>  elem <= end_ - elem_len);</div> -<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  }</div> -<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span> </div> -<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  <span class="comment">// Verify a range indicated by sizeof(T).</span></div> -<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> <span class="keywordtype">void</span> *elem)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  <span class="keywordflow">return</span> Verify(elem, <span class="keyword">sizeof</span>(T));</div> -<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  }</div> -<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span> </div> -<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  <span class="comment">// Verify a pointer (may be NULL) of a table type.</span></div> -<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyTable(<span class="keyword">const</span> T *table) {</div> -<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  <span class="keywordflow">return</span> !table || table->Verify(*<span class="keyword">this</span>);</div> -<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>  }</div> -<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span> </div> -<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>  <span class="comment">// Verify a pointer (may be NULL) of any vector type.</span></div> -<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> Vector<T> *vec)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  <span class="keyword">const</span> uint8_t *end;</div> -<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  <span class="keywordflow">return</span> !vec ||</div> -<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  VerifyVector(reinterpret_cast<const uint8_t *>(vec), <span class="keyword">sizeof</span>(T),</div> -<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  &end);</div> -<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  }</div> -<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span> </div> -<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  <span class="comment">// Verify a pointer (may be NULL) of a vector to struct.</span></div> -<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> Vector<const T *> *vec)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  <span class="keywordflow">return</span> Verify(<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>Vector<T> *<span class="keyword">></span>(vec));</div> -<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  }</div> -<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span> </div> -<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  <span class="comment">// Verify a pointer (may be NULL) to string.</span></div> -<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> String *str)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>  <span class="keyword">const</span> uint8_t *end;</div> -<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  <span class="keywordflow">return</span> !str ||</div> -<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  (VerifyVector(reinterpret_cast<const uint8_t *>(str), 1, &end) &&</div> -<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  Verify(end, 1) && <span class="comment">// Must have terminator</span></div> -<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  Check(*end == <span class="charliteral">'\0'</span>)); <span class="comment">// Terminating byte must be 0.</span></div> -<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  }</div> -<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span> </div> -<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  <span class="comment">// Common code between vectors and strings.</span></div> -<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  <span class="keywordtype">bool</span> VerifyVector(<span class="keyword">const</span> uint8_t *vec, <span class="keywordtype">size_t</span> elem_size,</div> -<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  <span class="keyword">const</span> uint8_t **end)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>  <span class="comment">// Check we can read the size field.</span></div> -<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>  <span class="keywordflow">if</span> (!Verify<uoffset_t>(vec)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  <span class="comment">// Check the whole array. If this is a string, the byte past the array</span></div> -<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  <span class="comment">// must be 0.</span></div> -<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>  <span class="keyword">auto</span> size = ReadScalar<uoffset_t>(vec);</div> -<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  <span class="keyword">auto</span> max_elems = FLATBUFFERS_MAX_BUFFER_SIZE / elem_size;</div> -<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  <span class="keywordflow">if</span> (!Check(size < max_elems))</div> -<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// Protect against byte_size overflowing.</span></div> -<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  <span class="keyword">auto</span> byte_size = <span class="keyword">sizeof</span>(size) + elem_size * size;</div> -<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>  *end = vec + byte_size;</div> -<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>  <span class="keywordflow">return</span> Verify(vec, byte_size);</div> -<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  }</div> -<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span> </div> -<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>  <span class="comment">// Special case for string contents, after the above has been called.</span></div> -<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>  <span class="keywordtype">bool</span> VerifyVectorOfStrings(<span class="keyword">const</span> Vector<Offset<String>> *vec)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>  <span class="keywordflow">if</span> (vec) {</div> -<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>  <span class="keywordflow">for</span> (uoffset_t i = 0; i < vec->size(); i++) {</div> -<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>  <span class="keywordflow">if</span> (!Verify(vec->Get(i))) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  }</div> -<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  }</div> -<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  }</div> -<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span> </div> -<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>  <span class="comment">// Special case for table contents, after the above has been called.</span></div> -<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyVectorOfTables(<span class="keyword">const</span> Vector<Offset<T>> *vec) {</div> -<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  <span class="keywordflow">if</span> (vec) {</div> -<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>  <span class="keywordflow">for</span> (uoffset_t i = 0; i < vec->size(); i++) {</div> -<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  <span class="keywordflow">if</span> (!vec->Get(i)->Verify(*<span class="keyword">this</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>  }</div> -<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>  }</div> -<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">Finish</a>(uoffset_t root, <span class="keyword">const</span> <span class="keywordtype">char</span> *file_identifier, <span class="keywordtype">bool</span> size_prefix) {</div> +<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>  NotNested();</div> +<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  <span class="comment">// This will cause the whole buffer to be aligned.</span></div> +<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>  PreAlign((size_prefix ? <span class="keyword">sizeof</span>(uoffset_t) : 0) +</div> +<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>  <span class="keyword">sizeof</span>(uoffset_t) +</div> +<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>  (file_identifier ? <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">kFileIdentifierLength</a> : 0),</div> +<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>  minalign_);</div> +<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>  <span class="keywordflow">if</span> (file_identifier) {</div> +<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  assert(strlen(file_identifier) == <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">kFileIdentifierLength</a>);</div> +<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>  PushBytes(reinterpret_cast<const uint8_t *>(file_identifier),</div> +<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">kFileIdentifierLength</a>);</div> +<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>  }</div> +<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>  PushElement(ReferTo(root)); <span class="comment">// Location of root.</span></div> +<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>  <span class="keywordflow">if</span> (size_prefix) {</div> +<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>  PushElement(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">GetSize</a>());</div> +<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>  }</div> +<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  finished = <span class="keyword">true</span>;</div> +<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  }</div> +<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span> </div> +<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>  <span class="keyword">struct </span>FieldLoc {</div> +<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>  uoffset_t off;</div> +<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>  voffset_t id;</div> +<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>  };</div> +<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span> </div> +<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>  simple_allocator default_allocator;</div> +<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span> </div> +<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  vector_downward buf_;</div> +<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span> </div> +<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  <span class="comment">// Accumulating offsets of table members while it is being built.</span></div> +<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  std::vector<FieldLoc> offsetbuf_;</div> +<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span> </div> +<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  <span class="comment">// Ensure objects are not nested.</span></div> +<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  <span class="keywordtype">bool</span> nested;</div> +<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span> </div> +<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>  <span class="comment">// Ensure the buffer is finished before it is being accessed.</span></div> +<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  <span class="keywordtype">bool</span> finished;</div> +<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span> </div> +<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  std::vector<uoffset_t> vtables_; <span class="comment">// todo: Could make this into a map?</span></div> +<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span> </div> +<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>  <span class="keywordtype">size_t</span> minalign_;</div> +<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span> </div> +<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  <span class="keywordtype">bool</span> force_defaults_; <span class="comment">// Serialize values equal to their defaults anyway.</span></div> +<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span> </div> +<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  <span class="keywordtype">bool</span> dedup_vtables_;</div> +<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span> </div> +<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  <span class="keyword">struct </span>StringOffsetCompare {</div> +<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  StringOffsetCompare(<span class="keyword">const</span> vector_downward &buf) : buf_(&buf) {}</div> +<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  <span class="keywordtype">bool</span> operator() (<span class="keyword">const</span> Offset<String> &a, <span class="keyword">const</span> Offset<String> &b)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>  <span class="keyword">auto</span> stra = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>String *<span class="keyword">></span>(buf_->data_at(a.o));</div> +<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  <span class="keyword">auto</span> strb = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>String *<span class="keyword">></span>(buf_->data_at(b.o));</div> +<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  <span class="keywordflow">return</span> strncmp(stra->c_str(), strb->c_str(),</div> +<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  std::min(stra->size(), strb->size()) + 1) < 0;</div> +<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  }</div> +<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  <span class="keyword">const</span> vector_downward *buf_;</div> +<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  };</div> +<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span> </div> +<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>  <span class="comment">// For use with CreateSharedString. Instantiated on first use only.</span></div> +<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  <span class="keyword">typedef</span> std::set<Offset<String>, StringOffsetCompare> StringOffsetMap;</div> +<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>  StringOffsetMap *string_pool;</div> +<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span> };<span class="comment"></span></div> +<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span> <span class="comment">/// @}</span></div> +<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span> <span class="comment"></span><span class="comment"></span></div> +<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span> <span class="comment">/// @cond FLATBUFFERS_INTERNAL</span></div> +<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span> <span class="comment"></span><span class="comment">// Helpers to get a typed pointer to the root object contained in the buffer.</span></div> +<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> T *GetMutableRoot(<span class="keywordtype">void</span> *buf) {</div> +<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>  EndianCheck();</div> +<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(<span class="keyword">reinterpret_cast<</span>uint8_t *<span class="keyword">></span>(buf) +</div> +<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>  EndianScalar(*reinterpret_cast<uoffset_t *>(buf)));</div> +<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span> }</div> +<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span> </div> +<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">const</span> T *GetRoot(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf) {</div> +<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  <span class="keywordflow">return</span> GetMutableRoot<T>(<span class="keyword">const_cast<</span><span class="keywordtype">void</span> *<span class="keyword">></span>(buf));</div> +<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span> }</div> +<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span> </div> +<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">const</span> T *GetSizePrefixedRoot(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf) {</div> +<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  <span class="keywordflow">return</span> GetRoot<T>(<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(buf) + <span class="keyword">sizeof</span>(uoffset_t));</div> +<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span> }</div> +<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span> <span class="comment"></span></div> +<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span> <span class="comment">/// Helpers to get a typed pointer to objects that are currently being built.</span></div> +<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span> <span class="comment">/// @warning Creating new objects will lead to reallocations and invalidates</span></div> +<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span> <span class="comment">/// the pointer!</span></div> +<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span> <span class="comment"></span><span class="keyword">template</span><<span class="keyword">typename</span> T> T *GetMutableTemporaryPointer(FlatBufferBuilder &fbb,</div> +<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  Offset<T> offset) {</div> +<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T *<span class="keyword">></span>(fbb.GetCurrentBufferPointer() +</div> +<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  fbb.GetSize() - offset.o);</div> +<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span> }</div> +<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span> </div> +<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">const</span> T *GetTemporaryPointer(FlatBufferBuilder &fbb,</div> +<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  Offset<T> offset) {</div> +<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  <span class="keywordflow">return</span> GetMutableTemporaryPointer<T>(fbb, offset);</div> +<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span> }</div> +<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span> </div> +<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span> <span class="comment">// Helper to see if the identifier in a buffer has the expected value.</span></div> +<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> BufferHasIdentifier(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf, <span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div> +<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  <span class="keywordflow">return</span> strncmp(reinterpret_cast<const char *>(buf) + <span class="keyword">sizeof</span>(uoffset_t),</div> +<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  identifier, <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">FlatBufferBuilder::kFileIdentifierLength</a>) == 0;</div> +<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span> }</div> +<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span> </div> +<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span> <span class="comment">// Helper class to verify the integrity of a FlatBuffer</span></div> +<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span> <span class="keyword">class </span>Verifier FLATBUFFERS_FINAL_CLASS {</div> +<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>  <span class="keyword">public</span>:</div> +<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  Verifier(<span class="keyword">const</span> uint8_t *buf, <span class="keywordtype">size_t</span> buf_len, <span class="keywordtype">size_t</span> _max_depth = 64,</div> +<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  <span class="keywordtype">size_t</span> _max_tables = 1000000)</div> +<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  : buf_(buf), end_(buf + buf_len), depth_(0), max_depth_(_max_depth),</div> +<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  num_tables_(0), max_tables_(_max_tables)</div> +<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</div> +<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  , upper_bound_(buf)</div> +<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  #endif</div> +<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  {}</div> +<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span> </div> +<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  <span class="comment">// Central location where any verification failures register.</span></div> +<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  <span class="keywordtype">bool</span> Check(<span class="keywordtype">bool</span> ok)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span> <span class="preprocessor"> #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE</span></div> +<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  assert(ok);</div> +<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div> +<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  <span class="keywordflow">if</span> (!ok)</div> +<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  upper_bound_ = buf_;</div> +<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  <span class="keywordflow">return</span> ok;</div> +<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  }</div> +<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span> </div> +<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  <span class="comment">// Verify any range within the buffer.</span></div> +<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> <span class="keywordtype">void</span> *elem, <span class="keywordtype">size_t</span> elem_len)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div> +<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>  <span class="keyword">auto</span> upper_bound = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(elem) + elem_len;</div> +<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  <span class="keywordflow">if</span> (upper_bound_ < upper_bound)</div> +<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  upper_bound_ = upper_bound;</div> +<div class="line"><a name="l01394"></a><span class="lineno"> 1394</span> <span class="preprocessor"> #endif</span></div> +<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  <span class="keywordflow">return</span> Check(elem_len <= (<span class="keywordtype">size_t</span>) (end_ - buf_) &&</div> +<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  elem >= buf_ &&</div> +<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  elem <= end_ - elem_len);</div> +<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  }</div> +<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span> </div> +<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>  <span class="comment">// Verify a range indicated by sizeof(T).</span></div> +<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> <span class="keywordtype">void</span> *elem)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>  <span class="keywordflow">return</span> Verify(elem, <span class="keyword">sizeof</span>(T));</div> +<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>  }</div> +<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span> </div> +<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>  <span class="comment">// Verify a pointer (may be NULL) of a table type.</span></div> +<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyTable(<span class="keyword">const</span> T *table) {</div> +<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>  <span class="keywordflow">return</span> !table || table->Verify(*<span class="keyword">this</span>);</div> +<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  }</div> +<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span> </div> +<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>  <span class="comment">// Verify a pointer (may be NULL) of any vector type.</span></div> +<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> Vector<T> *vec)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>  <span class="keyword">const</span> uint8_t *end;</div> +<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>  <span class="keywordflow">return</span> !vec ||</div> +<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  VerifyVector(reinterpret_cast<const uint8_t *>(vec), <span class="keyword">sizeof</span>(T),</div> +<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  &end);</div> +<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>  }</div> +<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span> </div> +<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>  <span class="comment">// Verify a pointer (may be NULL) of a vector to struct.</span></div> +<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> Vector<const T *> *vec)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>  <span class="keywordflow">return</span> Verify(<span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>Vector<T> *<span class="keyword">></span>(vec));</div> <div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>  }</div> <div class="line"><a name="l01422"></a><span class="lineno"> 1422</span> </div> -<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyBufferFromStart(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier,</div> -<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>  <span class="keyword">const</span> uint8_t *start) {</div> -<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>  <span class="keywordflow">if</span> (identifier &&</div> -<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  (<span class="keywordtype">size_t</span>(end_ - start) < 2 * <span class="keyword">sizeof</span>(flatbuffers::uoffset_t) ||</div> -<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  !BufferHasIdentifier(start, identifier))) {</div> -<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  }</div> -<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span> </div> -<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>  <span class="comment">// Call T::Verify, which must be in the generated code for this type.</span></div> -<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  <span class="keywordflow">return</span> Verify<uoffset_t>(start) &&</div> -<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  reinterpret_cast<const T *>(start + ReadScalar<uoffset_t>(start))-></div> -<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  Verify(*<span class="keyword">this</span>)</div> -<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>  <span class="preprocessor">#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div> -<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>  && GetComputedSize()</div> -<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>  <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  ;</div> -<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  }</div> -<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span> </div> -<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>  <span class="comment">// Verify this whole buffer, starting with root type T.</span></div> -<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyBuffer(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div> -<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>  <span class="keywordflow">return</span> VerifyBufferFromStart<T>(identifier, buf_);</div> -<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  }</div> -<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span> </div> -<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifySizePrefixedBuffer(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div> -<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>  <span class="keywordflow">return</span> Verify<uoffset_t>(buf_) &&</div> -<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>  ReadScalar<uoffset_t>(buf_) == end_ - buf_ - <span class="keyword">sizeof</span>(uoffset_t) &&</div> -<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  VerifyBufferFromStart<T>(identifier, buf_ + <span class="keyword">sizeof</span>(uoffset_t));</div> -<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  }</div> -<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span> </div> -<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  <span class="comment">// Called at the start of a table to increase counters measuring data</span></div> -<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  <span class="comment">// structure depth and amount, and possibly bails out with false if</span></div> -<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>  <span class="comment">// limits set by the constructor have been hit. Needs to be balanced</span></div> -<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>  <span class="comment">// with EndTable().</span></div> -<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>  <span class="keywordtype">bool</span> VerifyComplexity() {</div> -<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>  depth_++;</div> -<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>  num_tables_++;</div> -<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>  <span class="keywordflow">return</span> Check(depth_ <= max_depth_ && num_tables_ <= max_tables_);</div> -<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  }</div> -<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span> </div> -<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>  <span class="comment">// Called at the end of a table to pop the depth count.</span></div> -<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>  <span class="keywordtype">bool</span> EndTable() {</div> -<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>  depth_--;</div> +<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>  <span class="comment">// Verify a pointer (may be NULL) to string.</span></div> +<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>  <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> String *str)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>  <span class="keyword">const</span> uint8_t *end;</div> +<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  <span class="keywordflow">return</span> !str ||</div> +<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  (VerifyVector(reinterpret_cast<const uint8_t *>(str), 1, &end) &&</div> +<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  Verify(end, 1) && <span class="comment">// Must have terminator</span></div> +<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  Check(*end == <span class="charliteral">'\0'</span>)); <span class="comment">// Terminating byte must be 0.</span></div> +<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  }</div> +<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span> </div> +<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  <span class="comment">// Common code between vectors and strings.</span></div> +<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  <span class="keywordtype">bool</span> VerifyVector(<span class="keyword">const</span> uint8_t *vec, <span class="keywordtype">size_t</span> elem_size,</div> +<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  <span class="keyword">const</span> uint8_t **end)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>  <span class="comment">// Check we can read the size field.</span></div> +<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>  <span class="keywordflow">if</span> (!Verify<uoffset_t>(vec)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>  <span class="comment">// Check the whole array. If this is a string, the byte past the array</span></div> +<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  <span class="comment">// must be 0.</span></div> +<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  <span class="keyword">auto</span> size = ReadScalar<uoffset_t>(vec);</div> +<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  <span class="keyword">auto</span> max_elems = FLATBUFFERS_MAX_BUFFER_SIZE / elem_size;</div> +<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>  <span class="keywordflow">if</span> (!Check(size < max_elems))</div> +<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// Protect against byte_size overflowing.</span></div> +<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>  <span class="keyword">auto</span> byte_size = <span class="keyword">sizeof</span>(size) + elem_size * size;</div> +<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  *end = vec + byte_size;</div> +<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>  <span class="keywordflow">return</span> Verify(vec, byte_size);</div> +<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>  }</div> +<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span> </div> +<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>  <span class="comment">// Special case for string contents, after the above has been called.</span></div> +<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  <span class="keywordtype">bool</span> VerifyVectorOfStrings(<span class="keyword">const</span> Vector<Offset<String>> *vec)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  <span class="keywordflow">if</span> (vec) {</div> +<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>  <span class="keywordflow">for</span> (uoffset_t i = 0; i < vec->size(); i++) {</div> +<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  <span class="keywordflow">if</span> (!Verify(vec->Get(i))) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  }</div> +<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>  }</div> +<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>  }</div> +<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span> </div> +<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>  <span class="comment">// Special case for table contents, after the above has been called.</span></div> +<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyVectorOfTables(<span class="keyword">const</span> Vector<Offset<T>> *vec) {</div> +<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  <span class="keywordflow">if</span> (vec) {</div> +<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>  <span class="keywordflow">for</span> (uoffset_t i = 0; i < vec->size(); i++) {</div> +<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>  <span class="keywordflow">if</span> (!vec->Get(i)->Verify(*<span class="keyword">this</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>  }</div> +<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>  }</div> <div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> <div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>  }</div> <div class="line"><a name="l01467"></a><span class="lineno"> 1467</span> </div> -<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div> -<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  <span class="comment">// Returns the message size in bytes</span></div> -<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  <span class="keywordtype">size_t</span> GetComputedSize()<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  uintptr_t size = upper_bound_ - buf_;</div> -<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  <span class="comment">// Align the size to uoffset_t</span></div> -<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>  size = (size - 1 + <span class="keyword">sizeof</span>(uoffset_t)) & ~(<span class="keyword">sizeof</span>(uoffset_t) - 1);</div> -<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>  <span class="keywordflow">return</span> (buf_ + size > end_) ? 0 : size;</div> -<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>  }</div> -<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span> <span class="preprocessor"> #endif</span></div> -<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span> </div> -<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>  <span class="keyword">const</span> uint8_t *buf_;</div> -<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  <span class="keyword">const</span> uint8_t *end_;</div> -<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  <span class="keywordtype">size_t</span> depth_;</div> -<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>  <span class="keywordtype">size_t</span> max_depth_;</div> -<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>  <span class="keywordtype">size_t</span> num_tables_;</div> -<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  <span class="keywordtype">size_t</span> max_tables_;</div> -<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span> <span class="preprocessor">#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div> -<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  <span class="keyword">mutable</span> <span class="keyword">const</span> uint8_t *upper_bound_;</div> -<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span> };</div> -<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span> </div> -<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span> <span class="comment">// Convenient way to bundle a buffer and its length, to pass it around</span></div> -<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span> <span class="comment">// typed by its root.</span></div> -<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span> <span class="comment">// A BufferRef does not own its buffer.</span></div> -<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span> <span class="keyword">struct </span>BufferRefBase {}; <span class="comment">// for std::is_base_of</span></div> -<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>BufferRef : BufferRefBase {</div> -<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  BufferRef() : buf(nullptr), len(0), must_free(false) {}</div> -<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>  BufferRef(uint8_t *_buf, uoffset_t _len)</div> -<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>  : buf(_buf), len(_len), must_free(false) {}</div> -<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span> </div> -<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  ~BufferRef() { <span class="keywordflow">if</span> (must_free) free(buf); }</div> -<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span> </div> -<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>  <span class="keyword">const</span> T *GetRoot()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> flatbuffers::GetRoot<T>(buf); }</div> -<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span> </div> -<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>  <span class="keywordtype">bool</span> Verify() {</div> -<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>  Verifier verifier(buf, len);</div> -<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>  <span class="keywordflow">return</span> verifier.VerifyBuffer<T>(<span class="keyword">nullptr</span>);</div> -<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>  }</div> -<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span> </div> -<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>  uint8_t *buf;</div> -<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>  uoffset_t len;</div> -<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>  <span class="keywordtype">bool</span> must_free;</div> -<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span> };</div> +<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyBufferFromStart(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier,</div> +<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  <span class="keyword">const</span> uint8_t *start) {</div> +<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  <span class="keywordflow">if</span> (identifier &&</div> +<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  (<span class="keywordtype">size_t</span>(end_ - start) < 2 * <span class="keyword">sizeof</span>(flatbuffers::uoffset_t) ||</div> +<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  !BufferHasIdentifier(start, identifier))) {</div> +<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>  }</div> +<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span> </div> +<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>  <span class="comment">// Call T::Verify, which must be in the generated code for this type.</span></div> +<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  <span class="keywordflow">return</span> Verify<uoffset_t>(start) &&</div> +<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  reinterpret_cast<const T *>(start + ReadScalar<uoffset_t>(start))-></div> +<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>  Verify(*<span class="keyword">this</span>)</div> +<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  <span class="preprocessor">#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div> +<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  && GetComputedSize()</div> +<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>  <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>  ;</div> +<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  }</div> +<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span> </div> +<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  <span class="comment">// Verify this whole buffer, starting with root type T.</span></div> +<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyBuffer(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div> +<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>  <span class="keywordflow">return</span> VerifyBufferFromStart<T>(identifier, buf_);</div> +<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>  }</div> +<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span> </div> +<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifySizePrefixedBuffer(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div> +<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>  <span class="keywordflow">return</span> Verify<uoffset_t>(buf_) &&</div> +<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>  ReadScalar<uoffset_t>(buf_) == end_ - buf_ - <span class="keyword">sizeof</span>(uoffset_t) &&</div> +<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>  VerifyBufferFromStart<T>(identifier, buf_ + <span class="keyword">sizeof</span>(uoffset_t));</div> +<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  }</div> +<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span> </div> +<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>  <span class="comment">// Called at the start of a table to increase counters measuring data</span></div> +<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>  <span class="comment">// structure depth and amount, and possibly bails out with false if</span></div> +<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  <span class="comment">// limits set by the constructor have been hit. Needs to be balanced</span></div> +<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>  <span class="comment">// with EndTable().</span></div> +<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>  <span class="keywordtype">bool</span> VerifyComplexity() {</div> +<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>  depth_++;</div> +<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>  num_tables_++;</div> +<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>  <span class="keywordflow">return</span> Check(depth_ <= max_depth_ && num_tables_ <= max_tables_);</div> +<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>  }</div> +<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span> </div> +<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>  <span class="comment">// Called at the end of a table to pop the depth count.</span></div> +<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>  <span class="keywordtype">bool</span> EndTable() {</div> +<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>  depth_--;</div> +<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  }</div> <div class="line"><a name="l01512"></a><span class="lineno"> 1512</span> </div> -<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span> <span class="comment">// "structs" are flat structures that do not have an offset table, thus</span></div> -<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span> <span class="comment">// always have all members present and do not support forwards/backwards</span></div> -<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span> <span class="comment">// compatible extensions.</span></div> -<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span> </div> -<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span> <span class="keyword">class </span>Struct FLATBUFFERS_FINAL_CLASS {</div> -<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>  <span class="keyword">public</span>:</div> -<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T GetField(uoffset_t o)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>  <span class="keywordflow">return</span> ReadScalar<T>(&data_[o]);</div> -<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>  }</div> +<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span> <span class="preprocessor"> #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div> +<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>  <span class="comment">// Returns the message size in bytes</span></div> +<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>  <span class="keywordtype">size_t</span> GetComputedSize()<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>  uintptr_t size = upper_bound_ - buf_;</div> +<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>  <span class="comment">// Align the size to uoffset_t</span></div> +<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>  size = (size - 1 + <span class="keyword">sizeof</span>(uoffset_t)) & ~(<span class="keyword">sizeof</span>(uoffset_t) - 1);</div> +<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>  <span class="keywordflow">return</span> (buf_ + size > end_) ? 0 : size;</div> +<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>  }</div> +<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span> <span class="preprocessor"> #endif</span></div> <div class="line"><a name="l01522"></a><span class="lineno"> 1522</span> </div> -<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T GetStruct(uoffset_t o)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T<span class="keyword">></span>(&data_[o]);</div> -<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>  }</div> -<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span> </div> -<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>  <span class="keyword">const</span> uint8_t *GetAddressOf(uoffset_t o)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &data_[o]; }</div> -<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  uint8_t *GetAddressOf(uoffset_t o) { <span class="keywordflow">return</span> &data_[o]; }</div> -<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span> </div> -<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>  uint8_t data_[1];</div> -<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span> };</div> -<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span> </div> -<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span> <span class="comment">// "tables" use an offset table (possibly shared) that allows fields to be</span></div> -<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span> <span class="comment">// omitted and added at will, but uses an extra indirection to read.</span></div> -<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span> <span class="keyword">class </span>Table {</div> -<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>  <span class="keyword">public</span>:</div> -<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>  <span class="keyword">const</span> uint8_t *GetVTable()<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>  <span class="keywordflow">return</span> data_ - ReadScalar<soffset_t>(data_);</div> -<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>  }</div> -<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span> </div> -<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>  <span class="comment">// This gets the field offset for any of the functions below it, or 0</span></div> -<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>  <span class="comment">// if the field was not present.</span></div> -<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>  voffset_t GetOptionalFieldOffset(voffset_t field)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>  <span class="comment">// The vtable offset is always at the start.</span></div> -<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>  <span class="keyword">auto</span> vtable = GetVTable();</div> -<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>  <span class="comment">// The first element is the size of the vtable (fields + type id + itself).</span></div> -<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>  <span class="keyword">auto</span> vtsize = ReadScalar<voffset_t>(vtable);</div> -<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>  <span class="comment">// If the field we're accessing is outside the vtable, we're reading older</span></div> -<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>  <span class="comment">// data, so it's the same as if the offset was 0 (not present).</span></div> -<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>  <span class="keywordflow">return</span> field < vtsize ? ReadScalar<voffset_t>(vtable + field) : 0;</div> -<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>  }</div> -<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span> </div> -<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T GetField(voffset_t field, T defaultval)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> -<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>  <span class="keywordflow">return</span> field_offset ? ReadScalar<T>(data_ + field_offset) : defaultval;</div> -<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>  }</div> -<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span> </div> -<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>  <span class="keyword">template</span><<span class="keyword">typename</span> P> P GetPointer(voffset_t field) {</div> -<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> -<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>  <span class="keyword">auto</span> p = data_ + field_offset;</div> -<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>  <span class="keywordflow">return</span> field_offset</div> -<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>  ? <span class="keyword">reinterpret_cast<</span>P<span class="keyword">></span>(p + ReadScalar<uoffset_t>(p))</div> -<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>  : nullptr;</div> -<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>  }</div> -<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>  <span class="keyword">template</span><<span class="keyword">typename</span> P> P GetPointer(voffset_t field)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>Table *<span class="keyword">></span>(<span class="keyword">this</span>)->GetPointer<P>(field);</div> -<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>  }</div> -<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span> </div> -<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>  <span class="keyword">template</span><<span class="keyword">typename</span> P> P GetStruct(voffset_t field)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> -<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>  <span class="keyword">auto</span> p = <span class="keyword">const_cast<</span>uint8_t *<span class="keyword">></span>(data_ + field_offset);</div> -<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>  <span class="keywordflow">return</span> field_offset ? <span class="keyword">reinterpret_cast<</span>P<span class="keyword">></span>(p) : <span class="keyword">nullptr</span>;</div> -<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>  }</div> -<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span> </div> -<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> SetField(voffset_t field, T val) {</div> -<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> -<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>  <span class="keywordflow">if</span> (!field_offset) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>  WriteScalar(data_ + field_offset, val);</div> -<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>  }</div> -<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span> </div> -<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>  <span class="keywordtype">bool</span> SetPointer(voffset_t field, <span class="keyword">const</span> uint8_t *val) {</div> -<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> -<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>  <span class="keywordflow">if</span> (!field_offset) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>  WriteScalar(data_ + field_offset,</div> -<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>  static_cast<uoffset_t>(val - (data_ + field_offset)));</div> -<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> -<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>  }</div> -<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span> </div> -<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>  uint8_t *GetAddressOf(voffset_t field) {</div> -<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> -<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>  <span class="keywordflow">return</span> field_offset ? data_ + field_offset : <span class="keyword">nullptr</span>;</div> -<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>  }</div> -<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>  <span class="keyword">const</span> uint8_t *GetAddressOf(voffset_t field)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>Table *<span class="keyword">></span>(<span class="keyword">this</span>)->GetAddressOf(field);</div> +<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  <span class="keyword">const</span> uint8_t *buf_;</div> +<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>  <span class="keyword">const</span> uint8_t *end_;</div> +<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>  <span class="keywordtype">size_t</span> depth_;</div> +<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>  <span class="keywordtype">size_t</span> max_depth_;</div> +<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  <span class="keywordtype">size_t</span> num_tables_;</div> +<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>  <span class="keywordtype">size_t</span> max_tables_;</div> +<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span> <span class="preprocessor">#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div> +<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>  <span class="keyword">mutable</span> <span class="keyword">const</span> uint8_t *upper_bound_;</div> +<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span> };</div> +<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span> </div> +<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span> <span class="comment">// Convenient way to bundle a buffer and its length, to pass it around</span></div> +<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span> <span class="comment">// typed by its root.</span></div> +<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span> <span class="comment">// A BufferRef does not own its buffer.</span></div> +<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span> <span class="keyword">struct </span>BufferRefBase {}; <span class="comment">// for std::is_base_of</span></div> +<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>BufferRef : BufferRefBase {</div> +<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>  BufferRef() : buf(nullptr), len(0), must_free(false) {}</div> +<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>  BufferRef(uint8_t *_buf, uoffset_t _len)</div> +<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>  : buf(_buf), len(_len), must_free(false) {}</div> +<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span> </div> +<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>  ~BufferRef() { <span class="keywordflow">if</span> (must_free) free(buf); }</div> +<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span> </div> +<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>  <span class="keyword">const</span> T *GetRoot()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> flatbuffers::GetRoot<T>(buf); }</div> +<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span> </div> +<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>  <span class="keywordtype">bool</span> Verify() {</div> +<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>  Verifier verifier(buf, len);</div> +<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>  <span class="keywordflow">return</span> verifier.VerifyBuffer<T>(<span class="keyword">nullptr</span>);</div> +<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>  }</div> +<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span> </div> +<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>  uint8_t *buf;</div> +<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>  uoffset_t len;</div> +<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>  <span class="keywordtype">bool</span> must_free;</div> +<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span> };</div> +<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span> </div> +<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span> <span class="comment">// "structs" are flat structures that do not have an offset table, thus</span></div> +<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span> <span class="comment">// always have all members present and do not support forwards/backwards</span></div> +<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span> <span class="comment">// compatible extensions.</span></div> +<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span> </div> +<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span> <span class="keyword">class </span>Struct FLATBUFFERS_FINAL_CLASS {</div> +<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>  <span class="keyword">public</span>:</div> +<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T GetField(uoffset_t o)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>  <span class="keywordflow">return</span> ReadScalar<T>(&data_[o]);</div> +<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>  }</div> +<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span> </div> +<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T GetStruct(uoffset_t o)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span>T<span class="keyword">></span>(&data_[o]);</div> +<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>  }</div> +<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span> </div> +<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>  <span class="keyword">const</span> uint8_t *GetAddressOf(uoffset_t o)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &data_[o]; }</div> +<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>  uint8_t *GetAddressOf(uoffset_t o) { <span class="keywordflow">return</span> &data_[o]; }</div> +<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span> </div> +<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>  uint8_t data_[1];</div> +<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span> };</div> +<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span> </div> +<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span> <span class="comment">// "tables" use an offset table (possibly shared) that allows fields to be</span></div> +<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span> <span class="comment">// omitted and added at will, but uses an extra indirection to read.</span></div> +<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span> <span class="keyword">class </span>Table {</div> +<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>  <span class="keyword">public</span>:</div> +<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>  <span class="keyword">const</span> uint8_t *GetVTable()<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>  <span class="keywordflow">return</span> data_ - ReadScalar<soffset_t>(data_);</div> +<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>  }</div> +<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span> </div> +<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>  <span class="comment">// This gets the field offset for any of the functions below it, or 0</span></div> +<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>  <span class="comment">// if the field was not present.</span></div> +<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>  voffset_t GetOptionalFieldOffset(voffset_t field)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>  <span class="comment">// The vtable offset is always at the start.</span></div> +<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>  <span class="keyword">auto</span> vtable = GetVTable();</div> +<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>  <span class="comment">// The first element is the size of the vtable (fields + type id + itself).</span></div> +<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>  <span class="keyword">auto</span> vtsize = ReadScalar<voffset_t>(vtable);</div> +<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>  <span class="comment">// If the field we're accessing is outside the vtable, we're reading older</span></div> +<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>  <span class="comment">// data, so it's the same as if the offset was 0 (not present).</span></div> +<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>  <span class="keywordflow">return</span> field < vtsize ? ReadScalar<voffset_t>(vtable + field) : 0;</div> <div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>  }</div> <div class="line"><a name="l01598"></a><span class="lineno"> 1598</span> </div> -<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>  <span class="keywordtype">bool</span> CheckField(voffset_t field)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  <span class="keywordflow">return</span> GetOptionalFieldOffset(field) != 0;</div> -<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  }</div> -<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span> </div> -<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>  <span class="comment">// Verify the vtable of this table.</span></div> -<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  <span class="comment">// Call this once per table, followed by VerifyField once per field.</span></div> -<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  <span class="keywordtype">bool</span> VerifyTableStart(Verifier &verifier)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  <span class="comment">// Check the vtable offset.</span></div> -<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  <span class="keywordflow">if</span> (!verifier.Verify<soffset_t>(data_)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> -<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  <span class="keyword">auto</span> vtable = GetVTable();</div> -<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  <span class="comment">// Check the vtable size field, then check vtable fits in its entirety.</span></div> -<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>  <span class="keywordflow">return</span> verifier.VerifyComplexity() &&</div> -<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>  verifier.Verify<voffset_t>(vtable) &&</div> -<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>  (ReadScalar<voffset_t>(vtable) & (<span class="keyword">sizeof</span>(voffset_t) - 1)) == 0 &&</div> -<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>  verifier.Verify(vtable, ReadScalar<voffset_t>(vtable));</div> -<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>  }</div> -<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span> </div> -<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>  <span class="comment">// Verify a particular field.</span></div> -<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyField(<span class="keyword">const</span> Verifier &verifier,</div> -<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>  voffset_t field)<span class="keyword"> const </span>{</div> -<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>  <span class="comment">// Calling GetOptionalFieldOffset should be safe now thanks to</span></div> -<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>  <span class="comment">// VerifyTable().</span></div> -<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> -<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>  <span class="comment">// Check the actual field.</span></div> -<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>  <span class="keywordflow">return</span> !field_offset || verifier.Verify<T>(data_ + field_offset);</div> -<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>  }</div> -<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span> </div> -<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>  <span class="comment">// VerifyField for required fields.</span></div> -<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyFieldRequired(<span class="keyword">const</span> Verifier &verifier,</div> -<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>  voffset_t field)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> T GetField(voffset_t field, T defaultval)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> +<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  <span class="keywordflow">return</span> field_offset ? ReadScalar<T>(data_ + field_offset) : defaultval;</div> +<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>  }</div> +<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span> </div> +<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  <span class="keyword">template</span><<span class="keyword">typename</span> P> P GetPointer(voffset_t field) {</div> +<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> +<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  <span class="keyword">auto</span> p = data_ + field_offset;</div> +<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  <span class="keywordflow">return</span> field_offset</div> +<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  ? <span class="keyword">reinterpret_cast<</span>P<span class="keyword">></span>(p + ReadScalar<uoffset_t>(p))</div> +<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  : nullptr;</div> +<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>  }</div> +<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>  <span class="keyword">template</span><<span class="keyword">typename</span> P> P GetPointer(voffset_t field)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>Table *<span class="keyword">></span>(<span class="keyword">this</span>)->GetPointer<P>(field);</div> +<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>  }</div> +<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span> </div> +<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>  <span class="keyword">template</span><<span class="keyword">typename</span> P> P GetStruct(voffset_t field)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> +<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>  <span class="keyword">auto</span> p = <span class="keyword">const_cast<</span>uint8_t *<span class="keyword">></span>(data_ + field_offset);</div> +<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>  <span class="keywordflow">return</span> field_offset ? <span class="keyword">reinterpret_cast<</span>P<span class="keyword">></span>(p) : <span class="keyword">nullptr</span>;</div> +<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>  }</div> +<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span> </div> +<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> SetField(voffset_t field, T val) {</div> +<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> +<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>  <span class="keywordflow">if</span> (!field_offset) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>  WriteScalar(data_ + field_offset, val);</div> +<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>  }</div> +<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span> </div> +<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>  <span class="keywordtype">bool</span> SetPointer(voffset_t field, <span class="keyword">const</span> uint8_t *val) {</div> <div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> -<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>  <span class="keywordflow">return</span> verifier.Check(field_offset != 0) &&</div> -<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>  verifier.Verify<T>(data_ + field_offset);</div> -<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>  }</div> -<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span> </div> -<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>  <span class="keyword">private</span>:</div> -<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>  <span class="comment">// private constructor & copy constructor: you obtain instances of this</span></div> -<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>  <span class="comment">// class by pointing to existing data only</span></div> -<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>  Table();</div> -<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>  Table(<span class="keyword">const</span> Table &other);</div> -<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span> </div> -<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>  uint8_t data_[1];</div> -<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span> };</div> -<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span> <span class="comment"></span></div> -<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span> <span class="comment">/// @brief This can compute the start of a FlatBuffer from a root pointer, i.e.</span></div> -<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span> <span class="comment">/// it is the opposite transformation of GetRoot().</span></div> -<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span> <span class="comment">/// This may be useful if you want to pass on a root and have the recipient</span></div> -<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span> <span class="comment">/// delete the buffer afterwards.</span></div> -<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span> <span class="comment"></span><span class="keyword">inline</span> <span class="keyword">const</span> uint8_t *GetBufferStartFromRootPointer(<span class="keyword">const</span> <span class="keywordtype">void</span> *root) {</div> -<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>  <span class="keyword">auto</span> table = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>Table *<span class="keyword">></span>(root);</div> -<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>  <span class="keyword">auto</span> vtable = table->GetVTable();</div> -<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>  <span class="comment">// Either the vtable is before the root or after the root.</span></div> -<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>  <span class="keyword">auto</span> start = std::min(vtable, reinterpret_cast<const uint8_t *>(root));</div> -<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>  <span class="comment">// Align to at least sizeof(uoffset_t).</span></div> -<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>  start = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(</div> -<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>  <span class="keyword">reinterpret_cast<</span>uintptr_t<span class="keyword">></span>(start) & ~(<span class="keyword">sizeof</span>(uoffset_t) - 1));</div> -<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>  <span class="comment">// Additionally, there may be a file_identifier in the buffer, and the root</span></div> -<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>  <span class="comment">// offset. The buffer may have been aligned to any size between</span></div> -<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>  <span class="comment">// sizeof(uoffset_t) and FLATBUFFERS_MAX_ALIGNMENT (see "force_align").</span></div> -<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>  <span class="comment">// Sadly, the exact alignment is only known when constructing the buffer,</span></div> -<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>  <span class="comment">// since it depends on the presence of values with said alignment properties.</span></div> -<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>  <span class="comment">// So instead, we simply look at the next uoffset_t values (root,</span></div> -<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>  <span class="comment">// file_identifier, and alignment padding) to see which points to the root.</span></div> -<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>  <span class="comment">// None of the other values can "impersonate" the root since they will either</span></div> -<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>  <span class="comment">// be 0 or four ASCII characters.</span></div> -<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>  static_assert(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">FlatBufferBuilder::kFileIdentifierLength</a> == <span class="keyword">sizeof</span>(uoffset_t),</div> -<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>  <span class="stringliteral">"file_identifier is assumed to be the same size as uoffset_t"</span>);</div> -<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> possible_roots = FLATBUFFERS_MAX_ALIGNMENT / <span class="keyword">sizeof</span>(uoffset_t) + 1;</div> -<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>  possible_roots;</div> -<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>  possible_roots--) {</div> -<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>  start -= <span class="keyword">sizeof</span>(uoffset_t);</div> -<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>  <span class="keywordflow">if</span> (ReadScalar<uoffset_t>(start) + start ==</div> -<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>  <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(root)) <span class="keywordflow">return</span> start;</div> -<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>  }</div> -<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>  <span class="comment">// We didn't find the root, either the "root" passed isn't really a root,</span></div> -<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>  <span class="comment">// or the buffer is corrupt.</span></div> -<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>  <span class="comment">// Assert, because calling this function with bad data may cause reads</span></div> -<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>  <span class="comment">// outside of buffer boundaries.</span></div> -<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>  assert(<span class="keyword">false</span>);</div> -<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div> -<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span> }</div> -<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span> </div> -<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span> <span class="comment">// Base class for native objects (FlatBuffer data de-serialized into native</span></div> -<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span> <span class="comment">// C++ data structures).</span></div> -<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span> <span class="comment">// Contains no functionality, purely documentative.</span></div> -<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span> <span class="keyword">struct </span>NativeTable {</div> -<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span> };</div> -<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span> <span class="comment"></span></div> -<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span> <span class="comment">/// @brief Function types to be used with resolving hashes into objects and</span></div> -<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span> <span class="comment">/// back again. The resolver gets a pointer to a field inside an object API</span></div> -<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span> <span class="comment">/// object that is of the type specified in the schema using the attribute</span></div> -<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span> <span class="comment">/// `cpp_type` (it is thus important whatever you write to this address</span></div> -<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span> <span class="comment">/// matches that type). The value of this field is initially null, so you</span></div> -<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span> <span class="comment">/// may choose to implement a delayed binding lookup using this function</span></div> -<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span> <span class="comment">/// if you wish. The resolver does the opposite lookup, for when the object</span></div> -<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span> <span class="comment">/// is being serialized again.</span></div> -<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span> <span class="comment"></span><span class="keyword">typedef</span> uint64_t hash_value_t;</div> -<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span> <span class="preprocessor">#ifdef FLATBUFFERS_CPP98_STL</span></div> -<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>  <span class="keyword">typedef</span> void (*resolver_function_t)(<span class="keywordtype">void</span> **pointer_adr, hash_value_t hash);</div> -<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>  <span class="keyword">typedef</span> hash_value_t (*rehasher_function_t)(<span class="keywordtype">void</span> *pointer);</div> -<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span> <span class="preprocessor">#else</span></div> -<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>  <span class="keyword">typedef</span> std::function<void (void **pointer_adr, hash_value_t hash)></div> -<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>  resolver_function_t;</div> -<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>  <span class="keyword">typedef</span> std::function<hash_value_t (void *pointer)> rehasher_function_t;</div> -<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span> </div> -<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span> <span class="comment">// Helper function to test if a field is present, using any of the field</span></div> -<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span> <span class="comment">// enums in the generated code.</span></div> -<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span> <span class="comment">// `table` must be a generated table type. Since this is a template parameter,</span></div> -<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span> <span class="comment">// this is not typechecked to be a subclass of Table, so beware!</span></div> -<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span> <span class="comment">// Note: this function will return false for fields equal to the default</span></div> -<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span> <span class="comment">// value, since they're not stored in the buffer (unless force_defaults was</span></div> -<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span> <span class="comment">// used).</span></div> -<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> IsFieldPresent(<span class="keyword">const</span> T *table, voffset_t field) {</div> -<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>  <span class="comment">// Cast, since Table is a private baseclass of any table types.</span></div> -<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>Table *<span class="keyword">></span>(table)->CheckField(field);</div> -<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span> }</div> -<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span> </div> -<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span> <span class="comment">// Utility function for reverse lookups on the EnumNames*() functions</span></div> -<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span> <span class="comment">// (in the generated C++ code)</span></div> -<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span> <span class="comment">// names must be NULL terminated.</span></div> -<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> LookupEnum(<span class="keyword">const</span> <span class="keywordtype">char</span> **names, <span class="keyword">const</span> <span class="keywordtype">char</span> *name) {</div> -<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">char</span> **p = names; *p; p++)</div> -<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>  <span class="keywordflow">if</span> (!strcmp(*p, name))</div> -<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(p - names);</div> -<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>  <span class="keywordflow">return</span> -1;</div> -<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span> }</div> -<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span> </div> -<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span> <span class="comment">// These macros allow us to layout a struct with a guarantee that they'll end</span></div> -<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span> <span class="comment">// up looking the same on different compilers and platforms.</span></div> -<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span> <span class="comment">// It does this by disallowing the compiler to do any padding, and then</span></div> -<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span> <span class="comment">// does padding itself by inserting extra padding fields that make every</span></div> -<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span> <span class="comment">// element aligned to its own size.</span></div> -<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span> <span class="comment">// Additionally, it manually sets the alignment of the struct as a whole,</span></div> -<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span> <span class="comment">// which is typically its largest element, or a custom size set in the schema</span></div> -<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span> <span class="comment">// by the force_align attribute.</span></div> -<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span> <span class="comment">// These are used in the generated code only.</span></div> -<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span> </div> -<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span> <span class="preprocessor">#if defined(_MSC_VER)</span></div> -<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span> <span class="preprocessor"> #define MANUALLY_ALIGNED_STRUCT(alignment) \</span></div> -<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span> <span class="preprocessor"> __pragma(pack(1)); \</span></div> -<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span> <span class="preprocessor"> struct __declspec(align(alignment))</span></div> -<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span> <span class="preprocessor"> #define STRUCT_END(name, size) \</span></div> -<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span> <span class="preprocessor"> __pragma(pack()); \</span></div> -<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span> <span class="preprocessor"> static_assert(sizeof(name) == size, "compiler breaks packing rules")</span></div> -<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span> <span class="preprocessor">#elif defined(__GNUC__) || defined(__clang__)</span></div> -<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span> <span class="preprocessor"> #define MANUALLY_ALIGNED_STRUCT(alignment) \</span></div> -<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span> <span class="preprocessor"> _Pragma("pack(1)") \</span></div> -<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span> <span class="preprocessor"> struct __attribute__((aligned(alignment)))</span></div> -<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span> <span class="preprocessor"> #define STRUCT_END(name, size) \</span></div> -<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span> <span class="preprocessor"> _Pragma("pack()") \</span></div> -<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span> <span class="preprocessor"> static_assert(sizeof(name) == size, "compiler breaks packing rules")</span></div> -<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span> <span class="preprocessor">#else</span></div> -<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span> <span class="preprocessor"> #error Unknown compiler, please define structure alignment macros</span></div> -<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span> <span class="preprocessor">#endif</span></div> -<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span> </div> -<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span> <span class="comment">// String which identifies the current version of FlatBuffers.</span></div> -<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span> <span class="comment">// flatbuffer_version_string is used by Google developers to identify which</span></div> -<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span> <span class="comment">// applications uploaded to Google Play are using this library. This allows</span></div> -<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span> <span class="comment">// the development team at Google to determine the popularity of the library.</span></div> -<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span> <span class="comment">// How it works: Applications that are uploaded to the Google Play Store are</span></div> -<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span> <span class="comment">// scanned for this version string. We track which applications are using it</span></div> -<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span> <span class="comment">// to measure popularity. You are free to remove it (of course) but we would</span></div> -<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span> <span class="comment">// appreciate if you left it in.</span></div> -<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span> </div> -<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span> <span class="comment">// Weak linkage is culled by VS & doesn't work on cygwin.</span></div> -<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span> <span class="preprocessor">#if !defined(_WIN32) && !defined(__CYGWIN__)</span></div> -<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span> </div> -<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span> <span class="keyword">extern</span> <span class="keyword">volatile</span> __attribute__((weak)) const <span class="keywordtype">char</span> *flatbuffer_version_string;</div> -<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span> volatile __attribute__((weak)) const <span class="keywordtype">char</span> *flatbuffer_version_string =</div> -<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>  "FlatBuffers "</div> -<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR) "."</div> -<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MINOR) "."</div> -<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION);</div> -<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span> </div> -<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span> <span class="preprocessor">#endif // !defined(_WIN32) && !defined(__CYGWIN__)</span></div> -<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span> </div> -<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span> <span class="preprocessor">#define DEFINE_BITMASK_OPERATORS(E, T)\</span></div> -<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span> <span class="preprocessor"> inline E operator | (E lhs, E rhs){\</span></div> -<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span> <span class="preprocessor"> return E(T(lhs) | T(rhs));\</span></div> -<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span> <span class="preprocessor"> }\</span></div> -<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span> <span class="preprocessor"> inline E operator & (E lhs, E rhs){\</span></div> -<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span> <span class="preprocessor"> return E(T(lhs) & T(rhs));\</span></div> -<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span> <span class="preprocessor"> }\</span></div> -<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span> <span class="preprocessor"> inline E operator ^ (E lhs, E rhs){\</span></div> -<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span> <span class="preprocessor"> return E(T(lhs) ^ T(rhs));\</span></div> -<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span> <span class="preprocessor"> }\</span></div> -<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span> <span class="preprocessor"> inline E operator ~ (E lhs){\</span></div> -<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span> <span class="preprocessor"> return E(~T(lhs));\</span></div> -<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span> <span class="preprocessor"> }\</span></div> -<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span> <span class="preprocessor"> inline E operator |= (E &lhs, E rhs){\</span></div> -<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span> <span class="preprocessor"> lhs = lhs | rhs;\</span></div> -<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span> <span class="preprocessor"> return lhs;\</span></div> -<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span> <span class="preprocessor"> }\</span></div> -<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span> <span class="preprocessor"> inline E operator &= (E &lhs, E rhs){\</span></div> -<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span> <span class="preprocessor"> lhs = lhs & rhs;\</span></div> -<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span> <span class="preprocessor"> return lhs;\</span></div> -<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span> <span class="preprocessor"> }\</span></div> -<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span> <span class="preprocessor"> inline E operator ^= (E &lhs, E rhs){\</span></div> -<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span> <span class="preprocessor"> lhs = lhs ^ rhs;\</span></div> -<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span> <span class="preprocessor"> return lhs;\</span></div> -<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span> <span class="preprocessor"> }\</span></div> -<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span> <span class="preprocessor"> inline bool operator !(E rhs) \</span></div> -<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span> <span class="preprocessor"> {\</span></div> -<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span> <span class="preprocessor"> return !bool(T(rhs)); \</span></div> -<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span> <span class="preprocessor"> }</span></div> -<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span> <span class="comment">/// @endcond</span></div> -<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span> <span class="comment"></span>} <span class="comment">// namespace flatbuffers</span></div> -<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span> </div> -<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span> <span class="preprocessor">#endif // FLATBUFFERS_H_</span></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a1080c9e370e2d9d9d872dadd1131436b"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b">flatbuffers::FlatBufferBuilder::CreateVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateVector(size_t vector_size, const std::function< T(size_t i)> &f)</div><div class="ttdoc">Serialize values returned by a function into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1074</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac2b96292fa0fb1534fe7fd218a094d0c"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c">flatbuffers::FlatBufferBuilder::CreateUninitializedVector</a></div><div class="ttdeci">uoffset_t CreateUninitializedVector(size_t len, size_t elemsize, uint8_t **buf)</div><div class="ttdoc">Specialized version of CreateVector for non-copying use cases. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1169</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac64d11c219559ea51567eab556e13135"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedTables</a></div><div class="ttdeci">Offset< Vector< Offset< T > > > CreateVectorOfSortedTables(std::vector< Offset< T >> *v)</div><div class="ttdoc">Serialize an array of table offsets as a vector in the buffer in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1157</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a></div><div class="ttdoc">Helper class to hold data needed in creation of a FlatBuffer. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:630</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac1bfd609f7f736e9a37cedae77448b63"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">flatbuffers::FlatBufferBuilder::GetSize</a></div><div class="ttdeci">uoffset_t GetSize() const </div><div class="ttdoc">The current size of the serialized buffer, counting from the end. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:670</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac72b54a75e0c329e0ce0b8fab758e256"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac72b54a75e0c329e0ce0b8fab758e256">flatbuffers::FlatBufferBuilder::FlatBufferBuilder</a></div><div class="ttdeci">FlatBufferBuilder(uoffset_t initial_size=1024, const simple_allocator *allocator=nullptr)</div><div class="ttdoc">Default constructor for FlatBufferBuilder. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:642</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ae94b94ba71ea0aeb2d9a98c43b713412"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412">flatbuffers::FlatBufferBuilder::Clear</a></div><div class="ttdeci">void Clear()</div><div class="ttdoc">Reset all the state in this FlatBufferBuilder so it can be reused to construct another buffer...</div><div class="ttdef"><b>Definition:</b> flatbuffers.h:658</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a21c7f933d7ff1212f2090763ef9f0c44"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a21c7f933d7ff1212f2090763ef9f0c44">flatbuffers::FlatBufferBuilder::ReleaseBufferPointer</a></div><div class="ttdeci">unique_ptr_t ReleaseBufferPointer()</div><div class="ttdoc">Get the released pointer to the serialized buffer. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:691</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a7ba8462e408431054c99d25120326220"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220">flatbuffers::FlatBufferBuilder::FinishSizePrefixed</a></div><div class="ttdeci">void FinishSizePrefixed(Offset< T > root, const char *file_identifier=nullptr)</div><div class="ttdoc">Finish a buffer with a 32 bit size field pre-fixed (size of the buffer following the size field)...</div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1213</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a3eb68613e5883dc4b8fff6cf7d1223d7"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const char *str)</div><div class="ttdoc">Store a string in the buffer, which null-terminated. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:980</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_aec6f9df2a0366b540b24822414d92cbe"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const char *str, size_t len)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:920</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a16a8fd46b34ad7727406c37b65b6b27a"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a">flatbuffers::FlatBufferBuilder::ForceDefaults</a></div><div class="ttdeci">void ForceDefaults(bool fd)</div><div class="ttdoc">In order to save space, fields that are set to their default value don't get serialized into the buff...</div><div class="ttdef"><b>Definition:</b> flatbuffers.h:721</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_af8c7583c92e1d1d6f438977da5158d19"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">flatbuffers::FlatBufferBuilder::kFileIdentifierLength</a></div><div class="ttdeci">static const size_t kFileIdentifierLength</div><div class="ttdoc">The length of a FlatBuffer file header. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1195</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac0b6a1c5d949f20ad84367fc0f9e1506"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const String *str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:946</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a840b769fbb4148f97d3eed266e4690c3"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const String *str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:998</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a592110519a6c8db1926f1365bf2a58e6"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6">flatbuffers::FlatBufferBuilder::CreateVectorOfStrings</a></div><div class="ttdeci">Offset< Vector< Offset< String > > > CreateVectorOfStrings(const std::vector< std::string > &v)</div><div class="ttdoc">Serialize a std::vector<std::string> into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1088</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_aa1ebce1f3f46832946a95952af1e9c2b"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b">flatbuffers::FlatBufferBuilder::GetBufferMinAlignment</a></div><div class="ttdeci">size_t GetBufferMinAlignment()</div><div class="ttdoc">get the minimum alignment this buffer needs to be accessed properly. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:702</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_afede51fd9c32d146cbb1832f57c5e1b7"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7">flatbuffers::FlatBufferBuilder::CreateVectorOfStructs</a></div><div class="ttdeci">Offset< Vector< const T * > > CreateVectorOfStructs(const T *v, size_t len)</div><div class="ttdoc">Serialize an array of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1102</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_aad93d113ac24e86ed04b5236b3f4c0c5"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const char *str)</div><div class="ttdoc">Store a string in the buffer, which is null-terminated. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:932</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a8c3af55e64f5cda9aefa38ac5287ef9f"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const std::string &str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:939</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_af715dd24dd37cb0151dc7a980ad0f207"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207">flatbuffers::FlatBufferBuilder::CreateVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateVector(const std::vector< T > &v)</div><div class="ttdoc">Serialize a std::vector into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1051</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a2305b63d367845972b51669dd995cc50"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50">flatbuffers::FlatBufferBuilder::CreateUninitializedVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateUninitializedVector(size_t len, T **buf)</div><div class="ttdoc">Specialized version of CreateVector for non-copying use cases. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1188</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a3f4252e9bc005ba6c700469544fdccc9"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a3f4252e9bc005ba6c700469544fdccc9">flatbuffers::FlatBufferBuilder::GetCurrentBufferPointer</a></div><div class="ttdeci">uint8_t * GetCurrentBufferPointer() const </div><div class="ttdoc">Get a pointer to an unfinished buffer. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:682</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a2cca5c89246a53e80e6ad9487f4c36f3"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">flatbuffers::FlatBufferBuilder::CreateVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateVector(const T *v, size_t len)</div><div class="ttdoc">Serialize an array into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1037</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a10e8ec7d1c8fbdc21b1c7047bbbe38d9"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const std::string &str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:989</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a2130ef232ff405eebe2e7f184ecd06e6"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedTables</a></div><div class="ttdeci">Offset< Vector< Offset< T > > > CreateVectorOfSortedTables(Offset< T > *v, size_t len)</div><div class="ttdoc">Serialize an array of table offsets as a vector in the buffer in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1144</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ab478a645216d2d613fc7b7c29b0ff9d1"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const char *str, size_t len)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:956</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a8704709a2e25ad04679212ee4126b1a1"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1">flatbuffers::FlatBufferBuilder::CreateVectorOfStructs</a></div><div class="ttdeci">Offset< Vector< const T * > > CreateVectorOfStructs(const std::vector< T > &v)</div><div class="ttdoc">Serialize a std::vector of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1115</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a0c9e507b373d598b51052fab4fa34912"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">flatbuffers::FlatBufferBuilder::Finish</a></div><div class="ttdeci">void Finish(Offset< T > root, const char *file_identifier=nullptr)</div><div class="ttdoc">Finish serializing a buffer by writing the root offset. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1200</div></div> -<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a8dc35f792179df4ca850492c1796d8b8"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a8dc35f792179df4ca850492c1796d8b8">flatbuffers::FlatBufferBuilder::GetBufferPointer</a></div><div class="ttdeci">uint8_t * GetBufferPointer() const </div><div class="ttdoc">Get the serialized buffer (after you call Finish()). </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:675</div></div> +<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>  <span class="keywordflow">if</span> (!field_offset) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>  WriteScalar(data_ + field_offset,</div> +<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>  static_cast<uoffset_t>(val - (data_ + field_offset)));</div> +<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div> +<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>  }</div> +<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span> </div> +<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>  uint8_t *GetAddressOf(voffset_t field) {</div> +<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> +<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>  <span class="keywordflow">return</span> field_offset ? data_ + field_offset : <span class="keyword">nullptr</span>;</div> +<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>  }</div> +<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>  <span class="keyword">const</span> uint8_t *GetAddressOf(voffset_t field)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>Table *<span class="keyword">></span>(<span class="keyword">this</span>)->GetAddressOf(field);</div> +<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>  }</div> +<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span> </div> +<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>  <span class="keywordtype">bool</span> CheckField(voffset_t field)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>  <span class="keywordflow">return</span> GetOptionalFieldOffset(field) != 0;</div> +<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>  }</div> +<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span> </div> +<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>  <span class="comment">// Verify the vtable of this table.</span></div> +<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>  <span class="comment">// Call this once per table, followed by VerifyField once per field.</span></div> +<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>  <span class="keywordtype">bool</span> VerifyTableStart(Verifier &verifier)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>  <span class="comment">// Check the vtable offset.</span></div> +<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>  <span class="keywordflow">if</span> (!verifier.Verify<soffset_t>(data_)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div> +<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>  <span class="keyword">auto</span> vtable = GetVTable();</div> +<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>  <span class="comment">// Check the vtable size field, then check vtable fits in its entirety.</span></div> +<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>  <span class="keywordflow">return</span> verifier.VerifyComplexity() &&</div> +<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>  verifier.Verify<voffset_t>(vtable) &&</div> +<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>  (ReadScalar<voffset_t>(vtable) & (<span class="keyword">sizeof</span>(voffset_t) - 1)) == 0 &&</div> +<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>  verifier.Verify(vtable, ReadScalar<voffset_t>(vtable));</div> +<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>  }</div> +<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span> </div> +<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>  <span class="comment">// Verify a particular field.</span></div> +<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyField(<span class="keyword">const</span> Verifier &verifier,</div> +<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>  voffset_t field)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>  <span class="comment">// Calling GetOptionalFieldOffset should be safe now thanks to</span></div> +<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>  <span class="comment">// VerifyTable().</span></div> +<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> +<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>  <span class="comment">// Check the actual field.</span></div> +<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>  <span class="keywordflow">return</span> !field_offset || verifier.Verify<T>(data_ + field_offset);</div> +<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>  }</div> +<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span> </div> +<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>  <span class="comment">// VerifyField for required fields.</span></div> +<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>  <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> VerifyFieldRequired(<span class="keyword">const</span> Verifier &verifier,</div> +<div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>  voffset_t field)<span class="keyword"> const </span>{</div> +<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>  <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div> +<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>  <span class="keywordflow">return</span> verifier.Check(field_offset != 0) &&</div> +<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>  verifier.Verify<T>(data_ + field_offset);</div> +<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>  }</div> +<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span> </div> +<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>  <span class="keyword">private</span>:</div> +<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>  <span class="comment">// private constructor & copy constructor: you obtain instances of this</span></div> +<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>  <span class="comment">// class by pointing to existing data only</span></div> +<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>  Table();</div> +<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>  Table(<span class="keyword">const</span> Table &other);</div> +<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span> </div> +<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>  uint8_t data_[1];</div> +<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span> };</div> +<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span> <span class="comment"></span></div> +<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span> <span class="comment">/// @brief This can compute the start of a FlatBuffer from a root pointer, i.e.</span></div> +<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span> <span class="comment">/// it is the opposite transformation of GetRoot().</span></div> +<div class="line"><a name="l01690"></a><span class="lineno"> 1690</span> <span class="comment">/// This may be useful if you want to pass on a root and have the recipient</span></div> +<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span> <span class="comment">/// delete the buffer afterwards.</span></div> +<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span> <span class="comment"></span><span class="keyword">inline</span> <span class="keyword">const</span> uint8_t *GetBufferStartFromRootPointer(<span class="keyword">const</span> <span class="keywordtype">void</span> *root) {</div> +<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>  <span class="keyword">auto</span> table = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>Table *<span class="keyword">></span>(root);</div> +<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>  <span class="keyword">auto</span> vtable = table->GetVTable();</div> +<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>  <span class="comment">// Either the vtable is before the root or after the root.</span></div> +<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>  <span class="keyword">auto</span> start = std::min(vtable, reinterpret_cast<const uint8_t *>(root));</div> +<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>  <span class="comment">// Align to at least sizeof(uoffset_t).</span></div> +<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>  start = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(</div> +<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>  <span class="keyword">reinterpret_cast<</span>uintptr_t<span class="keyword">></span>(start) & ~(<span class="keyword">sizeof</span>(uoffset_t) - 1));</div> +<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>  <span class="comment">// Additionally, there may be a file_identifier in the buffer, and the root</span></div> +<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>  <span class="comment">// offset. The buffer may have been aligned to any size between</span></div> +<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>  <span class="comment">// sizeof(uoffset_t) and FLATBUFFERS_MAX_ALIGNMENT (see "force_align").</span></div> +<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>  <span class="comment">// Sadly, the exact alignment is only known when constructing the buffer,</span></div> +<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>  <span class="comment">// since it depends on the presence of values with said alignment properties.</span></div> +<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>  <span class="comment">// So instead, we simply look at the next uoffset_t values (root,</span></div> +<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>  <span class="comment">// file_identifier, and alignment padding) to see which points to the root.</span></div> +<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>  <span class="comment">// None of the other values can "impersonate" the root since they will either</span></div> +<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>  <span class="comment">// be 0 or four ASCII characters.</span></div> +<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>  static_assert(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">FlatBufferBuilder::kFileIdentifierLength</a> == <span class="keyword">sizeof</span>(uoffset_t),</div> +<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>  <span class="stringliteral">"file_identifier is assumed to be the same size as uoffset_t"</span>);</div> +<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> possible_roots = FLATBUFFERS_MAX_ALIGNMENT / <span class="keyword">sizeof</span>(uoffset_t) + 1;</div> +<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>  possible_roots;</div> +<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>  possible_roots--) {</div> +<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>  start -= <span class="keyword">sizeof</span>(uoffset_t);</div> +<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>  <span class="keywordflow">if</span> (ReadScalar<uoffset_t>(start) + start ==</div> +<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>  <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t *<span class="keyword">></span>(root)) <span class="keywordflow">return</span> start;</div> +<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>  }</div> +<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>  <span class="comment">// We didn't find the root, either the "root" passed isn't really a root,</span></div> +<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>  <span class="comment">// or the buffer is corrupt.</span></div> +<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>  <span class="comment">// Assert, because calling this function with bad data may cause reads</span></div> +<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>  <span class="comment">// outside of buffer boundaries.</span></div> +<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>  assert(<span class="keyword">false</span>);</div> +<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div> +<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span> }</div> +<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span> </div> +<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span> <span class="comment">// Base class for native objects (FlatBuffer data de-serialized into native</span></div> +<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span> <span class="comment">// C++ data structures).</span></div> +<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span> <span class="comment">// Contains no functionality, purely documentative.</span></div> +<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span> <span class="keyword">struct </span>NativeTable {</div> +<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span> };</div> +<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span> <span class="comment"></span></div> +<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span> <span class="comment">/// @brief Function types to be used with resolving hashes into objects and</span></div> +<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span> <span class="comment">/// back again. The resolver gets a pointer to a field inside an object API</span></div> +<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span> <span class="comment">/// object that is of the type specified in the schema using the attribute</span></div> +<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span> <span class="comment">/// `cpp_type` (it is thus important whatever you write to this address</span></div> +<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span> <span class="comment">/// matches that type). The value of this field is initially null, so you</span></div> +<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span> <span class="comment">/// may choose to implement a delayed binding lookup using this function</span></div> +<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span> <span class="comment">/// if you wish. The resolver does the opposite lookup, for when the object</span></div> +<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span> <span class="comment">/// is being serialized again.</span></div> +<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span> <span class="comment"></span><span class="keyword">typedef</span> uint64_t hash_value_t;</div> +<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span> <span class="preprocessor">#ifdef FLATBUFFERS_CPP98_STL</span></div> +<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>  <span class="keyword">typedef</span> void (*resolver_function_t)(<span class="keywordtype">void</span> **pointer_adr, hash_value_t hash);</div> +<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>  <span class="keyword">typedef</span> hash_value_t (*rehasher_function_t)(<span class="keywordtype">void</span> *pointer);</div> +<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span> <span class="preprocessor">#else</span></div> +<div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>  <span class="keyword">typedef</span> std::function<void (void **pointer_adr, hash_value_t hash)></div> +<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>  resolver_function_t;</div> +<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>  <span class="keyword">typedef</span> std::function<hash_value_t (void *pointer)> rehasher_function_t;</div> +<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span> </div> +<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span> <span class="comment">// Helper function to test if a field is present, using any of the field</span></div> +<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span> <span class="comment">// enums in the generated code.</span></div> +<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span> <span class="comment">// `table` must be a generated table type. Since this is a template parameter,</span></div> +<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span> <span class="comment">// this is not typechecked to be a subclass of Table, so beware!</span></div> +<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span> <span class="comment">// Note: this function will return false for fields equal to the default</span></div> +<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span> <span class="comment">// value, since they're not stored in the buffer (unless force_defaults was</span></div> +<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span> <span class="comment">// used).</span></div> +<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span> <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keywordtype">bool</span> IsFieldPresent(<span class="keyword">const</span> T *table, voffset_t field) {</div> +<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>  <span class="comment">// Cast, since Table is a private baseclass of any table types.</span></div> +<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>Table *<span class="keyword">></span>(table)->CheckField(field);</div> +<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span> }</div> +<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span> </div> +<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span> <span class="comment">// Utility function for reverse lookups on the EnumNames*() functions</span></div> +<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span> <span class="comment">// (in the generated C++ code)</span></div> +<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span> <span class="comment">// names must be NULL terminated.</span></div> +<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> LookupEnum(<span class="keyword">const</span> <span class="keywordtype">char</span> **names, <span class="keyword">const</span> <span class="keywordtype">char</span> *name) {</div> +<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">char</span> **p = names; *p; p++)</div> +<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>  <span class="keywordflow">if</span> (!strcmp(*p, name))</div> +<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(p - names);</div> +<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>  <span class="keywordflow">return</span> -1;</div> +<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span> }</div> +<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span> </div> +<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span> <span class="comment">// These macros allow us to layout a struct with a guarantee that they'll end</span></div> +<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span> <span class="comment">// up looking the same on different compilers and platforms.</span></div> +<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span> <span class="comment">// It does this by disallowing the compiler to do any padding, and then</span></div> +<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span> <span class="comment">// does padding itself by inserting extra padding fields that make every</span></div> +<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span> <span class="comment">// element aligned to its own size.</span></div> +<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span> <span class="comment">// Additionally, it manually sets the alignment of the struct as a whole,</span></div> +<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span> <span class="comment">// which is typically its largest element, or a custom size set in the schema</span></div> +<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span> <span class="comment">// by the force_align attribute.</span></div> +<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span> <span class="comment">// These are used in the generated code only.</span></div> +<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span> </div> +<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span> <span class="preprocessor">#if defined(_MSC_VER)</span></div> +<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span> <span class="preprocessor"> #define MANUALLY_ALIGNED_STRUCT(alignment) \</span></div> +<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span> <span class="preprocessor"> __pragma(pack(1)); \</span></div> +<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span> <span class="preprocessor"> struct __declspec(align(alignment))</span></div> +<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span> <span class="preprocessor"> #define STRUCT_END(name, size) \</span></div> +<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span> <span class="preprocessor"> __pragma(pack()); \</span></div> +<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span> <span class="preprocessor"> static_assert(sizeof(name) == size, "compiler breaks packing rules")</span></div> +<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span> <span class="preprocessor">#elif defined(__GNUC__) || defined(__clang__)</span></div> +<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span> <span class="preprocessor"> #define MANUALLY_ALIGNED_STRUCT(alignment) \</span></div> +<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span> <span class="preprocessor"> _Pragma("pack(1)") \</span></div> +<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span> <span class="preprocessor"> struct __attribute__((aligned(alignment)))</span></div> +<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span> <span class="preprocessor"> #define STRUCT_END(name, size) \</span></div> +<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span> <span class="preprocessor"> _Pragma("pack()") \</span></div> +<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span> <span class="preprocessor"> static_assert(sizeof(name) == size, "compiler breaks packing rules")</span></div> +<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span> <span class="preprocessor">#else</span></div> +<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span> <span class="preprocessor"> #error Unknown compiler, please define structure alignment macros</span></div> +<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span> <span class="preprocessor">#endif</span></div> +<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span> </div> +<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span> <span class="comment">// String which identifies the current version of FlatBuffers.</span></div> +<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span> <span class="comment">// flatbuffer_version_string is used by Google developers to identify which</span></div> +<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span> <span class="comment">// applications uploaded to Google Play are using this library. This allows</span></div> +<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span> <span class="comment">// the development team at Google to determine the popularity of the library.</span></div> +<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span> <span class="comment">// How it works: Applications that are uploaded to the Google Play Store are</span></div> +<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span> <span class="comment">// scanned for this version string. We track which applications are using it</span></div> +<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span> <span class="comment">// to measure popularity. You are free to remove it (of course) but we would</span></div> +<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span> <span class="comment">// appreciate if you left it in.</span></div> +<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span> </div> +<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span> <span class="comment">// Weak linkage is culled by VS & doesn't work on cygwin.</span></div> +<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span> <span class="preprocessor">#if !defined(_WIN32) && !defined(__CYGWIN__)</span></div> +<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span> </div> +<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span> <span class="keyword">extern</span> <span class="keyword">volatile</span> __attribute__((weak)) const <span class="keywordtype">char</span> *flatbuffer_version_string;</div> +<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span> volatile __attribute__((weak)) const <span class="keywordtype">char</span> *flatbuffer_version_string =</div> +<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>  "FlatBuffers "</div> +<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR) "."</div> +<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MINOR) "."</div> +<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION);</div> +<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span> </div> +<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span> <span class="preprocessor">#endif // !defined(_WIN32) && !defined(__CYGWIN__)</span></div> +<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span> </div> +<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span> <span class="preprocessor">#define DEFINE_BITMASK_OPERATORS(E, T)\</span></div> +<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span> <span class="preprocessor"> inline E operator | (E lhs, E rhs){\</span></div> +<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span> <span class="preprocessor"> return E(T(lhs) | T(rhs));\</span></div> +<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span> <span class="preprocessor"> }\</span></div> +<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span> <span class="preprocessor"> inline E operator & (E lhs, E rhs){\</span></div> +<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span> <span class="preprocessor"> return E(T(lhs) & T(rhs));\</span></div> +<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span> <span class="preprocessor"> }\</span></div> +<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span> <span class="preprocessor"> inline E operator ^ (E lhs, E rhs){\</span></div> +<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span> <span class="preprocessor"> return E(T(lhs) ^ T(rhs));\</span></div> +<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span> <span class="preprocessor"> }\</span></div> +<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span> <span class="preprocessor"> inline E operator ~ (E lhs){\</span></div> +<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span> <span class="preprocessor"> return E(~T(lhs));\</span></div> +<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span> <span class="preprocessor"> }\</span></div> +<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span> <span class="preprocessor"> inline E operator |= (E &lhs, E rhs){\</span></div> +<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span> <span class="preprocessor"> lhs = lhs | rhs;\</span></div> +<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span> <span class="preprocessor"> return lhs;\</span></div> +<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span> <span class="preprocessor"> }\</span></div> +<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span> <span class="preprocessor"> inline E operator &= (E &lhs, E rhs){\</span></div> +<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span> <span class="preprocessor"> lhs = lhs & rhs;\</span></div> +<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span> <span class="preprocessor"> return lhs;\</span></div> +<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span> <span class="preprocessor"> }\</span></div> +<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span> <span class="preprocessor"> inline E operator ^= (E &lhs, E rhs){\</span></div> +<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span> <span class="preprocessor"> lhs = lhs ^ rhs;\</span></div> +<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span> <span class="preprocessor"> return lhs;\</span></div> +<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span> <span class="preprocessor"> }\</span></div> +<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span> <span class="preprocessor"> inline bool operator !(E rhs) \</span></div> +<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span> <span class="preprocessor"> {\</span></div> +<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span> <span class="preprocessor"> return !bool(T(rhs)); \</span></div> +<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span> <span class="preprocessor"> }</span></div> +<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span> <span class="comment">/// @endcond</span></div> +<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span> <span class="comment"></span>} <span class="comment">// namespace flatbuffers</span></div> +<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span> </div> +<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span> <span class="preprocessor">#endif // FLATBUFFERS_H_</span></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a1080c9e370e2d9d9d872dadd1131436b"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b">flatbuffers::FlatBufferBuilder::CreateVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateVector(size_t vector_size, const std::function< T(size_t i)> &f)</div><div class="ttdoc">Serialize values returned by a function into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1096</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac2b96292fa0fb1534fe7fd218a094d0c"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c">flatbuffers::FlatBufferBuilder::CreateUninitializedVector</a></div><div class="ttdeci">uoffset_t CreateUninitializedVector(size_t len, size_t elemsize, uint8_t **buf)</div><div class="ttdoc">Specialized version of CreateVector for non-copying use cases. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1212</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a6e90ada59d9553636f72ce8e4a892f72"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72">flatbuffers::FlatBufferBuilder::CreateVectorOfStructs</a></div><div class="ttdeci">Offset< Vector< const T * > > CreateVectorOfStructs(size_t vector_size, const std::function< void(size_t i, T *)> &filler)</div><div class="ttdoc">Serialize an array of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1140</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac64d11c219559ea51567eab556e13135"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedTables</a></div><div class="ttdeci">Offset< Vector< Offset< T > > > CreateVectorOfSortedTables(std::vector< Offset< T >> *v)</div><div class="ttdoc">Serialize an array of table offsets as a vector in the buffer in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1200</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a></div><div class="ttdoc">Helper class to hold data needed in creation of a FlatBuffer. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:646</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac1bfd609f7f736e9a37cedae77448b63"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63">flatbuffers::FlatBufferBuilder::GetSize</a></div><div class="ttdeci">uoffset_t GetSize() const </div><div class="ttdoc">The current size of the serialized buffer, counting from the end. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:686</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac72b54a75e0c329e0ce0b8fab758e256"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac72b54a75e0c329e0ce0b8fab758e256">flatbuffers::FlatBufferBuilder::FlatBufferBuilder</a></div><div class="ttdeci">FlatBufferBuilder(uoffset_t initial_size=1024, const simple_allocator *allocator=nullptr)</div><div class="ttdoc">Default constructor for FlatBufferBuilder. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:658</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ae94b94ba71ea0aeb2d9a98c43b713412"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412">flatbuffers::FlatBufferBuilder::Clear</a></div><div class="ttdeci">void Clear()</div><div class="ttdoc">Reset all the state in this FlatBufferBuilder so it can be reused to construct another buffer...</div><div class="ttdef"><b>Definition:</b> flatbuffers.h:674</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a21c7f933d7ff1212f2090763ef9f0c44"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a21c7f933d7ff1212f2090763ef9f0c44">flatbuffers::FlatBufferBuilder::ReleaseBufferPointer</a></div><div class="ttdeci">unique_ptr_t ReleaseBufferPointer()</div><div class="ttdoc">Get the released pointer to the serialized buffer. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:707</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a7ba8462e408431054c99d25120326220"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220">flatbuffers::FlatBufferBuilder::FinishSizePrefixed</a></div><div class="ttdeci">void FinishSizePrefixed(Offset< T > root, const char *file_identifier=nullptr)</div><div class="ttdoc">Finish a buffer with a 32 bit size field pre-fixed (size of the buffer following the size field)...</div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1256</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a3eb68613e5883dc4b8fff6cf7d1223d7"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const char *str)</div><div class="ttdoc">Store a string in the buffer, which null-terminated. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1002</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_aec6f9df2a0366b540b24822414d92cbe"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const char *str, size_t len)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:942</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a16a8fd46b34ad7727406c37b65b6b27a"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a">flatbuffers::FlatBufferBuilder::ForceDefaults</a></div><div class="ttdeci">void ForceDefaults(bool fd)</div><div class="ttdoc">In order to save space, fields that are set to their default value don't get serialized into the buff...</div><div class="ttdef"><b>Definition:</b> flatbuffers.h:737</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_aa905b29dce19a1795c7bce375cf29961"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961">flatbuffers::FlatBufferBuilder::DedupVtables</a></div><div class="ttdeci">void DedupVtables(bool dedup)</div><div class="ttdoc">By default vtables are deduped in order to save space. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:741</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_af8c7583c92e1d1d6f438977da5158d19"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">flatbuffers::FlatBufferBuilder::kFileIdentifierLength</a></div><div class="ttdeci">static const size_t kFileIdentifierLength</div><div class="ttdoc">The length of a FlatBuffer file header. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1238</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac0b6a1c5d949f20ad84367fc0f9e1506"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const String *str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:968</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a840b769fbb4148f97d3eed266e4690c3"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const String *str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1020</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a592110519a6c8db1926f1365bf2a58e6"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6">flatbuffers::FlatBufferBuilder::CreateVectorOfStrings</a></div><div class="ttdeci">Offset< Vector< Offset< String > > > CreateVectorOfStrings(const std::vector< std::string > &v)</div><div class="ttdoc">Serialize a std::vector<std::string> into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1110</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_aa1ebce1f3f46832946a95952af1e9c2b"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b">flatbuffers::FlatBufferBuilder::GetBufferMinAlignment</a></div><div class="ttdeci">size_t GetBufferMinAlignment()</div><div class="ttdoc">get the minimum alignment this buffer needs to be accessed properly. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:718</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_afede51fd9c32d146cbb1832f57c5e1b7"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7">flatbuffers::FlatBufferBuilder::CreateVectorOfStructs</a></div><div class="ttdeci">Offset< Vector< const T * > > CreateVectorOfStructs(const T *v, size_t len)</div><div class="ttdoc">Serialize an array of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1124</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_aad93d113ac24e86ed04b5236b3f4c0c5"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const char *str)</div><div class="ttdoc">Store a string in the buffer, which is null-terminated. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:954</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a8c3af55e64f5cda9aefa38ac5287ef9f"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset< String > CreateString(const std::string &str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:961</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_af715dd24dd37cb0151dc7a980ad0f207"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207">flatbuffers::FlatBufferBuilder::CreateVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateVector(const std::vector< T > &v)</div><div class="ttdoc">Serialize a std::vector into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1073</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a2305b63d367845972b51669dd995cc50"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50">flatbuffers::FlatBufferBuilder::CreateUninitializedVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateUninitializedVector(size_t len, T **buf)</div><div class="ttdoc">Specialized version of CreateVector for non-copying use cases. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1231</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a3f4252e9bc005ba6c700469544fdccc9"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a3f4252e9bc005ba6c700469544fdccc9">flatbuffers::FlatBufferBuilder::GetCurrentBufferPointer</a></div><div class="ttdeci">uint8_t * GetCurrentBufferPointer() const </div><div class="ttdoc">Get a pointer to an unfinished buffer. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:698</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a2cca5c89246a53e80e6ad9487f4c36f3"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">flatbuffers::FlatBufferBuilder::CreateVector</a></div><div class="ttdeci">Offset< Vector< T > > CreateVector(const T *v, size_t len)</div><div class="ttdoc">Serialize an array into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1059</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a10e8ec7d1c8fbdc21b1c7047bbbe38d9"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const std::string &str)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1011</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a2130ef232ff405eebe2e7f184ecd06e6"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedTables</a></div><div class="ttdeci">Offset< Vector< Offset< T > > > CreateVectorOfSortedTables(Offset< T > *v, size_t len)</div><div class="ttdoc">Serialize an array of table offsets as a vector in the buffer in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1187</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ab478a645216d2d613fc7b7c29b0ff9d1"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1">flatbuffers::FlatBufferBuilder::CreateSharedString</a></div><div class="ttdeci">Offset< String > CreateSharedString(const char *str, size_t len)</div><div class="ttdoc">Store a string in the buffer, which can contain any binary data. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:978</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a8704709a2e25ad04679212ee4126b1a1"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1">flatbuffers::FlatBufferBuilder::CreateVectorOfStructs</a></div><div class="ttdeci">Offset< Vector< const T * > > CreateVectorOfStructs(const std::vector< T > &v)</div><div class="ttdoc">Serialize a std::vector of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1158</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a0c9e507b373d598b51052fab4fa34912"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">flatbuffers::FlatBufferBuilder::Finish</a></div><div class="ttdeci">void Finish(Offset< T > root, const char *file_identifier=nullptr)</div><div class="ttdoc">Finish serializing a buffer by writing the root offset. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1243</div></div> +<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a8dc35f792179df4ca850492c1796d8b8"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a8dc35f792179df4ca850492c1796d8b8">flatbuffers::FlatBufferBuilder::GetBufferPointer</a></div><div class="ttdeci">uint8_t * GetBufferPointer() const </div><div class="ttdoc">Get the serialized buffer (after you call Finish()). </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:691</div></div> </div><!-- fragment --></div><!-- contents --> </div><!-- doc-content --> <!-- Google Analytics --> diff --git a/flatbuffers_guide_use_cpp.html b/flatbuffers_guide_use_cpp.html index 8f077873c8aeac88b2b930226c32cbc39b9696bd..20c8e56c3b9c7f2f27ea0f8b3abb1fcf28683576 100644 --- a/flatbuffers_guide_use_cpp.html +++ b/flatbuffers_guide_use_cpp.html @@ -147,16 +147,42 @@ $(document).ready(function(){initNavTree('flatbuffers_guide_use_cpp.html','');}) <div class="line">printf(<span class="stringliteral">"%d\n"</span>, monster->mana()); <span class="comment">// default value of `150`</span></div> <div class="line">printf(<span class="stringliteral">"%s\n"</span>, monster->name()->c_str()); <span class="comment">// "MyMonster"</span></div> </div><!-- fragment --><p><em>Note: That we never stored a <code>mana</code> value, so it will return the default.</em></p> -<h2>Object based API.</h2> <p>FlatBuffers is all about memory efficiency, which is why its base API is written around using as little as possible of it. This does make the API clumsier (requiring pre-order construction of all data, and making mutation harder).</p> <p>For times when efficiency is less important a more convenient object based API can be used (through <code>--gen-object-api</code>) that is able to unpack & pack a FlatBuffer into objects and standard STL containers, allowing for convenient construction, access and mutation.</p> <p>To use:</p> -<div class="fragment"><div class="line"><span class="keyword">auto</span> monsterobj = UnpackMonster(buffer);</div> +<div class="fragment"><div class="line"><span class="comment">// Autogenerated class from table Monster.</span></div> +<div class="line">MonsterT monsterobj;</div> +<div class="line"></div> +<div class="line"><span class="comment">// Deserialize from buffer into object.</span></div> +<div class="line">UnPackTo(&monsterobj, flatbuffer);</div> +<div class="line"></div> +<div class="line"><span class="comment">// Update object directly like a C++ class instance.</span></div> <div class="line">cout << monsterobj->name; <span class="comment">// This is now a std::string!</span></div> <div class="line">monsterobj->name = <span class="stringliteral">"Bob"</span>; <span class="comment">// Change the name.</span></div> +<div class="line"></div> +<div class="line"><span class="comment">// Serialize into new flatbuffer.</span></div> <div class="line">FlatBufferBuilder fbb;</div> -<div class="line">CreateMonster(fbb, monsterobj.get()); <span class="comment">// Serialize into new buffer.</span></div> -</div><!-- fragment --><h1>External references.</h1> +<div class="line">Pack(fbb, &monsterobj);</div> +</div><!-- fragment --><p>The following attributes are specific to the object-based API code generation:</p> +<ul> +<li><code>native_inline</code> (on a field): Because FlatBuffer tables and structs are optionally present in a given buffer, they are best represented as pointers (specifically std::unique_ptrs) in the native class since they can be null. This attribute changes the member declaration to use the type directly rather than wrapped in a unique_ptr.</li> +<li><code>native_default</code>: "value" (on a field): For members that are declared "native_inline", the value specified with this attribute will be included verbatim in the class constructor initializer list for this member.</li> +<li><p class="startli"><code>native_type</code>' "type" (on a struct): In some cases, a more optimal C++ data type exists for a given struct. For example, the following schema:</p> +<p class="startli">struct Vec2 { x: float; y: float; }</p> +<p class="startli">generates the following Object-Based API class:</p> +<p class="startli">struct Vec2T : flatbuffers::NativeTable { float x; float y; };</p> +<p class="startli">However, it can be useful to instead use a user-defined C++ type since it can provide more functionality, eg.</p> +<p class="startli">struct vector2 { float x = 0, y = 0; vector2 operator+(vector2 rhs) const { ... } vector2 operator-(vector2 rhs) const { ... } float length() const { ... } // etc. };</p> +<p class="startli">The <code>native_type</code> attribute will replace the usage of the generated class with the given type. So, continuing with the example, the generated code would use |vector2| in place of |Vec2T| for all generated code.</p> +<p class="startli">However, becuase the native_type is unknown to flatbuffers, the user must provide the following functions to aide in the serialization process:</p> +<p class="startli">namespace flatbuffers { FlatbufferStruct Pack(const native_type& obj); native_type UnPack(const FlatbufferStruct& obj); }</p> +</li> +</ul> +<p>Finally, the following top-level attribute</p> +<ul> +<li>native_include: "path" (at file level): Because the <code>native_type</code> attribute can be used to introduce types that are unknown to flatbuffers, it may be necessary to include "external" header files in the generated code. This attribute can be used to directly add an include directive to the top of the generated code that includes the specified path directly.</li> +</ul> +<h1>External references.</h1> <p>An additional feature of the object API is the ability to allow you to load multiple independent FlatBuffers, and have them refer to eachothers objects using hashes which are then represented as typed pointers in the object API.</p> <p>To make this work have a field in the objects you want to referred to which is using the string hashing feature (see <code>hash</code> attribute in the <a class="el" href="flatbuffers_guide_writing_schema.html">schema</a> documentation). Then you have a similar hash in the field referring to it, along with a <code>cpp_type</code> attribute specifying the C++ type this will refer to (this can be any C++ type, and will get a <code>*</code> added).</p> <p>Then, in JSON or however you create these buffers, make sure they use the same string (or hash).</p> diff --git a/flatbuffers_guide_writing_schema.html b/flatbuffers_guide_writing_schema.html index 0c10543397e2330306e70eedc0a991117a8112ee..d7a418a6623e2894b05d02c8250f38f11838803a 100644 --- a/flatbuffers_guide_writing_schema.html +++ b/flatbuffers_guide_writing_schema.html @@ -179,6 +179,7 @@ root_type Monster; <p>Unions share a lot of properties with enums, but instead of new names for constants, you use names of tables. You can then declare a union field, which can hold a reference to any of those types, and additionally a hidden field with the suffix <code>_type</code> is generated that holds the corresponding enum value, allowing you to know which type to cast to at runtime.</p> <p>Unions are a good way to be able to send multiple message types as a FlatBuffer. Note that because a union field is really two fields, it must always be part of a table, it cannot be the root of a FlatBuffer by itself.</p> <p>If you have a need to distinguish between different FlatBuffers in a more open-ended way, for example for use as files, see the file identification feature below.</p> +<p>There is an experimental support only in C++ for a vector of unions (and types). In the example IDL file above, use [Any] to add a vector of Any to Monster table.</p> <h3>Namespaces</h3> <p>These will generate the corresponding namespace in C++ for all helper code, and packages in Java. You can use <code>.</code> to specify nested namespaces / packages.</p> <h3>Includes</h3> @@ -217,6 +218,8 @@ root_type Monster; <li><code>key</code> (on a field): this field is meant to be used as a key when sorting a vector of the type of table it sits in. Can be used for in-place binary search.</li> <li><code>hash</code> (on a field). This is an (un)signed 32/64 bit integer field, whose value during JSON parsing is allowed to be a string, which will then be stored as its hash. The value of attribute is the hashing algorithm to use, one of <code>fnv1_32</code> <code>fnv1_64</code> <code>fnv1a_32</code> <code>fnv1a_64</code>.</li> <li><code>original_order</code> (on a table): since elements in a table do not need to be stored in any particular order, they are often optimized for space by sorting them to size. This attribute stops that from happening. There should generally not be any reason to use this flag.</li> +<li>'native_*'. Several attributes have been added to support the <a class="el" href="flatbuffers_guide_use_cpp.html#flatbuffers_cpp_object_based_api">C++ object</a> Based API". All such attributes + are prefixed with the term "native_".</li> </ul> <h2>JSON Parsing</h2> <p>The same parser that parses the schema declarations above is also able to parse JSON objects that conform to this schema. So, unlike other JSON parsers, this parser is strongly typed, and parses directly into a FlatBuffer (see the compiler documentation on how to do this from the command line, or the C++ documentation on how to do this at runtime).</p> diff --git a/flatbuffers_internals.html b/flatbuffers_internals.html index f603ffe5290a9c08974a8c5932ea25d91ee53b9a..11bf7cdb27419a2c4eeed39fa720f765f47b8a83 100644 --- a/flatbuffers_internals.html +++ b/flatbuffers_internals.html @@ -242,7 +242,66 @@ int16_t 0 // Padding for alignment. uint32_t 4 // Length of string. int8_t 'f', 'r', 'e', 'd', 0, 0, 0, 0 // Text + 0 termination + padding. </pre><p>Note that this not the only possible encoding, since the writer has some flexibility in which of the children of root object to write first (though in this case there's only one string), and what order to write the fields in. Different orders may also cause different alignments to happen.</p> -<p><br /> +<h1>FlexBuffers</h1> +<p>The <a class="el" href="flexbuffers.html">schema-less</a> version of FlatBuffers have their own encoding, detailed here.</p> +<p>It shares many properties mentioned above, in that all data is accessed over offsets, all scalars are aligned to their own size, and all data is always stored in little endian format.</p> +<p>One difference is that FlexBuffers are built front to back, so children are stored before parents, and the root of the data starts at the last byte.</p> +<p>Another difference is that scalar data is stored with a variable number of bits (8/16/32/64). The current width is always determined by the <em>parent</em>, i.e. if the scalar sits in a vector, the vector determines the bit width for all elements at once. Selecting the minimum bit width for a particular vector is something the encoder does automatically and thus is typically of no concern to the user, though being aware of this feature (and not sticking a double in the same vector as a bunch of byte sized elements) is helpful for efficiency.</p> +<p>Unlike FlatBuffers there is only one kind of offset, and that is an unsigned integer indicating the number of bytes in a negative direction from the address of itself (where the offset is stored).</p> +<h3>Vectors</h3> +<p>The representation of the vector is at the core of how FlexBuffers works (since maps are really just a combination of 2 vectors), so it is worth starting there.</p> +<p>As mentioned, a vector is governed by a single bit width (supplied by its parent). This includes the size field. For example, a vector that stores the integer values <code>1, 2, 3</code> is encoded as follows: </p><pre class="fragment">uint8_t 3, 1, 2, 3, 4, 4, 4 +</pre><p>The first <code>3</code> is the size field, and is placed before the vector (an offset from the parent to this vector points to the first element, not the size field, so the size field is effectively at index -1). Since this is an untyped vector <code>SL_VECTOR</code>, it is followed by 3 type bytes (one per element of the vector), which are always following the vector, and are always a uint8_t even if the vector is made up of bigger scalars.</p> +<h3>Types</h3> +<p>A type byte is made up of 2 components (see flexbuffers.h for exact values):</p> +<ul> +<li>2 lower bits representing the bit-width of the child (8, 16, 32, 64). This is only used if the child is accessed over an offset, such as a child vector. It is ignored for inline types.</li> +<li>6 bits representing the actual type (see flexbuffers.h).</li> +</ul> +<p>Thus, in this example <code>4</code> means 8 bit child (value 0, unused, since the value is in-line), type <code>SL_INT</code> (value 1).</p> +<h3>Typed Vectors</h3> +<p>These are like the Vectors above, but omit the type bytes. The type is instead determined by the vector type supplied by the parent. Typed vectors are only available for a subset of types for which these savings can be significant, namely inline signed/unsigned integers (<code>TYPE_VECTOR_INT</code> / <code>TYPE_VECTOR_UINT</code>), floats (<code>TYPE_VECTOR_FLOAT</code>), and keys (<code>TYPE_VECTOR_KEY</code>, see below).</p> +<p>Additionally, for scalars, there are fixed length vectors of sizes 2 / 3 / 4 that don't store the size (<code>TYPE_VECTOR_INT2</code> etc.), for an additional savings in space when storing common vector or color data.</p> +<h3>Scalars</h3> +<p>FlexBuffers supports integers (<code>TYPE_INT</code> and <code>TYPE_UINT</code>) and floats (<code>TYPE_FLOAT</code>), available in the bit-widths mentioned above. They can be stored both inline and over an offset (<code>TYPE_INDIRECT_*</code>).</p> +<p>The offset version is useful to encode costly 64bit (or even 32bit) quantities into vectors / maps of smaller sizes, and to share / repeat a value multiple times.</p> +<h3>Blobs, Strings and Keys.</h3> +<p>A blob (<code>TYPE_BLOB</code>) is encoded similar to a vector, with one difference: the elements are always <code>uint8_t</code>. The parent bit width only determines the width of the size field, allowing blobs to be large without the elements being large.</p> +<p>Strings (<code>TYPE_STRING</code>) are similar to blobs, except they have an additional 0 termination byte for convenience, and they MUST be UTF-8 encoded (since an accessor in a language that does not support pointers to UTF-8 data may have to convert them to a native string type).</p> +<p>A "Key" (<code>TYPE_KEY</code>) is similar to a string, but doesn't store the size field. They're so named because they are used with maps, which don't care for the size, and can thus be even more compact. Unlike strings, keys cannot contain bytes of value 0 as part of their data (size can only be determined by <code>strlen</code>), so while you can use them outside the context of maps if you so desire, you're usually better off with strings.</p> +<h3>Maps</h3> +<p>A map (<code>TYPE_MAP</code>) is like an (untyped) vector, but with 2 prefixes before the size field:</p> +<table class="doxtable"> +<tr> +<th align="right">index </th><th align="left">field </th></tr> +<tr> +<td align="right">-3 </td><td align="left">An offset to the keys vector (may be shared between tables). </td></tr> +<tr> +<td align="right">-2 </td><td align="left">Byte width of the keys vector. </td></tr> +<tr> +<td align="right">-1 </td><td align="left">Size (from here on it is compatible with <code>TYPE_VECTOR</code>) </td></tr> +<tr> +<td align="right">0 </td><td align="left">Elements. </td></tr> +<tr> +<td align="right">Size </td><td align="left">Types. </td></tr> +</table> +<p>Since a map is otherwise the same as a vector, it can be iterated like a vector (which is probably faster than lookup by key).</p> +<p>The keys vector is a typed vector of keys. Both the keys and corresponding values <em>have</em> to be stored in sorted order (as determined by <code>strcmp</code>), such that lookups can be made using binary search.</p> +<p>The reason the key vector is a seperate structure from the value vector is such that it can be shared between multiple value vectors, and also to allow it to be treated as its own indivual vector in code.</p> +<p>An example map { foo: 13, bar: 14 } would be encoded as: </p><pre class="fragment">0 : uint8_t 'f', 'o', 'o', 0 +4 : uint8_t 'b', 'a', 'r', 0 +8 : uint8_t 2 // key vector of size 2 +// key vector offset points here +9 : uint8_t 9, 6 // offsets to foo_key and bar_key +11: uint8_t 3, 1 // offset to key vector, and its byte width +13: uint8_t 2 // value vector of size +// value vector offset points here +14: uint8_t 13, 14 // values +16: uint8_t 4, 4 // types +</pre><h3>The root</h3> +<p>As mentioned, the root starts at the end of the buffer. The last uint8_t is the width in bytes of the root (normally the parent determines the width, but the root has no parent). The uint8_t before this is the type of the root, and the bytes before that are the root value (of the number of bytes specified by the last byte).</p> +<p>So for example, the integer value <code>13</code> as root would be: </p><pre class="fragment">uint8_t 13, 4, 1 // Value, type, root byte width. +</pre><p><br /> </p> </div></div><!-- contents --> </div><!-- doc-content --> diff --git a/flexbuffers.html b/flexbuffers.html new file mode 100644 index 0000000000000000000000000000000000000000..c1f79cc67eaf889853030e28825f61950491873d --- /dev/null +++ b/flexbuffers.html @@ -0,0 +1,183 @@ +<!-- HTML header for doxygen 1.8.6--> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://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.7"/> +<title>FlatBuffers: FlexBuffers</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="navtree.js"></script> +<script type="text/javascript"> + $(document).ready(initResizable); + $(window).load(resizeHeight); +</script> +<link href="search/search.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="search/search.js"></script> +<script type="text/javascript"> + $(document).ready(function() { searchBox.OnSelectItem(0); }); +</script> +<link href="doxygen.css" rel="stylesheet" type="text/css" /> +<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,400italic,500,500italic,700,700italic|Roboto+Mono:400,700" rel="stylesheet"> +<link href="style.css" rel="stylesheet" type="text/css"/> +</head> +<body> +<div id="top"><!-- do not remove this div, it is closed by doxygen! --> +<div id="titlearea" style="height: 110px;"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr style="height: 56px;"> + <td id="commonprojectlogo"> + <img alt="Logo" src="fpl_logo_small.png"/> + </td> + <td style="padding-left: 0.5em;"> + <div id="projectname">FlatBuffers + </div> + <div style="font-size:12px;"> + An open source project by <a href="https://developers.google.com/games/#Tools">FPL</a>. + </div> + </td> + </tr> + </tbody> +</table> +</div> +<!-- end header part --> +<!-- Generated by Doxygen 1.8.7 --> +<script type="text/javascript"> +var searchBox = new SearchBox("searchBox", "search",false,'Search'); +</script> + <div id="navrow1" class="tabs"> + <ul class="tablist"> + <li><a href="index.html"><span>Main Page</span></a></li> + <li><a href="usergroup0.html"><span>Programmer's Guide</span></a></li> + <li><a href="flatbuffers_support.html"><span>Platform / Language / Feature support</span></a></li> + <li><a href="flatbuffers_benchmarks.html"><span>Benchmarks</span></a></li> + <li><a href="flatbuffers_white_paper.html"><span>FlatBuffers white paper</span></a></li> + <li><a href="flatbuffers_internals.html"><span>FlatBuffers internals</span></a></li> + <li><a href="flatbuffers_grammar.html"><span>Grammar of the schema language</span></a></li> + <li><a href="usergroup1.html"><span>API Reference</span></a></li> + <li><a href="contributing.html"><span>Contributing</span></a></li> + <li> + <div id="MSearchBox" class="MSearchBoxInactive"> + <span class="left"> + <img id="MSearchSelect" src="search/mag_sel.png" + onmouseover="return searchBox.OnSearchSelectShow()" + onmouseout="return searchBox.OnSearchSelectHide()" + alt=""/> + <input type="text" id="MSearchField" value="Search" accesskey="S" + onfocus="searchBox.OnSearchFieldFocus(true)" + onblur="searchBox.OnSearchFieldFocus(false)" + onkeyup="searchBox.OnSearchFieldChange(event)"/> + </span><span class="right"> + <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a> + </span> + </div> + </li> + </ul> + </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"> +$(document).ready(function(){initNavTree('flexbuffers.html','');}); +</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)"> +<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Properties</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Pages</a></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">FlexBuffers </div> </div> +</div><!--header--> +<div class="contents"> +<div class="textblock"><p>FlatBuffers was designed around schemas, because when you want maximum performance and data consistency, strong typing is helpful.</p> +<p>There are however times when you want to store data that doesn't fit a schema, because you can't know ahead of time what all needs to be stored.</p> +<p>For this, FlatBuffers has a dedicated format, called FlexBuffers. This is a binary format that can be used in conjunction with FlatBuffers (by storing a part of a buffer in FlexBuffers format), or also as its own independent serialization format.</p> +<p>While it loses the strong typing, you retain the most unique advantage FlatBuffers has over other serialization formats (schema-based or not): FlexBuffers can also be accessed without parsing / copying / object allocation. This is a huge win in efficiency / memory friendly-ness, and allows unique use cases such as mmap-ing large amounts of free-form data.</p> +<p>FlexBuffers design and implementation allows for a very compact encoding, combining automatic pooling of strings with automatic sizing of containers to their smallest possible representation (8/16/32/64 bits). Many values and offsets can be encoded in just 8 bits. While a schema-less representation is usually more bulky because of the need to be self-descriptive, FlexBuffers generates smaller binaries for many cases than regular FlatBuffers.</p> +<p>FlexBuffers is still slower than regular FlatBuffers though, so we recommend to only use it if you need it.</p> +<h1>Usage</h1> +<p>This is for C++, other languages may follow.</p> +<p>Include the header <code>flexbuffers.h</code>, which in turn depends on <code>flatbuffers.h</code> and <code>util.h</code>.</p> +<p>To create a buffer:</p> +<div class="fragment"><div class="line"><a class="code" href="group__flatbuffers__javascript__api.html#gabd00b65bbe9e9fbac55fe4982eb6cec8">flexbuffers::Builder</a> fbb;</div> +<div class="line">fbb.Int(13);</div> +<div class="line">fbb.Finish();</div> +</div><!-- fragment --><p>You create any value, followed by <code>Finish</code>. Unlike FlatBuffers which requires the root value to be a table, here any value can be the root, including a lonely int value.</p> +<p>You can now access the <code>std::vector<uint8_t></code> that contains the encoded value as <code>fbb.GetBuffer()</code>. Write it, send it, or store it in a parent FlatBuffer. In this case, the buffer is just 3 bytes in size.</p> +<p>To read this value back, you could just say:</p> +<div class="fragment"><div class="line"><span class="keyword">auto</span> root = flexbuffers::GetRoot(my_buffer);</div> +<div class="line">int64_t i = root.AsInt64();</div> +</div><!-- fragment --><p>FlexBuffers stores ints only as big as needed, so it doesn't differentiate between different sizes of ints. You can ask for the 64 bit version, regardless of what you put in. In fact, since you demand to read the root as an int, if you supply a buffer that actually contains a float, or a string with numbers in it, it will convert it for you on the fly as well, or return 0 if it can't. If instead you actually want to know what is inside the buffer before you access it, you can call <code>root.GetType()</code> or <code>root.IsInt()</code> etc.</p> +<p>Here's a slightly more complex value you could write instead of <code>fbb.Int</code> above:</p> +<div class="fragment"><div class="line">fbb.Map([&]() {</div> +<div class="line"> fbb.Vector(<span class="stringliteral">"vec"</span>, [&]() {</div> +<div class="line"> fbb.Int(-100);</div> +<div class="line"> fbb.String(<span class="stringliteral">"Fred"</span>);</div> +<div class="line"> fbb.IndirectFloat(4.0f);</div> +<div class="line"> });</div> +<div class="line"> fbb.UInt(<span class="stringliteral">"foo"</span>, 100);</div> +<div class="line">});</div> +</div><!-- fragment --><p>This stores the equivalent of the JSON value <code>{ vec: [ -100, "Fred", 4.0 ], foo: 100 }</code>. The root is a dictionary that has just two key-value pairs, with keys <code>vec</code> and <code>foo</code>. Unlike FlatBuffers, it actually has to store these keys in the buffer (which it does only once if you store multiple such objects, by pooling key values), but also unlike FlatBuffers it has no restriction on the keys (fields) that you use.</p> +<p>The map constructor uses a C++11 Lambda to group its children, but you can also use more conventional start/end calls if you prefer.</p> +<p>The first value in the map is a vector. You'll notice that unlike FlatBuffers, you can use mixed types. There is also a <code>TypedVector</code> variant that only allows a single type, and uses a bit less memory.</p> +<p><code>IndirectFloat</code> is an interesting feature that allows you to store values by offset rather than inline. Though that doesn't make any visible change to the user, the consequence is that large values (especially doubles or 64 bit ints) that occur more than once can be shared. Another use case is inside of vectors, where the largest element makes up the size of all elements (e.g. a single double forces all elements to 64bit), so storing a lot of small integers together with a double is more efficient if the double is indirect.</p> +<p>Accessing it:</p> +<div class="fragment"><div class="line"><span class="keyword">auto</span> map = flexbuffers::GetRoot(my_buffer).AsMap();</div> +<div class="line">map.size(); <span class="comment">// 2</span></div> +<div class="line"><span class="keyword">auto</span> vec = map[<span class="stringliteral">"vec"</span>].AsVector();</div> +<div class="line">vec.size(); <span class="comment">// 3</span></div> +<div class="line">vec[0].AsInt64(); <span class="comment">// -100;</span></div> +<div class="line">vec[1].AsString().c_str(); <span class="comment">// "Fred";</span></div> +<div class="line">vec[1].AsInt64(); <span class="comment">// 0 (Number parsing failed).</span></div> +<div class="line">vec[2].AsDouble(); <span class="comment">// 4.0</span></div> +<div class="line">vec[2].AsString().IsTheEmptyString(); <span class="comment">// true (Wrong Type).</span></div> +<div class="line">vec[2].AsString().c_str(); <span class="comment">// "" (This still works though).</span></div> +<div class="line">vec[2].ToString().c_str(); <span class="comment">// "4" (Or have it converted).</span></div> +<div class="line">map[<span class="stringliteral">"foo"</span>].AsUInt8(); <span class="comment">// 100</span></div> +<div class="line">map[<span class="stringliteral">"unknown"</span>].IsNull(); <span class="comment">// true</span></div> +</div><!-- fragment --><h1>Binary encoding</h1> +<p>A description of how FlexBuffers are encoded is in the <a class="el" href="flatbuffers_internals.html">internals</a> document.</p> +<h1>Efficiency tips</h1> +<ul> +<li>Vectors generally are a lot more efficient than maps, so prefer them over maps when possible for small objects. Instead of a map with keys <code>x</code>, <code>y</code> and <code>z</code>, use a vector. Better yet, use a typed vector. Or even better, use a fixed size typed vector.</li> +<li>Maps are backwards compatible with vectors, and can be iterated as such. You can iterate either just the values (<code>map.Values()</code>), or in parallel with the keys vector (<code>map.Keys()</code>). If you intend to access most or all elements, this is faster than looking up each element by key, since that involves a binary search of the key vector.</li> +<li>When possible, don't mix values that require a big bit width (such as double) in a large vector of smaller values, since all elements will take on this width. Use <code>IndirectDouble</code> when this is a possibility. Note that integers automatically use the smallest width possible, i.e. if you ask to serialize an int64_t whose value is actually small, you will use less bits. Doubles are represented as floats whenever possible losslessly, but this is only possible for few values. Since nested vectors/maps are stored over offsets, they typically don't affect the vector width.</li> +<li>To store large arrays of byte data, use a blob. If you'd use a typed vector, the bit width of the size field may make it use more space than expected, and may not be compatible with <code>memcpy</code>. Similarly, large arrays of (u)int16_t may be better off stored as a binary blob if their size could exceed 64k elements. Construction and use are otherwise similar to strings. </li> +</ul> +</div></div><!-- contents --> +</div><!-- doc-content --> +<!-- Google Analytics --> +<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-49880327-7', 'auto'); + ga('send', 'pageview'); +</script> +</body> +</html> diff --git a/functions.html b/functions.html index 451d88eddf6fd5d4250c7bcf7739c8ab50fbe5e8..53e0945bed8cb1b2b340db3c9005c9af4d88c58c 100644 --- a/functions.html +++ b/functions.html @@ -290,16 +290,16 @@ $(document).ready(function(){initNavTree('functions.html','');}); : <a class="el" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#acc889115f91460ca89ce981cb02c2039">com.google.flatbuffers.FlatBufferBuilder</a> </li> <li>CreateVector() -: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">flatbuffers::FlatBufferBuilder</a> +: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207">flatbuffers::FlatBufferBuilder</a> </li> <li>CreateVectorOfSortedTables() -: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">flatbuffers::FlatBufferBuilder</a> +: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">flatbuffers::FlatBufferBuilder</a> </li> <li>CreateVectorOfStrings() : <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6">flatbuffers::FlatBufferBuilder</a> </li> <li>CreateVectorOfStructs() -: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1">flatbuffers::FlatBufferBuilder</a> +: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72">flatbuffers::FlatBufferBuilder</a> </li> <li>createVectorOfTables() : <a class="el" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a24ea4649f508a7843e429737a4a9fad1">com.google.flatbuffers.FlatBufferBuilder</a> @@ -320,6 +320,9 @@ $(document).ready(function(){initNavTree('functions.html','');}); <li>dataBuffer() : <a class="el" href="class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#ae7e97c2d21da04ef483e6940d442938f">Google\FlatBuffers\FlatbufferBuilder</a> </li> +<li>DedupVtables() +: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961">flatbuffers::FlatBufferBuilder</a> +</li> </ul> diff --git a/functions_func.html b/functions_func.html index 5193e6e7732329c5443e709784abebe2d5e51fea..ad3863a6fef721490a6d87ff299275c37e267eee 100644 --- a/functions_func.html +++ b/functions_func.html @@ -284,13 +284,13 @@ $(document).ready(function(){initNavTree('functions_func.html','');}); : <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207">flatbuffers::FlatBufferBuilder</a> </li> <li>CreateVectorOfSortedTables() -: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">flatbuffers::FlatBufferBuilder</a> +: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">flatbuffers::FlatBufferBuilder</a> </li> <li>CreateVectorOfStrings() : <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6">flatbuffers::FlatBufferBuilder</a> </li> <li>CreateVectorOfStructs() -: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1">flatbuffers::FlatBufferBuilder</a> +: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72">flatbuffers::FlatBufferBuilder</a> </li> <li>createVectorOfTables() : <a class="el" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a24ea4649f508a7843e429737a4a9fad1">com.google.flatbuffers.FlatBufferBuilder</a> @@ -306,6 +306,9 @@ $(document).ready(function(){initNavTree('functions_func.html','');}); : <a class="el" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#abf0fd34f0d93a9d89f595fddf752feb7">com.google.flatbuffers.FlatBufferBuilder</a> , <a class="el" href="class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#ae7e97c2d21da04ef483e6940d442938f">Google\FlatBuffers\FlatbufferBuilder</a> </li> +<li>DedupVtables() +: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961">flatbuffers::FlatBufferBuilder</a> +</li> </ul> diff --git a/group__flatbuffers__cpp__api.js b/group__flatbuffers__cpp__api.js index 4674cc37435966bcc4de5b4eae728db60bd3ab97..7a45d5ea8029c52c6b329ba3a5be894b9e6787e8 100644 --- a/group__flatbuffers__cpp__api.js +++ b/group__flatbuffers__cpp__api.js @@ -22,7 +22,9 @@ var group__flatbuffers__cpp__api = [ "CreateVectorOfSortedTables", "classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135", null ], [ "CreateVectorOfStrings", "classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6", null ], [ "CreateVectorOfStructs", "classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7", null ], + [ "CreateVectorOfStructs", "classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72", null ], [ "CreateVectorOfStructs", "classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1", null ], + [ "DedupVtables", "classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961", null ], [ "Finish", "classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912", null ], [ "FinishSizePrefixed", "classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220", null ], [ "ForceDefaults", "classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a", null ], diff --git a/index.html b/index.html index 5c1954970f2356db4a430aaa595927da4b4cc370..613a35fae827c8c4be79375f545ce38eee5d6bab 100644 --- a/index.html +++ b/index.html @@ -133,6 +133,7 @@ Overview</h1> <p>Protocol Buffers is indeed relatively similar to FlatBuffers, with the primary difference being that FlatBuffers does not need a parsing/ unpacking step to a secondary representation before you can access data, often coupled with per-object memory allocation. The code is an order of magnitude bigger, too. Protocol Buffers has neither optional text import/export nor schema language features like unions.</p> <h3>But all the cool kids use JSON!</h3> <p>JSON is very readable (which is why we use it as our optional text format) and very convenient when used together with dynamically typed languages (such as JavaScript). When serializing data from statically typed languages, however, JSON not only has the obvious drawback of runtime inefficiency, but also forces you to write <em>more</em> code to access data (counterintuitively) due to its dynamic-typing serialization system. In this context, it is only a better choice for systems that have very little to no information ahead of time about what data needs to be stored.</p> +<p>If you do need to store data that doesn't fit a schema, FlatBuffers also offers a schema-less (self-describing) version!</p> <p>Read more about the "why" of FlatBuffers in the <a class="el" href="flatbuffers_white_paper.html">white paper</a>.</p> <h3>Who uses FlatBuffers?</h3> <ul> @@ -161,6 +162,7 @@ Overview</h1> <li><a class="el" href="flatbuffers_support.html">Support matrix</a> for platforms/languages/features.</li> <li>Some <a class="el" href="flatbuffers_benchmarks.html">benchmarks</a> showing the advantage of using FlatBuffers.</li> <li>A <a class="el" href="flatbuffers_white_paper.html">white paper</a> explaining the "why" of FlatBuffers.</li> +<li>How to use the <a class="el" href="flexbuffers.html">schema-less</a> version of FlatBuffers.</li> <li>A description of the <a class="el" href="flatbuffers_internals.html">internals</a> of FlatBuffers.</li> <li>A formal <a class="el" href="flatbuffers_grammar.html">grammar</a> of the schema language.</li> </ul> diff --git a/navtree.js b/navtree.js index 340e3736f90e6cfae5abb9c1e6884bbae61526e0..00e152cd819897c8b638f85ac3dabec0afef9b4b 100644 --- a/navtree.js +++ b/navtree.js @@ -13,7 +13,8 @@ var NAVTREE = [ "Use in Java/C#", "flatbuffers_guide_use_java_c-sharp.html", null ], [ "Use in JavaScript", "flatbuffers_guide_use_javascript.html", null ], [ "Use in PHP", "flatbuffers_guide_use_php.html", null ], - [ "Use in Python", "flatbuffers_guide_use_python.html", null ] + [ "Use in Python", "flatbuffers_guide_use_python.html", null ], + [ "Schema-less version", "flexbuffers.html", null ] ] ], [ "Platform / Language / Feature support", "flatbuffers_support.html", null ], [ "Benchmarks", "flatbuffers_benchmarks.html", null ], diff --git a/navtreeindex0.js b/navtreeindex0.js index e54430bdd967db6824b90a6b0112afaab38e2a5c..9fdfa6c8a5768416e954fd27df060591fdf7c62e 100644 --- a/navtreeindex0.js +++ b/navtreeindex0.js @@ -77,35 +77,37 @@ var NAVTREEINDEX0 = "classes.html":[7,1,1], "classflatbuffers_1_1_flat_buffer_builder.html":[7,0,0,0], "classflatbuffers_1_1_flat_buffer_builder.html#a01dabf5cdd6b1b2881337e1e84aa1683":[7,0,0,0,1], -"classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912":[7,0,0,0,22], +"classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912":[7,0,0,0,24], "classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b":[7,0,0,0,16], "classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9":[7,0,0,0,5], -"classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a":[7,0,0,0,24], +"classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a":[7,0,0,0,26], "classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6":[7,0,0,0,17], -"classflatbuffers_1_1_flat_buffer_builder.html#a21c7f933d7ff1212f2090763ef9f0c44":[7,0,0,0,29], +"classflatbuffers_1_1_flat_buffer_builder.html#a21c7f933d7ff1212f2090763ef9f0c44":[7,0,0,0,31], "classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50":[7,0,0,0,12], "classflatbuffers_1_1_flat_buffer_builder.html#a274b1afcfa16bab2c884129b2788db19":[7,0,0,0,15], "classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3":[7,0,0,0,13], "classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7":[7,0,0,0,4], -"classflatbuffers_1_1_flat_buffer_builder.html#a3f4252e9bc005ba6c700469544fdccc9":[7,0,0,0,27], +"classflatbuffers_1_1_flat_buffer_builder.html#a3f4252e9bc005ba6c700469544fdccc9":[7,0,0,0,29], "classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6":[7,0,0,0,19], -"classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220":[7,0,0,0,23], +"classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72":[7,0,0,0,21], +"classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220":[7,0,0,0,25], "classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3":[7,0,0,0,6], -"classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1":[7,0,0,0,21], +"classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1":[7,0,0,0,22], "classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f":[7,0,0,0,9], -"classflatbuffers_1_1_flat_buffer_builder.html#a8dc35f792179df4ca850492c1796d8b8":[7,0,0,0,26], -"classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b":[7,0,0,0,25], +"classflatbuffers_1_1_flat_buffer_builder.html#a8dc35f792179df4ca850492c1796d8b8":[7,0,0,0,28], +"classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b":[7,0,0,0,27], +"classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961":[7,0,0,0,23], "classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5":[7,0,0,0,8], "classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1":[7,0,0,0,3], "classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506":[7,0,0,0,10], -"classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63":[7,0,0,0,28], +"classflatbuffers_1_1_flat_buffer_builder.html#ac1bfd609f7f736e9a37cedae77448b63":[7,0,0,0,30], "classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c":[7,0,0,0,11], "classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135":[7,0,0,0,18], "classflatbuffers_1_1_flat_buffer_builder.html#ac72b54a75e0c329e0ce0b8fab758e256":[7,0,0,0,0], "classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412":[7,0,0,0,2], "classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe":[7,0,0,0,7], "classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207":[7,0,0,0,14], -"classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19":[7,0,0,0,30], +"classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19":[7,0,0,0,32], "classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7":[7,0,0,0,20], "contributing.html":[8], "flatbuffers_benchmarks.html":[3], @@ -124,6 +126,7 @@ var NAVTREEINDEX0 = "flatbuffers_internals.html":[5], "flatbuffers_support.html":[2], "flatbuffers_white_paper.html":[4], +"flexbuffers.html":[1,11], "functions.html":[7,1,2,0], "functions_func.html":[7,1,2,1], "functions_prop.html":[7,1,2,3], diff --git a/search/all_2.js b/search/all_2.js index 7e482db7e36b8572de1c54fd968be5f97572e60d..efd80e359bd3a65dad41d2a573f7fff74fd59240 100644 --- a/search/all_2.js +++ b/search/all_2.js @@ -7,7 +7,7 @@ var searchData= ['addfloat',['addFloat',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a55c20e99ba68be516dfbddfddb9efd4d',1,'com.google.flatbuffers.FlatBufferBuilder.addFloat()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#a5ce6215b65e222b8ee22d3eb4436e404',1,'Google\FlatBuffers\FlatbufferBuilder\addFloat()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#a41a1e6f7e7b9098a9d8c1af7157ef2bf',1,'FlatBuffers.FlatBufferBuilder.AddFloat()']]], ['addfloat32',['addFloat32',['../group__flatbuffers__javascript__api.html#ga1c36e9d7e294c61d1d6ab0923ea91e8e',1,'flatbuffers.js']]], ['addfloat64',['addFloat64',['../group__flatbuffers__javascript__api.html#ga53af3baf50f96de783c06a35934d63bf',1,'flatbuffers.js']]], - ['addint',['AddInt',['../class_flat_buffers_1_1_flat_buffer_builder.html#a7970bfc069caeee5dfd994e6c1106ab9',1,'FlatBuffers.FlatBufferBuilder.AddInt()'],['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a1c0ae381bf6adb84b18e613aadf8d4db',1,'com.google.flatbuffers.FlatBufferBuilder.addInt()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#a63c9d66329dff15855d11c89134599e0',1,'Google\FlatBuffers\FlatbufferBuilder\addInt()']]], + ['addint',['addInt',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a1c0ae381bf6adb84b18e613aadf8d4db',1,'com.google.flatbuffers.FlatBufferBuilder.addInt()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#a63c9d66329dff15855d11c89134599e0',1,'Google\FlatBuffers\FlatbufferBuilder\addInt()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#a7970bfc069caeee5dfd994e6c1106ab9',1,'FlatBuffers.FlatBufferBuilder.AddInt()']]], ['addint16',['addInt16',['../group__flatbuffers__javascript__api.html#ga8260b8431cb8b1c32b5997646cb102a9',1,'flatbuffers.js']]], ['addint32',['addInt32',['../group__flatbuffers__javascript__api.html#gaba2edd0e1e53d1c2815bb1a6ee54abf5',1,'flatbuffers.js']]], ['addint64',['addInt64',['../group__flatbuffers__javascript__api.html#ga17a48cc241b10348fd6751ed3a973e2d',1,'flatbuffers.js']]], diff --git a/search/all_4.js b/search/all_4.js index 980a32a0a9fcfff1dbdc9b4ea728d81b46c29ce2..d7d0fe39b0a3ce33efa741c3dbd9221f49f9a0eb 100644 --- a/search/all_4.js +++ b/search/all_4.js @@ -11,7 +11,7 @@ var searchData= ['createvector',['CreateVector',['../classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3',1,'flatbuffers::FlatBufferBuilder::CreateVector(const T *v, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207',1,'flatbuffers::FlatBufferBuilder::CreateVector(const std::vector< T > &v)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b',1,'flatbuffers::FlatBufferBuilder::CreateVector(size_t vector_size, const std::function< T(size_t i)> &f)']]], ['createvectorofsortedtables',['CreateVectorOfSortedTables',['../classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfSortedTables(Offset< T > *v, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfSortedTables(std::vector< Offset< T >> *v)']]], ['createvectorofstrings',['CreateVectorOfStrings',['../classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6',1,'flatbuffers::FlatBufferBuilder']]], - ['createvectorofstructs',['CreateVectorOfStructs',['../classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfStructs(const T *v, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfStructs(const std::vector< T > &v)']]], + ['createvectorofstructs',['CreateVectorOfStructs',['../classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfStructs(const T *v, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfStructs(size_t vector_size, const std::function< void(size_t i, T *)> &filler)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfStructs(const std::vector< T > &v)']]], ['createvectoroftables',['createVectorOfTables',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a24ea4649f508a7843e429737a4a9fad1',1,'com::google::flatbuffers::FlatBufferBuilder']]], ['createvectoroftables_3c_20t_20_3e',['CreateVectorOfTables< T >',['../class_flat_buffers_1_1_flat_buffer_builder.html#a82219d659221dfc4c271399d9e56c47a',1,'FlatBuffers::FlatBufferBuilder']]], ['c_2b_2b_20api',['C++ API',['../group__flatbuffers__cpp__api.html',1,'']]], diff --git a/search/all_5.js b/search/all_5.js index 31a3eb55b79fb6795693f806e516878935ada3b1..d4ec2b75d7b998dee906e3ef95264c05e090ff21 100644 --- a/search/all_5.js +++ b/search/all_5.js @@ -1,4 +1,5 @@ var searchData= [ - ['databuffer',['dataBuffer',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#abf0fd34f0d93a9d89f595fddf752feb7',1,'com.google.flatbuffers.FlatBufferBuilder.dataBuffer()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#ae7e97c2d21da04ef483e6940d442938f',1,'Google\FlatBuffers\FlatbufferBuilder\dataBuffer()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#a6f0cbd075878e2c0f021c0947cc8a211',1,'FlatBuffers.FlatBufferBuilder.DataBuffer()'],['../group__flatbuffers__javascript__api.html#ga674814e0816f06c8a29ab364d19bed60',1,'dataBuffer(): flatbuffers.js']]] + ['databuffer',['dataBuffer',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#abf0fd34f0d93a9d89f595fddf752feb7',1,'com.google.flatbuffers.FlatBufferBuilder.dataBuffer()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#ae7e97c2d21da04ef483e6940d442938f',1,'Google\FlatBuffers\FlatbufferBuilder\dataBuffer()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#a6f0cbd075878e2c0f021c0947cc8a211',1,'FlatBuffers.FlatBufferBuilder.DataBuffer()'],['../group__flatbuffers__javascript__api.html#ga674814e0816f06c8a29ab364d19bed60',1,'dataBuffer(): flatbuffers.js']]], + ['dedupvtables',['DedupVtables',['../classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961',1,'flatbuffers::FlatBufferBuilder']]] ]; diff --git a/search/all_7.js b/search/all_7.js index 882937bdd3680ca2c31680da2b9ec260409427e0..36c95a7fca56a75a93a19e2b4b59f24734cb81aa 100644 --- a/search/all_7.js +++ b/search/all_7.js @@ -14,5 +14,6 @@ var searchData= ['flatbuffers_2ejs',['flatbuffers.js',['../flatbuffers_8js.html',1,'']]], ['flatbuffer_20internals',['FlatBuffer Internals',['../flatbuffers_internals.html',1,'']]], ['flatbuffers_20white_20paper',['FlatBuffers white paper',['../flatbuffers_white_paper.html',1,'']]], + ['flexbuffers',['FlexBuffers',['../flexbuffers.html',1,'']]], ['forcedefaults',['forceDefaults',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#aaadff3772bfdff756b4f269afae5ac69',1,'com.google.flatbuffers.FlatBufferBuilder.forceDefaults()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#a5d75bca1a17d58bb6e383a73761ba45f',1,'Google\FlatBuffers\FlatbufferBuilder\forceDefaults()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#a40d549b2db96b91b2345d1a44ff3fe13',1,'FlatBuffers.FlatBufferBuilder.ForceDefaults()'],['../classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a',1,'flatbuffers::FlatBufferBuilder::ForceDefaults()'],['../group__flatbuffers__javascript__api.html#ga0d1738111b83dffb2c2a7fc8bca19b33',1,'forceDefaults(): flatbuffers.js']]] ]; diff --git a/search/functions_1.js b/search/functions_1.js index 6475ae62471c7b55d0571730706b4eee19d0d4c6..e6c4d1618df768161811bf4084bf457f4c12b8e4 100644 --- a/search/functions_1.js +++ b/search/functions_1.js @@ -5,7 +5,7 @@ var searchData= ['addbyte',['AddByte',['../class_flat_buffers_1_1_flat_buffer_builder.html#ac11b10888152d4f687e8ce4d60022254',1,'FlatBuffers.FlatBufferBuilder.AddByte()'],['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#ae019d7ee089c95a37421365d5fb9533b',1,'com.google.flatbuffers.FlatBufferBuilder.addByte()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#a7b78098530190cb90d315419fb1d21fc',1,'Google\FlatBuffers\FlatbufferBuilder\addByte()']]], ['adddouble',['addDouble',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#ac36c1fc72851b17129fc763da00cff32',1,'com.google.flatbuffers.FlatBufferBuilder.addDouble()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#a23a5478774e8909117d31b62dde51e86',1,'Google\FlatBuffers\FlatbufferBuilder\addDouble()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#aef6feaf282148043e6a1c9c1ba9e2094',1,'FlatBuffers.FlatBufferBuilder.AddDouble()']]], ['addfloat',['addFloat',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a55c20e99ba68be516dfbddfddb9efd4d',1,'com.google.flatbuffers.FlatBufferBuilder.addFloat()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#a5ce6215b65e222b8ee22d3eb4436e404',1,'Google\FlatBuffers\FlatbufferBuilder\addFloat()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#a41a1e6f7e7b9098a9d8c1af7157ef2bf',1,'FlatBuffers.FlatBufferBuilder.AddFloat()']]], - ['addint',['AddInt',['../class_flat_buffers_1_1_flat_buffer_builder.html#a7970bfc069caeee5dfd994e6c1106ab9',1,'FlatBuffers.FlatBufferBuilder.AddInt()'],['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a1c0ae381bf6adb84b18e613aadf8d4db',1,'com.google.flatbuffers.FlatBufferBuilder.addInt()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#a63c9d66329dff15855d11c89134599e0',1,'Google\FlatBuffers\FlatbufferBuilder\addInt()']]], + ['addint',['addInt',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a1c0ae381bf6adb84b18e613aadf8d4db',1,'com.google.flatbuffers.FlatBufferBuilder.addInt()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#a63c9d66329dff15855d11c89134599e0',1,'Google\FlatBuffers\FlatbufferBuilder\addInt()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#a7970bfc069caeee5dfd994e6c1106ab9',1,'FlatBuffers.FlatBufferBuilder.AddInt()']]], ['addlong',['addLong',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a0e1215f334989ecc59b49a3239aed5b5',1,'com.google.flatbuffers.FlatBufferBuilder.addLong()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#a8875bff7ef67af16938cabe719ceac70',1,'Google\FlatBuffers\FlatbufferBuilder\addLong()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#a0d182e151b4f57d47069885cc1d05893',1,'FlatBuffers.FlatBufferBuilder.AddLong()']]], ['addoffset',['AddOffset',['../class_flat_buffers_1_1_flat_buffer_builder.html#ae1d6d927d400c330cae48951eae546e5',1,'FlatBuffers.FlatBufferBuilder.AddOffset()'],['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#ae817751382089b603753452cc1e56790',1,'com.google.flatbuffers.FlatBufferBuilder.addOffset()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#a127fe515651f4b4347ea8e01b3951934',1,'Google\FlatBuffers\FlatbufferBuilder\addOffset()']]], ['addsbyte',['addSbyte',['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#a6add2b19644657fbe0925cb0238618c6',1,'Google\FlatBuffers\FlatbufferBuilder\addSbyte()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#a0b2addc87bde29213424a187b7b08707',1,'FlatBuffers.FlatBufferBuilder.AddSbyte()']]], diff --git a/search/functions_2.js b/search/functions_2.js index d3e8d69d4b7d6f1e5eb9eebf410aad44079b9a92..f7f7b4ad60dc220eea393850ddc6c28893f4dc2f 100644 --- a/search/functions_2.js +++ b/search/functions_2.js @@ -9,7 +9,7 @@ var searchData= ['createvector',['CreateVector',['../classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3',1,'flatbuffers::FlatBufferBuilder::CreateVector(const T *v, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207',1,'flatbuffers::FlatBufferBuilder::CreateVector(const std::vector< T > &v)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b',1,'flatbuffers::FlatBufferBuilder::CreateVector(size_t vector_size, const std::function< T(size_t i)> &f)']]], ['createvectorofsortedtables',['CreateVectorOfSortedTables',['../classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfSortedTables(Offset< T > *v, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfSortedTables(std::vector< Offset< T >> *v)']]], ['createvectorofstrings',['CreateVectorOfStrings',['../classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6',1,'flatbuffers::FlatBufferBuilder']]], - ['createvectorofstructs',['CreateVectorOfStructs',['../classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfStructs(const T *v, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfStructs(const std::vector< T > &v)']]], + ['createvectorofstructs',['CreateVectorOfStructs',['../classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfStructs(const T *v, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfStructs(size_t vector_size, const std::function< void(size_t i, T *)> &filler)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a8704709a2e25ad04679212ee4126b1a1',1,'flatbuffers::FlatBufferBuilder::CreateVectorOfStructs(const std::vector< T > &v)']]], ['createvectoroftables',['createVectorOfTables',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a24ea4649f508a7843e429737a4a9fad1',1,'com::google::flatbuffers::FlatBufferBuilder']]], ['createvectoroftables_3c_20t_20_3e',['CreateVectorOfTables< T >',['../class_flat_buffers_1_1_flat_buffer_builder.html#a82219d659221dfc4c271399d9e56c47a',1,'FlatBuffers::FlatBufferBuilder']]] ]; diff --git a/search/functions_3.js b/search/functions_3.js index 02f2cf153c3c410a33052089f04ac555fdd3afbf..a82b8a29b6b13812e921f7d8602aa8e2c3bfd5e4 100644 --- a/search/functions_3.js +++ b/search/functions_3.js @@ -1,4 +1,5 @@ var searchData= [ - ['databuffer',['dataBuffer',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#abf0fd34f0d93a9d89f595fddf752feb7',1,'com.google.flatbuffers.FlatBufferBuilder.dataBuffer()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#ae7e97c2d21da04ef483e6940d442938f',1,'Google\FlatBuffers\FlatbufferBuilder\dataBuffer()']]] + ['databuffer',['dataBuffer',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#abf0fd34f0d93a9d89f595fddf752feb7',1,'com.google.flatbuffers.FlatBufferBuilder.dataBuffer()'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#ae7e97c2d21da04ef483e6940d442938f',1,'Google\FlatBuffers\FlatbufferBuilder\dataBuffer()']]], + ['dedupvtables',['DedupVtables',['../classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961',1,'flatbuffers::FlatBufferBuilder']]] ]; diff --git a/search/pages_2.js b/search/pages_2.js index 79a380e94063776116070a3c89787e0b9c0be572..41693ae99b8396fc48df9f66dca1ad681635ba4d 100644 --- a/search/pages_2.js +++ b/search/pages_2.js @@ -1,5 +1,6 @@ var searchData= [ ['flatbuffer_20internals',['FlatBuffer Internals',['../flatbuffers_internals.html',1,'']]], - ['flatbuffers_20white_20paper',['FlatBuffers white paper',['../flatbuffers_white_paper.html',1,'']]] + ['flatbuffers_20white_20paper',['FlatBuffers white paper',['../flatbuffers_white_paper.html',1,'']]], + ['flexbuffers',['FlexBuffers',['../flexbuffers.html',1,'']]] ]; diff --git a/usergroup0.html b/usergroup0.html index f9acf582a1bc0dda3e5aed33575796c28c36f17e..12cc81feec5663b61a2d7a8caf1749432f8def8f 100644 --- a/usergroup0.html +++ b/usergroup0.html @@ -92,6 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); <li><a href="flatbuffers_guide_use_javascript.html"><span>Use in JavaScript</span></a></li> <li><a href="flatbuffers_guide_use_php.html"><span>Use in PHP</span></a></li> <li><a href="flatbuffers_guide_use_python.html"><span>Use in Python</span></a></li> + <li><a href="flexbuffers.html"><span>Schema-less version</span></a></li> </ul> </div> </div><!-- top --> @@ -140,6 +141,7 @@ $(document).ready(function(){initNavTree('usergroup0.html','');}); <li><a href="flatbuffers_guide_use_javascript.html"><span>Use in JavaScript</span></a></li> <li><a href="flatbuffers_guide_use_php.html"><span>Use in PHP</span></a></li> <li><a href="flatbuffers_guide_use_python.html"><span>Use in Python</span></a></li> +<li><a href="flexbuffers.html"><span>Schema-less version</span></a></li> </ul> </div><!-- contents --> </div><!-- doc-content -->