diff --git a/classflatbuffers_1_1_default_allocator-members.html b/classflatbuffers_1_1_default_allocator-members.html
index e05eef2ddc1e6c59027b5b3853d5d1e468e88b13..7e58d521e0090898a08c811246ec157f0aa5849b 100644
--- a/classflatbuffers_1_1_default_allocator-members.html
+++ b/classflatbuffers_1_1_default_allocator-members.html
@@ -96,10 +96,9 @@ $(document).ready(function(){initNavTree('classflatbuffers_1_1_default_allocator
 <table class="directory">
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>allocate</b>(size_t size) FLATBUFFERS_OVERRIDE (defined in <a class="el" href="classflatbuffers_1_1_default_allocator.html">flatbuffers::DefaultAllocator</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_default_allocator.html">flatbuffers::DefaultAllocator</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>deallocate</b>(uint8_t *p, size_t) FLATBUFFERS_OVERRIDE (defined in <a class="el" href="classflatbuffers_1_1_default_allocator.html">flatbuffers::DefaultAllocator</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_default_allocator.html">flatbuffers::DefaultAllocator</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>instance</b>() (defined in <a class="el" href="classflatbuffers_1_1_default_allocator.html">flatbuffers::DefaultAllocator</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_default_allocator.html">flatbuffers::DefaultAllocator</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>memcpy_downward</b>(uint8_t *old_p, size_t old_size, uint8_t *new_p, size_t new_size, size_t in_use_back, size_t in_use_front) (defined in <a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>reallocate_downward</b>(uint8_t *old_p, size_t old_size, size_t new_size, size_t in_use_back, size_t in_use_front) (defined in <a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>~Allocator</b>() (defined in <a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>memcpy_downward</b>(uint8_t *old_p, size_t old_size, uint8_t *new_p, size_t new_size, size_t in_use_back, size_t in_use_front) (defined in <a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>reallocate_downward</b>(uint8_t *old_p, size_t old_size, size_t new_size, size_t in_use_back, size_t in_use_front) (defined in <a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>~Allocator</b>() (defined in <a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
 </table></div><!-- contents -->
 </div><!-- doc-content -->
 <!-- Google Analytics -->
diff --git a/classflatbuffers_1_1_default_allocator.html b/classflatbuffers_1_1_default_allocator.html
index 3130ea262bfb10f7a423556d19e03ffe3cacaeac..22e612fbd7ce15bbc369ca6af190cd9ab44a0a8f 100644
--- a/classflatbuffers_1_1_default_allocator.html
+++ b/classflatbuffers_1_1_default_allocator.html
@@ -89,7 +89,6 @@ $(document).ready(function(){initNavTree('classflatbuffers_1_1_default_allocator
 <div class="header">
   <div class="summary">
 <a href="#pub-methods">Public Member Functions</a> &#124;
-<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
 <a href="classflatbuffers_1_1_default_allocator-members.html">List of all members</a>  </div>
   <div class="headertitle">
 <div class="title">flatbuffers::DefaultAllocator Class Reference</div>  </div>
@@ -107,23 +106,17 @@ Inheritance diagram for flatbuffers::DefaultAllocator:</div>
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
 Public Member Functions</h2></td></tr>
-<tr class="memitem:a9ddbc3a812e35a46a36b37baa17503d0"><td class="memItemLeft" align="right" valign="top"><a id="a9ddbc3a812e35a46a36b37baa17503d0"></a>
-virtual uint8_t *&#160;</td><td class="memItemRight" valign="bottom"><b>allocate</b> (size_t size) FLATBUFFERS_OVERRIDE</td></tr>
-<tr class="separator:a9ddbc3a812e35a46a36b37baa17503d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a69f1e08a9f98cd86d04a0bc5ad08b187"><td class="memItemLeft" align="right" valign="top"><a id="a69f1e08a9f98cd86d04a0bc5ad08b187"></a>
-virtual void&#160;</td><td class="memItemRight" valign="bottom"><b>deallocate</b> (uint8_t *p, size_t) FLATBUFFERS_OVERRIDE</td></tr>
-<tr class="separator:a69f1e08a9f98cd86d04a0bc5ad08b187"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af14dc83724cf6373c7f757c3e2518e6e"><td class="memItemLeft" align="right" valign="top"><a id="af14dc83724cf6373c7f757c3e2518e6e"></a>
+uint8_t *&#160;</td><td class="memItemRight" valign="bottom"><b>allocate</b> (size_t size) FLATBUFFERS_OVERRIDE</td></tr>
+<tr class="separator:af14dc83724cf6373c7f757c3e2518e6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acfc866696fe9db8e74d9529d8fc70aac"><td class="memItemLeft" align="right" valign="top"><a id="acfc866696fe9db8e74d9529d8fc70aac"></a>
+void&#160;</td><td class="memItemRight" valign="bottom"><b>deallocate</b> (uint8_t *p, size_t) FLATBUFFERS_OVERRIDE</td></tr>
+<tr class="separator:acfc866696fe9db8e74d9529d8fc70aac"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="inherit_header pub_methods_classflatbuffers_1_1_allocator"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classflatbuffers_1_1_allocator')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a></td></tr>
 <tr class="memitem:a1344ebeb1c1ab40a6d5b78b4e20ed187 inherit pub_methods_classflatbuffers_1_1_allocator"><td class="memItemLeft" align="right" valign="top"><a id="a1344ebeb1c1ab40a6d5b78b4e20ed187"></a>
 virtual uint8_t *&#160;</td><td class="memItemRight" valign="bottom"><b>reallocate_downward</b> (uint8_t *old_p, size_t old_size, size_t new_size, size_t in_use_back, size_t in_use_front)</td></tr>
 <tr class="separator:a1344ebeb1c1ab40a6d5b78b4e20ed187 inherit pub_methods_classflatbuffers_1_1_allocator"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
-<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
-Static Public Member Functions</h2></td></tr>
-<tr class="memitem:a57604c8749237a162bb22fcea09482ef"><td class="memItemLeft" align="right" valign="top"><a id="a57604c8749237a162bb22fcea09482ef"></a>
-static <a class="el" href="classflatbuffers_1_1_default_allocator.html">DefaultAllocator</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><b>instance</b> ()</td></tr>
-<tr class="separator:a57604c8749237a162bb22fcea09482ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
-</table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
 Additional Inherited Members</h2></td></tr>
 <tr class="inherit_header pro_methods_classflatbuffers_1_1_allocator"><td colspan="2" onclick="javascript:toggleInherit('pro_methods_classflatbuffers_1_1_allocator')"><img src="closed.png" alt="-"/>&#160;Protected Member Functions inherited from <a class="el" href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a></td></tr>
diff --git a/classflatbuffers_1_1_default_allocator.js b/classflatbuffers_1_1_default_allocator.js
index b69e7b848c3bf3e1978bc81f74485ee3535cd7ce..8df21fa30aea4cc71a5799d03c1fbfef7df81061 100644
--- a/classflatbuffers_1_1_default_allocator.js
+++ b/classflatbuffers_1_1_default_allocator.js
@@ -1,6 +1,5 @@
 var classflatbuffers_1_1_default_allocator =
 [
-    [ "allocate", "classflatbuffers_1_1_default_allocator.html#a9ddbc3a812e35a46a36b37baa17503d0", null ],
-    [ "deallocate", "classflatbuffers_1_1_default_allocator.html#a69f1e08a9f98cd86d04a0bc5ad08b187", null ],
-    [ "instance", "classflatbuffers_1_1_default_allocator.html#a57604c8749237a162bb22fcea09482ef", null ]
+    [ "allocate", "classflatbuffers_1_1_default_allocator.html#af14dc83724cf6373c7f757c3e2518e6e", null ],
+    [ "deallocate", "classflatbuffers_1_1_default_allocator.html#acfc866696fe9db8e74d9529d8fc70aac", null ]
 ];
\ No newline at end of file
diff --git a/classflatbuffers_1_1_flat_buffer_builder-members.html b/classflatbuffers_1_1_flat_buffer_builder-members.html
index d323c8251ac08771d079104187b9a40d0c25afe7..0c66d7af570c34f1081282945c52c5512bf7103b 100644
--- a/classflatbuffers_1_1_flat_buffer_builder-members.html
+++ b/classflatbuffers_1_1_flat_buffer_builder-members.html
@@ -104,56 +104,57 @@ $(document).ready(function(){initNavTree('classflatbuffers_1_1_flat_buffer_build
   <tr><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5">CreateString</a>(const char *str)</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#ac51db9083ac815eb81420b6d51f42154">CreateString</a>(char *str)</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#a8c3af55e64f5cda9aefa38ac5287ef9f">CreateString</a>(const std::string &amp;str)</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#ac0b6a1c5d949f20ad84367fc0f9e1506">CreateString</a>(const String *str)</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#ab77d800e77fa76bc758a6c399fd37685">CreateString</a>(const T &amp;str)</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#a43f51ba9c8f4f24ea2247a3979d095b8">CreateStruct</a>(const T &amp;structobj)</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#ac2b96292fa0fb1534fe7fd218a094d0c">CreateUninitializedVector</a>(size_t len, size_t elemsize, uint8_t **buf)</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#a2305b63d367845972b51669dd995cc50">CreateUninitializedVector</a>(size_t len, T **buf)</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#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</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 bgcolor="#f0f0f0" class="even"><td class="entry"><b>CreateVector</b>(const Offset&lt; T &gt; *v, size_t len) (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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#af715dd24dd37cb0151dc7a980ad0f207">CreateVector</a>(const std::vector&lt; T &gt; &amp;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 bgcolor="#f0f0f0" class="even"><td class="entry"><b>CreateVector</b>(const std::vector&lt; bool &gt; &amp;v) (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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#a1080c9e370e2d9d9d872dadd1131436b">CreateVector</a>(size_t vector_size, const std::function&lt; T(size_t i)&gt; &amp;f)</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#a53504fc2cab681a7980b03260f8b2f7a">CreateVector</a>(size_t vector_size, F f, S *state)</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#a3d57074082aaab8cdeb8474ff9df0b53">CreateVectorOfNativeStructs</a>(const S *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 class="even"><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95">CreateVectorOfNativeStructs</a>(const std::vector&lt; S &gt; &amp;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#a23aa4c910e053446cc404bc486012e54">CreateVectorOfSortedNativeStructs</a>(std::vector&lt; S &gt; *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#a799701af34c398d8eb86e049b73bcecf">CreateVectorOfSortedNativeStructs</a>(S *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#a7cc10b709dfa3e72083843d1a5e36c15">CreateVectorOfSortedStructs</a>(std::vector&lt; T &gt; *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#ab1f44cc1b130e13b41e9a80de76e25cf">CreateVectorOfSortedStructs</a>(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#a2130ef232ff405eebe2e7f184ecd06e6">CreateVectorOfSortedTables</a>(Offset&lt; T &gt; *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 class="even"><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">CreateVectorOfSortedTables</a>(std::vector&lt; Offset&lt; T &gt;&gt; *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&lt; std::string &gt; &amp;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#a6e90ada59d9553636f72ce8e4a892f72">CreateVectorOfStructs</a>(size_t vector_size, const std::function&lt; void(size_t i, T *)&gt; &amp;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#a9cc09fa59ff9732e972877cfe911c8a5">CreateVectorOfStructs</a>(size_t vector_size, F f, S *state)</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#a110c2a3298aebef1a9dfa3c44ee84f42">CreateVectorOfStructs</a>(const std::vector&lt; T, Alloc &gt; &amp;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 bgcolor="#f0f0f0" class="even"><td class="entry"><b>dedup_vtables_</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</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&lt; T &gt; 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 bgcolor="#f0f0f0"><td class="entry"><b>Finish</b>(uoffset_t root, const char *file_identifier, bool size_prefix) (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>finished</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
-  <tr><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220">FinishSizePrefixed</a>(Offset&lt; T &gt; 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#ab0173786ea4ec3e4ae10555639b2996c">FlatBufferBuilder</a>(size_t initial_size=1024, Allocator *allocator=nullptr, bool own_allocator=false, size_t buffer_minalign=AlignOf&lt; largest_scalar_t &gt;())</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>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>FlatBufferBuilder</b>(const FlatBufferBuilder &amp;) (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>force_defaults_</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
-  <tr><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a">ForceDefaults</a>(bool fd)</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#aa1ebce1f3f46832946a95952af1e9c2b">GetBufferMinAlignment</a>()</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#ab81ab8aa273c270b0942fd81489cad83">GetBufferPointer</a>() const</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#a099810f03046139d1854d20a1c2a2e41">GetCurrentBufferPointer</a>() const</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#a66c8fd33ab9b3b237954c9ea38648f7f">GetSize</a>() const</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#af8c7583c92e1d1d6f438977da5158d19">kFileIdentifierLength</a></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">static</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>max_voffset_</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>minalign_</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>nested</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>num_field_loc</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>operator=</b>(const FlatBufferBuilder &amp;) (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45">Release</a>()</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#a0e715d9019060b4b753c4e5228be56e8">ReleaseBufferPointer</a>()</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 bgcolor="#f0f0f0" class="even"><td class="entry"><b>Reset</b>() (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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 bgcolor="#f0f0f0"><td class="entry"><b>string_pool</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>StringOffsetMap</b> typedef (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
-  <tr bgcolor="#f0f0f0"><td class="entry"><b>~FlatBufferBuilder</b>() (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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#a9a3a955fbff1c69e944c3560460dd7a6">CreateString</a>(flatbuffers::string_view str)</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#ac0b6a1c5d949f20ad84367fc0f9e1506">CreateString</a>(const String *str)</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#ab77d800e77fa76bc758a6c399fd37685">CreateString</a>(const T &amp;str)</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#a43f51ba9c8f4f24ea2247a3979d095b8">CreateStruct</a>(const T &amp;structobj)</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#ac2b96292fa0fb1534fe7fd218a094d0c">CreateUninitializedVector</a>(size_t len, size_t elemsize, uint8_t **buf)</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#a2305b63d367845972b51669dd995cc50">CreateUninitializedVector</a>(size_t len, T **buf)</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#a2cca5c89246a53e80e6ad9487f4c36f3">CreateVector</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 bgcolor="#f0f0f0"><td class="entry"><b>CreateVector</b>(const Offset&lt; T &gt; *v, size_t len) (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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#af715dd24dd37cb0151dc7a980ad0f207">CreateVector</a>(const std::vector&lt; T &gt; &amp;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 bgcolor="#f0f0f0"><td class="entry"><b>CreateVector</b>(const std::vector&lt; bool &gt; &amp;v) (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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#a1080c9e370e2d9d9d872dadd1131436b">CreateVector</a>(size_t vector_size, const std::function&lt; T(size_t i)&gt; &amp;f)</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#a53504fc2cab681a7980b03260f8b2f7a">CreateVector</a>(size_t vector_size, F f, S *state)</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#a3d57074082aaab8cdeb8474ff9df0b53">CreateVectorOfNativeStructs</a>(const S *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#a11c291ccd2159604c149600ee6180b95">CreateVectorOfNativeStructs</a>(const std::vector&lt; S &gt; &amp;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#a23aa4c910e053446cc404bc486012e54">CreateVectorOfSortedNativeStructs</a>(std::vector&lt; S &gt; *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#a799701af34c398d8eb86e049b73bcecf">CreateVectorOfSortedNativeStructs</a>(S *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 class="even"><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15">CreateVectorOfSortedStructs</a>(std::vector&lt; T &gt; *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#ab1f44cc1b130e13b41e9a80de76e25cf">CreateVectorOfSortedStructs</a>(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 class="even"><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">CreateVectorOfSortedTables</a>(Offset&lt; T &gt; *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#ac64d11c219559ea51567eab556e13135">CreateVectorOfSortedTables</a>(std::vector&lt; Offset&lt; T &gt;&gt; *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#a592110519a6c8db1926f1365bf2a58e6">CreateVectorOfStrings</a>(const std::vector&lt; std::string &gt; &amp;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#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 class="even"><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72">CreateVectorOfStructs</a>(size_t vector_size, const std::function&lt; void(size_t i, T *)&gt; &amp;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><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a9cc09fa59ff9732e972877cfe911c8a5">CreateVectorOfStructs</a>(size_t vector_size, F f, S *state)</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#a110c2a3298aebef1a9dfa3c44ee84f42">CreateVectorOfStructs</a>(const std::vector&lt; T, Alloc &gt; &amp;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 bgcolor="#f0f0f0"><td class="entry"><b>dedup_vtables_</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
+  <tr class="even"><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><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">Finish</a>(Offset&lt; T &gt; 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 bgcolor="#f0f0f0" class="even"><td class="entry"><b>Finish</b>(uoffset_t root, const char *file_identifier, bool size_prefix) (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>finished</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220">FinishSizePrefixed</a>(Offset&lt; T &gt; 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#ab0173786ea4ec3e4ae10555639b2996c">FlatBufferBuilder</a>(size_t initial_size=1024, Allocator *allocator=nullptr, bool own_allocator=false, size_t buffer_minalign=AlignOf&lt; largest_scalar_t &gt;())</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>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>FlatBufferBuilder</b>(const FlatBufferBuilder &amp;) (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>force_defaults_</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a">ForceDefaults</a>(bool fd)</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#aa1ebce1f3f46832946a95952af1e9c2b">GetBufferMinAlignment</a>()</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#ab81ab8aa273c270b0942fd81489cad83">GetBufferPointer</a>() const</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#a099810f03046139d1854d20a1c2a2e41">GetCurrentBufferPointer</a>() const</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#a66c8fd33ab9b3b237954c9ea38648f7f">GetSize</a>() const</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#af8c7583c92e1d1d6f438977da5158d19">kFileIdentifierLength</a></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">static</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>max_voffset_</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>minalign_</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>nested</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>num_field_loc</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>operator=</b>(const FlatBufferBuilder &amp;) (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
+  <tr><td class="entry"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45">Release</a>()</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#a0e715d9019060b4b753c4e5228be56e8">ReleaseBufferPointer</a>()</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 bgcolor="#f0f0f0"><td class="entry"><b>Reset</b>() (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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 bgcolor="#f0f0f0" class="even"><td class="entry"><b>string_pool</b> (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>StringOffsetMap</b> typedef (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>~FlatBufferBuilder</b>() (defined in <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a>)</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>
 </table></div><!-- contents -->
 </div><!-- doc-content -->
 <!-- Google Analytics -->
diff --git a/classflatbuffers_1_1_flat_buffer_builder.html b/classflatbuffers_1_1_flat_buffer_builder.html
index 0ec82dc6f69f8c0083b191e9a75c6ecea114e1de..599abb830b2067aaa94626195fea463b4c1a90f2 100644
--- a/classflatbuffers_1_1_flat_buffer_builder.html
+++ b/classflatbuffers_1_1_flat_buffer_builder.html
@@ -144,6 +144,9 @@ Public Member Functions</h2></td></tr>
 <tr class="memitem:a8c3af55e64f5cda9aefa38ac5287ef9f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structflatbuffers_1_1_offset.html">Offset</a>&lt; <a class="el" href="structflatbuffers_1_1_string.html">String</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f">CreateString</a> (const std::string &amp;str)</td></tr>
 <tr class="memdesc:a8c3af55e64f5cda9aefa38ac5287ef9f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Store a string in the buffer, which can contain any binary data.  <a href="#a8c3af55e64f5cda9aefa38ac5287ef9f">More...</a><br /></td></tr>
 <tr class="separator:a8c3af55e64f5cda9aefa38ac5287ef9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a3a955fbff1c69e944c3560460dd7a6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structflatbuffers_1_1_offset.html">Offset</a>&lt; <a class="el" href="structflatbuffers_1_1_string.html">String</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a9a3a955fbff1c69e944c3560460dd7a6">CreateString</a> (flatbuffers::string_view str)</td></tr>
+<tr class="memdesc:a9a3a955fbff1c69e944c3560460dd7a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Store a string in the buffer, which can contain any binary data.  <a href="#a9a3a955fbff1c69e944c3560460dd7a6">More...</a><br /></td></tr>
+<tr class="separator:a9a3a955fbff1c69e944c3560460dd7a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ac0b6a1c5d949f20ad84367fc0f9e1506"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structflatbuffers_1_1_offset.html">Offset</a>&lt; <a class="el" href="structflatbuffers_1_1_string.html">String</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506">CreateString</a> (const <a class="el" href="structflatbuffers_1_1_string.html">String</a> *str)</td></tr>
 <tr class="memdesc:ac0b6a1c5d949f20ad84367fc0f9e1506"><td class="mdescLeft">&#160;</td><td class="mdescRight">Store a string in the buffer, which can contain any binary data.  <a href="#ac0b6a1c5d949f20ad84367fc0f9e1506">More...</a><br /></td></tr>
 <tr class="separator:ac0b6a1c5d949f20ad84367fc0f9e1506"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -382,7 +385,7 @@ StringOffsetMap *&#160;</td><td class="memItemRight" valign="bottom"><b>string_p
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramdir">[in]</td><td class="paramname">initial_size</td><td>The initial size of the buffer, in bytes. Defaults to <code>1024</code>. </td></tr>
-    <tr><td class="paramdir">[in]</td><td class="paramname">allocator</td><td>An <code>Allocator</code> to use. Defaults to a new instance of a <code>DefaultAllocator</code>. </td></tr>
+    <tr><td class="paramdir">[in]</td><td class="paramname">allocator</td><td>An <code>Allocator</code> to use. If null will use <code>DefaultAllocator</code>. </td></tr>
     <tr><td class="paramdir">[in]</td><td class="paramname">own_allocator</td><td>Whether the builder/vector should own the allocator. Defaults to / <code>false</code>. </td></tr>
     <tr><td class="paramdir">[in]</td><td class="paramname">buffer_minalign</td><td>Force the buffer to be aligned to the given minimum alignment upon reallocation. Only needed if you intend to store types with custom alignment AND you wish to read the buffer in-place directly after creation. </td></tr>
   </table>
@@ -571,7 +574,7 @@ StringOffsetMap *&#160;</td><td class="memItemRight" valign="bottom"><b>string_p
 </div>
 </div>
 <a id="aec6f9df2a0366b540b24822414d92cbe"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#aec6f9df2a0366b540b24822414d92cbe">&#9670;&nbsp;</a></span>CreateString() <span class="overload">[1/6]</span></h2>
+<h2 class="memtitle"><span class="permalink"><a href="#aec6f9df2a0366b540b24822414d92cbe">&#9670;&nbsp;</a></span>CreateString() <span class="overload">[1/7]</span></h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -617,7 +620,7 @@ StringOffsetMap *&#160;</td><td class="memItemRight" valign="bottom"><b>string_p
 </div>
 </div>
 <a id="aad93d113ac24e86ed04b5236b3f4c0c5"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#aad93d113ac24e86ed04b5236b3f4c0c5">&#9670;&nbsp;</a></span>CreateString() <span class="overload">[2/6]</span></h2>
+<h2 class="memtitle"><span class="permalink"><a href="#aad93d113ac24e86ed04b5236b3f4c0c5">&#9670;&nbsp;</a></span>CreateString() <span class="overload">[2/7]</span></h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -652,7 +655,7 @@ StringOffsetMap *&#160;</td><td class="memItemRight" valign="bottom"><b>string_p
 </div>
 </div>
 <a id="ac51db9083ac815eb81420b6d51f42154"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ac51db9083ac815eb81420b6d51f42154">&#9670;&nbsp;</a></span>CreateString() <span class="overload">[3/6]</span></h2>
+<h2 class="memtitle"><span class="permalink"><a href="#ac51db9083ac815eb81420b6d51f42154">&#9670;&nbsp;</a></span>CreateString() <span class="overload">[3/7]</span></h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -687,7 +690,7 @@ StringOffsetMap *&#160;</td><td class="memItemRight" valign="bottom"><b>string_p
 </div>
 </div>
 <a id="a8c3af55e64f5cda9aefa38ac5287ef9f"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#a8c3af55e64f5cda9aefa38ac5287ef9f">&#9670;&nbsp;</a></span>CreateString() <span class="overload">[4/6]</span></h2>
+<h2 class="memtitle"><span class="permalink"><a href="#a8c3af55e64f5cda9aefa38ac5287ef9f">&#9670;&nbsp;</a></span>CreateString() <span class="overload">[4/7]</span></h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -719,10 +722,45 @@ StringOffsetMap *&#160;</td><td class="memItemRight" valign="bottom"><b>string_p
 </dl>
 <dl class="section return"><dt>Returns</dt><dd>Returns the offset in the buffer where the string starts. </dd></dl>
 
+</div>
+</div>
+<a id="a9a3a955fbff1c69e944c3560460dd7a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9a3a955fbff1c69e944c3560460dd7a6">&#9670;&nbsp;</a></span>CreateString() <span class="overload">[5/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+  <tr>
+  <td class="mlabels-left">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="structflatbuffers_1_1_offset.html">Offset</a>&lt;<a class="el" href="structflatbuffers_1_1_string.html">String</a>&gt; flatbuffers::FlatBufferBuilder::CreateString </td>
+          <td>(</td>
+          <td class="paramtype">flatbuffers::string_view&#160;</td>
+          <td class="paramname"><em>str</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>Store a string in the buffer, which can contain any binary data. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramdir">[in]</td><td class="paramname">str</td><td>A const string_view to copy in to the buffer. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Returns the offset in the buffer where the string starts. </dd></dl>
+
 </div>
 </div>
 <a id="ac0b6a1c5d949f20ad84367fc0f9e1506"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ac0b6a1c5d949f20ad84367fc0f9e1506">&#9670;&nbsp;</a></span>CreateString() <span class="overload">[5/6]</span></h2>
+<h2 class="memtitle"><span class="permalink"><a href="#ac0b6a1c5d949f20ad84367fc0f9e1506">&#9670;&nbsp;</a></span>CreateString() <span class="overload">[6/7]</span></h2>
 
 <div class="memitem">
 <div class="memproto">
@@ -757,7 +795,7 @@ StringOffsetMap *&#160;</td><td class="memItemRight" valign="bottom"><b>string_p
 </div>
 </div>
 <a id="ab77d800e77fa76bc758a6c399fd37685"></a>
-<h2 class="memtitle"><span class="permalink"><a href="#ab77d800e77fa76bc758a6c399fd37685">&#9670;&nbsp;</a></span>CreateString() <span class="overload">[6/6]</span></h2>
+<h2 class="memtitle"><span class="permalink"><a href="#ab77d800e77fa76bc758a6c399fd37685">&#9670;&nbsp;</a></span>CreateString() <span class="overload">[7/7]</span></h2>
 
 <div class="memitem">
 <div class="memproto">
diff --git a/classflatbuffers_1_1_flat_buffer_builder.js b/classflatbuffers_1_1_flat_buffer_builder.js
index 7895048c7e2030dcb768781b311589f8b83194b7..7bb68d5370176531218898b9a2bc1cbb2f1f8907 100644
--- a/classflatbuffers_1_1_flat_buffer_builder.js
+++ b/classflatbuffers_1_1_flat_buffer_builder.js
@@ -15,6 +15,7 @@ var classflatbuffers_1_1_flat_buffer_builder =
     [ "CreateString", "classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5", null ],
     [ "CreateString", "classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154", null ],
     [ "CreateString", "classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f", null ],
+    [ "CreateString", "classflatbuffers_1_1_flat_buffer_builder.html#a9a3a955fbff1c69e944c3560460dd7a6", null ],
     [ "CreateString", "classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506", null ],
     [ "CreateString", "classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685", null ],
     [ "CreateStruct", "classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8", null ],
diff --git a/classflatbuffers_1_1vector__downward-members.html b/classflatbuffers_1_1vector__downward-members.html
index 3b9caa4449f4d2183b5d3eb54f493dc40abf840f..979fd690cbab753d3874cd36b81af0c988dd378b 100644
--- a/classflatbuffers_1_1vector__downward-members.html
+++ b/classflatbuffers_1_1vector__downward-members.html
@@ -102,7 +102,7 @@ $(document).ready(function(){initNavTree('classflatbuffers_1_1vector__downward.h
   <tr bgcolor="#f0f0f0"><td class="entry"><b>ensure_space</b>(size_t len) (defined in <a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>fill</b>(size_t zero_pad_bytes) (defined in <a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>fill_big</b>(size_t zero_pad_bytes) (defined in <a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>get_allocator</b>() (defined in <a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>get_custom_allocator</b>() (defined in <a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>make_space</b>(size_t len) (defined in <a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>pop</b>(size_t bytes_to_remove) (defined in <a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>push</b>(const uint8_t *bytes, size_t num) (defined in <a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
diff --git a/classflatbuffers_1_1vector__downward.html b/classflatbuffers_1_1vector__downward.html
index 74c7632d509b61383332f86b909896c5e5f5fe34..b22735796f63de7a5802ed07359d5fba669f2986 100644
--- a/classflatbuffers_1_1vector__downward.html
+++ b/classflatbuffers_1_1vector__downward.html
@@ -121,9 +121,9 @@ void&#160;</td><td class="memItemRight" valign="bottom"><b>fill</b> (size_t zero
 <tr class="memitem:a99e13c5b83569b07df357c76feb1e614"><td class="memItemLeft" align="right" valign="top"><a id="a99e13c5b83569b07df357c76feb1e614"></a>
 void&#160;</td><td class="memItemRight" valign="bottom"><b>fill_big</b> (size_t zero_pad_bytes)</td></tr>
 <tr class="separator:a99e13c5b83569b07df357c76feb1e614"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:abc8846756ed814d1722913105e0da7a3"><td class="memItemLeft" align="right" valign="top"><a id="abc8846756ed814d1722913105e0da7a3"></a>
-<a class="el" href="classflatbuffers_1_1_allocator.html">Allocator</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><b>get_allocator</b> ()</td></tr>
-<tr class="separator:abc8846756ed814d1722913105e0da7a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45866c629916716dd618c55a662b7d99"><td class="memItemLeft" align="right" valign="top"><a id="a45866c629916716dd618c55a662b7d99"></a>
+<a class="el" href="classflatbuffers_1_1_allocator.html">Allocator</a> *&#160;</td><td class="memItemRight" valign="bottom"><b>get_custom_allocator</b> ()</td></tr>
+<tr class="separator:a45866c629916716dd618c55a662b7d99"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a4a0686bb0afe2feefec0502f527a11bf"><td class="memItemLeft" align="right" valign="top"><a id="a4a0686bb0afe2feefec0502f527a11bf"></a>
 uint8_t *&#160;</td><td class="memItemRight" valign="bottom"><b>make_space</b> (size_t len)</td></tr>
 <tr class="separator:a4a0686bb0afe2feefec0502f527a11bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
diff --git a/classflatbuffers_1_1vector__downward.js b/classflatbuffers_1_1vector__downward.js
index b436d0de99210124462068638539dd3295615dca..b0e7d078f160b87f04e980ed82ee3687799ae8bb 100644
--- a/classflatbuffers_1_1vector__downward.js
+++ b/classflatbuffers_1_1vector__downward.js
@@ -10,7 +10,7 @@ var classflatbuffers_1_1vector__downward =
     [ "ensure_space", "classflatbuffers_1_1vector__downward.html#a46e8f7f5035f87fe202419d6c5446eb3", null ],
     [ "fill", "classflatbuffers_1_1vector__downward.html#a692f950a105db47f983ff80d4e5c3772", null ],
     [ "fill_big", "classflatbuffers_1_1vector__downward.html#a99e13c5b83569b07df357c76feb1e614", null ],
-    [ "get_allocator", "classflatbuffers_1_1vector__downward.html#abc8846756ed814d1722913105e0da7a3", null ],
+    [ "get_custom_allocator", "classflatbuffers_1_1vector__downward.html#a45866c629916716dd618c55a662b7d99", null ],
     [ "make_space", "classflatbuffers_1_1vector__downward.html#a4a0686bb0afe2feefec0502f527a11bf", null ],
     [ "pop", "classflatbuffers_1_1vector__downward.html#a23cd3d0692fe86eacc6324ea4b58a599", null ],
     [ "push", "classflatbuffers_1_1vector__downward.html#a8cfd1b66f93043acb9905519e9998ced", null ],
diff --git a/flatbuffers_8h_source.html b/flatbuffers_8h_source.html
index 96f3f9c36862f5f4988fb41ea02cd9bcb8c6d410..1d02cfed072d2df6d7093e8ff4ffe81d82c7a787 100644
--- a/flatbuffers_8h_source.html
+++ b/flatbuffers_8h_source.html
@@ -91,63 +91,64 @@ $(document).ready(function(){initNavTree('flatbuffers_8h_source.html','');});
 <div class="title">flatbuffers.h</div>  </div>
 </div><!--header-->
 <div class="contents">
-<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * Copyright 2014 Google Inc. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> * you may not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *     http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> * Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> * See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> * limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="preprocessor">#ifndef FLATBUFFERS_H_</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="preprocessor">#define FLATBUFFERS_H_</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;</div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="preprocessor">#include &quot;flatbuffers/base.h&quot;</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceflatbuffers.html">flatbuffers</a> {</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment">// Wrapper for uoffset_t to allow safe template specialization.</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment">// Value is allowed to be 0 to indicate a null object (see e.g. AddOffset).</span></div><div class="line"><a name="l00025"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_offset.html">   25</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_offset.html">Offset</a> {</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;  uoffset_t o;</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset</a>() : o(0) {}</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset</a>(uoffset_t _o) : o(_o) {}</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;void&gt;</a> Union()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;void&gt;</a>(o); }</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;  <span class="keywordtype">bool</span> IsNull()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !o; }</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;};</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> EndianCheck() {</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;  <span class="keywordtype">int</span> endiantest = 1;</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;  <span class="comment">// If this fails, see FLATBUFFERS_LITTLEENDIAN above.</span></div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;  assert(*reinterpret_cast&lt;char *&gt;(&amp;endiantest) == FLATBUFFERS_LITTLEENDIAN);</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;  (void)endiantest;</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;}</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; FLATBUFFERS_CONSTEXPR <span class="keywordtype">size_t</span> AlignOf() {</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="preprocessor">  #ifdef _MSC_VER</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;    <span class="keywordflow">return</span> __alignof(T);</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;<span class="preprocessor">  #else</span></div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="preprocessor">    #ifndef alignof</span></div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;      <span class="keywordflow">return</span> __alignof__(T);</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;      <span class="keywordflow">return</span> <span class="keyword">alignof</span>(T);</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;<span class="preprocessor">  #endif</span></div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;}</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;<span class="comment">// When we read serialized data from memory, in the case of most scalars,</span></div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;<span class="comment">// we want to just read T, but in the case of Offset, we want to actually</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;<span class="comment">// perform the indirection and return a pointer.</span></div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;<span class="comment">// The template specialization below does just that.</span></div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;<span class="comment">// It is wrapped in a struct since function templates can&#39;t overload on the</span></div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;<span class="comment">// return type like this.</span></div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;<span class="comment">// The typedef is for the convenience of callers of this function</span></div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;<span class="comment">// (avoiding the need for a trailing return decltype)</span></div><div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_indirect_helper.html">   62</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper</a> {</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;  <span class="keyword">typedef</span> T return_type;</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;  <span class="keyword">typedef</span> T mutable_return_type;</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> element_stride = <span class="keyword">sizeof</span>(T);</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;  <span class="keyword">static</span> return_type Read(<span class="keyword">const</span> uint8_t *p, uoffset_t i) {</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;    <span class="keywordflow">return</span> EndianScalar((reinterpret_cast&lt;const T *&gt;(p))[i]);</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;  }</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;};</div><div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_indirect_helper_3_01_offset_3_01_t_01_4_01_4.html">   70</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper</a>&lt;<a class="code" href="structflatbuffers_1_1_offset.html">Offset</a>&lt;T&gt;&gt; {</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;  <span class="keyword">typedef</span> <span class="keyword">const</span> T *return_type;</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;  <span class="keyword">typedef</span> T *mutable_return_type;</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> element_stride = <span class="keyword">sizeof</span>(uoffset_t);</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;  <span class="keyword">static</span> return_type Read(<span class="keyword">const</span> uint8_t *p, uoffset_t i) {</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;    p += i * <span class="keyword">sizeof</span>(uoffset_t);</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>return_type<span class="keyword">&gt;</span>(p + ReadScalar&lt;uoffset_t&gt;(p));</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;  }</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;};</div><div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_indirect_helper_3_01const_01_t_01_5_01_4.html">   79</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper</a>&lt;const T *&gt; {</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;  <span class="keyword">typedef</span> <span class="keyword">const</span> T *return_type;</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;  <span class="keyword">typedef</span> T *mutable_return_type;</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> element_stride = <span class="keyword">sizeof</span>(T);</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;  <span class="keyword">static</span> return_type Read(<span class="keyword">const</span> uint8_t *p, uoffset_t i) {</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>T *<span class="keyword">&gt;</span>(p + i * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;  }</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;};</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;<span class="comment">// An STL compatible iterator implementation for Vector below, effectively</span></div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;<span class="comment">// calling Get() for every element.</span></div><div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_vector_iterator.html">   90</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> IT&gt; <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> {</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;  <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;  <span class="keyword">typedef</span> IT value_type;</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;  <span class="keyword">typedef</span> uoffset_t difference_type;</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;  <span class="keyword">typedef</span> IT *pointer;</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;  <span class="keyword">typedef</span> IT &amp;reference;</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a>(<span class="keyword">const</span> uint8_t *data, uoffset_t i)</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;      : data_(data + <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a> * i) {}</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a>(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other) : data_(other.data_) {}</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;operator=(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other) {</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;    data_ = other.data_;</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;  }</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;operator=(<a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;&amp;other) {</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;    data_ = other.data_;</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;  }</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;  <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;    <span class="keywordflow">return</span> data_ == other.data_;</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;  }</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;  <span class="keywordtype">bool</span> operator&lt;(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;    <span class="keywordflow">return</span> data_ &lt; other.data_;</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;  }</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;  <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;    <span class="keywordflow">return</span> data_ != other.data_;</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;  }</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;  ptrdiff_t operator-(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;    <span class="keywordflow">return</span> (data_ - other.data_) / <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;  }</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;  IT operator*()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::Read</a>(data_, 0); }</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;  IT operator-&gt;()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::Read</a>(data_, 0); }</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;operator++() {</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;    data_ += <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;  }</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> operator++(<span class="keywordtype">int</span>) {</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;    <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> temp(data_, 0);</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;    data_ += <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;    <span class="keywordflow">return</span> temp;</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;  }</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> operator+(<span class="keyword">const</span> uoffset_t &amp;offset)<span class="keyword"> const </span>{</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a>(data_ + offset * <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>,</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;                          0);</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;  }</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;operator+=(<span class="keyword">const</span> uoffset_t &amp;offset) {</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;    data_ += offset * <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;  }</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;operator--() {</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;    data_ -= <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;  }</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> operator--(<span class="keywordtype">int</span>) {</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;    <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> temp(data_, 0);</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;    data_ -= <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;    <span class="keywordflow">return</span> temp;</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;  }</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> operator-(<span class="keyword">const</span> uoffset_t &amp;offset) {</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a>(data_ - offset * <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>,</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;                          0);</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;  }</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;operator-=(<span class="keyword">const</span> uoffset_t &amp;offset) {</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;    data_ -= offset * <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;  }</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;  <span class="keyword">const</span> uint8_t *data_;</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;};</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;<span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_string.html">String</a>;</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;<span class="comment">// This is used as a helper type for accessing vectors.</span></div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;<span class="comment">// Vector::data() assumes the vector elements start after the length field.</span></div><div class="line"><a name="l00181"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_vector.html">  181</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_vector.html">Vector</a> {</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;  <span class="keyword">typedef</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator&lt;T, typename IndirectHelper&lt;T&gt;::mutable_return_type</a>&gt;</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;      <a class="code" href="structflatbuffers_1_1_vector_iterator.html">iterator</a>;</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;  <span class="keyword">typedef</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator&lt;T, typename IndirectHelper&lt;T&gt;::return_type</a>&gt;</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;      <a class="code" href="structflatbuffers_1_1_vector_iterator.html">const_iterator</a>;</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;  uoffset_t size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> EndianScalar(length_); }</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;  <span class="comment">// Deprecated: use size(). Here for backwards compatibility.</span></div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;  uoffset_t Length()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> size(); }</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;  <span class="keyword">typedef</span> <span class="keyword">typename</span> IndirectHelper&lt;T&gt;::return_type return_type;</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;  <span class="keyword">typedef</span> <span class="keyword">typename</span> IndirectHelper&lt;T&gt;::mutable_return_type mutable_return_type;</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;  return_type Get(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;    assert(i &lt; size());</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::Read</a>(Data(), i);</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;  }</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;  return_type operator[](uoffset_t i)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> Get(i); }</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;  <span class="comment">// If this is a Vector of enums, T will be its storage type, not the enum</span></div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;  <span class="comment">// type. This function makes it convenient to retrieve value with enum</span></div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;  <span class="comment">// type E.</span></div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> E&gt; E GetEnum(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>E<span class="keyword">&gt;</span>(Get(i));</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;  }</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;  <span class="comment">// If this a vector of unions, this does the cast for you. There&#39;s no check</span></div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;  <span class="comment">// to make sure this is the right type!</span></div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt; <span class="keyword">const</span> U *GetAs(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>U *<span class="keyword">&gt;</span>(Get(i));</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;  }</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;  <span class="comment">// If this a vector of unions, this does the cast for you. There&#39;s no check</span></div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;  <span class="comment">// to make sure this is actually a string!</span></div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;  <span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> *GetAsString(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> *<span class="keyword">&gt;</span>(Get(i));</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;  }</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;  <span class="keyword">const</span> <span class="keywordtype">void</span> *GetStructFromOffset(<span class="keywordtype">size_t</span> o)<span class="keyword"> const </span>{</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">void</span> *<span class="keyword">&gt;</span>(Data() + o);</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;  }</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;  iterator begin() { <span class="keywordflow">return</span> iterator(Data(), 0); }</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;  const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(Data(), 0); }</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;  iterator end() { <span class="keywordflow">return</span> iterator(Data(), size()); }</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;  const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(Data(), size()); }</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;  <span class="comment">// Change elements if you have a non-const pointer to this object.</span></div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;  <span class="comment">// Scalars only. See reflection.h, and the documentation.</span></div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;  <span class="keywordtype">void</span> Mutate(uoffset_t i, <span class="keyword">const</span> T &amp;val) {</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;    assert(i &lt; size());</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;    WriteScalar(data() + i, val);</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;  }</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;  <span class="comment">// Change an element of a vector of tables (or strings).</span></div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;  <span class="comment">// &quot;val&quot; points to the new table/string, as you can obtain from</span></div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;  <span class="comment">// e.g. reflection::AddFlatBuffer().</span></div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;  <span class="keywordtype">void</span> MutateOffset(uoffset_t i, <span class="keyword">const</span> uint8_t *val) {</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;    assert(i &lt; size());</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;    assert(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;    WriteScalar(data() + i,</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;                static_cast&lt;uoffset_t&gt;(val - (Data() + i * <span class="keyword">sizeof</span>(uoffset_t))));</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;  }</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;  <span class="comment">// Get a mutable pointer to tables/strings inside this vector.</span></div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;  mutable_return_type GetMutableObject(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;    assert(i &lt; size());</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span>mutable_return_type<span class="keyword">&gt;</span>(<a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::Read</a>(Data(), i));</div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;  }</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;  <span class="comment">// The raw data in little endian format. Use with care.</span></div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;  <span class="keyword">const</span> uint8_t *Data()<span class="keyword"> const </span>{</div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(&amp;length_ + 1);</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;  }</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;</div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;  uint8_t *Data() { <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>uint8_t *<span class="keyword">&gt;</span>(&amp;length_ + 1); }</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;</div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;  <span class="comment">// Similarly, but typed, much like std::vector::data</span></div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;  <span class="keyword">const</span> T *data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>T *<span class="keyword">&gt;</span>(Data()); }</div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;  T *data() { <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(Data()); }</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> K&gt; return_type LookupByKey(K key)<span class="keyword"> const </span>{</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;    <span class="keywordtype">void</span> *search_result = std::bsearch(</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;        &amp;key, Data(), size(), <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>, KeyCompare&lt;K&gt;);</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;    <span class="keywordflow">if</span> (!search_result) {</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;      <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;  <span class="comment">// Key not found.</span></div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;    }</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;    <span class="keyword">const</span> uint8_t *element = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(search_result);</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::Read</a>(element, 0);</div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;  }</div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160; <span class="keyword">protected</span>:</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;  <span class="comment">// This class is only used to access pre-existing data. Don&#39;t ever</span></div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;  <span class="comment">// try to construct these manually.</span></div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;  <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>();</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;  uoffset_t length_;</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;  <span class="comment">// This class is a pointer. Copying will therefore create an invalid object.</span></div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;  <span class="comment">// Private and unimplemented copy constructor.</span></div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;  <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a> &amp;);</div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> K&gt; <span class="keyword">static</span> <span class="keywordtype">int</span> KeyCompare(<span class="keyword">const</span> <span class="keywordtype">void</span> *ap, <span class="keyword">const</span> <span class="keywordtype">void</span> *bp) {</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;    <span class="keyword">const</span> K *key = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>K *<span class="keyword">&gt;</span>(ap);</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;    <span class="keyword">const</span> uint8_t *data = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(bp);</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;    <span class="keyword">auto</span> table = <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::Read</a>(data, 0);</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;</div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;    <span class="comment">// std::bsearch compares with the operands transposed, so we negate the</span></div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;    <span class="comment">// result here.</span></div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;    <span class="keywordflow">return</span> -table-&gt;KeyCompareWithValue(*key);</div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;  }</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;};</div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;<span class="comment">// Represent a vector much like the template above, but in this case we</span></div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;<span class="comment">// don&#39;t know what the element types are (used with reflection.h).</span></div><div class="line"><a name="l00304"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_vector_of_any.html">  304</a></span>&#160;<span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_vector_of_any.html">VectorOfAny</a> {</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;  uoffset_t size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> EndianScalar(length_); }</div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;</div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;  <span class="keyword">const</span> uint8_t *Data()<span class="keyword"> const </span>{</div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(&amp;length_ + 1);</div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;  }</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;  uint8_t *Data() { <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>uint8_t *<span class="keyword">&gt;</span>(&amp;length_ + 1); }</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160; <span class="keyword">protected</span>:</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;  <a class="code" href="classflatbuffers_1_1_vector_of_any.html">VectorOfAny</a>();</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;  uoffset_t length_;</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;  <a class="code" href="classflatbuffers_1_1_vector_of_any.html">VectorOfAny</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector_of_any.html">VectorOfAny</a> &amp;);</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;};</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;<span class="preprocessor">#ifndef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;<a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;Offset&lt;T&gt;</a>&gt; *VectorCast(<a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>&lt;<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;U&gt;</a>&gt; *ptr) {</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;  static_assert(std::is_base_of&lt;T, U&gt;::value, <span class="stringliteral">&quot;Unrelated types&quot;</span>);</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;Offset&lt;T&gt;</a><span class="keyword">&gt;</span> *&gt;(ptr);</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;}</div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;</div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;Offset&lt;T&gt;</a>&gt; *VectorCast(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>&lt;<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;U&gt;</a>&gt; *ptr) {</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;  static_assert(std::is_base_of&lt;T, U&gt;::value, <span class="stringliteral">&quot;Unrelated types&quot;</span>);</div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;Offset&lt;T&gt;</a><span class="keyword">&gt;</span> *&gt;(ptr);</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;}</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;<span class="comment">// Convenient helper function to get the length of any vector, regardless</span></div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;<span class="comment">// of wether it is null or not (the field is not set).</span></div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">size_t</span> VectorLength(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;T&gt;</a> *v) {</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;  <span class="keywordflow">return</span> v ? v-&gt;Length() : 0;</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;}</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;</div><div class="line"><a name="l00342"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_string.html">  342</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> : <span class="keyword">public</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>&lt;char&gt; {</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;  <span class="keyword">const</span> <span class="keywordtype">char</span> *c_str()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">char</span> *<span class="keyword">&gt;</span>(Data()); }</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;  std::string str()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> std::string(c_str(), Length()); }</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;  <span class="keywordtype">bool</span> operator&lt;(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> &amp;o)<span class="keyword"> const </span>{</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;    <span class="keywordflow">return</span> strcmp(c_str(), o.c_str()) &lt; 0;</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;  }</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;};</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;<span class="comment">// Allocator interface. This is flatbuffers-specific and meant only for</span></div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;<span class="comment">// `vector_downward` usage.</span></div><div class="line"><a name="l00353"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_allocator.html">  353</a></span>&#160;<span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> {</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;  <span class="keyword">virtual</span> ~<a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a>() {}</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;  <span class="comment">// Allocate `size` bytes of memory.</span></div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;  <span class="keyword">virtual</span> uint8_t *allocate(<span class="keywordtype">size_t</span> size) = 0;</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;</div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;  <span class="comment">// Deallocate `size` bytes of memory at `p` allocated by this allocator.</span></div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;  <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate(uint8_t *p, <span class="keywordtype">size_t</span> size) = 0;</div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;</div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;  <span class="comment">// Reallocate `new_size` bytes of memory, replacing the old region of size</span></div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;  <span class="comment">// `old_size` at `p`. In contrast to a normal realloc, this grows downwards,</span></div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;  <span class="comment">// and is intended specifcally for `vector_downward` use.</span></div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;  <span class="comment">// `in_use_back` and `in_use_front` indicate how much of `old_size` is</span></div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;  <span class="comment">// actually in use at each end, and needs to be copied.</span></div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;  <span class="keyword">virtual</span> uint8_t *reallocate_downward(uint8_t *old_p, <span class="keywordtype">size_t</span> old_size,</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;                                       <span class="keywordtype">size_t</span> new_size, <span class="keywordtype">size_t</span> in_use_back,</div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;                                       <span class="keywordtype">size_t</span> in_use_front) {</div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;    assert(new_size &gt; old_size);  <span class="comment">// vector_downward only grows</span></div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;    uint8_t *new_p = allocate(new_size);</div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;    memcpy_downward(old_p, old_size, new_p, new_size, in_use_back,</div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;                    in_use_front);</div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;    deallocate(old_p, old_size);</div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;    <span class="keywordflow">return</span> new_p;</div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;  }</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;</div><div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160; <span class="keyword">protected</span>:</div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;  <span class="comment">// Called by `reallocate_downward` to copy memory from `old_p` of `old_size`</span></div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;  <span class="comment">// to `new_p` of `new_size`. Only memory of size `in_use_front` and</span></div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;  <span class="comment">// `in_use_back` will be copied from the front and back of the old memory</span></div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;  <span class="comment">// allocation.</span></div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;  <span class="keywordtype">void</span> memcpy_downward(uint8_t *old_p, <span class="keywordtype">size_t</span> old_size,</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;                       uint8_t *new_p, <span class="keywordtype">size_t</span> new_size,</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;                       <span class="keywordtype">size_t</span> in_use_back, <span class="keywordtype">size_t</span> in_use_front) {</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;    memcpy(new_p + new_size - in_use_back, old_p + old_size - in_use_back,</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;           in_use_back);</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;    memcpy(new_p, old_p, in_use_front);</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;  }</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;};</div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;<span class="comment">// DefaultAllocator uses new/delete to allocate memory regions</span></div><div class="line"><a name="l00394"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_default_allocator.html">  394</a></span>&#160;<span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_default_allocator.html">DefaultAllocator</a> : <span class="keyword">public</span> <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> {</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;  <span class="keyword">virtual</span> uint8_t *allocate(<span class="keywordtype">size_t</span> size) FLATBUFFERS_OVERRIDE {</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">new</span> uint8_t[size];</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;  }</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;  <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate(uint8_t *p, <span class="keywordtype">size_t</span>) FLATBUFFERS_OVERRIDE {</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;    <span class="keyword">delete</span>[] p;</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;  }</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;  <span class="keyword">static</span> <a class="code" href="classflatbuffers_1_1_default_allocator.html">DefaultAllocator</a> &amp;instance() {</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;    <span class="keyword">static</span> <a class="code" href="classflatbuffers_1_1_default_allocator.html">DefaultAllocator</a> inst;</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;    <span class="keywordflow">return</span> inst;</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;  }</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;};</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;<span class="comment">// DetachedBuffer is a finished flatbuffer memory region, detached from its</span></div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;<span class="comment">// builder. The original memory region and allocator are also stored so that</span></div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;<span class="comment">// the DetachedBuffer can manage the memory lifetime.</span></div><div class="line"><a name="l00413"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_detached_buffer.html">  413</a></span>&#160;<span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> {</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>()</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;      : allocator_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;        own_allocator_(<span class="keyword">false</span>),</div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;        buf_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;        reserved_(0),</div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;        cur_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;        size_(0) {}</div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>(<a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator, <span class="keywordtype">bool</span> own_allocator, uint8_t *buf,</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;                 <span class="keywordtype">size_t</span> reserved, uint8_t *cur, <span class="keywordtype">size_t</span> sz)</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;      : allocator_(allocator),</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;        own_allocator_(own_allocator),</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;        buf_(buf),</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;        reserved_(reserved),</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;        cur_(cur),</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;        size_(sz) {</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;    assert(allocator_);</div><div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;  }</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>(<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &amp;&amp;other)</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;      : allocator_(other.allocator_),</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;        own_allocator_(other.own_allocator_),</div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;        buf_(other.buf_),</div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;        reserved_(other.reserved_),</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;        cur_(other.cur_),</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;        size_(other.size_) {</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;    other.reset();</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;  }</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &amp;operator=(<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &amp;&amp;other) {</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;    destroy();</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;    allocator_ = other.allocator_;</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;    own_allocator_ = other.own_allocator_;</div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;    buf_ = other.buf_;</div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;    reserved_ = other.reserved_;</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;    cur_ = other.cur_;</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;    size_ = other.size_;</div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;</div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;    other.reset();</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;  }</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;  ~<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>() { destroy(); }</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;  <span class="keyword">const</span> uint8_t *data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> cur_; }</div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;  uint8_t *data() { <span class="keywordflow">return</span> cur_; }</div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;</div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;  <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> size_; }</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;<span class="preprocessor">  #if 0  // disabled for now due to the ordering of classes in this header</span></div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;  <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;  <span class="keywordtype">bool</span> Verify()<span class="keyword"> const </span>{</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;    Verifier verifier(data(), size());</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;    <span class="keywordflow">return</span> verifier.Verify&lt;T&gt;(<span class="keyword">nullptr</span>);</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;  }</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;  <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;  <span class="keyword">const</span> T* GetRoot()<span class="keyword"> const </span>{</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;    <span class="keywordflow">return</span> flatbuffers::GetRoot&lt;T&gt;(data());</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;  }</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;</div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;  <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;  T* GetRoot() {</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;    <span class="keywordflow">return</span> flatbuffers::GetRoot&lt;T&gt;(data());</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;  }</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;<span class="preprocessor">  #endif</span></div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;  <span class="comment">// These may change access mode, leave these at end of public section</span></div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;  FLATBUFFERS_DELETE_FUNC(<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &amp;other))</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;  FLATBUFFERS_DELETE_FUNC(</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;      <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &amp;<span class="keyword">operator</span>=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &amp;other))</div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160; <span class="keyword">protected</span>:</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator_;</div><div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;  <span class="keywordtype">bool</span> own_allocator_;</div><div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;  uint8_t *buf_;</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;  <span class="keywordtype">size_t</span> reserved_;</div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;  uint8_t *cur_;</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;  <span class="keywordtype">size_t</span> size_;</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;</div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;  <span class="keyword">inline</span> <span class="keywordtype">void</span> destroy() {</div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;    <span class="keywordflow">if</span> (buf_) {</div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;      assert(allocator_);</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;      allocator_-&gt;deallocate(buf_, reserved_);</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;    }</div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;    <span class="keywordflow">if</span> (own_allocator_ &amp;&amp; allocator_) { <span class="keyword">delete</span> allocator_; }</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;    reset();</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;  }</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;  <span class="keyword">inline</span> <span class="keywordtype">void</span> reset() {</div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;    allocator_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;    own_allocator_ = <span class="keyword">false</span>;</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;    buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;    reserved_ = 0;</div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;    cur_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;    size_ = 0;</div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;  }</div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;};</div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;</div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;<span class="comment">// This is a minimal replication of std::vector&lt;uint8_t&gt; functionality,</span></div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;<span class="comment">// except growing from higher to lower addresses. i.e push_back() inserts data</span></div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;<span class="comment">// in the lowest address in the vector.</span></div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;<span class="comment">// Since this vector leaves the lower part unused, we support a &quot;scratch-pad&quot;</span></div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;<span class="comment">// that can be stored there for temporary data, to share the allocated space.</span></div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;<span class="comment">// Essentially, this supports 2 std::vectors in a single buffer.</span></div><div class="line"><a name="l00526"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1vector__downward.html">  526</a></span>&#160;<span class="keyword">class </span><a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> {</div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;  <span class="keyword">explicit</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a>(<span class="keywordtype">size_t</span> initial_size,</div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;                           <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator,</div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;                           <span class="keywordtype">bool</span> own_allocator,</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;                           <span class="keywordtype">size_t</span> buffer_minalign)</div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;      : allocator_(allocator ? allocator : &amp;DefaultAllocator::instance()),</div><div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;        own_allocator_(own_allocator),</div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;        initial_size_(initial_size),</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;        buffer_minalign_(buffer_minalign),</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;        reserved_(0),</div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;        buf_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;        cur_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;        scratch_(<span class="keyword">nullptr</span>) {</div><div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;    assert(allocator_);</div><div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;  }</div><div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;</div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;  ~<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a>() {</div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;    <span class="keywordflow">if</span> (buf_) {</div><div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;      assert(allocator_);</div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;      allocator_-&gt;deallocate(buf_, reserved_);</div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;    }</div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;    <span class="keywordflow">if</span> (own_allocator_ &amp;&amp; allocator_) { <span class="keyword">delete</span> allocator_; }</div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;  }</div><div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;</div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;  <span class="keywordtype">void</span> reset() {</div><div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;    <span class="keywordflow">if</span> (buf_) {</div><div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;      assert(allocator_);</div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;      allocator_-&gt;deallocate(buf_, reserved_);</div><div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;      buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;    }</div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;    clear();</div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;  }</div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;  <span class="keywordtype">void</span> clear() {</div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;    <span class="keywordflow">if</span> (buf_) {</div><div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;      cur_ = buf_ + reserved_;</div><div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;      reserved_ = 0;</div><div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;      cur_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;    }</div><div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;    clear_scratch();</div><div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;  }</div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;</div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;  <span class="keywordtype">void</span> clear_scratch() {</div><div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;    scratch_ = buf_;</div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;  }</div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;</div><div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;  <span class="comment">// Relinquish the pointer to the caller.</span></div><div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> release() {</div><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;    <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> fb(allocator_, own_allocator_, buf_, reserved_, cur_,</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;                      size());</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;    allocator_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;    own_allocator_ = <span class="keyword">false</span>;</div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;    buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;    clear();</div><div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;    <span class="keywordflow">return</span> fb;</div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;  }</div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;</div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;  <span class="keywordtype">size_t</span> ensure_space(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;    assert(cur_ &gt;= scratch_ &amp;&amp; scratch_ &gt;= buf_);</div><div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;    <span class="keywordflow">if</span> (len &gt; static_cast&lt;size_t&gt;(cur_ - scratch_)) { reallocate(len); }</div><div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;    <span class="comment">// Beyond this, signed offsets may not have enough range:</span></div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;    <span class="comment">// (FlatBuffers &gt; 2GB not supported).</span></div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;    assert(size() &lt; FLATBUFFERS_MAX_BUFFER_SIZE);</div><div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;    <span class="keywordflow">return</span> len;</div><div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;  }</div><div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;</div><div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;  <span class="keyword">inline</span> uint8_t *make_space(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;    cur_ -= ensure_space(len);</div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;    <span class="keywordflow">return</span> cur_;</div><div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;  }</div><div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;</div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> &amp;get_allocator() { <span class="keywordflow">return</span> *allocator_; }</div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;</div><div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;  uoffset_t size()<span class="keyword"> const </span>{</div><div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>uoffset_t<span class="keyword">&gt;</span>(reserved_ - (cur_ - buf_));</div><div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;  }</div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;</div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;  uoffset_t scratch_size()<span class="keyword"> const </span>{</div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>uoffset_t<span class="keyword">&gt;</span>(scratch_ - buf_);</div><div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;  }</div><div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;</div><div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;  <span class="keywordtype">size_t</span> capacity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> reserved_; }</div><div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;</div><div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;  uint8_t *data()<span class="keyword"> const </span>{</div><div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;    assert(cur_);</div><div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;    <span class="keywordflow">return</span> cur_;</div><div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;  }</div><div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;</div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;  uint8_t *scratch_data()<span class="keyword"> const </span>{</div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;    assert(buf_);</div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;    <span class="keywordflow">return</span> buf_;</div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;  }</div><div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;</div><div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;  uint8_t *scratch_end()<span class="keyword"> const </span>{</div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;    assert(scratch_);</div><div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;    <span class="keywordflow">return</span> scratch_;</div><div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;  }</div><div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;</div><div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;  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="l00627"></a><span class="lineno">  627</span>&#160;</div><div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;  <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="l00629"></a><span class="lineno">  629</span>&#160;    memcpy(make_space(num), bytes, num);</div><div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;  }</div><div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;</div><div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;  <span class="comment">// Specialized version of push() that avoids memcpy call for small data.</span></div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> push_small(<span class="keyword">const</span> T &amp;little_endian_t) {</div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;    make_space(<span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;    *<span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(cur_) = little_endian_t;</div><div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;  }</div><div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;</div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> scratch_push_small(<span class="keyword">const</span> T &amp;t) {</div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;    ensure_space(<span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;    *<span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(scratch_) = t;</div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;    scratch_ += <span class="keyword">sizeof</span>(T);</div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;  }</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;</div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;  <span class="comment">// fill() is most frequently called with small byte counts (&lt;= 4),</span></div><div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;  <span class="comment">// which is why we&#39;re using loops rather than calling memset.</span></div><div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;  <span class="keywordtype">void</span> fill(<span class="keywordtype">size_t</span> zero_pad_bytes) {</div><div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;    make_space(zero_pad_bytes);</div><div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; zero_pad_bytes; i++) cur_[i] = 0;</div><div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;  }</div><div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;</div><div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;  <span class="comment">// Version for when we know the size is larger.</span></div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;  <span class="keywordtype">void</span> fill_big(<span class="keywordtype">size_t</span> zero_pad_bytes) {</div><div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;    memset(make_space(zero_pad_bytes), 0, zero_pad_bytes);</div><div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;  }</div><div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;</div><div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;  <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="l00657"></a><span class="lineno">  657</span>&#160;  <span class="keywordtype">void</span> scratch_pop(<span class="keywordtype">size_t</span> bytes_to_remove) { scratch_ -= bytes_to_remove; }</div><div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;</div><div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;  <span class="comment">// You shouldn&#39;t really be copying instances of this class.</span></div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;  FLATBUFFERS_DELETE_FUNC(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &amp;))</div><div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;  FLATBUFFERS_DELETE_FUNC(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &amp;<span class="keyword">operator</span>=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &amp;))</div><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;</div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator_;</div><div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;  <span class="keywordtype">bool</span> own_allocator_;</div><div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;  <span class="keywordtype">size_t</span> initial_size_;</div><div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;  <span class="keywordtype">size_t</span> buffer_minalign_;</div><div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;  <span class="keywordtype">size_t</span> reserved_;</div><div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;  uint8_t *buf_;</div><div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;  uint8_t *cur_;  <span class="comment">// Points at location between empty (below) and used (above).</span></div><div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;  uint8_t *scratch_;  <span class="comment">// Points to the end of the scratchpad in use.</span></div><div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;</div><div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;  <span class="keywordtype">void</span> reallocate(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;    assert(allocator_);</div><div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;    <span class="keyword">auto</span> old_reserved = reserved_;</div><div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;    <span class="keyword">auto</span> old_size = size();</div><div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;    <span class="keyword">auto</span> old_scratch_size = scratch_size();</div><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;    reserved_ += (std::max)(len,</div><div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;                            old_reserved ? old_reserved / 2 : initial_size_);</div><div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;    reserved_ = (reserved_ + buffer_minalign_ - 1) &amp; ~(buffer_minalign_ - 1);</div><div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;    <span class="keywordflow">if</span> (buf_) {</div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;      buf_ = allocator_-&gt;reallocate_downward(buf_, old_reserved, reserved_,</div><div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;                                             old_size, old_scratch_size);</div><div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;      buf_ = allocator_-&gt;allocate(reserved_);</div><div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;    }</div><div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;    cur_ = buf_ + reserved_ - old_size;</div><div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;    scratch_ = buf_ + old_scratch_size;</div><div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;  }</div><div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;};</div><div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;</div><div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;<span class="comment">// Converts a Field ID to a virtual table offset.</span></div><div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;<span class="keyword">inline</span> voffset_t FieldIndexToOffset(voffset_t field_id) {</div><div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;  <span class="comment">// Should correspond to what EndTable() below builds up.</span></div><div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;  <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="l00696"></a><span class="lineno">  696</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>voffset_t<span class="keyword">&gt;</span>((field_id + fixed_fields) * <span class="keyword">sizeof</span>(voffset_t));</div><div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;}</div><div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;</div><div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> Alloc&gt;</div><div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;<span class="keyword">const</span> T *data(<span class="keyword">const</span> std::vector&lt;T, Alloc&gt; &amp;v) {</div><div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;  <span class="keywordflow">return</span> v.empty() ? nullptr : &amp;v.front();</div><div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;}</div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> Alloc&gt; T *data(std::vector&lt;T, Alloc&gt; &amp;v) {</div><div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;  <span class="keywordflow">return</span> v.empty() ? nullptr : &amp;v.front();</div><div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;}</div><div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;<span class="comment">/// @endcond</span></div><div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;<span class="comment">/// @addtogroup flatbuffers_cpp_api</span></div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;<span class="comment">/// @{</span></div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;<span class="comment">/// @class FlatBufferBuilder</span></div><div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;<span class="comment">/// @brief Helper class to hold data needed in creation of a FlatBuffer.</span></div><div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;<span class="comment">/// To serialize data, you typically call one of the `Create*()` functions in</span></div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;<span class="comment">/// the generated code, which in turn call a sequence of `StartTable`/</span></div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;<span class="comment">/// `PushElement`/`AddElement`/`EndTable`, or the builtin `CreateString`/</span></div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;<span class="comment">/// `CreateVector` functions. Do this is depth-first order to build up a tree to</span></div><div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;<span class="comment">/// the root. `Finish()` wraps up the buffer ready for transport.</span></div><div class="line"><a name="l00718"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html">  718</a></span>&#160;<span class="comment"></span><span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> {</div><div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160; <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;<span class="comment">  /// @brief Default constructor for FlatBufferBuilder.</span></div><div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;<span class="comment">  /// @param[in] initial_size The initial size of the buffer, in bytes. Defaults</span></div><div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;<span class="comment">  /// to `1024`.</span></div><div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;<span class="comment">  /// @param[in] allocator An `Allocator` to use. Defaults to a new instance of</span></div><div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;<span class="comment">  /// a `DefaultAllocator`.</span></div><div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;<span class="comment">  /// @param[in] own_allocator Whether the builder/vector should own the</span></div><div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;<span class="comment">  /// allocator. Defaults to / `false`.</span></div><div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;<span class="comment">  /// @param[in] buffer_minalign Force the buffer to be aligned to the given</span></div><div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;<span class="comment">  /// minimum alignment upon reallocation. Only needed if you intend to store</span></div><div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;<span class="comment">  /// types with custom alignment AND you wish to read the buffer in-place</span></div><div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;<span class="comment">  /// directly after creation.</span></div><div class="line"><a name="l00731"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab0173786ea4ec3e4ae10555639b2996c">  731</a></span>&#160;<span class="comment"></span>  <span class="keyword">explicit</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab0173786ea4ec3e4ae10555639b2996c">FlatBufferBuilder</a>(<span class="keywordtype">size_t</span> initial_size = 1024,</div><div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;                             <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator = <span class="keyword">nullptr</span>,</div><div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;                             <span class="keywordtype">bool</span> own_allocator = <span class="keyword">false</span>,</div><div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;                             <span class="keywordtype">size_t</span> buffer_minalign =</div><div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;                                 AlignOf&lt;largest_scalar_t&gt;())</div><div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;      : buf_(initial_size, allocator, own_allocator, buffer_minalign),</div><div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;        num_field_loc(0),</div><div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;        max_voffset_(0),</div><div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;        nested(false),</div><div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;        finished(false),</div><div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;        minalign_(1),</div><div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;        force_defaults_(false),</div><div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;        dedup_vtables_(true),</div><div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;        string_pool(nullptr) {</div><div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;    EndianCheck();</div><div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;  }</div><div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;</div><div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;  ~<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a>() {</div><div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;    <span class="keywordflow">if</span> (string_pool) <span class="keyword">delete</span> string_pool;</div><div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;  }</div><div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;</div><div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;  <span class="keywordtype">void</span> Reset() {</div><div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;    Clear();       <span class="comment">// clear builder state</span></div><div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;    buf_.reset();  <span class="comment">// deallocate buffer</span></div><div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;  }</div><div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;<span class="comment">  /// @brief Reset all the state in this FlatBufferBuilder so it can be reused</span></div><div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;<span class="comment">  /// to construct another buffer.</span></div><div class="line"><a name="l00759"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412">  759</a></span>&#160;<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="l00760"></a><span class="lineno">  760</span>&#160;    ClearOffsets();</div><div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;    buf_.clear();</div><div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;    nested = <span class="keyword">false</span>;</div><div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;    finished = <span class="keyword">false</span>;</div><div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;    minalign_ = 1;</div><div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;    <span class="keywordflow">if</span> (string_pool) string_pool-&gt;clear();</div><div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;  }</div><div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;<span class="comment">  /// @brief The current size of the serialized buffer, counting from the end.</span></div><div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;<span class="comment">  /// @return Returns an `uoffset_t` with the current size of the buffer.</span></div><div class="line"><a name="l00770"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a66c8fd33ab9b3b237954c9ea38648f7f">  770</a></span>&#160;<span class="comment"></span>  uoffset_t <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a66c8fd33ab9b3b237954c9ea38648f7f">GetSize</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> buf_.size(); }</div><div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;<span class="comment">  /// @brief Get the serialized buffer (after you call `Finish()`).</span></div><div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;<span class="comment">  /// @return Returns an `uint8_t` pointer to the FlatBuffer data inside the</span></div><div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;<span class="comment">  /// buffer.</span></div><div class="line"><a name="l00775"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab81ab8aa273c270b0942fd81489cad83">  775</a></span>&#160;<span class="comment"></span>  uint8_t *<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab81ab8aa273c270b0942fd81489cad83">GetBufferPointer</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;    Finished();</div><div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;    <span class="keywordflow">return</span> buf_.data();</div><div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;  }</div><div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;<span class="comment">  /// @brief Get a pointer to an unfinished buffer.</span></div><div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;<span class="comment">  /// @return Returns a `uint8_t` pointer to the unfinished buffer.</span></div><div class="line"><a name="l00782"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a099810f03046139d1854d20a1c2a2e41">  782</a></span>&#160;<span class="comment"></span>  uint8_t *<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a099810f03046139d1854d20a1c2a2e41">GetCurrentBufferPointer</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> buf_.data(); }</div><div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;<span class="comment">  /// @brief Get the released pointer to the serialized buffer.</span></div><div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;<span class="comment">  /// @warning Do NOT attempt to use this FlatBufferBuilder afterwards!</span></div><div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;<span class="comment">  /// @return A `FlatBuffer` that owns the buffer and its allocator and</span></div><div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;<span class="comment">  /// behaves similar to a `unique_ptr` with a deleter.</span></div><div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;<span class="comment">  /// Deprecated: use Release() instead</span></div><div class="line"><a name="l00789"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8">  789</a></span>&#160;<span class="comment"></span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8">ReleaseBufferPointer</a>() {</div><div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;    Finished();</div><div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;    <span class="keywordflow">return</span> buf_.release();</div><div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;  }</div><div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;<span class="comment">  /// @brief Get the released DetachedBuffer.</span></div><div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;<span class="comment">  /// @return A `DetachedBuffer` that owns the buffer and its allocator.</span></div><div class="line"><a name="l00796"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45">  796</a></span>&#160;<span class="comment"></span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45">Release</a>() {</div><div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;    Finished();</div><div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;    <span class="keywordflow">return</span> buf_.release();</div><div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;  }</div><div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;<span class="comment">  /// @brief get the minimum alignment this buffer needs to be accessed</span></div><div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;<span class="comment">  /// properly. This is only known once all elements have been written (after</span></div><div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;<span class="comment">  /// you call Finish()). You can use this information if you need to embed</span></div><div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;<span class="comment">  /// a FlatBuffer in some other buffer, such that you can later read it</span></div><div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;<span class="comment">  /// without first having to copy it into its own buffer.</span></div><div class="line"><a name="l00806"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b">  806</a></span>&#160;<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="l00807"></a><span class="lineno">  807</span>&#160;    Finished();</div><div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;    <span class="keywordflow">return</span> minalign_;</div><div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;  }</div><div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;<span class="comment">  /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;<span class="comment"></span>  <span class="keywordtype">void</span> Finished()<span class="keyword"> const </span>{</div><div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;    <span class="comment">// If you get this assert, you&#39;re attempting to get access a buffer</span></div><div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;    <span class="comment">// which hasn&#39;t been finished yet. Be sure to call</span></div><div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;    <span class="comment">// FlatBufferBuilder::Finish with your root table.</span></div><div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;    <span class="comment">// If you really need to access an unfinished buffer, call</span></div><div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;    <span class="comment">// GetCurrentBufferPointer instead.</span></div><div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;    assert(finished);</div><div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;  }<span class="comment"></span></div><div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;<span class="comment">  /// @endcond</span></div><div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;<span class="comment">  /// @brief In order to save space, fields that are set to their default value</span></div><div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;<span class="comment">  /// don&#39;t get serialized into the buffer.</span></div><div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;<span class="comment">  /// @param[in] bool fd When set to `true`, always serializes default values.</span></div><div class="line"><a name="l00825"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a">  825</a></span>&#160;<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="l00826"></a><span class="lineno">  826</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;<span class="comment">  /// @brief By default vtables are deduped in order to save space.</span></div><div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;<span class="comment">  /// @param[in] bool dedup When set to `true`, dedup vtables.</span></div><div class="line"><a name="l00829"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961">  829</a></span>&#160;<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="l00830"></a><span class="lineno">  830</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;<span class="comment">  /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;<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="l00833"></a><span class="lineno">  833</span>&#160;</div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;  <span class="keywordtype">void</span> TrackMinAlign(<span class="keywordtype">size_t</span> elem_size) {</div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;    <span class="keywordflow">if</span> (elem_size &gt; minalign_) minalign_ = elem_size;</div><div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;  }</div><div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;</div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;  <span class="keywordtype">void</span> Align(<span class="keywordtype">size_t</span> elem_size) {</div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;    TrackMinAlign(elem_size);</div><div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;    buf_.fill(PaddingBytes(buf_.size(), elem_size));</div><div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;  }</div><div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;</div><div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;  <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="l00844"></a><span class="lineno">  844</span>&#160;    PushBytes(bytes, size);</div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;    finished = <span class="keyword">true</span>;</div><div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;  }</div><div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;</div><div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;  <span class="keywordtype">void</span> PushBytes(<span class="keyword">const</span> uint8_t *bytes, <span class="keywordtype">size_t</span> size) { buf_.push(bytes, size); }</div><div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;</div><div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;  <span class="keywordtype">void</span> PopBytes(<span class="keywordtype">size_t</span> amount) { buf_.pop(amount); }</div><div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;</div><div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> AssertScalarT() {</div><div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;    <span class="comment">// The code assumes power of 2 sizes and endian-swap-ability.</span></div><div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;    static_assert(flatbuffers::is_scalar&lt;T&gt;::value, <span class="stringliteral">&quot;T must be a scalar type&quot;</span>);</div><div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;  }</div><div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;</div><div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160;  <span class="comment">// Write a single aligned scalar to the buffer</span></div><div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; uoffset_t PushElement(T element) {</div><div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;    AssertScalarT&lt;T&gt;();</div><div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;    T litle_endian_element = EndianScalar(element);</div><div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;    Align(<span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;    buf_.push_small(litle_endian_element);</div><div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;    <span class="keywordflow">return</span> GetSize();</div><div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;  }</div><div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;</div><div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; uoffset_t PushElement(<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> off) {</div><div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;    <span class="comment">// Special case for offsets: see ReferTo below.</span></div><div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;    <span class="keywordflow">return</span> PushElement(ReferTo(off.o));</div><div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;  }</div><div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;</div><div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;  <span class="comment">// When writing fields, we track where they are, so we can create correct</span></div><div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;  <span class="comment">// vtables later.</span></div><div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;  <span class="keywordtype">void</span> TrackField(voffset_t field, uoffset_t off) {</div><div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;    <a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a> fl = { off, field };</div><div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;    buf_.scratch_push_small(fl);</div><div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;    num_field_loc++;</div><div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;    max_voffset_ = (std::max)(max_voffset_, field);</div><div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;  }</div><div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;</div><div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;  <span class="comment">// Like PushElement, but additionally tracks the field this represents.</span></div><div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> AddElement(voffset_t field, T e, T def) {</div><div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;    <span class="comment">// We don&#39;t serialize values equal to the default.</span></div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;    <span class="keywordflow">if</span> (e == def &amp;&amp; !force_defaults_) <span class="keywordflow">return</span>;</div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;    <span class="keyword">auto</span> off = PushElement(e);</div><div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;    TrackField(field, off);</div><div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;  }</div><div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;</div><div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> AddOffset(voffset_t field, <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> off) {</div><div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;    <span class="keywordflow">if</span> (off.IsNull()) <span class="keywordflow">return</span>;  <span class="comment">// Don&#39;t store.</span></div><div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;    AddElement(field, ReferTo(off.o), static_cast&lt;uoffset_t&gt;(0));</div><div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;  }</div><div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;</div><div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> AddStruct(voffset_t field, <span class="keyword">const</span> T *structptr) {</div><div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;    <span class="keywordflow">if</span> (!structptr) <span class="keywordflow">return</span>;  <span class="comment">// Default, don&#39;t store.</span></div><div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;    Align(AlignOf&lt;T&gt;());</div><div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;    buf_.push_small(*structptr);</div><div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;    TrackField(field, GetSize());</div><div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;  }</div><div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;</div><div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;  <span class="keywordtype">void</span> AddStructOffset(voffset_t field, uoffset_t off) {</div><div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;    TrackField(field, off);</div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;  }</div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;</div><div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;  <span class="comment">// Offsets initially are relative to the end of the buffer (downwards).</span></div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;  <span class="comment">// This function converts them to be relative to the current location</span></div><div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;  <span class="comment">// in the buffer (when stored here), pointing upwards.</span></div><div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;  uoffset_t ReferTo(uoffset_t off) {</div><div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;    <span class="comment">// Align to ensure GetSize() below is correct.</span></div><div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;    Align(<span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;    <span class="comment">// Offset must refer to something already in buffer.</span></div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;    assert(off &amp;&amp; off &lt;= GetSize());</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;    <span class="keywordflow">return</span> GetSize() - off + <span class="keyword">static_cast&lt;</span>uoffset_t<span class="keyword">&gt;</span>(<span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;  }</div><div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;</div><div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;  <span class="keywordtype">void</span> NotNested() {</div><div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;    <span class="comment">// If you hit this, you&#39;re trying to construct a Table/Vector/String</span></div><div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;    <span class="comment">// during the construction of its parent table (between the MyTableBuilder</span></div><div class="line"><a name="l00918"></a><span class="lineno">  918</span>&#160;    <span class="comment">// and table.Finish().</span></div><div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;    <span class="comment">// Move the creation of these sub-objects to above the MyTableBuilder to</span></div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;    <span class="comment">// not get this assert.</span></div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;    <span class="comment">// Ignoring this assert may appear to work in simple cases, but the reason</span></div><div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;    <span class="comment">// it is here is that storing objects in-line may cause vtable offsets</span></div><div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;    <span class="comment">// to not fit anymore. It also leads to vtable duplication.</span></div><div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;    assert(!nested);</div><div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;    <span class="comment">// If you hit this, fields were added outside the scope of a table.</span></div><div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;    assert(!num_field_loc);</div><div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;  }</div><div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;</div><div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;  <span class="comment">// From generated code (or from the parser), we call StartTable/EndTable</span></div><div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;  <span class="comment">// with a sequence of AddElement calls in between.</span></div><div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;  uoffset_t StartTable() {</div><div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;    NotNested();</div><div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;    nested = <span class="keyword">true</span>;</div><div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;    <span class="keywordflow">return</span> GetSize();</div><div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;  }</div><div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;</div><div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;  <span class="comment">// This finishes one serialized object by generating the vtable if it&#39;s a</span></div><div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;  <span class="comment">// table, comparing it against existing vtables, and writing the</span></div><div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;  <span class="comment">// resulting vtable offset.</span></div><div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;  uoffset_t EndTable(uoffset_t start) {</div><div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;    <span class="comment">// If you get this assert, a corresponding StartTable wasn&#39;t called.</span></div><div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;    assert(nested);</div><div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;    <span class="comment">// Write the vtable offset, which is the start of any Table.</span></div><div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;    <span class="comment">// We fill it&#39;s value later.</span></div><div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;    <span class="keyword">auto</span> vtableoffsetloc = PushElement&lt;soffset_t&gt;(0);</div><div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;    <span class="comment">// Write a vtable, which consists entirely of voffset_t elements.</span></div><div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;    <span class="comment">// It starts with the number of offsets, followed by a type id, followed</span></div><div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;    <span class="comment">// by the offsets themselves. In reverse:</span></div><div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;    <span class="comment">// Include space for the last offset and ensure empty tables have a</span></div><div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;    <span class="comment">// minimum size.</span></div><div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160;    max_voffset_ =</div><div class="line"><a name="l00952"></a><span class="lineno">  952</span>&#160;        (std::max)(static_cast&lt;voffset_t&gt;(max_voffset_ + <span class="keyword">sizeof</span>(voffset_t)),</div><div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;                   FieldIndexToOffset(0));</div><div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;    buf_.fill_big(max_voffset_);</div><div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;    <span class="keyword">auto</span> table_object_size = vtableoffsetloc - start;</div><div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;    assert(table_object_size &lt; 0x10000);  <span class="comment">// Vtable use 16bit offsets.</span></div><div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;    WriteScalar&lt;voffset_t&gt;(buf_.data() + <span class="keyword">sizeof</span>(voffset_t),</div><div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;                           static_cast&lt;voffset_t&gt;(table_object_size));</div><div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160;    WriteScalar&lt;voffset_t&gt;(buf_.data(), max_voffset_);</div><div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;    <span class="comment">// Write the offsets into the table</span></div><div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = buf_.scratch_end() - num_field_loc * <span class="keyword">sizeof</span>(<a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a>);</div><div class="line"><a name="l00962"></a><span class="lineno">  962</span>&#160;         it &lt; buf_.scratch_end(); it += <span class="keyword">sizeof</span>(<a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a>)) {</div><div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;      <span class="keyword">auto</span> field_location = <span class="keyword">reinterpret_cast&lt;</span><a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a> *<span class="keyword">&gt;</span>(it);</div><div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160;      <span class="keyword">auto</span> pos = <span class="keyword">static_cast&lt;</span>voffset_t<span class="keyword">&gt;</span>(vtableoffsetloc - field_location-&gt;off);</div><div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;      <span class="comment">// If this asserts, it means you&#39;ve set a field twice.</span></div><div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;      assert(!ReadScalar&lt;voffset_t&gt;(buf_.data() + field_location-&gt;id));</div><div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;      WriteScalar&lt;voffset_t&gt;(buf_.data() + field_location-&gt;id, pos);</div><div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;    }</div><div class="line"><a name="l00969"></a><span class="lineno">  969</span>&#160;    ClearOffsets();</div><div class="line"><a name="l00970"></a><span class="lineno">  970</span>&#160;    <span class="keyword">auto</span> vt1 = <span class="keyword">reinterpret_cast&lt;</span>voffset_t *<span class="keyword">&gt;</span>(buf_.data());</div><div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;    <span class="keyword">auto</span> vt1_size = ReadScalar&lt;voffset_t&gt;(vt1);</div><div class="line"><a name="l00972"></a><span class="lineno">  972</span>&#160;    <span class="keyword">auto</span> vt_use = GetSize();</div><div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;    <span class="comment">// See if we already have generated a vtable with this exact same</span></div><div class="line"><a name="l00974"></a><span class="lineno">  974</span>&#160;    <span class="comment">// layout before. If so, make it point to the old one, remove this one.</span></div><div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;    <span class="keywordflow">if</span> (dedup_vtables_) {</div><div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;      <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = buf_.scratch_data(); it &lt; buf_.scratch_end();</div><div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;           it += <span class="keyword">sizeof</span>(uoffset_t)) {</div><div class="line"><a name="l00978"></a><span class="lineno">  978</span>&#160;        <span class="keyword">auto</span> vt_offset_ptr = <span class="keyword">reinterpret_cast&lt;</span>uoffset_t *<span class="keyword">&gt;</span>(it);</div><div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160;        <span class="keyword">auto</span> vt2 = <span class="keyword">reinterpret_cast&lt;</span>voffset_t *<span class="keyword">&gt;</span>(buf_.data_at(*vt_offset_ptr));</div><div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;        <span class="keyword">auto</span> vt2_size = *vt2;</div><div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;        <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="l00982"></a><span class="lineno">  982</span>&#160;        vt_use = *vt_offset_ptr;</div><div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;        buf_.pop(GetSize() - vtableoffsetloc);</div><div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;      }</div><div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;    }</div><div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;    <span class="comment">// If this is a new vtable, remember it.</span></div><div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;    <span class="keywordflow">if</span> (vt_use == GetSize()) { buf_.scratch_push_small(vt_use); }</div><div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;    <span class="comment">// Fill the vtable offset we created above.</span></div><div class="line"><a name="l00990"></a><span class="lineno">  990</span>&#160;    <span class="comment">// The offset points from the beginning of the object to where the</span></div><div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160;    <span class="comment">// vtable is stored.</span></div><div class="line"><a name="l00992"></a><span class="lineno">  992</span>&#160;    <span class="comment">// Offsets default direction is downward in memory for future format</span></div><div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;    <span class="comment">// flexibility (storing all vtables at the start of the file).</span></div><div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;    WriteScalar(buf_.data_at(vtableoffsetloc),</div><div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;                <span class="keyword">static_cast&lt;</span>soffset_t<span class="keyword">&gt;</span>(vt_use) -</div><div class="line"><a name="l00996"></a><span class="lineno">  996</span>&#160;                    static_cast&lt;soffset_t&gt;(vtableoffsetloc));</div><div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;</div><div class="line"><a name="l00998"></a><span class="lineno">  998</span>&#160;    nested = <span class="keyword">false</span>;</div><div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;    <span class="keywordflow">return</span> vtableoffsetloc;</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;  }</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160;</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;  <span class="comment">// DEPRECATED: call the version above instead.</span></div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;  uoffset_t EndTable(uoffset_t start, voffset_t <span class="comment">/*numfields*/</span>) {</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;    <span class="keywordflow">return</span> EndTable(start);</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;  }</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;  <span class="comment">// This checks a required field has been set in a given table that has</span></div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;  <span class="comment">// just been constructed.</span></div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> Required(<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> table, voffset_t field) {</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;    <span class="keyword">auto</span> table_ptr = buf_.data_at(table.o);</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;    <span class="keyword">auto</span> vtable_ptr = table_ptr - ReadScalar&lt;soffset_t&gt;(table_ptr);</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160;    <span class="keywordtype">bool</span> ok = ReadScalar&lt;voffset_t&gt;(vtable_ptr + field) != 0;</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160;    <span class="comment">// If this fails, the caller will show what field needs to be set.</span></div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;    assert(ok);</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160;    (void)ok;</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160;  }</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160;</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160;  uoffset_t StartStruct(<span class="keywordtype">size_t</span> alignment) {</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;    Align(alignment);</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;    <span class="keywordflow">return</span> GetSize();</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;  }</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160;</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;  uoffset_t EndStruct() { <span class="keywordflow">return</span> GetSize(); }</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;  <span class="keywordtype">void</span> ClearOffsets() {</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;    buf_.scratch_pop(num_field_loc * <span class="keyword">sizeof</span>(<a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a>));</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;    num_field_loc = 0;</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;    max_voffset_ = 0;</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;  }</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;  <span class="comment">// Aligns such that when &quot;len&quot; bytes are written, an object can be written</span></div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;  <span class="comment">// after it with &quot;alignment&quot; without padding.</span></div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;  <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="l01034"></a><span class="lineno"> 1034</span>&#160;    TrackMinAlign(alignment);</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;    buf_.fill(PaddingBytes(GetSize() + len, alignment));</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;  }</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> PreAlign(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;    AssertScalarT&lt;T&gt;();</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;    PreAlign(len, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;  }<span class="comment"></span></div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;<span class="comment">  /// @endcond</span></div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;<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="l01045"></a><span class="lineno"> 1045</span>&#160;<span class="comment">  /// @param[in] len The number of bytes that should be stored from `str`.</span></div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01047"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe"> 1047</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <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="l01048"></a><span class="lineno"> 1048</span>&#160;    NotNested();</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;    PreAlign&lt;uoffset_t&gt;(len + 1);  <span class="comment">// Always 0-terminated.</span></div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;    buf_.fill(1);</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;    PushBytes(reinterpret_cast&lt;const uint8_t *&gt;(str), len);</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160;    PushElement(static_cast&lt;uoffset_t&gt;(len));</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a>(GetSize());</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;  }</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which is null-terminated.</span></div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;<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="l01058"></a><span class="lineno"> 1058</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01059"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5"> 1059</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <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="l01060"></a><span class="lineno"> 1060</span>&#160;    <span class="keywordflow">return</span> CreateString(str, strlen(str));</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;  }</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which is null-terminated.</span></div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;<span class="comment">  /// @param[in] str A char pointer to a C-string to add to the buffer.</span></div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01066"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154"> 1066</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154">CreateString</a>(<span class="keywordtype">char</span> *str) {</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;    <span class="keywordflow">return</span> CreateString(str, strlen(str));</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;  }</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;<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="l01072"></a><span class="lineno"> 1072</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01073"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f"> 1073</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f">CreateString</a>(<span class="keyword">const</span> std::string &amp;str) {</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;    <span class="keywordflow">return</span> CreateString(str.c_str(), str.length());</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;  }</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;<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="l01079"></a><span class="lineno"> 1079</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts</span></div><div class="line"><a name="l01080"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506"> 1080</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506">CreateString</a>(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> *str) {</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;    <span class="keywordflow">return</span> str ? CreateString(str-&gt;c_str(), str-&gt;Length()) : 0;</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;  }</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;<span class="comment">  /// @param[in] str A const reference to a std::string like type with support</span></div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;<span class="comment">  /// of T::c_str() and T::length() to store in the buffer.</span></div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01088"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685"> 1088</a></span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685">CreateString</a>(<span class="keyword">const</span> T &amp;str) {</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;    <span class="keywordflow">return</span> CreateString(str.c_str(), str.length());</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;  }</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;<span class="comment">  /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160;<span class="comment">  /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;<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="l01096"></a><span class="lineno"> 1096</span>&#160;<span class="comment">  /// @param[in] len The number of bytes that should be stored from `str`.</span></div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01098"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1"> 1098</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <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="l01099"></a><span class="lineno"> 1099</span>&#160;    <span class="keywordflow">if</span> (!string_pool)</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;      string_pool = <span class="keyword">new</span> StringOffsetMap(<a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html">StringOffsetCompare</a>(buf_));</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;    <span class="keyword">auto</span> size_before_string = buf_.size();</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;    <span class="comment">// Must first serialize the string, since the set is all offsets into</span></div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;    <span class="comment">// buffer.</span></div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;    <span class="keyword">auto</span> off = CreateString(str, len);</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;    <span class="keyword">auto</span> it = string_pool-&gt;find(off);</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160;    <span class="comment">// If it exists we reuse existing serialized data!</span></div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;    <span class="keywordflow">if</span> (it != string_pool-&gt;end()) {</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160;      <span class="comment">// We can remove the string we serialized.</span></div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160;      buf_.pop(buf_.size() - size_before_string);</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;      <span class="keywordflow">return</span> *it;</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;    }</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;    <span class="comment">// Record this string for future use.</span></div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;    string_pool-&gt;insert(off);</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;    <span class="keywordflow">return</span> off;</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;  }</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which null-terminated.</span></div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160;<span class="comment">  /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;<span class="comment">  /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;<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="l01121"></a><span class="lineno"> 1121</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01122"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7"> 1122</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <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="l01123"></a><span class="lineno"> 1123</span>&#160;    <span class="keywordflow">return</span> CreateSharedString(str, strlen(str));</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;  }</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;<span class="comment">  /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;<span class="comment">  /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;<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="l01130"></a><span class="lineno"> 1130</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01131"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9"> 1131</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9">CreateSharedString</a>(<span class="keyword">const</span> std::string &amp;str) {</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;    <span class="keywordflow">return</span> CreateSharedString(str.c_str(), str.length());</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;  }</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;<span class="comment">  /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160;<span class="comment">  /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160;<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="l01139"></a><span class="lineno"> 1139</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts</span></div><div class="line"><a name="l01140"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3"> 1140</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3">CreateSharedString</a>(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> *str) {</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;    <span class="keywordflow">return</span> CreateSharedString(str-&gt;c_str(), str-&gt;Length());</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;  }</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;<span class="comment">  /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;<span class="comment"></span>  uoffset_t EndVector(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;    assert(nested);  <span class="comment">// Hit if no corresponding StartVector.</span></div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;    nested = <span class="keyword">false</span>;</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;    <span class="keywordflow">return</span> PushElement(static_cast&lt;uoffset_t&gt;(len));</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;  }</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;  <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="l01152"></a><span class="lineno"> 1152</span>&#160;    NotNested();</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;    nested = <span class="keyword">true</span>;</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160;    PreAlign&lt;uoffset_t&gt;(len * elemsize);</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;    PreAlign(len * elemsize, elemsize);  <span class="comment">// Just in case elemsize &gt; uoffset_t.</span></div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;  }</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;  <span class="comment">// Call this right before StartVector/CreateVector if you want to force the</span></div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;  <span class="comment">// alignment to be something different than what the element size would</span></div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;  <span class="comment">// normally dictate.</span></div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160;  <span class="comment">// This is useful when storing a nested_flatbuffer in a vector of bytes,</span></div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;  <span class="comment">// or when storing SIMD floats, etc.</span></div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;  <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="l01164"></a><span class="lineno"> 1164</span>&#160;    PreAlign(len * elemsize, alignment);</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;  }</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;<span class="comment">  /// @endcond</span></div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;<span class="comment">  /// @brief Serialize an array into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;<span class="comment">  /// @tparam T The data type of the array elements.</span></div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;<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="l01172"></a><span class="lineno"> 1172</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;<span class="comment">  /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01176"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3"> 1176</a></span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;T&gt;</a>&gt; <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="l01177"></a><span class="lineno"> 1177</span>&#160;    <span class="comment">// If this assert hits, you&#39;re specifying a template argument that is</span></div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;    <span class="comment">// causing the wrong overload to be selected, remove it.</span></div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;    AssertScalarT&lt;T&gt;();</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;    StartVector(len, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160;    <span class="comment">// clang-format off</span></div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160;<span class="preprocessor">    #if FLATBUFFERS_LITTLEENDIAN</span></div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;      PushBytes(reinterpret_cast&lt;const uint8_t *&gt;(v), len * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;      <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(T) == 1) {</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;        PushBytes(reinterpret_cast&lt;const uint8_t *&gt;(v), len);</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160;      } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = len; i &gt; 0; ) {</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;          PushElement(v[--i]);</div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;        }</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;      }</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;    <span class="comment">// clang-format on</span></div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;T&gt;</a>&gt;(EndVector(len));</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;  }</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160;</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;Offset&lt;T&gt;</a>&gt;&gt; CreateVector(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> *v, <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;    StartVector(len, <span class="keyword">sizeof</span>(<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a>));</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = len; i &gt; 0;) { PushElement(v[--i]); }</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;Offset&lt;T&gt;</a>&gt;&gt;(EndVector(len));</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160;  }</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;<span class="comment">  /// @brief Serialize a `std::vector` into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;<span class="comment">  /// @tparam T The data type of the `std::vector` elements.</span></div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;<span class="comment">  /// @param v A const reference to the `std::vector` to serialize into the</span></div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01210"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207"> 1210</a></span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;T&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207">CreateVector</a>(<span class="keyword">const</span> std::vector&lt;T&gt; &amp;v) {</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;    <span class="keywordflow">return</span> CreateVector(data(v), v.size());</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;  }</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;  <span class="comment">// vector&lt;bool&gt; may be implemented using a bit-set, so we can&#39;t access it as</span></div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;  <span class="comment">// an array. Instead, read elements manually.</span></div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;  <span class="comment">// Background: https://isocpp.org/blog/2012/11/on-vectorbool</span></div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;uint8_t&gt;</a>&gt; CreateVector(<span class="keyword">const</span> std::vector&lt;bool&gt; &amp;v) {</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;    StartVector(v.size(), <span class="keyword">sizeof</span>(uint8_t));</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = v.size(); i &gt; 0;) {</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;      PushElement(static_cast&lt;uint8_t&gt;(v[--i]));</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;    }</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;uint8_t&gt;</a>&gt;(EndVector(v.size()));</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160;  }</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160;</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;<span class="preprocessor">  #ifndef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;<span class="comment">  /// @brief Serialize values returned by a function into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160;<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="l01229"></a><span class="lineno"> 1229</span>&#160;<span class="comment"></span><span class="comment">  /// @tparam T The data type of the `std::vector` elements.</span></div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;<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="l01231"></a><span class="lineno"> 1231</span>&#160;<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="l01232"></a><span class="lineno"> 1232</span>&#160;<span class="comment"></span><span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160;<span class="comment"></span><span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01234"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b"> 1234</a></span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;T&gt;</a>&gt; <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="l01235"></a><span class="lineno"> 1235</span>&#160;      <span class="keyword">const</span> std::function&lt;T (<span class="keywordtype">size_t</span> i)&gt; &amp;f) {</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;    std::vector&lt;T&gt; elems(vector_size);</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; vector_size; i++) elems[i] = f(i);</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160;    <span class="keywordflow">return</span> CreateVector(elems);</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;  }</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160;<span class="preprocessor">  #endif</span></div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160;<span class="comment">  /// @brief Serialize values returned by a function into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;<span class="comment">  /// This is a convenience function that takes care of iteration for you.</span></div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;<span class="comment">  /// @tparam T The data type of the `std::vector` elements.</span></div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;<span class="comment">  /// @param f A function that takes the current iteration 0..vector_size-1,</span></div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;<span class="comment">  /// and the state parameter returning any type that you can construct a</span></div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;<span class="comment">  /// FlatBuffers vector out of.</span></div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;<span class="comment">  /// @param state State passed to f.</span></div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> F, <span class="keyword">typename</span> S&gt;</div><div class="line"><a name="l01253"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a53504fc2cab681a7980b03260f8b2f7a"> 1253</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;T&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a53504fc2cab681a7980b03260f8b2f7a">CreateVector</a>(<span class="keywordtype">size_t</span> vector_size, F f, S *state) {</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;    std::vector&lt;T&gt; elems(vector_size);</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; vector_size; i++) elems[i] = f(i, state);</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;    <span class="keywordflow">return</span> CreateVector(elems);</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;  }</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160;<span class="comment">  /// @brief Serialize a `std::vector&lt;std::string&gt;` into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;<span class="comment">  /// This is a convenience function for a common case.</span></div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;<span class="comment">  /// @param v A const reference to the `std::vector` to serialize into the</span></div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01265"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6"> 1265</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;Offset&lt;String&gt;</a>&gt;&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6">CreateVectorOfStrings</a>(</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;      <span class="keyword">const</span> std::vector&lt;std::string&gt; &amp;v) {</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160;    std::vector&lt;Offset&lt;String&gt;&gt; offsets(v.size());</div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; v.size(); i++) offsets[i] = CreateString(v[i]);</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160;    <span class="keywordflow">return</span> CreateVector(offsets);</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160;  }</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160;<span class="comment">  /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160;<span class="comment">  /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;<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="l01275"></a><span class="lineno"> 1275</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;<span class="comment">  /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01280"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7"> 1280</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7">CreateVectorOfStructs</a>(<span class="keyword">const</span> T *v, <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;    StartVector(len * <span class="keyword">sizeof</span>(T) / AlignOf&lt;T&gt;(), AlignOf&lt;T&gt;());</div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160;    PushBytes(reinterpret_cast&lt;const uint8_t *&gt;(v), <span class="keyword">sizeof</span>(T) * len);</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt;(EndVector(len));</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;  }</div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;<span class="comment">  /// @brief Serialize an array of native structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;<span class="comment">  /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;<span class="comment">  /// @tparam S The data type of the native struct array elements.</span></div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;<span class="comment">  /// @param[in] v A pointer to the array of type `S` to serialize into the</span></div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160;<span class="comment">  /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> S&gt;</div><div class="line"><a name="l01295"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a3d57074082aaab8cdeb8474ff9df0b53"> 1295</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a3d57074082aaab8cdeb8474ff9df0b53">CreateVectorOfNativeStructs</a>(<span class="keyword">const</span> S *v,</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160;                                                        <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160;    <span class="keyword">extern</span> T Pack(<span class="keyword">const</span> S &amp;);</div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160;    <span class="keyword">typedef</span> T (*Pack_t)(<span class="keyword">const</span> S &amp;);</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160;    std::vector&lt;T&gt; vv(len);</div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160;    std::transform(v, v + len, vv.begin(), *(Pack_t)&amp;Pack);</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfStructs&lt;T&gt;(vv.data(), vv.size());</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;  }</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160;</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;<span class="preprocessor">  #ifndef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;<span class="comment">  /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160;<span class="comment"></span><span class="comment">  /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160;<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="l01309"></a><span class="lineno"> 1309</span>&#160;<span class="comment"></span><span class="comment">  /// and a pointer to the struct that must be filled.</span></div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160;<span class="comment"></span><span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;<span class="comment"></span><span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;<span class="comment"></span><span class="comment">  /// This is mostly useful when flatbuffers are generated with mutation</span></div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;<span class="comment"></span><span class="comment">  /// accessors.</span></div><div class="line"><a name="l01314"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72"> 1314</a></span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72">CreateVectorOfStructs</a>(</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;      <span class="keywordtype">size_t</span> vector_size, <span class="keyword">const</span> std::function&lt;<span class="keywordtype">void</span>(<span class="keywordtype">size_t</span> i, T *)&gt; &amp;filler) {</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;    T* structs = StartVectorOfStructs&lt;T&gt;(vector_size);</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; vector_size; i++) {</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;      filler(i, structs);</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;      structs++;</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;    }</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;    <span class="keywordflow">return</span> EndVectorOfStructs&lt;T&gt;(vector_size);</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;  }</div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;<span class="preprocessor">  #endif</span></div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;<span class="comment">  /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;<span class="comment">  /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160;<span class="comment">  /// @param[in] f A function that takes the current iteration 0..vector_size-1,</span></div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160;<span class="comment">  /// a pointer to the struct that must be filled and the state argument.</span></div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160;<span class="comment">  /// @param[in] state Arbitrary state to pass to f.</span></div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160;<span class="comment">  /// This is mostly useful when flatbuffers are generated with mutation</span></div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160;<span class="comment">  /// accessors.</span></div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> F, <span class="keyword">typename</span> S&gt;</div><div class="line"><a name="l01336"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a9cc09fa59ff9732e972877cfe911c8a5"> 1336</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a9cc09fa59ff9732e972877cfe911c8a5">CreateVectorOfStructs</a>(<span class="keywordtype">size_t</span> vector_size, F f,</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;                                                  S *state) {</div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160;    T *structs = StartVectorOfStructs&lt;T&gt;(vector_size);</div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; vector_size; i++) {</div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160;      f(i, structs, state);</div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160;      structs++;</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160;    }</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;    <span class="keywordflow">return</span> EndVectorOfStructs&lt;T&gt;(vector_size);</div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160;  }</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160;<span class="comment">  /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;<span class="comment">  /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;<span class="comment">  /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;<span class="comment">  /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> Alloc&gt;</div><div class="line"><a name="l01353"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a110c2a3298aebef1a9dfa3c44ee84f42"> 1353</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a110c2a3298aebef1a9dfa3c44ee84f42">CreateVectorOfStructs</a>(</div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160;      <span class="keyword">const</span> std::vector&lt;T, Alloc&gt; &amp;v) {</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfStructs(data(v), v.size());</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;  }</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160;<span class="comment">  /// @brief Serialize a `std::vector` of native structs into a FlatBuffer</span></div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;<span class="comment">  /// `vector`.</span></div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160;<span class="comment">  /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160;<span class="comment">  /// @tparam S The data type of the `std::vector` native struct elements.</span></div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160;<span class="comment">  /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;<span class="comment">  /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> S&gt;</div><div class="line"><a name="l01367"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95"> 1367</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95">CreateVectorOfNativeStructs</a>(</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160;      <span class="keyword">const</span> std::vector&lt;S&gt; &amp;v) {</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfNativeStructs&lt;T, S&gt;(data(v), v.size());</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;  }</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160;<span class="comment">  /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span>StructKeyComparator {</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> T &amp;a, <span class="keyword">const</span> T &amp;b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;      <span class="keywordflow">return</span> a.KeyCompareLessThan(&amp;b);</div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160;    }</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160;</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160;   <span class="keyword">private</span>:</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160;    StructKeyComparator &amp;operator=(<span class="keyword">const</span> StructKeyComparator &amp;);</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;  };<span class="comment"></span></div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;<span class="comment">  /// @endcond</span></div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;<span class="comment">  /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`</span></div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;<span class="comment">  /// in sorted order.</span></div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;<span class="comment">  /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;<span class="comment">  /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;<span class="comment">  /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01391"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15"> 1391</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15">CreateVectorOfSortedStructs</a>(std::vector&lt;T&gt; *v) {</div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfSortedStructs(data(*v), v-&gt;size());</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160;  }</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;<span class="comment">  /// @brief Serialize a `std::vector` of native structs into a FlatBuffer</span></div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;<span class="comment">  /// `vector` in sorted order.</span></div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;<span class="comment">  /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;<span class="comment">  /// @tparam S The data type of the `std::vector` native struct elements.</span></div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;<span class="comment">  /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;<span class="comment">  /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> S&gt;</div><div class="line"><a name="l01404"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54"> 1404</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54">CreateVectorOfSortedNativeStructs</a>(</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;      std::vector&lt;S&gt; *v) {</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfSortedNativeStructs&lt;T, S&gt;(data(*v), v-&gt;size());</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;  }</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;<span class="comment">  /// @brief Serialize an array of structs into a FlatBuffer `vector` in sorted</span></div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160;<span class="comment">  /// order.</span></div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160;<span class="comment">  /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;<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="l01413"></a><span class="lineno"> 1413</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;<span class="comment">  /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01418"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab1f44cc1b130e13b41e9a80de76e25cf"> 1418</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab1f44cc1b130e13b41e9a80de76e25cf">CreateVectorOfSortedStructs</a>(T *v, <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160;    std::sort(v, v + len, StructKeyComparator&lt;T&gt;());</div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfStructs(v, len);</div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160;  }</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160;<span class="comment">  /// @brief Serialize an array of native structs into a FlatBuffer `vector` in</span></div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160;<span class="comment">  /// sorted order.</span></div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;<span class="comment">  /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;<span class="comment">  /// @tparam S The data type of the native struct array elements.</span></div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;<span class="comment">  /// @param[in] v A pointer to the array of type `S` to serialize into the</span></div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;<span class="comment">  /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> S&gt;</div><div class="line"><a name="l01433"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf"> 1433</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf">CreateVectorOfSortedNativeStructs</a>(S *v,</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160;                                                              <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160;    <span class="keyword">extern</span> T Pack(<span class="keyword">const</span> S &amp;);</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;    <span class="keyword">typedef</span> T (*Pack_t)(<span class="keyword">const</span> S &amp;);</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;    std::vector&lt;T&gt; vv(len);</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;    std::transform(v, v + len, vv.begin(), *(Pack_t)&amp;Pack);</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfSortedStructs&lt;T&gt;(vv, len);</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;  }</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160;<span class="comment">  /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span>TableKeyComparator {</div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;    TableKeyComparator(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &amp;buf) : buf_(buf) {}</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> &amp;a, <span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> &amp;b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160;      <span class="keyword">auto</span> table_a = <span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(buf_.data_at(a.o));</div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;      <span class="keyword">auto</span> table_b = <span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(buf_.data_at(b.o));</div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160;      <span class="keywordflow">return</span> table_a-&gt;KeyCompareLessThan(table_b);</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160;    }</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160;    <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &amp;buf_;</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160;</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;   <span class="keyword">private</span>:</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160;    TableKeyComparator &amp;operator=(<span class="keyword">const</span> TableKeyComparator &amp;);</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;  };<span class="comment"></span></div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160;<span class="comment">  /// @endcond</span></div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;<span class="comment">  /// @brief Serialize an array of `table` offsets as a `vector` in the buffer</span></div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160;<span class="comment">  /// in sorted order.</span></div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160;<span class="comment">  /// @tparam T The data type that the offset refers to.</span></div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;<span class="comment">  /// @param[in] v An array of type `Offset&lt;T&gt;` that contains the `table`</span></div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;<span class="comment">  /// offsets to store in the buffer in sorted order.</span></div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;<span class="comment">  /// @param[in] len The number of elements to store in the `vector`.</span></div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01466"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6"> 1466</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;Offset&lt;T&gt;</a>&gt;&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">CreateVectorOfSortedTables</a>(<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> *v,</div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;                                                       <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;    std::sort(v, v + len, TableKeyComparator&lt;T&gt;(buf_));</div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160;    <span class="keywordflow">return</span> CreateVector(v, len);</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;  }</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;<span class="comment">  /// @brief Serialize an array of `table` offsets as a `vector` in the buffer</span></div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160;<span class="comment">  /// in sorted order.</span></div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160;<span class="comment">  /// @tparam T The data type that the offset refers to.</span></div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160;<span class="comment">  /// @param[in] v An array of type `Offset&lt;T&gt;` that contains the `table`</span></div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;<span class="comment">  /// offsets to store in the buffer in sorted order.</span></div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01480"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135"> 1480</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;Offset&lt;T&gt;</a>&gt;&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">CreateVectorOfSortedTables</a>(</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;      std::vector&lt;<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a>&gt; *v) {</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfSortedTables(data(*v), v-&gt;size());</div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;  }</div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;<span class="comment">  /// @brief Specialized version of `CreateVector` for non-copying use cases.</span></div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160;<span class="comment">  /// Write the data any time later to the returned buffer pointer `buf`.</span></div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;<span class="comment">  /// @param[in] len The number of elements to store in the `vector`.</span></div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;<span class="comment">  /// @param[in] elemsize The size of each element in the `vector`.</span></div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;<span class="comment">  /// @param[out] buf A pointer to a `uint8_t` pointer that can be</span></div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;<span class="comment">  /// written to at a later time to serialize the data into a `vector`</span></div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;<span class="comment">  /// in the buffer.</span></div><div class="line"><a name="l01492"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c"> 1492</a></span>&#160;<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="l01493"></a><span class="lineno"> 1493</span>&#160;                                      uint8_t **buf) {</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;    NotNested();</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;    StartVector(len, elemsize);</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;    buf_.make_space(len * elemsize);</div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;    <span class="keyword">auto</span> vec_start = GetSize();</div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;    <span class="keyword">auto</span> vec_end = EndVector(len);</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;    *buf = buf_.data_at(vec_start);</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;    <span class="keywordflow">return</span> vec_end;</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;  }</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;<span class="comment">  /// @brief Specialized version of `CreateVector` for non-copying use cases.</span></div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;<span class="comment">  /// Write the data any time later to the returned buffer pointer `buf`.</span></div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160;<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="l01506"></a><span class="lineno"> 1506</span>&#160;<span class="comment">  /// as a `vector`.</span></div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;<span class="comment">  /// @param[in] len The number of elements to store in the `vector`.</span></div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;<span class="comment">  /// @param[out] buf A pointer to a pointer of type `T` that can be</span></div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;<span class="comment">  /// written to at a later time to serialize the data into a `vector`</span></div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;<span class="comment">  /// in the buffer.</span></div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01512"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50"> 1512</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;T&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50">CreateUninitializedVector</a>(<span class="keywordtype">size_t</span> len, T **buf) {</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;    <span class="keywordflow">return</span> CreateUninitializedVector(len, <span class="keyword">sizeof</span>(T),</div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160;                                     reinterpret_cast&lt;uint8_t **&gt;(buf));</div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160;  }</div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;<span class="comment">  /// @brief Write a struct by itself, typically to be part of a union.</span></div><div class="line"><a name="l01518"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8"> 1518</a></span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;const T *&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8">CreateStruct</a>(<span class="keyword">const</span> T &amp;structobj) {</div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;    NotNested();</div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160;    Align(AlignOf&lt;T&gt;());</div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160;    buf_.push_small(structobj);</div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;const T *&gt;</a>(GetSize());</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;  }</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;<span class="comment">  /// @brief The length of a FlatBuffer file header.</span></div><div class="line"><a name="l01526"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19"> 1526</a></span>&#160;<span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> kFileIdentifierLength = 4;</div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;<span class="comment">  /// @brief Finish serializing a buffer by writing the root offset.</span></div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;<span class="comment">  /// @param[in] file_identifier If a `file_identifier` is given, the buffer</span></div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;<span class="comment">  /// will be prefixed with a standard FlatBuffers file header.</span></div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01532"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912"> 1532</a></span>&#160;  <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">Finish</a>(<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> root, <span class="keyword">const</span> <span class="keywordtype">char</span> *file_identifier = <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;    Finish(root.o, file_identifier, <span class="keyword">false</span>);</div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;  }</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160;<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="l01537"></a><span class="lineno"> 1537</span>&#160;<span class="comment">  /// buffer following the size field). These buffers are NOT compatible</span></div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;<span class="comment">  /// with standard buffers created by Finish, i.e. you can&#39;t call GetRoot</span></div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160;<span class="comment">  /// on them, you have to use GetSizePrefixedRoot instead.</span></div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160;<span class="comment">  /// All &gt;32 bit quantities in this buffer will be aligned when the whole</span></div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160;<span class="comment">  /// size pre-fixed buffer is aligned.</span></div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160;<span class="comment">  /// These kinds of buffers are useful for creating a stream of FlatBuffers.</span></div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01544"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220"> 1544</a></span>&#160;  <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220">FinishSizePrefixed</a>(<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> root,</div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160;                          <span class="keyword">const</span> <span class="keywordtype">char</span> *file_identifier = <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160;    Finish(root.o, file_identifier, <span class="keyword">true</span>);</div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;  }</div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160; <span class="keyword">protected</span>:</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;  <span class="comment">// You shouldn&#39;t really be copying instances of this class.</span></div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &amp;);</div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160;  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &amp;operator=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &amp;);</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160;</div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160;  <span class="keywordtype">void</span> Finish(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="l01555"></a><span class="lineno"> 1555</span>&#160;    NotNested();</div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160;    buf_.clear_scratch();</div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160;    <span class="comment">// This will cause the whole buffer to be aligned.</span></div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160;    PreAlign((size_prefix ? <span class="keyword">sizeof</span>(uoffset_t) : 0) + <span class="keyword">sizeof</span>(uoffset_t) +</div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;                 (file_identifier ? kFileIdentifierLength : 0),</div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160;             minalign_);</div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160;    <span class="keywordflow">if</span> (file_identifier) {</div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160;      assert(strlen(file_identifier) == kFileIdentifierLength);</div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160;      PushBytes(reinterpret_cast&lt;const uint8_t *&gt;(file_identifier),</div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160;                kFileIdentifierLength);</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160;    }</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;    PushElement(ReferTo(root));  <span class="comment">// Location of root.</span></div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160;    <span class="keywordflow">if</span> (size_prefix) { PushElement(GetSize()); }</div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160;    finished = <span class="keyword">true</span>;</div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160;  }</div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160;</div><div class="line"><a name="l01571"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html"> 1571</a></span>&#160;  <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a> {</div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>&#160;    uoffset_t off;</div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>&#160;    voffset_t id;</div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160;  };</div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160;</div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160;  <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> buf_;</div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160;</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160;  <span class="comment">// Accumulating offsets of table members while it is being built.</span></div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160;  <span class="comment">// We store these in the scratch pad of buf_, after the vtable offsets.</span></div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160;  uoffset_t num_field_loc;</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160;  <span class="comment">// Track how much of the vtable is in use, so we can output the most compact</span></div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160;  <span class="comment">// possible vtable.</span></div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160;  voffset_t max_voffset_;</div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160;</div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160;  <span class="comment">// Ensure objects are not nested.</span></div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160;  <span class="keywordtype">bool</span> nested;</div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160;</div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;  <span class="comment">// Ensure the buffer is finished before it is being accessed.</span></div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160;  <span class="keywordtype">bool</span> finished;</div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160;</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160;  <span class="keywordtype">size_t</span> minalign_;</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;</div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160;  <span class="keywordtype">bool</span> force_defaults_;  <span class="comment">// Serialize values equal to their defaults anyway.</span></div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;</div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160;  <span class="keywordtype">bool</span> dedup_vtables_;</div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160;</div><div class="line"><a name="l01597"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html"> 1597</a></span>&#160;  <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html">StringOffsetCompare</a> {</div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>&#160;    <a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html">StringOffsetCompare</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &amp;buf) : buf_(&amp;buf) {}</div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> &amp;a, <span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> &amp;b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160;      <span class="keyword">auto</span> stra = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> *<span class="keyword">&gt;</span>(buf_-&gt;data_at(a.o));</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160;      <span class="keyword">auto</span> strb = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> *<span class="keyword">&gt;</span>(buf_-&gt;data_at(b.o));</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160;      <span class="keywordflow">return</span> strncmp(stra-&gt;c_str(), strb-&gt;c_str(),</div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160;                     (std::min)(stra-&gt;size(), strb-&gt;size()) + 1) &lt; 0;</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160;    }</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160;    <span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> *buf_;</div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160;  };</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160;  <span class="comment">// For use with CreateSharedString. Instantiated on first use only.</span></div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160;  <span class="keyword">typedef</span> std::set&lt;Offset&lt;String&gt;, <a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html">StringOffsetCompare</a>&gt; StringOffsetMap;</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160;  StringOffsetMap *string_pool;</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160;</div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160;  <span class="comment">// Allocates space for a vector of structures.</span></div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>&#160;  <span class="comment">// Must be completed with EndVectorOfStructs().</span></div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; T *StartVectorOfStructs(<span class="keywordtype">size_t</span> vector_size) {</div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160;    StartVector(vector_size * <span class="keyword">sizeof</span>(T) / AlignOf&lt;T&gt;(), AlignOf&lt;T&gt;());</div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(buf_.make_space(vector_size * <span class="keyword">sizeof</span>(T)));</div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160;  }</div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160;</div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160;  <span class="comment">// End the vector of structues in the flatbuffers.</span></div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160;  <span class="comment">// Vector should have previously be started with StartVectorOfStructs().</span></div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; EndVectorOfStructs(<span class="keywordtype">size_t</span> vector_size) {</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt;(EndVector(vector_size));</div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160;  }</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160;};<span class="comment"></span></div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160;<span class="comment">/// @}</span></div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160;<span class="comment">/// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160;<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="l01631"></a><span class="lineno"> 1631</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; T *GetMutableRoot(<span class="keywordtype">void</span> *buf) {</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160;  EndianCheck();</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160;      <span class="keyword">reinterpret_cast&lt;</span>uint8_t *<span class="keyword">&gt;</span>(buf) +</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160;      EndianScalar(*reinterpret_cast&lt;uoffset_t *&gt;(buf)));</div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>&#160;}</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160;</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">const</span> T *GetRoot(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf) {</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>&#160;  <span class="keywordflow">return</span> GetMutableRoot&lt;T&gt;(<span class="keyword">const_cast&lt;</span><span class="keywordtype">void</span> *<span class="keyword">&gt;</span>(buf));</div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160;}</div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>&#160;</div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">const</span> T *GetSizePrefixedRoot(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf) {</div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160;  <span class="keywordflow">return</span> GetRoot&lt;T&gt;(<span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(buf) + <span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160;}</div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>&#160;<span class="comment">/// Helpers to get a typed pointer to objects that are currently being built.</span></div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>&#160;<span class="comment">/// @warning Creating new objects will lead to reallocations and invalidates</span></div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>&#160;<span class="comment">/// the pointer!</span></div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>&#160;<span class="comment"></span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>&#160;T *GetMutableTemporaryPointer(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &amp;fbb, <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> offset) {</div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(fbb.<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a099810f03046139d1854d20a1c2a2e41">GetCurrentBufferPointer</a>() + fbb.<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a66c8fd33ab9b3b237954c9ea38648f7f">GetSize</a>() -</div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160;                               offset.o);</div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160;}</div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160;</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160;<span class="keyword">const</span> T *GetTemporaryPointer(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &amp;fbb, <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> offset) {</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160;  <span class="keywordflow">return</span> GetMutableTemporaryPointer&lt;T&gt;(fbb, offset);</div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160;}</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>&#160;<span class="comment">/// @brief Get a pointer to the the file_identifier section of the buffer.</span></div><div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>&#160;<span class="comment">/// @return Returns a const char pointer to the start of the file_identifier</span></div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>&#160;<span class="comment">/// characters in the buffer.  The returned char * has length</span></div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160;<span class="comment">/// &#39;flatbuffers::FlatBufferBuilder::kFileIdentifierLength&#39;.</span></div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160;<span class="comment">/// This function is UNDEFINED for FlatBuffers whose schema does not include</span></div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160;<span class="comment">/// a file_identifier (likely points at padding or the start of a the root</span></div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160;<span class="comment">/// vtable).</span></div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160;<span class="comment"></span><span class="keyword">inline</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *GetBufferIdentifier(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf, <span class="keywordtype">bool</span> size_prefixed = <span class="keyword">false</span>) {</div><div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">char</span> *<span class="keyword">&gt;</span>(buf) +</div><div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>&#160;         ((size_prefixed) ? 2 * <span class="keyword">sizeof</span>(uoffset_t) : <span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160;}</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160;</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160;<span class="comment">// Helper to see if the identifier in a buffer has the expected value.</span></div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160;<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, <span class="keywordtype">bool</span> size_prefixed = <span class="keyword">false</span>) {</div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160;  <span class="keywordflow">return</span> strncmp(GetBufferIdentifier(buf, size_prefixed), identifier,</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160;                 <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">FlatBufferBuilder::kFileIdentifierLength</a>) == 0;</div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160;}</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;</div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160;<span class="comment">// Helper class to verify the integrity of a FlatBuffer</span></div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160;<span class="keyword">class </span>Verifier FLATBUFFERS_FINAL_CLASS {</div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>&#160;  Verifier(<span class="keyword">const</span> uint8_t *buf, <span class="keywordtype">size_t</span> buf_len, uoffset_t _max_depth = 64,</div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160;           uoffset_t _max_tables = 1000000)</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160;      : buf_(buf),</div><div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>&#160;        end_(buf + buf_len),</div><div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>&#160;        depth_(0),</div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160;        max_depth_(_max_depth),</div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160;        num_tables_(0),</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160;        max_tables_(_max_tables)</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160;    <span class="preprocessor">#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160;        , upper_bound_(buf)</div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160;    <span class="preprocessor">#endif</span></div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>&#160;  {</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160;  }</div><div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160;</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160;  <span class="comment">// Central location where any verification failures register.</span></div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>&#160;  <span class="keywordtype">bool</span> Check(<span class="keywordtype">bool</span> ok)<span class="keyword"> const </span>{</div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160;    <span class="comment">// clang-format off</span></div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160;<span class="preprocessor">    #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE</span></div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160;      assert(ok);</div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>&#160;<span class="preprocessor">    #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160;      <span class="keywordflow">if</span> (!ok)</div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160;        upper_bound_ = buf_;</div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160;    <span class="comment">// clang-format on</span></div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>&#160;    <span class="keywordflow">return</span> ok;</div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>&#160;  }</div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>&#160;</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160;  <span class="comment">// Verify any range within the buffer.</span></div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160;  <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="l01713"></a><span class="lineno"> 1713</span>&#160;    <span class="comment">// clang-format off</span></div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160;<span class="preprocessor">    #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160;      <span class="keyword">auto</span> upper_bound = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(elem) + elem_len;</div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160;      <span class="keywordflow">if</span> (upper_bound_ &lt; upper_bound)</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160;        upper_bound_ =  upper_bound;</div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;    <span class="comment">// clang-format on</span></div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160;    <span class="keywordflow">return</span> Check(elem_len &lt;= (<span class="keywordtype">size_t</span>)(end_ - buf_) &amp;&amp; elem &gt;= buf_ &amp;&amp;</div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160;                 elem &lt;= end_ - elem_len);</div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160;  }</div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160;</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160;  <span class="comment">// Verify a range indicated by sizeof(T).</span></div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <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="l01726"></a><span class="lineno"> 1726</span>&#160;    <span class="keywordflow">return</span> Verify(elem, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160;  }</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;  <span class="comment">// Verify a pointer (may be NULL) of a table type.</span></div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> VerifyTable(<span class="keyword">const</span> T *table) {</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;    <span class="keywordflow">return</span> !table || table-&gt;Verify(*<span class="keyword">this</span>);</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160;  }</div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160;</div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160;  <span class="comment">// Verify a pointer (may be NULL) of any vector type.</span></div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;T&gt;</a> *vec)<span class="keyword"> const </span>{</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>&#160;    <span class="keyword">const</span> uint8_t *end;</div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>&#160;    <span class="keywordflow">return</span> !vec || VerifyVector(reinterpret_cast&lt;const uint8_t *&gt;(vec),</div><div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160;                                <span class="keyword">sizeof</span>(T), &amp;end);</div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160;  }</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>&#160;</div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>&#160;  <span class="comment">// Verify a pointer (may be NULL) of a vector to struct.</span></div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;const T *&gt;</a> *vec)<span class="keyword"> const </span>{</div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160;    <span class="keywordflow">return</span> Verify(<span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;T&gt;</a> *<span class="keyword">&gt;</span>(vec));</div><div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>&#160;  }</div><div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>&#160;</div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>&#160;  <span class="comment">// Verify a pointer (may be NULL) to string.</span></div><div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>&#160;  <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> *str)<span class="keyword"> const </span>{</div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160;    <span class="keyword">const</span> uint8_t *end;</div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160;    <span class="keywordflow">return</span> !str ||</div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160;           (VerifyVector(reinterpret_cast&lt;const uint8_t *&gt;(str), 1, &amp;end) &amp;&amp;</div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160;            Verify(end, 1) &amp;&amp;      <span class="comment">// Must have terminator</span></div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>&#160;            Check(*end == <span class="charliteral">&#39;\0&#39;</span>));  <span class="comment">// Terminating byte must be 0.</span></div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>&#160;  }</div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>&#160;</div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160;  <span class="comment">// Common code between vectors and strings.</span></div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160;  <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="l01757"></a><span class="lineno"> 1757</span>&#160;                    <span class="keyword">const</span> uint8_t **end)<span class="keyword"> const </span>{</div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160;    <span class="comment">// Check we can read the size field.</span></div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160;    <span class="keywordflow">if</span> (!Verify&lt;uoffset_t&gt;(vec)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160;    <span class="comment">// Check the whole array. If this is a string, the byte past the array</span></div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160;    <span class="comment">// must be 0.</span></div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160;    <span class="keyword">auto</span> size = ReadScalar&lt;uoffset_t&gt;(vec);</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160;    <span class="keyword">auto</span> max_elems = FLATBUFFERS_MAX_BUFFER_SIZE / elem_size;</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;    <span class="keywordflow">if</span> (!Check(size &lt; max_elems))</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160;      <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="l01766"></a><span class="lineno"> 1766</span>&#160;    <span class="keyword">auto</span> byte_size = <span class="keyword">sizeof</span>(size) + elem_size * size;</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160;    *end = vec + byte_size;</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160;    <span class="keywordflow">return</span> Verify(vec, byte_size);</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160;  }</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160;</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160;  <span class="comment">// Special case for string contents, after the above has been called.</span></div><div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160;  <span class="keywordtype">bool</span> VerifyVectorOfStrings(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>&lt;<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a>&gt; *vec)<span class="keyword"> const </span>{</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160;    <span class="keywordflow">if</span> (vec) {</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;      <span class="keywordflow">for</span> (uoffset_t i = 0; i &lt; vec-&gt;size(); i++) {</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;        <span class="keywordflow">if</span> (!Verify(vec-&gt;Get(i))) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;      }</div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160;    }</div><div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160;  }</div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160;</div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160;  <span class="comment">// Special case for table contents, after the above has been called.</span></div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> VerifyVectorOfTables(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>&lt;<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a>&gt; *vec) {</div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160;    <span class="keywordflow">if</span> (vec) {</div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160;      <span class="keywordflow">for</span> (uoffset_t i = 0; i &lt; vec-&gt;size(); i++) {</div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160;        <span class="keywordflow">if</span> (!vec-&gt;Get(i)-&gt;Verify(*<span class="keyword">this</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160;      }</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160;    }</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160;  }</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160;</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;  <span class="keywordtype">bool</span> VerifyBufferFromStart(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier, <span class="keyword">const</span> uint8_t *start) {</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160;    <span class="keywordflow">if</span> (identifier &amp;&amp;</div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160;        (<span class="keywordtype">size_t</span>(end_ - start) &lt; 2 * <span class="keyword">sizeof</span>(flatbuffers::uoffset_t) ||</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;         !BufferHasIdentifier(start, identifier))) {</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160;    }</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;    <span class="comment">// Call T::Verify, which must be in the generated code for this type.</span></div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;    <span class="keyword">auto</span> o = VerifyOffset(start);</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160;    <span class="keywordflow">return</span> o &amp;&amp; <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>T *<span class="keyword">&gt;</span>(start + o)-&gt;Verify(*<span class="keyword">this</span>)</div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160;<span class="preprocessor">#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160;           &amp;&amp; GetComputedSize()</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160;        ;</div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160;  }</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160;</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;  <span class="comment">// Verify this whole buffer, starting with root type T.</span></div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> VerifyBuffer() { <span class="keywordflow">return</span> VerifyBuffer&lt;T&gt;(<span class="keyword">nullptr</span>); }</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> VerifyBuffer(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160;    <span class="keywordflow">return</span> VerifyBufferFromStart&lt;T&gt;(identifier, buf_);</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;  }</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;</div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> VerifySizePrefixedBuffer(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160;    <span class="keywordflow">return</span> Verify&lt;uoffset_t&gt;(buf_) &amp;&amp;</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160;           ReadScalar&lt;uoffset_t&gt;(buf_) == end_ - buf_ - <span class="keyword">sizeof</span>(uoffset_t) &amp;&amp;</div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160;           VerifyBufferFromStart&lt;T&gt;(identifier, buf_ + <span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160;  }</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160;</div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160;  uoffset_t VerifyOffset(<span class="keyword">const</span> uint8_t *start)<span class="keyword"> const </span>{</div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160;    <span class="keywordflow">if</span> (!Verify&lt;uoffset_t&gt;(start)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160;    <span class="keyword">auto</span> o = ReadScalar&lt;uoffset_t&gt;(start);</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160;    Check(o != 0);</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160;    <span class="keywordflow">return</span> o;</div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160;  }</div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160;</div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160;  <span class="comment">// Called at the start of a table to increase counters measuring data</span></div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160;  <span class="comment">// structure depth and amount, and possibly bails out with false if</span></div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160;  <span class="comment">// limits set by the constructor have been hit. Needs to be balanced</span></div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;  <span class="comment">// with EndTable().</span></div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;  <span class="keywordtype">bool</span> VerifyComplexity() {</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160;    depth_++;</div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160;    num_tables_++;</div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160;    <span class="keywordflow">return</span> Check(depth_ &lt;= max_depth_ &amp;&amp; num_tables_ &lt;= max_tables_);</div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160;  }</div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160;</div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160;  <span class="comment">// Called at the end of a table to pop the depth count.</span></div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160;  <span class="keywordtype">bool</span> EndTable() {</div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>&#160;    depth_--;</div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160;  }</div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160;</div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160;<span class="preprocessor">  #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160;  <span class="comment">// Returns the message size in bytes</span></div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160;  <span class="keywordtype">size_t</span> GetComputedSize()<span class="keyword"> const </span>{</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160;    uintptr_t size = upper_bound_ - buf_;</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>&#160;    <span class="comment">// Align the size to uoffset_t</span></div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160;    size = (size - 1 + <span class="keyword">sizeof</span>(uoffset_t)) &amp; ~(<span class="keyword">sizeof</span>(uoffset_t) - 1);</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160;    <span class="keywordflow">return</span> (buf_  + size &gt; end_) ?  0 : size;</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160;  }</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160;<span class="preprocessor">  #endif</span></div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>&#160;</div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160;  <span class="keyword">const</span> uint8_t *buf_;</div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>&#160;  <span class="keyword">const</span> uint8_t *end_;</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160;  uoffset_t depth_;</div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160;  uoffset_t max_depth_;</div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160;  uoffset_t num_tables_;</div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160;  uoffset_t max_tables_;</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160;<span class="preprocessor">  #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160;    <span class="keyword">mutable</span> <span class="keyword">const</span> uint8_t *upper_bound_;</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160;<span class="preprocessor">  #endif</span></div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>&#160;};</div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160;</div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>&#160;<span class="comment">// Convenient way to bundle a buffer and its length, to pass it around</span></div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160;<span class="comment">// typed by its root.</span></div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160;<span class="comment">// A BufferRef does not own its buffer.</span></div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>&#160;<span class="keyword">struct </span>BufferRefBase {};  <span class="comment">// for std::is_base_of</span></div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span>BufferRef : BufferRefBase {</div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>&#160;  BufferRef() : buf(<span class="keyword">nullptr</span>), len(0), must_free(<span class="keyword">false</span>) {}</div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>&#160;  BufferRef(uint8_t *_buf, uoffset_t _len)</div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160;      : buf(_buf), len(_len), must_free(<span class="keyword">false</span>) {}</div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>&#160;</div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>&#160;  ~BufferRef() {</div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>&#160;    <span class="keywordflow">if</span> (must_free) free(buf);</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160;  }</div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160;</div><div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>&#160;  <span class="keyword">const</span> T *GetRoot()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> flatbuffers::GetRoot&lt;T&gt;(buf); }</div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>&#160;</div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>&#160;  <span class="keywordtype">bool</span> Verify() {</div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>&#160;    Verifier verifier(buf, len);</div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>&#160;    <span class="keywordflow">return</span> verifier.VerifyBuffer&lt;T&gt;(<span class="keyword">nullptr</span>);</div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>&#160;  }</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>&#160;</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>&#160;  uint8_t *buf;</div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>&#160;  uoffset_t len;</div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>&#160;  <span class="keywordtype">bool</span> must_free;</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160;};</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160;</div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160;<span class="comment">// &quot;structs&quot; are flat structures that do not have an offset table, thus</span></div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160;<span class="comment">// always have all members present and do not support forwards/backwards</span></div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160;<span class="comment">// compatible extensions.</span></div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>&#160;</div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160;<span class="keyword">class </span>Struct FLATBUFFERS_FINAL_CLASS {</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; T GetField(uoffset_t o)<span class="keyword"> const </span>{</div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160;    <span class="keywordflow">return</span> ReadScalar&lt;T&gt;(&amp;data_[o]);</div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160;  }</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160;</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; T GetStruct(uoffset_t o)<span class="keyword"> const </span>{</div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>T<span class="keyword">&gt;</span>(&amp;data_[o]);</div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160;  }</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160;</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160;  <span class="keyword">const</span> uint8_t *GetAddressOf(uoffset_t o)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &amp;data_[o]; }</div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160;  uint8_t *GetAddressOf(uoffset_t o) { <span class="keywordflow">return</span> &amp;data_[o]; }</div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160;</div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160;  uint8_t data_[1];</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160;};</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160;</div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>&#160;<span class="comment">// &quot;tables&quot; use an offset table (possibly shared) that allows fields to be</span></div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160;<span class="comment">// omitted and added at will, but uses an extra indirection to read.</span></div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160;<span class="keyword">class </span>Table {</div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160;  <span class="keyword">const</span> uint8_t *GetVTable()<span class="keyword"> const </span>{</div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160;    <span class="keywordflow">return</span> data_ - ReadScalar&lt;soffset_t&gt;(data_);</div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160;  }</div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160;</div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160;  <span class="comment">// This gets the field offset for any of the functions below it, or 0</span></div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160;  <span class="comment">// if the field was not present.</span></div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160;  voffset_t GetOptionalFieldOffset(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160;    <span class="comment">// The vtable offset is always at the start.</span></div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160;    <span class="keyword">auto</span> vtable = GetVTable();</div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160;    <span class="comment">// The first element is the size of the vtable (fields + type id + itself).</span></div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160;    <span class="keyword">auto</span> vtsize = ReadScalar&lt;voffset_t&gt;(vtable);</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160;    <span class="comment">// If the field we&#39;re accessing is outside the vtable, we&#39;re reading older</span></div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160;    <span class="comment">// data, so it&#39;s the same as if the offset was 0 (not present).</span></div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160;    <span class="keywordflow">return</span> field &lt; vtsize ? ReadScalar&lt;voffset_t&gt;(vtable + field) : 0;</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;  }</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160;</div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; T GetField(voffset_t field, T defaultval)<span class="keyword"> const </span>{</div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;    <span class="keywordflow">return</span> field_offset ? ReadScalar&lt;T&gt;(data_ + field_offset) : defaultval;</div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160;  }</div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160;</div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> P&gt; P GetPointer(voffset_t field) {</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;    <span class="keyword">auto</span> p = data_ + field_offset;</div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160;    <span class="keywordflow">return</span> field_offset ? <span class="keyword">reinterpret_cast&lt;</span>P<span class="keyword">&gt;</span>(p + ReadScalar&lt;uoffset_t&gt;(p))</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;                        : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160;  }</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> P&gt; P GetPointer(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span>Table *<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;GetPointer&lt;P&gt;(field);</div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160;  }</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160;</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> P&gt; P GetStruct(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160;    <span class="keyword">auto</span> p = <span class="keyword">const_cast&lt;</span>uint8_t *<span class="keyword">&gt;</span>(data_ + field_offset);</div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160;    <span class="keywordflow">return</span> field_offset ? <span class="keyword">reinterpret_cast&lt;</span>P<span class="keyword">&gt;</span>(p) : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160;  }</div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160;</div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> SetField(voffset_t field, T val, T def) {</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160;    <span class="keywordflow">if</span> (!field_offset) <span class="keywordflow">return</span> val == def;</div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160;    WriteScalar(data_ + field_offset, val);</div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160;  }</div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160;</div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160;  <span class="keywordtype">bool</span> SetPointer(voffset_t field, <span class="keyword">const</span> uint8_t *val) {</div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160;    <span class="keywordflow">if</span> (!field_offset) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160;    WriteScalar(data_ + field_offset,</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160;                static_cast&lt;uoffset_t&gt;(val - (data_ + field_offset)));</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160;  }</div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160;</div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160;  uint8_t *GetAddressOf(voffset_t field) {</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160;    <span class="keywordflow">return</span> field_offset ? data_ + field_offset : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160;  }</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160;  <span class="keyword">const</span> uint8_t *GetAddressOf(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span>Table *<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;GetAddressOf(field);</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160;  }</div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160;</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160;  <span class="keywordtype">bool</span> CheckField(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160;    <span class="keywordflow">return</span> GetOptionalFieldOffset(field) != 0;</div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>&#160;  }</div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160;</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160;  <span class="comment">// Verify the vtable of this table.</span></div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160;  <span class="comment">// Call this once per table, followed by VerifyField once per field.</span></div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;  <span class="keywordtype">bool</span> VerifyTableStart(Verifier &amp;verifier)<span class="keyword"> const </span>{</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;    <span class="comment">// Check the vtable offset.</span></div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;    <span class="keywordflow">if</span> (!verifier.Verify&lt;soffset_t&gt;(data_)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;    <span class="keyword">auto</span> vtable = GetVTable();</div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160;    <span class="comment">// Check the vtable size field, then check vtable fits in its entirety.</span></div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;    <span class="keywordflow">return</span> verifier.VerifyComplexity() &amp;&amp; verifier.Verify&lt;voffset_t&gt;(vtable) &amp;&amp;</div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160;           (ReadScalar&lt;voffset_t&gt;(vtable) &amp; (<span class="keyword">sizeof</span>(voffset_t) - 1)) == 0 &amp;&amp;</div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>&#160;           verifier.Verify(vtable, ReadScalar&lt;voffset_t&gt;(vtable));</div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>&#160;  }</div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>&#160;</div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>&#160;  <span class="comment">// Verify a particular field.</span></div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>&#160;  <span class="keywordtype">bool</span> VerifyField(<span class="keyword">const</span> Verifier &amp;verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>&#160;    <span class="comment">// Calling GetOptionalFieldOffset should be safe now thanks to</span></div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>&#160;    <span class="comment">// VerifyTable().</span></div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>&#160;    <span class="comment">// Check the actual field.</span></div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>&#160;    <span class="keywordflow">return</span> !field_offset || verifier.Verify&lt;T&gt;(data_ + field_offset);</div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>&#160;  }</div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>&#160;</div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160;  <span class="comment">// VerifyField for required fields.</span></div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160;  <span class="keywordtype">bool</span> VerifyFieldRequired(<span class="keyword">const</span> Verifier &amp;verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160;    <span class="keywordflow">return</span> verifier.Check(field_offset != 0) &amp;&amp;</div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>&#160;           verifier.Verify&lt;T&gt;(data_ + field_offset);</div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>&#160;  }</div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>&#160;</div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>&#160;  <span class="comment">// Versions for offsets.</span></div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>&#160;  <span class="keywordtype">bool</span> VerifyOffset(<span class="keyword">const</span> Verifier &amp;verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>&#160;    <span class="keywordflow">return</span> !field_offset || verifier.VerifyOffset(data_ + field_offset);</div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160;  }</div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160;</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160;  <span class="keywordtype">bool</span> VerifyOffsetRequired(<span class="keyword">const</span> Verifier &amp;verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160;    <span class="keywordflow">return</span> verifier.Check(field_offset != 0) &amp;&amp;</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160;           verifier.VerifyOffset(data_ + field_offset);</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>&#160;  }</div><div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>&#160;</div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160;  <span class="comment">// private constructor &amp; copy constructor: you obtain instances of this</span></div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160;  <span class="comment">// class by pointing to existing data only</span></div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160;  Table();</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160;  Table(<span class="keyword">const</span> Table &amp;other);</div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160;</div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160;  uint8_t data_[1];</div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160;};</div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160;<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="l02036"></a><span class="lineno"> 2036</span>&#160;<span class="comment">/// it is the opposite transformation of GetRoot().</span></div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;<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="l02038"></a><span class="lineno"> 2038</span>&#160;<span class="comment">/// delete the buffer afterwards.</span></div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160;<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="l02040"></a><span class="lineno"> 2040</span>&#160;  <span class="keyword">auto</span> table = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>Table *<span class="keyword">&gt;</span>(root);</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;  <span class="keyword">auto</span> vtable = table-&gt;GetVTable();</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;  <span class="comment">// Either the vtable is before the root or after the root.</span></div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160;  <span class="keyword">auto</span> start = (std::min)(vtable, reinterpret_cast&lt;const uint8_t *&gt;(root));</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;  <span class="comment">// Align to at least sizeof(uoffset_t).</span></div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;  start = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(<span class="keyword">reinterpret_cast&lt;</span>uintptr_t<span class="keyword">&gt;</span>(start) &amp;</div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;                                            ~(<span class="keyword">sizeof</span>(uoffset_t) - 1));</div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;  <span class="comment">// Additionally, there may be a file_identifier in the buffer, and the root</span></div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160;  <span class="comment">// offset. The buffer may have been aligned to any size between</span></div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160;  <span class="comment">// sizeof(uoffset_t) and FLATBUFFERS_MAX_ALIGNMENT (see &quot;force_align&quot;).</span></div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>&#160;  <span class="comment">// Sadly, the exact alignment is only known when constructing the buffer,</span></div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160;  <span class="comment">// since it depends on the presence of values with said alignment properties.</span></div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160;  <span class="comment">// So instead, we simply look at the next uoffset_t values (root,</span></div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160;  <span class="comment">// file_identifier, and alignment padding) to see which points to the root.</span></div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160;  <span class="comment">// None of the other values can &quot;impersonate&quot; the root since they will either</span></div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;  <span class="comment">// be 0 or four ASCII characters.</span></div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;  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="l02057"></a><span class="lineno"> 2057</span>&#160;                <span class="stringliteral">&quot;file_identifier is assumed to be the same size as uoffset_t&quot;</span>);</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;  <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="l02059"></a><span class="lineno"> 2059</span>&#160;       possible_roots; possible_roots--) {</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;    start -= <span class="keyword">sizeof</span>(uoffset_t);</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160;    <span class="keywordflow">if</span> (ReadScalar&lt;uoffset_t&gt;(start) + start ==</div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160;        <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(root))</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160;      <span class="keywordflow">return</span> start;</div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160;  }</div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160;  <span class="comment">// We didn&#39;t find the root, either the &quot;root&quot; passed isn&#39;t really a root,</span></div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160;  <span class="comment">// or the buffer is corrupt.</span></div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160;  <span class="comment">// Assert, because calling this function with bad data may cause reads</span></div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160;  <span class="comment">// outside of buffer boundaries.</span></div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>&#160;  assert(<span class="keyword">false</span>);</div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160;}</div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160;<span class="comment">/// @brief This return the prefixed size of a FlatBuffer.</span></div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160;<span class="comment"></span><span class="keyword">inline</span> uoffset_t GetPrefixedSize(<span class="keyword">const</span> uint8_t* buf){ <span class="keywordflow">return</span> ReadScalar&lt;uoffset_t&gt;(buf); }</div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160;</div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160;<span class="comment">// Base class for native objects (FlatBuffer data de-serialized into native</span></div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160;<span class="comment">// C++ data structures).</span></div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160;<span class="comment">// Contains no functionality, purely documentative.</span></div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160;<span class="keyword">struct </span>NativeTable {};</div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160;<span class="comment">/// @brief Function types to be used with resolving hashes into objects and</span></div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160;<span class="comment">/// back again. The resolver gets a pointer to a field inside an object API</span></div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;<span class="comment">/// object that is of the type specified in the schema using the attribute</span></div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;<span class="comment">/// `cpp_type` (it is thus important whatever you write to this address</span></div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160;<span class="comment">/// matches that type). The value of this field is initially null, so you</span></div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>&#160;<span class="comment">/// may choose to implement a delayed binding lookup using this function</span></div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160;<span class="comment">/// if you wish. The resolver does the opposite lookup, for when the object</span></div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>&#160;<span class="comment">/// is being serialized again.</span></div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160;<span class="comment"></span><span class="keyword">typedef</span> uint64_t hash_value_t;</div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>&#160;<span class="comment">// clang-format off</span></div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160;<span class="preprocessor">#ifdef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160;  <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="l02093"></a><span class="lineno"> 2093</span>&#160;  <span class="keyword">typedef</span> hash_value_t (*rehasher_function_t)(<span class="keywordtype">void</span> *pointer);</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160;  <span class="keyword">typedef</span> std::function&lt;void (void **pointer_adr, hash_value_t hash)&gt;</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>&#160;          resolver_function_t;</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160;  <span class="keyword">typedef</span> std::function&lt;hash_value_t (void *pointer)&gt; rehasher_function_t;</div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>&#160;<span class="comment">// clang-format on</span></div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>&#160;</div><div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>&#160;<span class="comment">// Helper function to test if a field is present, using any of the field</span></div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>&#160;<span class="comment">// enums in the generated code.</span></div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>&#160;<span class="comment">// `table` must be a generated table type. Since this is a template parameter,</span></div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>&#160;<span class="comment">// this is not typechecked to be a subclass of Table, so beware!</span></div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160;<span class="comment">// Note: this function will return false for fields equal to the default</span></div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>&#160;<span class="comment">// value, since they&#39;re not stored in the buffer (unless force_defaults was</span></div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>&#160;<span class="comment">// used).</span></div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> IsFieldPresent(<span class="keyword">const</span> T *table, voffset_t field) {</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>&#160;  <span class="comment">// Cast, since Table is a private baseclass of any table types.</span></div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>Table *<span class="keyword">&gt;</span>(table)-&gt;CheckField(field);</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>&#160;}</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160;</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160;<span class="comment">// Utility function for reverse lookups on the EnumNames*() functions</span></div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160;<span class="comment">// (in the generated C++ code)</span></div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>&#160;<span class="comment">// names must be NULL terminated.</span></div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160;<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="l02117"></a><span class="lineno"> 2117</span>&#160;  <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="l02118"></a><span class="lineno"> 2118</span>&#160;    <span class="keywordflow">if</span> (!strcmp(*p, name)) <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(p - names);</div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160;  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>&#160;}</div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>&#160;</div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>&#160;<span class="comment">// These macros allow us to layout a struct with a guarantee that they&#39;ll end</span></div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>&#160;<span class="comment">// up looking the same on different compilers and platforms.</span></div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>&#160;<span class="comment">// It does this by disallowing the compiler to do any padding, and then</span></div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>&#160;<span class="comment">// does padding itself by inserting extra padding fields that make every</span></div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>&#160;<span class="comment">// element aligned to its own size.</span></div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>&#160;<span class="comment">// Additionally, it manually sets the alignment of the struct as a whole,</span></div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160;<span class="comment">// which is typically its largest element, or a custom size set in the schema</span></div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160;<span class="comment">// by the force_align attribute.</span></div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;<span class="comment">// These are used in the generated code only.</span></div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>&#160;</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>&#160;<span class="comment">// clang-format off</span></div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>&#160;<span class="preprocessor">#if defined(_MSC_VER)</span></div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160;<span class="preprocessor">  #define MANUALLY_ALIGNED_STRUCT(alignment) \</span></div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160;<span class="preprocessor">    __pragma(pack(1)); \</span></div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>&#160;<span class="preprocessor">    struct __declspec(align(alignment))</span></div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>&#160;<span class="preprocessor">  #define STRUCT_END(name, size) \</span></div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>&#160;<span class="preprocessor">    __pragma(pack()); \</span></div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>&#160;<span class="preprocessor">    static_assert(sizeof(name) == size, &quot;compiler breaks packing rules&quot;)</span></div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>&#160;<span class="preprocessor">#elif defined(__GNUC__) || defined(__clang__)</span></div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160;<span class="preprocessor">  #define MANUALLY_ALIGNED_STRUCT(alignment) \</span></div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160;<span class="preprocessor">    _Pragma(&quot;pack(1)&quot;) \</span></div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160;<span class="preprocessor">    struct __attribute__((aligned(alignment)))</span></div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160;<span class="preprocessor">  #define STRUCT_END(name, size) \</span></div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160;<span class="preprocessor">    _Pragma(&quot;pack()&quot;) \</span></div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160;<span class="preprocessor">    static_assert(sizeof(name) == size, &quot;compiler breaks packing rules&quot;)</span></div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>&#160;<span class="preprocessor">  #error Unknown compiler, please define structure alignment macros</span></div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>&#160;<span class="comment">// clang-format on</span></div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>&#160;</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>&#160;<span class="comment">// Minimal reflection via code generation.</span></div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>&#160;<span class="comment">// Besides full-fat reflection (see reflection.h) and parsing/printing by</span></div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160;<span class="comment">// loading schemas (see idl.h), we can also have code generation for mimimal</span></div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>&#160;<span class="comment">// reflection data which allows pretty-printing and other uses without needing</span></div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>&#160;<span class="comment">// a schema or a parser.</span></div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160;<span class="comment">// Generate code with --reflect-types (types only) or --reflect-names (names</span></div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>&#160;<span class="comment">// also) to enable.</span></div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160;<span class="comment">// See minireflect.h for utilities using this functionality.</span></div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160;</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>&#160;<span class="comment">// These types are organized slightly differently as the ones in idl.h.</span></div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>&#160;<span class="keyword">enum</span> SequenceType { ST_TABLE, ST_STRUCT, ST_UNION, ST_ENUM };</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>&#160;</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160;<span class="comment">// Scalars have the same order as in idl.h</span></div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>&#160;<span class="comment">// clang-format off</span></div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>&#160;<span class="preprocessor">#define FLATBUFFERS_GEN_ELEMENTARY_TYPES(ET) \</span></div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>&#160;<span class="preprocessor">  ET(ET_UTYPE) \</span></div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>&#160;<span class="preprocessor">  ET(ET_BOOL) \</span></div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>&#160;<span class="preprocessor">  ET(ET_CHAR) \</span></div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>&#160;<span class="preprocessor">  ET(ET_UCHAR) \</span></div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>&#160;<span class="preprocessor">  ET(ET_SHORT) \</span></div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>&#160;<span class="preprocessor">  ET(ET_USHORT) \</span></div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>&#160;<span class="preprocessor">  ET(ET_INT) \</span></div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>&#160;<span class="preprocessor">  ET(ET_UINT) \</span></div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>&#160;<span class="preprocessor">  ET(ET_LONG) \</span></div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>&#160;<span class="preprocessor">  ET(ET_ULONG) \</span></div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>&#160;<span class="preprocessor">  ET(ET_FLOAT) \</span></div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>&#160;<span class="preprocessor">  ET(ET_DOUBLE) \</span></div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>&#160;<span class="preprocessor">  ET(ET_STRING) \</span></div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>&#160;<span class="preprocessor">  ET(ET_SEQUENCE)  // See SequenceType.</span></div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>&#160;</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>&#160;<span class="keyword">enum</span> ElementaryType {</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160;<span class="preprocessor">  #define FLATBUFFERS_ET(E) E,</span></div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>&#160;    FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET)</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>&#160;  <span class="preprocessor">#undef FLATBUFFERS_ET</span></div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>&#160;};</div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>&#160;</div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>&#160;<span class="keyword">inline</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> *ElementaryTypeNames() {</div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>&#160;  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> names[] = {</div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>&#160;<span class="preprocessor">    #define FLATBUFFERS_ET(E) #E,</span></div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>&#160;      FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET)</div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>&#160;    <span class="preprocessor">#undef FLATBUFFERS_ET</span></div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>&#160;  };</div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>&#160;  <span class="keywordflow">return</span> names;</div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>&#160;}</div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>&#160;<span class="comment">// clang-format on</span></div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>&#160;</div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>&#160;<span class="comment">// Basic type info cost just 16bits per field!</span></div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160;<span class="keyword">struct </span>TypeCode {</div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;  uint16_t base_type : 4;  <span class="comment">// ElementaryType</span></div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>&#160;  uint16_t is_vector : 1;</div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>&#160;  int16_t sequence_ref : 11;  <span class="comment">// Index into type_refs below, or -1 for none.</span></div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160;};</div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>&#160;</div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>&#160;static_assert(<span class="keyword">sizeof</span>(TypeCode) == 2, <span class="stringliteral">&quot;TypeCode&quot;</span>);</div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>&#160;</div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>&#160;<span class="keyword">struct </span>TypeTable;</div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>&#160;</div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>&#160;<span class="comment">// Signature of the static method present in each type.</span></div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>&#160;<span class="keyword">typedef</span> <span class="keyword">const</span> TypeTable *(*TypeFunction)();</div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>&#160;</div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>&#160;<span class="keyword">struct </span>TypeTable {</div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>&#160;  SequenceType st;</div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>&#160;  <span class="keywordtype">size_t</span> num_elems;  <span class="comment">// of each of the arrays below.</span></div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>&#160;  <span class="keyword">const</span> TypeCode *type_codes;</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>&#160;  <span class="keyword">const</span> TypeFunction *type_refs;</div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>&#160;  <span class="keyword">const</span> int32_t *values;  <span class="comment">// Only set for non-consecutive enum/union or structs.</span></div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>&#160;  <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> *names;     <span class="comment">// Only set if compiled with --reflect-names.</span></div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>&#160;};</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>&#160;</div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>&#160;<span class="comment">// String which identifies the current version of FlatBuffers.</span></div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>&#160;<span class="comment">// flatbuffer_version_string is used by Google developers to identify which</span></div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>&#160;<span class="comment">// applications uploaded to Google Play are using this library.  This allows</span></div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>&#160;<span class="comment">// the development team at Google to determine the popularity of the library.</span></div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>&#160;<span class="comment">// How it works: Applications that are uploaded to the Google Play Store are</span></div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>&#160;<span class="comment">// scanned for this version string.  We track which applications are using it</span></div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160;<span class="comment">// to measure popularity.  You are free to remove it (of course) but we would</span></div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160;<span class="comment">// appreciate if you left it in.</span></div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160;</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;<span class="comment">// Weak linkage is culled by VS &amp; doesn&#39;t work on cygwin.</span></div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160;<span class="comment">// clang-format off</span></div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>&#160;<span class="preprocessor">#if !defined(_WIN32) &amp;&amp; !defined(__CYGWIN__)</span></div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>&#160;</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>&#160;<span class="keyword">extern</span> <span class="keyword">volatile</span> __attribute__((weak)) <span class="keyword">const</span> <span class="keywordtype">char</span> *flatbuffer_version_string;</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>&#160;<span class="keyword">volatile</span> __attribute__((weak)) <span class="keyword">const</span> <span class="keywordtype">char</span> *flatbuffer_version_string =</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>&#160;  <span class="stringliteral">&quot;FlatBuffers &quot;</span></div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>&#160;  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR) <span class="stringliteral">&quot;.&quot;</span></div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>&#160;  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MINOR) <span class="stringliteral">&quot;.&quot;</span></div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>&#160;  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION);</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>&#160;</div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>&#160;<span class="preprocessor">#endif  // !defined(_WIN32) &amp;&amp; !defined(__CYGWIN__)</span></div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>&#160;</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>&#160;<span class="preprocessor">#define DEFINE_BITMASK_OPERATORS(E, T)\</span></div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>&#160;<span class="preprocessor">    inline E operator | (E lhs, E rhs){\</span></div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>&#160;<span class="preprocessor">        return E(T(lhs) | T(rhs));\</span></div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160;<span class="preprocessor">    inline E operator &amp; (E lhs, E rhs){\</span></div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>&#160;<span class="preprocessor">        return E(T(lhs) &amp; T(rhs));\</span></div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>&#160;<span class="preprocessor">    inline E operator ^ (E lhs, E rhs){\</span></div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160;<span class="preprocessor">        return E(T(lhs) ^ T(rhs));\</span></div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>&#160;<span class="preprocessor">    inline E operator ~ (E lhs){\</span></div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>&#160;<span class="preprocessor">        return E(~T(lhs));\</span></div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>&#160;<span class="preprocessor">    inline E operator |= (E &amp;lhs, E rhs){\</span></div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>&#160;<span class="preprocessor">        lhs = lhs | rhs;\</span></div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>&#160;<span class="preprocessor">        return lhs;\</span></div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>&#160;<span class="preprocessor">    inline E operator &amp;= (E &amp;lhs, E rhs){\</span></div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>&#160;<span class="preprocessor">        lhs = lhs &amp; rhs;\</span></div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>&#160;<span class="preprocessor">        return lhs;\</span></div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>&#160;<span class="preprocessor">    inline E operator ^= (E &amp;lhs, E rhs){\</span></div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>&#160;<span class="preprocessor">        lhs = lhs ^ rhs;\</span></div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>&#160;<span class="preprocessor">        return lhs;\</span></div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>&#160;<span class="preprocessor">    inline bool operator !(E rhs) \</span></div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>&#160;<span class="preprocessor">    {\</span></div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>&#160;<span class="preprocessor">        return !bool(T(rhs)); \</span></div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>&#160;<span class="preprocessor">    }</span></div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>&#160;<span class="comment">/// @endcond</span></div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160;<span class="comment"></span>}  <span class="comment">// namespace flatbuffers</span></div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>&#160;</div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>&#160;<span class="preprocessor">#if defined(_MSC_VER)</span></div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>&#160;<span class="preprocessor">  #pragma warning(pop)</span></div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>&#160;<span class="comment">// clang-format on</span></div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>&#160;</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>&#160;<span class="preprocessor">#endif  // FLATBUFFERS_H_</span></div><div class="ttc" id="structflatbuffers_1_1_offset_html"><div class="ttname"><a href="structflatbuffers_1_1_offset.html">flatbuffers::Offset</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:25</div></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&lt; Vector&lt; T &gt; &gt; CreateVector(size_t vector_size, const std::function&lt; T(size_t i)&gt; &amp;f)</div><div class="ttdoc">Serialize values returned by a function into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1234</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:1492</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&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfStructs(size_t vector_size, const std::function&lt; void(size_t i, T *)&gt; &amp;filler)</div><div class="ttdoc">Serialize an array of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1314</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ab1f44cc1b130e13b41e9a80de76e25cf"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ab1f44cc1b130e13b41e9a80de76e25cf">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfSortedStructs(T *v, size_t len)</div><div class="ttdoc">Serialize an array of structs into a FlatBuffer vector in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1418</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a23aa4c910e053446cc404bc486012e54"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedNativeStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfSortedNativeStructs(std::vector&lt; S &gt; *v)</div><div class="ttdoc">Serialize a std::vector of native structs into a FlatBuffer vector in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1404</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a66c8fd33ab9b3b237954c9ea38648f7f"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a66c8fd33ab9b3b237954c9ea38648f7f">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:770</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&lt; Vector&lt; Offset&lt; T &gt; &gt; &gt; CreateVectorOfSortedTables(std::vector&lt; Offset&lt; T &gt;&gt; *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:1480</div></div>
-<div class="ttc" id="structflatbuffers_1_1_vector_iterator_html"><div class="ttname"><a href="structflatbuffers_1_1_vector_iterator.html">flatbuffers::VectorIterator</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:90</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:718</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac51db9083ac815eb81420b6d51f42154"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset&lt; String &gt; CreateString(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:1066</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:759</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a9cc09fa59ff9732e972877cfe911c8a5"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a9cc09fa59ff9732e972877cfe911c8a5">flatbuffers::FlatBufferBuilder::CreateVectorOfStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfStructs(size_t vector_size, F f, S *state)</div><div class="ttdoc">Serialize an array of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1336</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a3d57074082aaab8cdeb8474ff9df0b53"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a3d57074082aaab8cdeb8474ff9df0b53">flatbuffers::FlatBufferBuilder::CreateVectorOfNativeStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfNativeStructs(const S *v, size_t len)</div><div class="ttdoc">Serialize an array of native structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1295</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a43f51ba9c8f4f24ea2247a3979d095b8"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8">flatbuffers::FlatBufferBuilder::CreateStruct</a></div><div class="ttdeci">Offset&lt; const T * &gt; CreateStruct(const T &amp;structobj)</div><div class="ttdoc">Write a struct by itself, typically to be part of a union. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1518</div></div>
+<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment"> * Copyright 2014 Google Inc. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment"> * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment"> * you may not use this file except in compliance with the License.</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment"> * You may obtain a copy of the License at</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment"> *     http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment"> * Unless required by applicable law or agreed to in writing, software</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment"> * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment"> * See the License for the specific language governing permissions and</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment"> * limitations under the License.</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="preprocessor">#ifndef FLATBUFFERS_H_</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="preprocessor">#define FLATBUFFERS_H_</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;</div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="preprocessor">#include &quot;flatbuffers/base.h&quot;</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceflatbuffers.html">flatbuffers</a> {</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="comment">// Wrapper for uoffset_t to allow safe template specialization.</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="comment">// Value is allowed to be 0 to indicate a null object (see e.g. AddOffset).</span></div><div class="line"><a name="l00025"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_offset.html">   25</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_offset.html">Offset</a> {</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;  uoffset_t o;</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset</a>() : o(0) {}</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset</a>(uoffset_t _o) : o(_o) {}</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;void&gt;</a> Union()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;void&gt;</a>(o); }</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;  <span class="keywordtype">bool</span> IsNull()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !o; }</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;};</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> EndianCheck() {</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;  <span class="keywordtype">int</span> endiantest = 1;</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;  <span class="comment">// If this fails, see FLATBUFFERS_LITTLEENDIAN above.</span></div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;  FLATBUFFERS_ASSERT(*reinterpret_cast&lt;char *&gt;(&amp;endiantest) ==</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;                     FLATBUFFERS_LITTLEENDIAN);</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;  (void)endiantest;</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;}</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; FLATBUFFERS_CONSTEXPR <span class="keywordtype">size_t</span> AlignOf() {</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="preprocessor">  #ifdef _MSC_VER</span></div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;    <span class="keywordflow">return</span> __alignof(T);</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;<span class="preprocessor">  #else</span></div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;<span class="preprocessor">    #ifndef alignof</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;      <span class="keywordflow">return</span> __alignof__(T);</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;      <span class="keywordflow">return</span> <span class="keyword">alignof</span>(T);</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;<span class="preprocessor">  #endif</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;}</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;<span class="comment">// When we read serialized data from memory, in the case of most scalars,</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;<span class="comment">// we want to just read T, but in the case of Offset, we want to actually</span></div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;<span class="comment">// perform the indirection and return a pointer.</span></div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;<span class="comment">// The template specialization below does just that.</span></div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;<span class="comment">// It is wrapped in a struct since function templates can&#39;t overload on the</span></div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;<span class="comment">// return type like this.</span></div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;<span class="comment">// The typedef is for the convenience of callers of this function</span></div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;<span class="comment">// (avoiding the need for a trailing return decltype)</span></div><div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_indirect_helper.html">   63</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper</a> {</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;  <span class="keyword">typedef</span> T return_type;</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;  <span class="keyword">typedef</span> T mutable_return_type;</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> element_stride = <span class="keyword">sizeof</span>(T);</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;  <span class="keyword">static</span> return_type Read(<span class="keyword">const</span> uint8_t *p, uoffset_t i) {</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;    <span class="keywordflow">return</span> EndianScalar((reinterpret_cast&lt;const T *&gt;(p))[i]);</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;  }</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;};</div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_indirect_helper_3_01_offset_3_01_t_01_4_01_4.html">   71</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper</a>&lt;<a class="code" href="structflatbuffers_1_1_offset.html">Offset</a>&lt;T&gt;&gt; {</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;  <span class="keyword">typedef</span> <span class="keyword">const</span> T *return_type;</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;  <span class="keyword">typedef</span> T *mutable_return_type;</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> element_stride = <span class="keyword">sizeof</span>(uoffset_t);</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;  <span class="keyword">static</span> return_type Read(<span class="keyword">const</span> uint8_t *p, uoffset_t i) {</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;    p += i * <span class="keyword">sizeof</span>(uoffset_t);</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>return_type<span class="keyword">&gt;</span>(p + ReadScalar&lt;uoffset_t&gt;(p));</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;  }</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;};</div><div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_indirect_helper_3_01const_01_t_01_5_01_4.html">   80</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper</a>&lt;const T *&gt; {</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;  <span class="keyword">typedef</span> <span class="keyword">const</span> T *return_type;</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;  <span class="keyword">typedef</span> T *mutable_return_type;</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> element_stride = <span class="keyword">sizeof</span>(T);</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;  <span class="keyword">static</span> return_type Read(<span class="keyword">const</span> uint8_t *p, uoffset_t i) {</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>T *<span class="keyword">&gt;</span>(p + i * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;  }</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;};</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;<span class="comment">// An STL compatible iterator implementation for Vector below, effectively</span></div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;<span class="comment">// calling Get() for every element.</span></div><div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_vector_iterator.html">   91</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> IT&gt; <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> {</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;  <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;  <span class="keyword">typedef</span> IT value_type;</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;  <span class="keyword">typedef</span> ptrdiff_t difference_type;</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;  <span class="keyword">typedef</span> IT *pointer;</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;  <span class="keyword">typedef</span> IT &amp;reference;</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a>(<span class="keyword">const</span> uint8_t *data, uoffset_t i)</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;      : data_(data + <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a> * i) {}</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a>(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other) : data_(other.data_) {}</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;operator=(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other) {</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    data_ = other.data_;</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;  }</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;operator=(<a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;&amp;other) {</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    data_ = other.data_;</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;  }</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;  <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;    <span class="keywordflow">return</span> data_ == other.data_;</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;  }</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;  <span class="keywordtype">bool</span> operator&lt;(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;    <span class="keywordflow">return</span> data_ &lt; other.data_;</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;  }</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;  <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;    <span class="keywordflow">return</span> data_ != other.data_;</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;  }</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;  difference_type operator-(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other)<span class="keyword"> const </span>{</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;    <span class="keywordflow">return</span> (data_ - other.data_) / <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;  }</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;  IT operator*()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::Read</a>(data_, 0); }</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;  IT operator-&gt;()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::Read</a>(data_, 0); }</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;operator++() {</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;    data_ += <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;  }</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> operator++(<span class="keywordtype">int</span>) {</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;    <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> temp(data_, 0);</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;    data_ += <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;    <span class="keywordflow">return</span> temp;</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;  }</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> operator+(<span class="keyword">const</span> uoffset_t &amp;offset)<span class="keyword"> const </span>{</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a>(data_ + offset * <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>,</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;                          0);</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;  }</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;operator+=(<span class="keyword">const</span> uoffset_t &amp;offset) {</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;    data_ += offset * <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;  }</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;operator--() {</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;    data_ -= <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;  }</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> operator--(<span class="keywordtype">int</span>) {</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;    <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> temp(data_, 0);</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;    data_ -= <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;    <span class="keywordflow">return</span> temp;</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;  }</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> operator-(<span class="keyword">const</span> uoffset_t &amp;offset) {</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a>(data_ - offset * <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>,</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;                          0);</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;  }</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;  <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;operator-=(<span class="keyword">const</span> uoffset_t &amp;offset) {</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;    data_ -= offset * <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>;</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;  }</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;  <span class="keyword">const</span> uint8_t *data_;</div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;};</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;<span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_string.html">String</a>;</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;<span class="comment">// This is used as a helper type for accessing vectors.</span></div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;<span class="comment">// Vector::data() assumes the vector elements start after the length field.</span></div><div class="line"><a name="l00182"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_vector.html">  182</a></span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_vector.html">Vector</a> {</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;  <span class="keyword">typedef</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator&lt;T, typename IndirectHelper&lt;T&gt;::mutable_return_type</a>&gt;</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;      <a class="code" href="structflatbuffers_1_1_vector_iterator.html">iterator</a>;</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;  <span class="keyword">typedef</span> <a class="code" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator&lt;T, typename IndirectHelper&lt;T&gt;::return_type</a>&gt;</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;      <a class="code" href="structflatbuffers_1_1_vector_iterator.html">const_iterator</a>;</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;  uoffset_t size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> EndianScalar(length_); }</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;  <span class="comment">// Deprecated: use size(). Here for backwards compatibility.</span></div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;  uoffset_t Length()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> size(); }</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;  <span class="keyword">typedef</span> <span class="keyword">typename</span> IndirectHelper&lt;T&gt;::return_type return_type;</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;  <span class="keyword">typedef</span> <span class="keyword">typename</span> IndirectHelper&lt;T&gt;::mutable_return_type mutable_return_type;</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;  return_type Get(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;    FLATBUFFERS_ASSERT(i &lt; size());</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::Read</a>(Data(), i);</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;  }</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;  return_type operator[](uoffset_t i)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> Get(i); }</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;  <span class="comment">// If this is a Vector of enums, T will be its storage type, not the enum</span></div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;  <span class="comment">// type. This function makes it convenient to retrieve value with enum</span></div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;  <span class="comment">// type E.</span></div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> E&gt; E GetEnum(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>E<span class="keyword">&gt;</span>(Get(i));</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;  }</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;  <span class="comment">// If this a vector of unions, this does the cast for you. There&#39;s no check</span></div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;  <span class="comment">// to make sure this is the right type!</span></div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt; <span class="keyword">const</span> U *GetAs(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>U *<span class="keyword">&gt;</span>(Get(i));</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;  }</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;  <span class="comment">// If this a vector of unions, this does the cast for you. There&#39;s no check</span></div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;  <span class="comment">// to make sure this is actually a string!</span></div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;  <span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> *GetAsString(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> *<span class="keyword">&gt;</span>(Get(i));</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;  }</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;  <span class="keyword">const</span> <span class="keywordtype">void</span> *GetStructFromOffset(<span class="keywordtype">size_t</span> o)<span class="keyword"> const </span>{</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">void</span> *<span class="keyword">&gt;</span>(Data() + o);</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;  }</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;  iterator begin() { <span class="keywordflow">return</span> iterator(Data(), 0); }</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;  const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(Data(), 0); }</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;  iterator end() { <span class="keywordflow">return</span> iterator(Data(), size()); }</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;  const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(Data(), size()); }</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;  <span class="comment">// Change elements if you have a non-const pointer to this object.</span></div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;  <span class="comment">// Scalars only. See reflection.h, and the documentation.</span></div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;  <span class="keywordtype">void</span> Mutate(uoffset_t i, <span class="keyword">const</span> T &amp;val) {</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;    FLATBUFFERS_ASSERT(i &lt; size());</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;    WriteScalar(data() + i, val);</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;  }</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;  <span class="comment">// Change an element of a vector of tables (or strings).</span></div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;  <span class="comment">// &quot;val&quot; points to the new table/string, as you can obtain from</span></div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;  <span class="comment">// e.g. reflection::AddFlatBuffer().</span></div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;  <span class="keywordtype">void</span> MutateOffset(uoffset_t i, <span class="keyword">const</span> uint8_t *val) {</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;    FLATBUFFERS_ASSERT(i &lt; size());</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;    static_assert(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(uoffset_t), <span class="stringliteral">&quot;Unrelated types&quot;</span>);</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;    WriteScalar(data() + i,</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;                static_cast&lt;uoffset_t&gt;(val - (Data() + i * <span class="keyword">sizeof</span>(uoffset_t))));</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;  }</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;  <span class="comment">// Get a mutable pointer to tables/strings inside this vector.</span></div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;  mutable_return_type GetMutableObject(uoffset_t i)<span class="keyword"> const </span>{</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;    FLATBUFFERS_ASSERT(i &lt; size());</div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span>mutable_return_type<span class="keyword">&gt;</span>(<a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::Read</a>(Data(), i));</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;  }</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;  <span class="comment">// The raw data in little endian format. Use with care.</span></div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;  <span class="keyword">const</span> uint8_t *Data()<span class="keyword"> const </span>{</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(&amp;length_ + 1);</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;  }</div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;  uint8_t *Data() { <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>uint8_t *<span class="keyword">&gt;</span>(&amp;length_ + 1); }</div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;</div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;  <span class="comment">// Similarly, but typed, much like std::vector::data</span></div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;  <span class="keyword">const</span> T *data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>T *<span class="keyword">&gt;</span>(Data()); }</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;  T *data() { <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(Data()); }</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> K&gt; return_type LookupByKey(K key)<span class="keyword"> const </span>{</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;    <span class="keywordtype">void</span> *search_result = std::bsearch(</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;        &amp;key, Data(), size(), <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::element_stride</a>, KeyCompare&lt;K&gt;);</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;    <span class="keywordflow">if</span> (!search_result) {</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;      <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;  <span class="comment">// Key not found.</span></div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;    }</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;    <span class="keyword">const</span> uint8_t *element = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(search_result);</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;</div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::Read</a>(element, 0);</div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;  }</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160; <span class="keyword">protected</span>:</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;  <span class="comment">// This class is only used to access pre-existing data. Don&#39;t ever</span></div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;  <span class="comment">// try to construct these manually.</span></div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;  <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>();</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;  uoffset_t length_;</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;  <span class="comment">// This class is a pointer. Copying will therefore create an invalid object.</span></div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;  <span class="comment">// Private and unimplemented copy constructor.</span></div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;  <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a> &amp;);</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> K&gt; <span class="keyword">static</span> <span class="keywordtype">int</span> KeyCompare(<span class="keyword">const</span> <span class="keywordtype">void</span> *ap, <span class="keyword">const</span> <span class="keywordtype">void</span> *bp) {</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;    <span class="keyword">const</span> K *key = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>K *<span class="keyword">&gt;</span>(ap);</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;    <span class="keyword">const</span> uint8_t *data = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(bp);</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;    <span class="keyword">auto</span> table = <a class="code" href="structflatbuffers_1_1_indirect_helper.html">IndirectHelper&lt;T&gt;::Read</a>(data, 0);</div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;</div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;    <span class="comment">// std::bsearch compares with the operands transposed, so we negate the</span></div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;    <span class="comment">// result here.</span></div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;    <span class="keywordflow">return</span> -table-&gt;KeyCompareWithValue(*key);</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;  }</div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;};</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;<span class="comment">// Represent a vector much like the template above, but in this case we</span></div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;<span class="comment">// don&#39;t know what the element types are (used with reflection.h).</span></div><div class="line"><a name="l00305"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_vector_of_any.html">  305</a></span>&#160;<span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_vector_of_any.html">VectorOfAny</a> {</div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;  uoffset_t size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> EndianScalar(length_); }</div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;</div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;  <span class="keyword">const</span> uint8_t *Data()<span class="keyword"> const </span>{</div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(&amp;length_ + 1);</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;  }</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;  uint8_t *Data() { <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>uint8_t *<span class="keyword">&gt;</span>(&amp;length_ + 1); }</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160; <span class="keyword">protected</span>:</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;  <a class="code" href="classflatbuffers_1_1_vector_of_any.html">VectorOfAny</a>();</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;  uoffset_t length_;</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;  <a class="code" href="classflatbuffers_1_1_vector_of_any.html">VectorOfAny</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector_of_any.html">VectorOfAny</a> &amp;);</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;};</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;</div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;<span class="preprocessor">#ifndef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;<a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;Offset&lt;T&gt;</a>&gt; *VectorCast(<a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>&lt;<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;U&gt;</a>&gt; *ptr) {</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;  static_assert(std::is_base_of&lt;T, U&gt;::value, <span class="stringliteral">&quot;Unrelated types&quot;</span>);</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;Offset&lt;T&gt;</a><span class="keyword">&gt;</span> *&gt;(ptr);</div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;}</div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;Offset&lt;T&gt;</a>&gt; *VectorCast(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>&lt;<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;U&gt;</a>&gt; *ptr) {</div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;  static_assert(std::is_base_of&lt;T, U&gt;::value, <span class="stringliteral">&quot;Unrelated types&quot;</span>);</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;Offset&lt;T&gt;</a><span class="keyword">&gt;</span> *&gt;(ptr);</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;}</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;<span class="comment">// Convenient helper function to get the length of any vector, regardless</span></div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;<span class="comment">// of wether it is null or not (the field is not set).</span></div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">size_t</span> VectorLength(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;T&gt;</a> *v) {</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;  <span class="keywordflow">return</span> v ? v-&gt;Length() : 0;</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;}</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;</div><div class="line"><a name="l00343"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_string.html">  343</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> : <span class="keyword">public</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>&lt;char&gt; {</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;  <span class="keyword">const</span> <span class="keywordtype">char</span> *c_str()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">char</span> *<span class="keyword">&gt;</span>(Data()); }</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;  std::string str()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> std::string(c_str(), Length()); }</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;<span class="preprocessor">  #ifdef FLATBUFFERS_HAS_STRING_VIEW</span></div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;  flatbuffers::string_view string_view()<span class="keyword"> const </span>{</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;    <span class="keywordflow">return</span> flatbuffers::string_view(c_str(), Length());</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;  }</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;<span class="preprocessor">  #endif // FLATBUFFERS_HAS_STRING_VIEW</span></div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;  <span class="keywordtype">bool</span> operator&lt;(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> &amp;o)<span class="keyword"> const </span>{</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;    <span class="keywordflow">return</span> strcmp(c_str(), o.c_str()) &lt; 0;</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;  }</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;};</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;</div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;<span class="comment">// Allocator interface. This is flatbuffers-specific and meant only for</span></div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;<span class="comment">// `vector_downward` usage.</span></div><div class="line"><a name="l00362"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_allocator.html">  362</a></span>&#160;<span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> {</div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;  <span class="keyword">virtual</span> ~<a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a>() {}</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;  <span class="comment">// Allocate `size` bytes of memory.</span></div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;  <span class="keyword">virtual</span> uint8_t *allocate(<span class="keywordtype">size_t</span> size) = 0;</div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;  <span class="comment">// Deallocate `size` bytes of memory at `p` allocated by this allocator.</span></div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;  <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate(uint8_t *p, <span class="keywordtype">size_t</span> size) = 0;</div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;  <span class="comment">// Reallocate `new_size` bytes of memory, replacing the old region of size</span></div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;  <span class="comment">// `old_size` at `p`. In contrast to a normal realloc, this grows downwards,</span></div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;  <span class="comment">// and is intended specifcally for `vector_downward` use.</span></div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;  <span class="comment">// `in_use_back` and `in_use_front` indicate how much of `old_size` is</span></div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;  <span class="comment">// actually in use at each end, and needs to be copied.</span></div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;  <span class="keyword">virtual</span> uint8_t *reallocate_downward(uint8_t *old_p, <span class="keywordtype">size_t</span> old_size,</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;                                       <span class="keywordtype">size_t</span> new_size, <span class="keywordtype">size_t</span> in_use_back,</div><div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;                                       <span class="keywordtype">size_t</span> in_use_front) {</div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;    FLATBUFFERS_ASSERT(new_size &gt; old_size);  <span class="comment">// vector_downward only grows</span></div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;    uint8_t *new_p = allocate(new_size);</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;    memcpy_downward(old_p, old_size, new_p, new_size, in_use_back,</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;                    in_use_front);</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;    deallocate(old_p, old_size);</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;    <span class="keywordflow">return</span> new_p;</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;  }</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160; <span class="keyword">protected</span>:</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;  <span class="comment">// Called by `reallocate_downward` to copy memory from `old_p` of `old_size`</span></div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;  <span class="comment">// to `new_p` of `new_size`. Only memory of size `in_use_front` and</span></div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;  <span class="comment">// `in_use_back` will be copied from the front and back of the old memory</span></div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;  <span class="comment">// allocation.</span></div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;  <span class="keywordtype">void</span> memcpy_downward(uint8_t *old_p, <span class="keywordtype">size_t</span> old_size,</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;                       uint8_t *new_p, <span class="keywordtype">size_t</span> new_size,</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;                       <span class="keywordtype">size_t</span> in_use_back, <span class="keywordtype">size_t</span> in_use_front) {</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;    memcpy(new_p + new_size - in_use_back, old_p + old_size - in_use_back,</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;           in_use_back);</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;    memcpy(new_p, old_p, in_use_front);</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;  }</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;};</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;<span class="comment">// DefaultAllocator uses new/delete to allocate memory regions</span></div><div class="line"><a name="l00403"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_default_allocator.html">  403</a></span>&#160;<span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_default_allocator.html">DefaultAllocator</a> : <span class="keyword">public</span> <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> {</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;  uint8_t *allocate(<span class="keywordtype">size_t</span> size) FLATBUFFERS_OVERRIDE {</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">new</span> uint8_t[size];</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;  }</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;  <span class="keywordtype">void</span> deallocate(uint8_t *p, <span class="keywordtype">size_t</span>) FLATBUFFERS_OVERRIDE {</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;    <span class="keyword">delete</span>[] p;</div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;  }</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;};</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;<span class="comment">// These functions allow for a null allocator to mean use the default allocator,</span></div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;<span class="comment">// as used by DetachedBuffer and vector_downward below.</span></div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;<span class="comment">// This is to avoid having a statically or dynamically allocated default</span></div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;<span class="comment">// allocator, or having to move it between the classes that may own it.</span></div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;<span class="keyword">inline</span> uint8_t *Allocate(<a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator, <span class="keywordtype">size_t</span> size) {</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;  <span class="keywordflow">return</span> allocator ? allocator-&gt;allocate(size)</div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;                   : <a class="code" href="classflatbuffers_1_1_default_allocator.html">DefaultAllocator</a>().allocate(size);</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;}</div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> Deallocate(<a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator, uint8_t *p, <span class="keywordtype">size_t</span> size) {</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;  <span class="keywordflow">if</span> (allocator) allocator-&gt;deallocate(p, size);</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;  <span class="keywordflow">else</span> <a class="code" href="classflatbuffers_1_1_default_allocator.html">DefaultAllocator</a>().deallocate(p, size);</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;}</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;<span class="keyword">inline</span> uint8_t *ReallocateDownward(<a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator, uint8_t *old_p,</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;                                   <span class="keywordtype">size_t</span> old_size, <span class="keywordtype">size_t</span> new_size,</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;                                   <span class="keywordtype">size_t</span> in_use_back, <span class="keywordtype">size_t</span> in_use_front) {</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;  <span class="keywordflow">return</span> allocator</div><div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;      ? allocator-&gt;reallocate_downward(old_p, old_size, new_size,</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;                                       in_use_back, in_use_front)</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;      : <a class="code" href="classflatbuffers_1_1_default_allocator.html">DefaultAllocator</a>().reallocate_downward(old_p, old_size, new_size,</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;                                               in_use_back, in_use_front);</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;}</div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;</div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;<span class="comment">// DetachedBuffer is a finished flatbuffer memory region, detached from its</span></div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;<span class="comment">// builder. The original memory region and allocator are also stored so that</span></div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;<span class="comment">// the DetachedBuffer can manage the memory lifetime.</span></div><div class="line"><a name="l00441"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_detached_buffer.html">  441</a></span>&#160;<span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> {</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>()</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;      : allocator_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;        own_allocator_(<span class="keyword">false</span>),</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;        buf_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;        reserved_(0),</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;        cur_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;        size_(0) {}</div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>(<a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator, <span class="keywordtype">bool</span> own_allocator, uint8_t *buf,</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;                 <span class="keywordtype">size_t</span> reserved, uint8_t *cur, <span class="keywordtype">size_t</span> sz)</div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;      : allocator_(allocator),</div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;        own_allocator_(own_allocator),</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;        buf_(buf),</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;        reserved_(reserved),</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;        cur_(cur),</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;        size_(sz) {}</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>(<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &amp;&amp;other)</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;      : allocator_(other.allocator_),</div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;        own_allocator_(other.own_allocator_),</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;        buf_(other.buf_),</div><div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;        reserved_(other.reserved_),</div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;        cur_(other.cur_),</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;        size_(other.size_) {</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;    other.reset();</div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;  }</div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &amp;operator=(<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &amp;&amp;other) {</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;    destroy();</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;    allocator_ = other.allocator_;</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;    own_allocator_ = other.own_allocator_;</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;    buf_ = other.buf_;</div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;    reserved_ = other.reserved_;</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;    cur_ = other.cur_;</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;    size_ = other.size_;</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;</div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;    other.reset();</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;    <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;  }</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;  ~<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>() { destroy(); }</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;  <span class="keyword">const</span> uint8_t *data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> cur_; }</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;  uint8_t *data() { <span class="keywordflow">return</span> cur_; }</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;</div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;  <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> size_; }</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;<span class="preprocessor">  #if 0  // disabled for now due to the ordering of classes in this header</span></div><div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;  <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;  <span class="keywordtype">bool</span> Verify()<span class="keyword"> const </span>{</div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;    Verifier verifier(data(), size());</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;    <span class="keywordflow">return</span> verifier.Verify&lt;T&gt;(<span class="keyword">nullptr</span>);</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;  }</div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;</div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;  <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;  <span class="keyword">const</span> T* GetRoot()<span class="keyword"> const </span>{</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;    <span class="keywordflow">return</span> flatbuffers::GetRoot&lt;T&gt;(data());</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;  }</div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;  <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;  T* GetRoot() {</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;    <span class="keywordflow">return</span> flatbuffers::GetRoot&lt;T&gt;(data());</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;  }</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;<span class="preprocessor">  #endif</span></div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;  <span class="comment">// These may change access mode, leave these at end of public section</span></div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;  FLATBUFFERS_DELETE_FUNC(<a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &amp;other))</div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;  FLATBUFFERS_DELETE_FUNC(</div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;      <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &amp;<span class="keyword">operator</span>=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> &amp;other))</div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;</div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160; <span class="keyword">protected</span>:</div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator_;</div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;  <span class="keywordtype">bool</span> own_allocator_;</div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;  uint8_t *buf_;</div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;  <span class="keywordtype">size_t</span> reserved_;</div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;  uint8_t *cur_;</div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;  <span class="keywordtype">size_t</span> size_;</div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;</div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;  <span class="keyword">inline</span> <span class="keywordtype">void</span> destroy() {</div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;    <span class="keywordflow">if</span> (buf_) Deallocate(allocator_, buf_, reserved_);</div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;    <span class="keywordflow">if</span> (own_allocator_ &amp;&amp; allocator_) { <span class="keyword">delete</span> allocator_; }</div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;    reset();</div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;  }</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;</div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;  <span class="keyword">inline</span> <span class="keywordtype">void</span> reset() {</div><div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;    allocator_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;    own_allocator_ = <span class="keyword">false</span>;</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;    buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;    reserved_ = 0;</div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;    cur_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;    size_ = 0;</div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;  }</div><div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;};</div><div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;</div><div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;<span class="comment">// This is a minimal replication of std::vector&lt;uint8_t&gt; functionality,</span></div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;<span class="comment">// except growing from higher to lower addresses. i.e push_back() inserts data</span></div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;<span class="comment">// in the lowest address in the vector.</span></div><div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;<span class="comment">// Since this vector leaves the lower part unused, we support a &quot;scratch-pad&quot;</span></div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;<span class="comment">// that can be stored there for temporary data, to share the allocated space.</span></div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;<span class="comment">// Essentially, this supports 2 std::vectors in a single buffer.</span></div><div class="line"><a name="l00548"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1vector__downward.html">  548</a></span>&#160;<span class="keyword">class </span><a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> {</div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;  <span class="keyword">explicit</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a>(<span class="keywordtype">size_t</span> initial_size,</div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;                           <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator,</div><div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;                           <span class="keywordtype">bool</span> own_allocator,</div><div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;                           <span class="keywordtype">size_t</span> buffer_minalign)</div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;      : allocator_(allocator),</div><div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;        own_allocator_(own_allocator),</div><div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;        initial_size_(initial_size),</div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;        buffer_minalign_(buffer_minalign),</div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;        reserved_(0),</div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;        buf_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;        cur_(<span class="keyword">nullptr</span>),</div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;        scratch_(<span class="keyword">nullptr</span>) {}</div><div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;</div><div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;  ~<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a>() {</div><div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;    <span class="keywordflow">if</span> (buf_) Deallocate(allocator_, buf_, reserved_);</div><div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;    <span class="keywordflow">if</span> (own_allocator_ &amp;&amp; allocator_) { <span class="keyword">delete</span> allocator_; }</div><div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;  }</div><div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;</div><div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;  <span class="keywordtype">void</span> reset() {</div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;    <span class="keywordflow">if</span> (buf_) {</div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;      Deallocate(allocator_, buf_, reserved_);</div><div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;      buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;    }</div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;    clear();</div><div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;  }</div><div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;</div><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;  <span class="keywordtype">void</span> clear() {</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;    <span class="keywordflow">if</span> (buf_) {</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;      cur_ = buf_ + reserved_;</div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;      reserved_ = 0;</div><div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;      cur_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;    }</div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;    clear_scratch();</div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;  }</div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;</div><div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;  <span class="keywordtype">void</span> clear_scratch() {</div><div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;    scratch_ = buf_;</div><div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;  }</div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;</div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;  <span class="comment">// Relinquish the pointer to the caller.</span></div><div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> release() {</div><div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;    <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> fb(allocator_, own_allocator_, buf_, reserved_, cur_,</div><div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;                      size());</div><div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;    allocator_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;    own_allocator_ = <span class="keyword">false</span>;</div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;    buf_ = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;    clear();</div><div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;    <span class="keywordflow">return</span> fb;</div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;  }</div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;</div><div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;  <span class="keywordtype">size_t</span> ensure_space(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;    FLATBUFFERS_ASSERT(cur_ &gt;= scratch_ &amp;&amp; scratch_ &gt;= buf_);</div><div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;    <span class="keywordflow">if</span> (len &gt; static_cast&lt;size_t&gt;(cur_ - scratch_)) { reallocate(len); }</div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;    <span class="comment">// Beyond this, signed offsets may not have enough range:</span></div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;    <span class="comment">// (FlatBuffers &gt; 2GB not supported).</span></div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;    FLATBUFFERS_ASSERT(size() &lt; FLATBUFFERS_MAX_BUFFER_SIZE);</div><div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;    <span class="keywordflow">return</span> len;</div><div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;  }</div><div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;</div><div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;  <span class="keyword">inline</span> uint8_t *make_space(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;    <span class="keywordtype">size_t</span> space = ensure_space(len);</div><div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;    cur_ -= space;</div><div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;    <span class="keywordflow">return</span> cur_;</div><div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;  }</div><div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;</div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;  <span class="comment">// Returns nullptr if using the DefaultAllocator.</span></div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *get_custom_allocator() { <span class="keywordflow">return</span> allocator_; }</div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;</div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;  uoffset_t size()<span class="keyword"> const </span>{</div><div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>uoffset_t<span class="keyword">&gt;</span>(reserved_ - (cur_ - buf_));</div><div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;  }</div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;</div><div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;  uoffset_t scratch_size()<span class="keyword"> const </span>{</div><div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>uoffset_t<span class="keyword">&gt;</span>(scratch_ - buf_);</div><div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;  }</div><div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;</div><div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;  <span class="keywordtype">size_t</span> capacity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> reserved_; }</div><div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;</div><div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;  uint8_t *data()<span class="keyword"> const </span>{</div><div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;    FLATBUFFERS_ASSERT(cur_);</div><div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;    <span class="keywordflow">return</span> cur_;</div><div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;  }</div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;</div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;  uint8_t *scratch_data()<span class="keyword"> const </span>{</div><div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;    FLATBUFFERS_ASSERT(buf_);</div><div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;    <span class="keywordflow">return</span> buf_;</div><div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;  }</div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;</div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;  uint8_t *scratch_end()<span class="keyword"> const </span>{</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;    FLATBUFFERS_ASSERT(scratch_);</div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;    <span class="keywordflow">return</span> scratch_;</div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;  }</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;</div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;  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="l00645"></a><span class="lineno">  645</span>&#160;</div><div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;  <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="l00647"></a><span class="lineno">  647</span>&#160;    memcpy(make_space(num), bytes, num);</div><div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;  }</div><div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;</div><div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;  <span class="comment">// Specialized version of push() that avoids memcpy call for small data.</span></div><div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> push_small(<span class="keyword">const</span> T &amp;little_endian_t) {</div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;    make_space(<span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;    *<span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(cur_) = little_endian_t;</div><div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;  }</div><div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;</div><div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> scratch_push_small(<span class="keyword">const</span> T &amp;t) {</div><div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;    ensure_space(<span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;    *<span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(scratch_) = t;</div><div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;    scratch_ += <span class="keyword">sizeof</span>(T);</div><div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;  }</div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;</div><div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;  <span class="comment">// fill() is most frequently called with small byte counts (&lt;= 4),</span></div><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;  <span class="comment">// which is why we&#39;re using loops rather than calling memset.</span></div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;  <span class="keywordtype">void</span> fill(<span class="keywordtype">size_t</span> zero_pad_bytes) {</div><div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;    make_space(zero_pad_bytes);</div><div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; zero_pad_bytes; i++) cur_[i] = 0;</div><div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;  }</div><div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;</div><div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;  <span class="comment">// Version for when we know the size is larger.</span></div><div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;  <span class="keywordtype">void</span> fill_big(<span class="keywordtype">size_t</span> zero_pad_bytes) {</div><div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;    memset(make_space(zero_pad_bytes), 0, zero_pad_bytes);</div><div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;  }</div><div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;</div><div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;  <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="l00675"></a><span class="lineno">  675</span>&#160;  <span class="keywordtype">void</span> scratch_pop(<span class="keywordtype">size_t</span> bytes_to_remove) { scratch_ -= bytes_to_remove; }</div><div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;</div><div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;  <span class="comment">// You shouldn&#39;t really be copying instances of this class.</span></div><div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;  FLATBUFFERS_DELETE_FUNC(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &amp;))</div><div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;  FLATBUFFERS_DELETE_FUNC(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &amp;<span class="keyword">operator</span>=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &amp;))</div><div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;</div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;  <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator_;</div><div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;  <span class="keywordtype">bool</span> own_allocator_;</div><div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;  <span class="keywordtype">size_t</span> initial_size_;</div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;  <span class="keywordtype">size_t</span> buffer_minalign_;</div><div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;  <span class="keywordtype">size_t</span> reserved_;</div><div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;  uint8_t *buf_;</div><div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;  uint8_t *cur_;  <span class="comment">// Points at location between empty (below) and used (above).</span></div><div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;  uint8_t *scratch_;  <span class="comment">// Points to the end of the scratchpad in use.</span></div><div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;</div><div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;  <span class="keywordtype">void</span> reallocate(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;    <span class="keyword">auto</span> old_reserved = reserved_;</div><div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;    <span class="keyword">auto</span> old_size = size();</div><div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;    <span class="keyword">auto</span> old_scratch_size = scratch_size();</div><div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;    reserved_ += (std::max)(len,</div><div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;                            old_reserved ? old_reserved / 2 : initial_size_);</div><div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;    reserved_ = (reserved_ + buffer_minalign_ - 1) &amp; ~(buffer_minalign_ - 1);</div><div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;    <span class="keywordflow">if</span> (buf_) {</div><div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;      buf_ = ReallocateDownward(allocator_, buf_, old_reserved, reserved_,</div><div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;                                old_size, old_scratch_size);</div><div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;      buf_ = Allocate(allocator_, reserved_);</div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;    }</div><div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;    cur_ = buf_ + reserved_ - old_size;</div><div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;    scratch_ = buf_ + old_scratch_size;</div><div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;  }</div><div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;};</div><div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;</div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;<span class="comment">// Converts a Field ID to a virtual table offset.</span></div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;<span class="keyword">inline</span> voffset_t FieldIndexToOffset(voffset_t field_id) {</div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;  <span class="comment">// Should correspond to what EndTable() below builds up.</span></div><div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;  <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="l00713"></a><span class="lineno">  713</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>voffset_t<span class="keyword">&gt;</span>((field_id + fixed_fields) * <span class="keyword">sizeof</span>(voffset_t));</div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;}</div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;</div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> Alloc&gt;</div><div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;<span class="keyword">const</span> T *data(<span class="keyword">const</span> std::vector&lt;T, Alloc&gt; &amp;v) {</div><div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;  <span class="keywordflow">return</span> v.empty() ? nullptr : &amp;v.front();</div><div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;}</div><div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> Alloc&gt; T *data(std::vector&lt;T, Alloc&gt; &amp;v) {</div><div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;  <span class="keywordflow">return</span> v.empty() ? nullptr : &amp;v.front();</div><div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;}</div><div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;<span class="comment">/// @endcond</span></div><div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;<span class="comment">/// @addtogroup flatbuffers_cpp_api</span></div><div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;<span class="comment">/// @{</span></div><div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;<span class="comment">/// @class FlatBufferBuilder</span></div><div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;<span class="comment">/// @brief Helper class to hold data needed in creation of a FlatBuffer.</span></div><div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;<span class="comment">/// To serialize data, you typically call one of the `Create*()` functions in</span></div><div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;<span class="comment">/// the generated code, which in turn call a sequence of `StartTable`/</span></div><div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;<span class="comment">/// `PushElement`/`AddElement`/`EndTable`, or the builtin `CreateString`/</span></div><div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;<span class="comment">/// `CreateVector` functions. Do this is depth-first order to build up a tree to</span></div><div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;<span class="comment">/// the root. `Finish()` wraps up the buffer ready for transport.</span></div><div class="line"><a name="l00735"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html">  735</a></span>&#160;<span class="comment"></span><span class="keyword">class </span><a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> {</div><div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160; <span class="keyword">public</span>:<span class="comment"></span></div><div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;<span class="comment">  /// @brief Default constructor for FlatBufferBuilder.</span></div><div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;<span class="comment">  /// @param[in] initial_size The initial size of the buffer, in bytes. Defaults</span></div><div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;<span class="comment">  /// to `1024`.</span></div><div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;<span class="comment">  /// @param[in] allocator An `Allocator` to use. If null will use</span></div><div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;<span class="comment">  /// `DefaultAllocator`.</span></div><div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;<span class="comment">  /// @param[in] own_allocator Whether the builder/vector should own the</span></div><div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;<span class="comment">  /// allocator. Defaults to / `false`.</span></div><div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;<span class="comment">  /// @param[in] buffer_minalign Force the buffer to be aligned to the given</span></div><div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;<span class="comment">  /// minimum alignment upon reallocation. Only needed if you intend to store</span></div><div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;<span class="comment">  /// types with custom alignment AND you wish to read the buffer in-place</span></div><div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;<span class="comment">  /// directly after creation.</span></div><div class="line"><a name="l00748"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab0173786ea4ec3e4ae10555639b2996c">  748</a></span>&#160;<span class="comment"></span>  <span class="keyword">explicit</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab0173786ea4ec3e4ae10555639b2996c">FlatBufferBuilder</a>(<span class="keywordtype">size_t</span> initial_size = 1024,</div><div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;                             <a class="code" href="classflatbuffers_1_1_allocator.html">Allocator</a> *allocator = <span class="keyword">nullptr</span>,</div><div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;                             <span class="keywordtype">bool</span> own_allocator = <span class="keyword">false</span>,</div><div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;                             <span class="keywordtype">size_t</span> buffer_minalign =</div><div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;                                 AlignOf&lt;largest_scalar_t&gt;())</div><div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;      : buf_(initial_size, allocator, own_allocator, buffer_minalign),</div><div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;        num_field_loc(0),</div><div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;        max_voffset_(0),</div><div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;        nested(false),</div><div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;        finished(false),</div><div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;        minalign_(1),</div><div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;        force_defaults_(false),</div><div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;        dedup_vtables_(true),</div><div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;        string_pool(nullptr) {</div><div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;    EndianCheck();</div><div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;  }</div><div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;</div><div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;  ~<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a>() {</div><div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;    <span class="keywordflow">if</span> (string_pool) <span class="keyword">delete</span> string_pool;</div><div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;  }</div><div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;</div><div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;  <span class="keywordtype">void</span> Reset() {</div><div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;    Clear();       <span class="comment">// clear builder state</span></div><div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;    buf_.reset();  <span class="comment">// deallocate buffer</span></div><div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;  }</div><div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;<span class="comment">  /// @brief Reset all the state in this FlatBufferBuilder so it can be reused</span></div><div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;<span class="comment">  /// to construct another buffer.</span></div><div class="line"><a name="l00776"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412">  776</a></span>&#160;<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="l00777"></a><span class="lineno">  777</span>&#160;    ClearOffsets();</div><div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;    buf_.clear();</div><div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;    nested = <span class="keyword">false</span>;</div><div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;    finished = <span class="keyword">false</span>;</div><div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160;    minalign_ = 1;</div><div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;    <span class="keywordflow">if</span> (string_pool) string_pool-&gt;clear();</div><div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;  }</div><div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;<span class="comment">  /// @brief The current size of the serialized buffer, counting from the end.</span></div><div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;<span class="comment">  /// @return Returns an `uoffset_t` with the current size of the buffer.</span></div><div class="line"><a name="l00787"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a66c8fd33ab9b3b237954c9ea38648f7f">  787</a></span>&#160;<span class="comment"></span>  uoffset_t <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a66c8fd33ab9b3b237954c9ea38648f7f">GetSize</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> buf_.size(); }</div><div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;<span class="comment">  /// @brief Get the serialized buffer (after you call `Finish()`).</span></div><div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;<span class="comment">  /// @return Returns an `uint8_t` pointer to the FlatBuffer data inside the</span></div><div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;<span class="comment">  /// buffer.</span></div><div class="line"><a name="l00792"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab81ab8aa273c270b0942fd81489cad83">  792</a></span>&#160;<span class="comment"></span>  uint8_t *<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab81ab8aa273c270b0942fd81489cad83">GetBufferPointer</a>()<span class="keyword"> const </span>{</div><div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;    Finished();</div><div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;    <span class="keywordflow">return</span> buf_.data();</div><div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;  }</div><div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;<span class="comment">  /// @brief Get a pointer to an unfinished buffer.</span></div><div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;<span class="comment">  /// @return Returns a `uint8_t` pointer to the unfinished buffer.</span></div><div class="line"><a name="l00799"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a099810f03046139d1854d20a1c2a2e41">  799</a></span>&#160;<span class="comment"></span>  uint8_t *<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a099810f03046139d1854d20a1c2a2e41">GetCurrentBufferPointer</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> buf_.data(); }</div><div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;<span class="comment">  /// @brief Get the released pointer to the serialized buffer.</span></div><div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;<span class="comment">  /// @warning Do NOT attempt to use this FlatBufferBuilder afterwards!</span></div><div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;<span class="comment">  /// @return A `FlatBuffer` that owns the buffer and its allocator and</span></div><div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;<span class="comment">  /// behaves similar to a `unique_ptr` with a deleter.</span></div><div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;<span class="comment">  /// Deprecated: use Release() instead</span></div><div class="line"><a name="l00806"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8">  806</a></span>&#160;<span class="comment"></span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8">ReleaseBufferPointer</a>() {</div><div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;    Finished();</div><div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;    <span class="keywordflow">return</span> buf_.release();</div><div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;  }</div><div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;<span class="comment">  /// @brief Get the released DetachedBuffer.</span></div><div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;<span class="comment">  /// @return A `DetachedBuffer` that owns the buffer and its allocator.</span></div><div class="line"><a name="l00813"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45">  813</a></span>&#160;<span class="comment"></span>  <a class="code" href="classflatbuffers_1_1_detached_buffer.html">DetachedBuffer</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45">Release</a>() {</div><div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;    Finished();</div><div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;    <span class="keywordflow">return</span> buf_.release();</div><div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;  }</div><div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;<span class="comment">  /// @brief get the minimum alignment this buffer needs to be accessed</span></div><div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;<span class="comment">  /// properly. This is only known once all elements have been written (after</span></div><div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;<span class="comment">  /// you call Finish()). You can use this information if you need to embed</span></div><div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;<span class="comment">  /// a FlatBuffer in some other buffer, such that you can later read it</span></div><div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;<span class="comment">  /// without first having to copy it into its own buffer.</span></div><div class="line"><a name="l00823"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b">  823</a></span>&#160;<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="l00824"></a><span class="lineno">  824</span>&#160;    Finished();</div><div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;    <span class="keywordflow">return</span> minalign_;</div><div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;  }</div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;<span class="comment">  /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;<span class="comment"></span>  <span class="keywordtype">void</span> Finished()<span class="keyword"> const </span>{</div><div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;    <span class="comment">// If you get this assert, you&#39;re attempting to get access a buffer</span></div><div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;    <span class="comment">// which hasn&#39;t been finished yet. Be sure to call</span></div><div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;    <span class="comment">// FlatBufferBuilder::Finish with your root table.</span></div><div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;    <span class="comment">// If you really need to access an unfinished buffer, call</span></div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;    <span class="comment">// GetCurrentBufferPointer instead.</span></div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;    FLATBUFFERS_ASSERT(finished);</div><div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;  }<span class="comment"></span></div><div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;<span class="comment">  /// @endcond</span></div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;<span class="comment">  /// @brief In order to save space, fields that are set to their default value</span></div><div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;<span class="comment">  /// don&#39;t get serialized into the buffer.</span></div><div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;<span class="comment">  /// @param[in] bool fd When set to `true`, always serializes default values.</span></div><div class="line"><a name="l00842"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a">  842</a></span>&#160;<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="l00843"></a><span class="lineno">  843</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;<span class="comment">  /// @brief By default vtables are deduped in order to save space.</span></div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;<span class="comment">  /// @param[in] bool dedup When set to `true`, dedup vtables.</span></div><div class="line"><a name="l00846"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961">  846</a></span>&#160;<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="l00847"></a><span class="lineno">  847</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;<span class="comment">  /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;<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="l00850"></a><span class="lineno">  850</span>&#160;</div><div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;  <span class="keywordtype">void</span> TrackMinAlign(<span class="keywordtype">size_t</span> elem_size) {</div><div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;    <span class="keywordflow">if</span> (elem_size &gt; minalign_) minalign_ = elem_size;</div><div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;  }</div><div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;</div><div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;  <span class="keywordtype">void</span> Align(<span class="keywordtype">size_t</span> elem_size) {</div><div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;    TrackMinAlign(elem_size);</div><div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160;    buf_.fill(PaddingBytes(buf_.size(), elem_size));</div><div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;  }</div><div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;</div><div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;  <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="l00861"></a><span class="lineno">  861</span>&#160;    PushBytes(bytes, size);</div><div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;    finished = <span class="keyword">true</span>;</div><div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;  }</div><div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;</div><div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;  <span class="keywordtype">void</span> PushBytes(<span class="keyword">const</span> uint8_t *bytes, <span class="keywordtype">size_t</span> size) { buf_.push(bytes, size); }</div><div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;</div><div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;  <span class="keywordtype">void</span> PopBytes(<span class="keywordtype">size_t</span> amount) { buf_.pop(amount); }</div><div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;</div><div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> AssertScalarT() {</div><div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;    <span class="comment">// The code assumes power of 2 sizes and endian-swap-ability.</span></div><div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;    static_assert(flatbuffers::is_scalar&lt;T&gt;::value, <span class="stringliteral">&quot;T must be a scalar type&quot;</span>);</div><div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;  }</div><div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;</div><div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;  <span class="comment">// Write a single aligned scalar to the buffer</span></div><div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; uoffset_t PushElement(T element) {</div><div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;    AssertScalarT&lt;T&gt;();</div><div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;    T litle_endian_element = EndianScalar(element);</div><div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;    Align(<span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;    buf_.push_small(litle_endian_element);</div><div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;    <span class="keywordflow">return</span> GetSize();</div><div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;  }</div><div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;</div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; uoffset_t PushElement(<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> off) {</div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;    <span class="comment">// Special case for offsets: see ReferTo below.</span></div><div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;    <span class="keywordflow">return</span> PushElement(ReferTo(off.o));</div><div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;  }</div><div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;</div><div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;  <span class="comment">// When writing fields, we track where they are, so we can create correct</span></div><div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;  <span class="comment">// vtables later.</span></div><div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;  <span class="keywordtype">void</span> TrackField(voffset_t field, uoffset_t off) {</div><div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;    <a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a> fl = { off, field };</div><div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;    buf_.scratch_push_small(fl);</div><div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;    num_field_loc++;</div><div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;    max_voffset_ = (std::max)(max_voffset_, field);</div><div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;  }</div><div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;</div><div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;  <span class="comment">// Like PushElement, but additionally tracks the field this represents.</span></div><div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> AddElement(voffset_t field, T e, T def) {</div><div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;    <span class="comment">// We don&#39;t serialize values equal to the default.</span></div><div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;    <span class="keywordflow">if</span> (e == def &amp;&amp; !force_defaults_) <span class="keywordflow">return</span>;</div><div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;    <span class="keyword">auto</span> off = PushElement(e);</div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;    TrackField(field, off);</div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;  }</div><div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;</div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> AddOffset(voffset_t field, <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> off) {</div><div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;    <span class="keywordflow">if</span> (off.IsNull()) <span class="keywordflow">return</span>;  <span class="comment">// Don&#39;t store.</span></div><div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;    AddElement(field, ReferTo(off.o), static_cast&lt;uoffset_t&gt;(0));</div><div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;  }</div><div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;</div><div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> AddStruct(voffset_t field, <span class="keyword">const</span> T *structptr) {</div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;    <span class="keywordflow">if</span> (!structptr) <span class="keywordflow">return</span>;  <span class="comment">// Default, don&#39;t store.</span></div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;    Align(AlignOf&lt;T&gt;());</div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;    buf_.push_small(*structptr);</div><div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;    TrackField(field, GetSize());</div><div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;  }</div><div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;</div><div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;  <span class="keywordtype">void</span> AddStructOffset(voffset_t field, uoffset_t off) {</div><div class="line"><a name="l00918"></a><span class="lineno">  918</span>&#160;    TrackField(field, off);</div><div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;  }</div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;</div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;  <span class="comment">// Offsets initially are relative to the end of the buffer (downwards).</span></div><div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;  <span class="comment">// This function converts them to be relative to the current location</span></div><div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;  <span class="comment">// in the buffer (when stored here), pointing upwards.</span></div><div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;  uoffset_t ReferTo(uoffset_t off) {</div><div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;    <span class="comment">// Align to ensure GetSize() below is correct.</span></div><div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;    Align(<span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;    <span class="comment">// Offset must refer to something already in buffer.</span></div><div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;    FLATBUFFERS_ASSERT(off &amp;&amp; off &lt;= GetSize());</div><div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;    <span class="keywordflow">return</span> GetSize() - off + <span class="keyword">static_cast&lt;</span>uoffset_t<span class="keyword">&gt;</span>(<span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;  }</div><div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;</div><div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;  <span class="keywordtype">void</span> NotNested() {</div><div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;    <span class="comment">// If you hit this, you&#39;re trying to construct a Table/Vector/String</span></div><div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;    <span class="comment">// during the construction of its parent table (between the MyTableBuilder</span></div><div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;    <span class="comment">// and table.Finish().</span></div><div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;    <span class="comment">// Move the creation of these sub-objects to above the MyTableBuilder to</span></div><div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;    <span class="comment">// not get this assert.</span></div><div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;    <span class="comment">// Ignoring this assert may appear to work in simple cases, but the reason</span></div><div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;    <span class="comment">// it is here is that storing objects in-line may cause vtable offsets</span></div><div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;    <span class="comment">// to not fit anymore. It also leads to vtable duplication.</span></div><div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;    FLATBUFFERS_ASSERT(!nested);</div><div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;    <span class="comment">// If you hit this, fields were added outside the scope of a table.</span></div><div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;    FLATBUFFERS_ASSERT(!num_field_loc);</div><div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;  }</div><div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;</div><div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;  <span class="comment">// From generated code (or from the parser), we call StartTable/EndTable</span></div><div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;  <span class="comment">// with a sequence of AddElement calls in between.</span></div><div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;  uoffset_t StartTable() {</div><div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;    NotNested();</div><div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;    nested = <span class="keyword">true</span>;</div><div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160;    <span class="keywordflow">return</span> GetSize();</div><div class="line"><a name="l00952"></a><span class="lineno">  952</span>&#160;  }</div><div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;</div><div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;  <span class="comment">// This finishes one serialized object by generating the vtable if it&#39;s a</span></div><div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;  <span class="comment">// table, comparing it against existing vtables, and writing the</span></div><div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;  <span class="comment">// resulting vtable offset.</span></div><div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;  uoffset_t EndTable(uoffset_t start) {</div><div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;    <span class="comment">// If you get this assert, a corresponding StartTable wasn&#39;t called.</span></div><div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160;    FLATBUFFERS_ASSERT(nested);</div><div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;    <span class="comment">// Write the vtable offset, which is the start of any Table.</span></div><div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;    <span class="comment">// We fill it&#39;s value later.</span></div><div class="line"><a name="l00962"></a><span class="lineno">  962</span>&#160;    <span class="keyword">auto</span> vtableoffsetloc = PushElement&lt;soffset_t&gt;(0);</div><div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;    <span class="comment">// Write a vtable, which consists entirely of voffset_t elements.</span></div><div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160;    <span class="comment">// It starts with the number of offsets, followed by a type id, followed</span></div><div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;    <span class="comment">// by the offsets themselves. In reverse:</span></div><div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;    <span class="comment">// Include space for the last offset and ensure empty tables have a</span></div><div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;    <span class="comment">// minimum size.</span></div><div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;    max_voffset_ =</div><div class="line"><a name="l00969"></a><span class="lineno">  969</span>&#160;        (std::max)(static_cast&lt;voffset_t&gt;(max_voffset_ + <span class="keyword">sizeof</span>(voffset_t)),</div><div class="line"><a name="l00970"></a><span class="lineno">  970</span>&#160;                   FieldIndexToOffset(0));</div><div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;    buf_.fill_big(max_voffset_);</div><div class="line"><a name="l00972"></a><span class="lineno">  972</span>&#160;    <span class="keyword">auto</span> table_object_size = vtableoffsetloc - start;</div><div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;    <span class="comment">// Vtable use 16bit offsets.</span></div><div class="line"><a name="l00974"></a><span class="lineno">  974</span>&#160;    FLATBUFFERS_ASSERT(table_object_size &lt; 0x10000);</div><div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;    WriteScalar&lt;voffset_t&gt;(buf_.data() + <span class="keyword">sizeof</span>(voffset_t),</div><div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;                           static_cast&lt;voffset_t&gt;(table_object_size));</div><div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160;    WriteScalar&lt;voffset_t&gt;(buf_.data(), max_voffset_);</div><div class="line"><a name="l00978"></a><span class="lineno">  978</span>&#160;    <span class="comment">// Write the offsets into the table</span></div><div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = buf_.scratch_end() - num_field_loc * <span class="keyword">sizeof</span>(<a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a>);</div><div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;         it &lt; buf_.scratch_end(); it += <span class="keyword">sizeof</span>(<a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a>)) {</div><div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;      <span class="keyword">auto</span> field_location = <span class="keyword">reinterpret_cast&lt;</span><a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a> *<span class="keyword">&gt;</span>(it);</div><div class="line"><a name="l00982"></a><span class="lineno">  982</span>&#160;      <span class="keyword">auto</span> pos = <span class="keyword">static_cast&lt;</span>voffset_t<span class="keyword">&gt;</span>(vtableoffsetloc - field_location-&gt;off);</div><div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;      <span class="comment">// If this asserts, it means you&#39;ve set a field twice.</span></div><div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;      FLATBUFFERS_ASSERT(</div><div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;          !ReadScalar&lt;voffset_t&gt;(buf_.data() + field_location-&gt;id));</div><div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;      WriteScalar&lt;voffset_t&gt;(buf_.data() + field_location-&gt;id, pos);</div><div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;    }</div><div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;    ClearOffsets();</div><div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;    <span class="keyword">auto</span> vt1 = <span class="keyword">reinterpret_cast&lt;</span>voffset_t *<span class="keyword">&gt;</span>(buf_.data());</div><div class="line"><a name="l00990"></a><span class="lineno">  990</span>&#160;    <span class="keyword">auto</span> vt1_size = ReadScalar&lt;voffset_t&gt;(vt1);</div><div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160;    <span class="keyword">auto</span> vt_use = GetSize();</div><div class="line"><a name="l00992"></a><span class="lineno">  992</span>&#160;    <span class="comment">// See if we already have generated a vtable with this exact same</span></div><div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;    <span class="comment">// layout before. If so, make it point to the old one, remove this one.</span></div><div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;    <span class="keywordflow">if</span> (dedup_vtables_) {</div><div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;      <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = buf_.scratch_data(); it &lt; buf_.scratch_end();</div><div class="line"><a name="l00996"></a><span class="lineno">  996</span>&#160;           it += <span class="keyword">sizeof</span>(uoffset_t)) {</div><div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;        <span class="keyword">auto</span> vt_offset_ptr = <span class="keyword">reinterpret_cast&lt;</span>uoffset_t *<span class="keyword">&gt;</span>(it);</div><div class="line"><a name="l00998"></a><span class="lineno">  998</span>&#160;        <span class="keyword">auto</span> vt2 = <span class="keyword">reinterpret_cast&lt;</span>voffset_t *<span class="keyword">&gt;</span>(buf_.data_at(*vt_offset_ptr));</div><div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;        <span class="keyword">auto</span> vt2_size = *vt2;</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;        <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="l01001"></a><span class="lineno"> 1001</span>&#160;        vt_use = *vt_offset_ptr;</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;        buf_.pop(GetSize() - vtableoffsetloc);</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;      }</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;    }</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;    <span class="comment">// If this is a new vtable, remember it.</span></div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;    <span class="keywordflow">if</span> (vt_use == GetSize()) { buf_.scratch_push_small(vt_use); }</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;    <span class="comment">// Fill the vtable offset we created above.</span></div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160;    <span class="comment">// The offset points from the beginning of the object to where the</span></div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;    <span class="comment">// vtable is stored.</span></div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;    <span class="comment">// Offsets default direction is downward in memory for future format</span></div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160;    <span class="comment">// flexibility (storing all vtables at the start of the file).</span></div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160;    WriteScalar(buf_.data_at(vtableoffsetloc),</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;                <span class="keyword">static_cast&lt;</span>soffset_t<span class="keyword">&gt;</span>(vt_use) -</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160;                    static_cast&lt;soffset_t&gt;(vtableoffsetloc));</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160;</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160;    nested = <span class="keyword">false</span>;</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160;    <span class="keywordflow">return</span> vtableoffsetloc;</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;  }</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;  <span class="comment">// DEPRECATED: call the version above instead.</span></div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160;  uoffset_t EndTable(uoffset_t start, voffset_t <span class="comment">/*numfields*/</span>) {</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;    <span class="keywordflow">return</span> EndTable(start);</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;  }</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;  <span class="comment">// This checks a required field has been set in a given table that has</span></div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;  <span class="comment">// just been constructed.</span></div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> Required(<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> table, voffset_t field) {</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;    <span class="keyword">auto</span> table_ptr = buf_.data_at(table.o);</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;    <span class="keyword">auto</span> vtable_ptr = table_ptr - ReadScalar&lt;soffset_t&gt;(table_ptr);</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;    <span class="keywordtype">bool</span> ok = ReadScalar&lt;voffset_t&gt;(vtable_ptr + field) != 0;</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;    <span class="comment">// If this fails, the caller will show what field needs to be set.</span></div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;    FLATBUFFERS_ASSERT(ok);</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;    (void)ok;</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;  }</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;  uoffset_t StartStruct(<span class="keywordtype">size_t</span> alignment) {</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;    Align(alignment);</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;    <span class="keywordflow">return</span> GetSize();</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;  }</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;  uoffset_t EndStruct() { <span class="keywordflow">return</span> GetSize(); }</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;  <span class="keywordtype">void</span> ClearOffsets() {</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;    buf_.scratch_pop(num_field_loc * <span class="keyword">sizeof</span>(<a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a>));</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;    num_field_loc = 0;</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160;    max_voffset_ = 0;</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;  }</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;  <span class="comment">// Aligns such that when &quot;len&quot; bytes are written, an object can be written</span></div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;  <span class="comment">// after it with &quot;alignment&quot; without padding.</span></div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160;  <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="l01053"></a><span class="lineno"> 1053</span>&#160;    TrackMinAlign(alignment);</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;    buf_.fill(PaddingBytes(GetSize() + len, alignment));</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160;  }</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">void</span> PreAlign(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;    AssertScalarT&lt;T&gt;();</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;    PreAlign(len, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;  }<span class="comment"></span></div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160;<span class="comment">  /// @endcond</span></div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;<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="l01064"></a><span class="lineno"> 1064</span>&#160;<span class="comment">  /// @param[in] len The number of bytes that should be stored from `str`.</span></div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01066"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe"> 1066</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <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="l01067"></a><span class="lineno"> 1067</span>&#160;    NotNested();</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;    PreAlign&lt;uoffset_t&gt;(len + 1);  <span class="comment">// Always 0-terminated.</span></div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;    buf_.fill(1);</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;    PushBytes(reinterpret_cast&lt;const uint8_t *&gt;(str), len);</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;    PushElement(static_cast&lt;uoffset_t&gt;(len));</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a>(GetSize());</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;  }</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which is null-terminated.</span></div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;<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="l01077"></a><span class="lineno"> 1077</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01078"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5"> 1078</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <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="l01079"></a><span class="lineno"> 1079</span>&#160;    <span class="keywordflow">return</span> CreateString(str, strlen(str));</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;  }</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which is null-terminated.</span></div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;<span class="comment">  /// @param[in] str A char pointer to a C-string to add to the buffer.</span></div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01085"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154"> 1085</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154">CreateString</a>(<span class="keywordtype">char</span> *str) {</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;    <span class="keywordflow">return</span> CreateString(str, strlen(str));</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;  }</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;<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="l01091"></a><span class="lineno"> 1091</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01092"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f"> 1092</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f">CreateString</a>(<span class="keyword">const</span> std::string &amp;str) {</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;    <span class="keywordflow">return</span> CreateString(str.c_str(), str.length());</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160;  }</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;<span class="preprocessor">  #ifdef FLATBUFFERS_HAS_STRING_VIEW</span></div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;<span class="comment"></span><span class="comment">  /// @param[in] str A const string_view to copy in to the buffer.</span></div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;<span class="comment"></span><span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01101"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a9a3a955fbff1c69e944c3560460dd7a6"> 1101</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a9a3a955fbff1c69e944c3560460dd7a6">CreateString</a>(flatbuffers::string_view str) {</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;    <span class="keywordflow">return</span> CreateString(str.data(), str.size());</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;  }</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;<span class="preprocessor">  #endif // FLATBUFFERS_HAS_STRING_VIEW</span></div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160;<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="l01109"></a><span class="lineno"> 1109</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts</span></div><div class="line"><a name="l01110"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506"> 1110</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506">CreateString</a>(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> *str) {</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;    <span class="keywordflow">return</span> str ? CreateString(str-&gt;c_str(), str-&gt;Length()) : 0;</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;  }</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;<span class="comment">  /// @param[in] str A const reference to a std::string like type with support</span></div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;<span class="comment">  /// of T::c_str() and T::length() to store in the buffer.</span></div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01118"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685"> 1118</a></span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685">CreateString</a>(<span class="keyword">const</span> T &amp;str) {</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;    <span class="keywordflow">return</span> CreateString(str.c_str(), str.length());</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;  }</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;<span class="comment">  /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;<span class="comment">  /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;<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="l01126"></a><span class="lineno"> 1126</span>&#160;<span class="comment">  /// @param[in] len The number of bytes that should be stored from `str`.</span></div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01128"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1"> 1128</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <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="l01129"></a><span class="lineno"> 1129</span>&#160;    <span class="keywordflow">if</span> (!string_pool)</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;      string_pool = <span class="keyword">new</span> StringOffsetMap(<a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html">StringOffsetCompare</a>(buf_));</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160;    <span class="keyword">auto</span> size_before_string = buf_.size();</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;    <span class="comment">// Must first serialize the string, since the set is all offsets into</span></div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;    <span class="comment">// buffer.</span></div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;    <span class="keyword">auto</span> off = CreateString(str, len);</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;    <span class="keyword">auto</span> it = string_pool-&gt;find(off);</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;    <span class="comment">// If it exists we reuse existing serialized data!</span></div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160;    <span class="keywordflow">if</span> (it != string_pool-&gt;end()) {</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160;      <span class="comment">// We can remove the string we serialized.</span></div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;      buf_.pop(buf_.size() - size_before_string);</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160;      <span class="keywordflow">return</span> *it;</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;    }</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;    <span class="comment">// Record this string for future use.</span></div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;    string_pool-&gt;insert(off);</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;    <span class="keywordflow">return</span> off;</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;  }</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which null-terminated.</span></div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;<span class="comment">  /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;<span class="comment">  /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;<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="l01151"></a><span class="lineno"> 1151</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01152"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7"> 1152</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <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="l01153"></a><span class="lineno"> 1153</span>&#160;    <span class="keywordflow">return</span> CreateSharedString(str, strlen(str));</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160;  }</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;<span class="comment">  /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;<span class="comment">  /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;<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="l01160"></a><span class="lineno"> 1160</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts.</span></div><div class="line"><a name="l01161"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9"> 1161</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9">CreateSharedString</a>(<span class="keyword">const</span> std::string &amp;str) {</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;    <span class="keywordflow">return</span> CreateSharedString(str.c_str(), str.length());</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;  }</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;<span class="comment">  /// @brief Store a string in the buffer, which can contain any binary data.</span></div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;<span class="comment">  /// If a string with this exact contents has already been serialized before,</span></div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;<span class="comment">  /// instead simply returns the offset of the existing string.</span></div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;<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="l01169"></a><span class="lineno"> 1169</span>&#160;<span class="comment">  /// @return Returns the offset in the buffer where the string starts</span></div><div class="line"><a name="l01170"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3"> 1170</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3">CreateSharedString</a>(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> *str) {</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;    <span class="keywordflow">return</span> CreateSharedString(str-&gt;c_str(), str-&gt;Length());</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;  }</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;<span class="comment">  /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160;<span class="comment"></span>  uoffset_t EndVector(<span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160;    FLATBUFFERS_ASSERT(nested);  <span class="comment">// Hit if no corresponding StartVector.</span></div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;    nested = <span class="keyword">false</span>;</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;    <span class="keywordflow">return</span> PushElement(static_cast&lt;uoffset_t&gt;(len));</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;  }</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160;  <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="l01182"></a><span class="lineno"> 1182</span>&#160;    NotNested();</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;    nested = <span class="keyword">true</span>;</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;    PreAlign&lt;uoffset_t&gt;(len * elemsize);</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;    PreAlign(len * elemsize, elemsize);  <span class="comment">// Just in case elemsize &gt; uoffset_t.</span></div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;  }</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160;</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;  <span class="comment">// Call this right before StartVector/CreateVector if you want to force the</span></div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;  <span class="comment">// alignment to be something different than what the element size would</span></div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;  <span class="comment">// normally dictate.</span></div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;  <span class="comment">// This is useful when storing a nested_flatbuffer in a vector of bytes,</span></div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;  <span class="comment">// or when storing SIMD floats, etc.</span></div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;  <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="l01194"></a><span class="lineno"> 1194</span>&#160;    PreAlign(len * elemsize, alignment);</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;  }</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;<span class="comment">  /// @endcond</span></div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;<span class="comment">  /// @brief Serialize an array into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;<span class="comment">  /// @tparam T The data type of the array elements.</span></div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;<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="l01202"></a><span class="lineno"> 1202</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;<span class="comment">  /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01206"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3"> 1206</a></span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;T&gt;</a>&gt; <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="l01207"></a><span class="lineno"> 1207</span>&#160;    <span class="comment">// If this assert hits, you&#39;re specifying a template argument that is</span></div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;    <span class="comment">// causing the wrong overload to be selected, remove it.</span></div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;    AssertScalarT&lt;T&gt;();</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;    StartVector(len, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;    <span class="comment">// clang-format off</span></div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;<span class="preprocessor">    #if FLATBUFFERS_LITTLEENDIAN</span></div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;      PushBytes(reinterpret_cast&lt;const uint8_t *&gt;(v), len * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;      <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(T) == 1) {</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;        PushBytes(reinterpret_cast&lt;const uint8_t *&gt;(v), len);</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;      } <span class="keywordflow">else</span> {</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = len; i &gt; 0; ) {</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;          PushElement(v[--i]);</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;        }</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;      }</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160;    <span class="comment">// clang-format on</span></div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;T&gt;</a>&gt;(EndVector(len));</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;  }</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;Offset&lt;T&gt;</a>&gt;&gt; CreateVector(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> *v, <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160;    StartVector(len, <span class="keyword">sizeof</span>(<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a>));</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = len; i &gt; 0;) { PushElement(v[--i]); }</div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;Offset&lt;T&gt;</a>&gt;&gt;(EndVector(len));</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;  }</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160;<span class="comment">  /// @brief Serialize a `std::vector` into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160;<span class="comment">  /// @tparam T The data type of the `std::vector` elements.</span></div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;<span class="comment">  /// @param v A const reference to the `std::vector` to serialize into the</span></div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01240"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207"> 1240</a></span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;T&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207">CreateVector</a>(<span class="keyword">const</span> std::vector&lt;T&gt; &amp;v) {</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160;    <span class="keywordflow">return</span> CreateVector(data(v), v.size());</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160;  }</div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160;</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;  <span class="comment">// vector&lt;bool&gt; may be implemented using a bit-set, so we can&#39;t access it as</span></div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;  <span class="comment">// an array. Instead, read elements manually.</span></div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;  <span class="comment">// Background: https://isocpp.org/blog/2012/11/on-vectorbool</span></div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;uint8_t&gt;</a>&gt; CreateVector(<span class="keyword">const</span> std::vector&lt;bool&gt; &amp;v) {</div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;    StartVector(v.size(), <span class="keyword">sizeof</span>(uint8_t));</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> i = v.size(); i &gt; 0;) {</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;      PushElement(static_cast&lt;uint8_t&gt;(v[--i]));</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;    }</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;uint8_t&gt;</a>&gt;(EndVector(v.size()));</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;  }</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;<span class="preprocessor">  #ifndef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;<span class="comment">  /// @brief Serialize values returned by a function into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;<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="l01259"></a><span class="lineno"> 1259</span>&#160;<span class="comment"></span><span class="comment">  /// @tparam T The data type of the `std::vector` elements.</span></div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;<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="l01261"></a><span class="lineno"> 1261</span>&#160;<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="l01262"></a><span class="lineno"> 1262</span>&#160;<span class="comment"></span><span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;<span class="comment"></span><span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01264"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b"> 1264</a></span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;T&gt;</a>&gt; <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="l01265"></a><span class="lineno"> 1265</span>&#160;      <span class="keyword">const</span> std::function&lt;T (<span class="keywordtype">size_t</span> i)&gt; &amp;f) {</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;    std::vector&lt;T&gt; elems(vector_size);</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; vector_size; i++) elems[i] = f(i);</div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160;    <span class="keywordflow">return</span> CreateVector(elems);</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160;  }</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160;<span class="preprocessor">  #endif</span></div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>&#160;<span class="comment">  /// @brief Serialize values returned by a function into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;<span class="comment">  /// This is a convenience function that takes care of iteration for you.</span></div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;<span class="comment">  /// @tparam T The data type of the `std::vector` elements.</span></div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;<span class="comment">  /// @param f A function that takes the current iteration 0..vector_size-1,</span></div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;<span class="comment">  /// and the state parameter returning any type that you can construct a</span></div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;<span class="comment">  /// FlatBuffers vector out of.</span></div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;<span class="comment">  /// @param state State passed to f.</span></div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> F, <span class="keyword">typename</span> S&gt;</div><div class="line"><a name="l01283"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a53504fc2cab681a7980b03260f8b2f7a"> 1283</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;T&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a53504fc2cab681a7980b03260f8b2f7a">CreateVector</a>(<span class="keywordtype">size_t</span> vector_size, F f, S *state) {</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;    std::vector&lt;T&gt; elems(vector_size);</div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; vector_size; i++) elems[i] = f(i, state);</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;    <span class="keywordflow">return</span> CreateVector(elems);</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;  }</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;<span class="comment">  /// @brief Serialize a `std::vector&lt;std::string&gt;` into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;<span class="comment">  /// This is a convenience function for a common case.</span></div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>&#160;<span class="comment">  /// @param v A const reference to the `std::vector` to serialize into the</span></div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01295"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6"> 1295</a></span>&#160;<span class="comment"></span>  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;Offset&lt;String&gt;</a>&gt;&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6">CreateVectorOfStrings</a>(</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160;      <span class="keyword">const</span> std::vector&lt;std::string&gt; &amp;v) {</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160;    std::vector&lt;Offset&lt;String&gt;&gt; offsets(v.size());</div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; v.size(); i++) offsets[i] = CreateString(v[i]);</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160;    <span class="keywordflow">return</span> CreateVector(offsets);</div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160;  }</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;<span class="comment">  /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160;<span class="comment">  /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160;<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="l01305"></a><span class="lineno"> 1305</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;<span class="comment">  /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01310"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7"> 1310</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7">CreateVectorOfStructs</a>(<span class="keyword">const</span> T *v, <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;    StartVector(len * <span class="keyword">sizeof</span>(T) / AlignOf&lt;T&gt;(), AlignOf&lt;T&gt;());</div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;    PushBytes(reinterpret_cast&lt;const uint8_t *&gt;(v), <span class="keyword">sizeof</span>(T) * len);</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt;(EndVector(len));</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160;  }</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;<span class="comment">  /// @brief Serialize an array of native structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;<span class="comment">  /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;<span class="comment">  /// @tparam S The data type of the native struct array elements.</span></div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;<span class="comment">  /// @param[in] v A pointer to the array of type `S` to serialize into the</span></div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;<span class="comment">  /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> S&gt;</div><div class="line"><a name="l01325"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a3d57074082aaab8cdeb8474ff9df0b53"> 1325</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a3d57074082aaab8cdeb8474ff9df0b53">CreateVectorOfNativeStructs</a>(<span class="keyword">const</span> S *v,</div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;                                                        <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;    <span class="keyword">extern</span> T Pack(<span class="keyword">const</span> S &amp;);</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160;    <span class="keyword">typedef</span> T (*Pack_t)(<span class="keyword">const</span> S &amp;);</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160;    std::vector&lt;T&gt; vv(len);</div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160;    std::transform(v, v + len, vv.begin(), *(Pack_t)&amp;Pack);</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfStructs&lt;T&gt;(vv.data(), vv.size());</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160;  }</div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160;</div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160;<span class="preprocessor">  #ifndef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160;<span class="comment">  /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;<span class="comment"></span><span class="comment">  /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160;<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="l01339"></a><span class="lineno"> 1339</span>&#160;<span class="comment"></span><span class="comment">  /// and a pointer to the struct that must be filled.</span></div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160;<span class="comment"></span><span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160;<span class="comment"></span><span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160;<span class="comment"></span><span class="comment">  /// This is mostly useful when flatbuffers are generated with mutation</span></div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;<span class="comment"></span><span class="comment">  /// accessors.</span></div><div class="line"><a name="l01344"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72"> 1344</a></span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72">CreateVectorOfStructs</a>(</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160;      <span class="keywordtype">size_t</span> vector_size, <span class="keyword">const</span> std::function&lt;<span class="keywordtype">void</span>(<span class="keywordtype">size_t</span> i, T *)&gt; &amp;filler) {</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160;    T* structs = StartVectorOfStructs&lt;T&gt;(vector_size);</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; vector_size; i++) {</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;      filler(i, structs);</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;      structs++;</div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160;    }</div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160;    <span class="keywordflow">return</span> EndVectorOfStructs&lt;T&gt;(vector_size);</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;  }</div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160;<span class="preprocessor">  #endif</span></div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;<span class="comment">  /// @brief Serialize an array of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;<span class="comment">  /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160;<span class="comment">  /// @param[in] f A function that takes the current iteration 0..vector_size-1,</span></div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;<span class="comment">  /// a pointer to the struct that must be filled and the state argument.</span></div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160;<span class="comment">  /// @param[in] state Arbitrary state to pass to f.</span></div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;<span class="comment">  /// This is mostly useful when flatbuffers are generated with mutation</span></div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;<span class="comment">  /// accessors.</span></div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> F, <span class="keyword">typename</span> S&gt;</div><div class="line"><a name="l01366"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a9cc09fa59ff9732e972877cfe911c8a5"> 1366</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a9cc09fa59ff9732e972877cfe911c8a5">CreateVectorOfStructs</a>(<span class="keywordtype">size_t</span> vector_size, F f,</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160;                                                  S *state) {</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160;    T *structs = StartVectorOfStructs&lt;T&gt;(vector_size);</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; vector_size; i++) {</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;      f(i, structs, state);</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160;      structs++;</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160;    }</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;    <span class="keywordflow">return</span> EndVectorOfStructs&lt;T&gt;(vector_size);</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;  }</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160;<span class="comment">  /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`.</span></div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160;<span class="comment">  /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160;<span class="comment">  /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160;<span class="comment">  /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> Alloc&gt;</div><div class="line"><a name="l01383"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a110c2a3298aebef1a9dfa3c44ee84f42"> 1383</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a110c2a3298aebef1a9dfa3c44ee84f42">CreateVectorOfStructs</a>(</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160;      <span class="keyword">const</span> std::vector&lt;T, Alloc&gt; &amp;v) {</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfStructs(data(v), v.size());</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;  }</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;<span class="comment">  /// @brief Serialize a `std::vector` of native structs into a FlatBuffer</span></div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160;<span class="comment">  /// `vector`.</span></div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160;<span class="comment">  /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160;<span class="comment">  /// @tparam S The data type of the `std::vector` native struct elements.</span></div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160;<span class="comment">  /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160;<span class="comment">  /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> S&gt;</div><div class="line"><a name="l01397"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95"> 1397</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95">CreateVectorOfNativeStructs</a>(</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;      <span class="keyword">const</span> std::vector&lt;S&gt; &amp;v) {</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfNativeStructs&lt;T, S&gt;(data(v), v.size());</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;  }</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160;<span class="comment">  /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span>StructKeyComparator {</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> T &amp;a, <span class="keyword">const</span> T &amp;b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;      <span class="keywordflow">return</span> a.KeyCompareLessThan(&amp;b);</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;    }</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160;   <span class="keyword">private</span>:</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;    StructKeyComparator &amp;operator=(<span class="keyword">const</span> StructKeyComparator &amp;);</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160;  };<span class="comment"></span></div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160;<span class="comment">  /// @endcond</span></div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;<span class="comment">  /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`</span></div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;<span class="comment">  /// in sorted order.</span></div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;<span class="comment">  /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;<span class="comment">  /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160;<span class="comment">  /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01421"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15"> 1421</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15">CreateVectorOfSortedStructs</a>(std::vector&lt;T&gt; *v) {</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfSortedStructs(data(*v), v-&gt;size());</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160;  }</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;<span class="comment">  /// @brief Serialize a `std::vector` of native structs into a FlatBuffer</span></div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;<span class="comment">  /// `vector` in sorted order.</span></div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;<span class="comment">  /// @tparam T The data type of the `std::vector` struct elements.</span></div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160;<span class="comment">  /// @tparam S The data type of the `std::vector` native struct elements.</span></div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;<span class="comment">  /// @param[in]] v A const reference to the `std::vector` of structs to</span></div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;<span class="comment">  /// serialize into the buffer as a `vector`.</span></div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> S&gt;</div><div class="line"><a name="l01434"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54"> 1434</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54">CreateVectorOfSortedNativeStructs</a>(</div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160;      std::vector&lt;S&gt; *v) {</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfSortedNativeStructs&lt;T, S&gt;(data(*v), v-&gt;size());</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;  }</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160;<span class="comment">  /// @brief Serialize an array of structs into a FlatBuffer `vector` in sorted</span></div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;<span class="comment">  /// order.</span></div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;<span class="comment">  /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160;<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="l01443"></a><span class="lineno"> 1443</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;<span class="comment">  /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01448"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ab1f44cc1b130e13b41e9a80de76e25cf"> 1448</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ab1f44cc1b130e13b41e9a80de76e25cf">CreateVectorOfSortedStructs</a>(T *v, <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160;    std::sort(v, v + len, StructKeyComparator&lt;T&gt;());</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfStructs(v, len);</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160;  }</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160;<span class="comment">  /// @brief Serialize an array of native structs into a FlatBuffer `vector` in</span></div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;<span class="comment">  /// sorted order.</span></div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160;<span class="comment">  /// @tparam T The data type of the struct array elements.</span></div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160;<span class="comment">  /// @tparam S The data type of the native struct array elements.</span></div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;<span class="comment">  /// @param[in] v A pointer to the array of type `S` to serialize into the</span></div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160;<span class="comment">  /// buffer as a `vector`.</span></div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160;<span class="comment">  /// @param[in] len The number of elements to serialize.</span></div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> S&gt;</div><div class="line"><a name="l01463"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf"> 1463</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf">CreateVectorOfSortedNativeStructs</a>(S *v,</div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160;                                                              <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;    <span class="keyword">extern</span> T Pack(<span class="keyword">const</span> S &amp;);</div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160;    <span class="keyword">typedef</span> T (*Pack_t)(<span class="keyword">const</span> S &amp;);</div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;    std::vector&lt;T&gt; vv(len);</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;    std::transform(v, v + len, vv.begin(), *(Pack_t)&amp;Pack);</div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfSortedStructs&lt;T&gt;(vv, len);</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;  }</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;<span class="comment">  /// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span>TableKeyComparator {</div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160;    TableKeyComparator(<a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &amp;buf) : buf_(buf) {}</div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> &amp;a, <span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> &amp;b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;      <span class="keyword">auto</span> table_a = <span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(buf_.data_at(a.o));</div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160;      <span class="keyword">auto</span> table_b = <span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(buf_.data_at(b.o));</div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160;      <span class="keywordflow">return</span> table_a-&gt;KeyCompareLessThan(table_b);</div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160;    }</div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;    <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &amp;buf_;</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;   <span class="keyword">private</span>:</div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;    TableKeyComparator &amp;operator=(<span class="keyword">const</span> TableKeyComparator &amp;);</div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;  };<span class="comment"></span></div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;<span class="comment">  /// @endcond</span></div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;<span class="comment">  /// @brief Serialize an array of `table` offsets as a `vector` in the buffer</span></div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;<span class="comment">  /// in sorted order.</span></div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;<span class="comment">  /// @tparam T The data type that the offset refers to.</span></div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;<span class="comment">  /// @param[in] v An array of type `Offset&lt;T&gt;` that contains the `table`</span></div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;<span class="comment">  /// offsets to store in the buffer in sorted order.</span></div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160;<span class="comment">  /// @param[in] len The number of elements to store in the `vector`.</span></div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01496"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6"> 1496</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;Offset&lt;T&gt;</a>&gt;&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6">CreateVectorOfSortedTables</a>(<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> *v,</div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;                                                       <span class="keywordtype">size_t</span> len) {</div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;    std::sort(v, v + len, TableKeyComparator&lt;T&gt;(buf_));</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;    <span class="keywordflow">return</span> CreateVector(v, len);</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;  }</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;<span class="comment">  /// @brief Serialize an array of `table` offsets as a `vector` in the buffer</span></div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;<span class="comment">  /// in sorted order.</span></div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;<span class="comment">  /// @tparam T The data type that the offset refers to.</span></div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160;<span class="comment">  /// @param[in] v An array of type `Offset&lt;T&gt;` that contains the `table`</span></div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160;<span class="comment">  /// offsets to store in the buffer in sorted order.</span></div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;<span class="comment">  /// @return Returns a typed `Offset` into the serialized data indicating</span></div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;<span class="comment">  /// where the vector is stored.</span></div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01510"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135"> 1510</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;Offset&lt;T&gt;</a>&gt;&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135">CreateVectorOfSortedTables</a>(</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;      std::vector&lt;<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a>&gt; *v) {</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;    <span class="keywordflow">return</span> CreateVectorOfSortedTables(data(*v), v-&gt;size());</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;  }</div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160;<span class="comment">  /// @brief Specialized version of `CreateVector` for non-copying use cases.</span></div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160;<span class="comment">  /// Write the data any time later to the returned buffer pointer `buf`.</span></div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;<span class="comment">  /// @param[in] len The number of elements to store in the `vector`.</span></div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;<span class="comment">  /// @param[in] elemsize The size of each element in the `vector`.</span></div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;<span class="comment">  /// @param[out] buf A pointer to a `uint8_t` pointer that can be</span></div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160;<span class="comment">  /// written to at a later time to serialize the data into a `vector`</span></div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160;<span class="comment">  /// in the buffer.</span></div><div class="line"><a name="l01522"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c"> 1522</a></span>&#160;<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="l01523"></a><span class="lineno"> 1523</span>&#160;                                      uint8_t **buf) {</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;    NotNested();</div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;    StartVector(len, elemsize);</div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160;    buf_.make_space(len * elemsize);</div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;    <span class="keyword">auto</span> vec_start = GetSize();</div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;    <span class="keyword">auto</span> vec_end = EndVector(len);</div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;    *buf = buf_.data_at(vec_start);</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;    <span class="keywordflow">return</span> vec_end;</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;  }</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;<span class="comment">  /// @brief Specialized version of `CreateVector` for non-copying use cases.</span></div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;<span class="comment">  /// Write the data any time later to the returned buffer pointer `buf`.</span></div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160;<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="l01536"></a><span class="lineno"> 1536</span>&#160;<span class="comment">  /// as a `vector`.</span></div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160;<span class="comment">  /// @param[in] len The number of elements to store in the `vector`.</span></div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;<span class="comment">  /// @param[out] buf A pointer to a pointer of type `T` that can be</span></div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160;<span class="comment">  /// written to at a later time to serialize the data into a `vector`</span></div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160;<span class="comment">  /// in the buffer.</span></div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01542"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50"> 1542</a></span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;T&gt;</a>&gt; <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50">CreateUninitializedVector</a>(<span class="keywordtype">size_t</span> len, T **buf) {</div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160;    AssertScalarT&lt;T&gt;();</div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160;    <span class="keywordflow">return</span> CreateUninitializedVector(len, <span class="keyword">sizeof</span>(T),</div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160;                                     reinterpret_cast&lt;uint8_t **&gt;(buf));</div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160;  }</div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;<span class="comment">  /// @brief Write a struct by itself, typically to be part of a union.</span></div><div class="line"><a name="l01549"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8"> 1549</a></span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;const T *&gt;</a> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8">CreateStruct</a>(<span class="keyword">const</span> T &amp;structobj) {</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;    NotNested();</div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;    Align(AlignOf&lt;T&gt;());</div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160;    buf_.push_small(structobj);</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;const T *&gt;</a>(GetSize());</div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160;  }</div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160;<span class="comment">  /// @brief The length of a FlatBuffer file header.</span></div><div class="line"><a name="l01557"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19"> 1557</a></span>&#160;<span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> kFileIdentifierLength = 4;</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;<span class="comment">  /// @brief Finish serializing a buffer by writing the root offset.</span></div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160;<span class="comment">  /// @param[in] file_identifier If a `file_identifier` is given, the buffer</span></div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160;<span class="comment">  /// will be prefixed with a standard FlatBuffers file header.</span></div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01563"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912"> 1563</a></span>&#160;  <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912">Finish</a>(<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> root, <span class="keyword">const</span> <span class="keywordtype">char</span> *file_identifier = <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160;    Finish(root.o, file_identifier, <span class="keyword">false</span>);</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160;  }</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160;<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="l01568"></a><span class="lineno"> 1568</span>&#160;<span class="comment">  /// buffer following the size field). These buffers are NOT compatible</span></div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160;<span class="comment">  /// with standard buffers created by Finish, i.e. you can&#39;t call GetRoot</span></div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160;<span class="comment">  /// on them, you have to use GetSizePrefixedRoot instead.</span></div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160;<span class="comment">  /// All &gt;32 bit quantities in this buffer will be aligned when the whole</span></div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>&#160;<span class="comment">  /// size pre-fixed buffer is aligned.</span></div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>&#160;<span class="comment">  /// These kinds of buffers are useful for creating a stream of FlatBuffers.</span></div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160;<span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01575"></a><span class="lineno"><a class="line" href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220"> 1575</a></span>&#160;  <span class="keywordtype">void</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220">FinishSizePrefixed</a>(<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> root,</div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160;                          <span class="keyword">const</span> <span class="keywordtype">char</span> *file_identifier = <span class="keyword">nullptr</span>) {</div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160;    Finish(root.o, file_identifier, <span class="keyword">true</span>);</div><div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160;  }</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160;</div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160; <span class="keyword">protected</span>:</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160;  <span class="comment">// You shouldn&#39;t really be copying instances of this class.</span></div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160;  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &amp;);</div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160;  <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &amp;operator=(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &amp;);</div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160;</div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160;  <span class="keywordtype">void</span> Finish(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="l01586"></a><span class="lineno"> 1586</span>&#160;    NotNested();</div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160;    buf_.clear_scratch();</div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;    <span class="comment">// This will cause the whole buffer to be aligned.</span></div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160;    PreAlign((size_prefix ? <span class="keyword">sizeof</span>(uoffset_t) : 0) + <span class="keyword">sizeof</span>(uoffset_t) +</div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160;                 (file_identifier ? kFileIdentifierLength : 0),</div><div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160;             minalign_);</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;    <span class="keywordflow">if</span> (file_identifier) {</div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160;      FLATBUFFERS_ASSERT(strlen(file_identifier) == kFileIdentifierLength);</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;      PushBytes(reinterpret_cast&lt;const uint8_t *&gt;(file_identifier),</div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160;                kFileIdentifierLength);</div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160;    }</div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160;    PushElement(ReferTo(root));  <span class="comment">// Location of root.</span></div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>&#160;    <span class="keywordflow">if</span> (size_prefix) { PushElement(GetSize()); }</div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>&#160;    finished = <span class="keyword">true</span>;</div><div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160;  }</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160;</div><div class="line"><a name="l01602"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html"> 1602</a></span>&#160;  <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">FieldLoc</a> {</div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160;    uoffset_t off;</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160;    voffset_t id;</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160;  };</div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160;</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;  <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> buf_;</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160;</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160;  <span class="comment">// Accumulating offsets of table members while it is being built.</span></div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160;  <span class="comment">// We store these in the scratch pad of buf_, after the vtable offsets.</span></div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160;  uoffset_t num_field_loc;</div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160;  <span class="comment">// Track how much of the vtable is in use, so we can output the most compact</span></div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160;  <span class="comment">// possible vtable.</span></div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>&#160;  voffset_t max_voffset_;</div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160;</div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160;  <span class="comment">// Ensure objects are not nested.</span></div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>&#160;  <span class="keywordtype">bool</span> nested;</div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160;</div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160;  <span class="comment">// Ensure the buffer is finished before it is being accessed.</span></div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160;  <span class="keywordtype">bool</span> finished;</div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160;</div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160;  <span class="keywordtype">size_t</span> minalign_;</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160;</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160;  <span class="keywordtype">bool</span> force_defaults_;  <span class="comment">// Serialize values equal to their defaults anyway.</span></div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160;</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160;  <span class="keywordtype">bool</span> dedup_vtables_;</div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160;</div><div class="line"><a name="l01628"></a><span class="lineno"><a class="line" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html"> 1628</a></span>&#160;  <span class="keyword">struct </span><a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html">StringOffsetCompare</a> {</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160;    <a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html">StringOffsetCompare</a>(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> &amp;buf) : buf_(&amp;buf) {}</div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> &amp;a, <span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a> &amp;b)<span class="keyword"> const </span>{</div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160;      <span class="keyword">auto</span> stra = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> *<span class="keyword">&gt;</span>(buf_-&gt;data_at(a.o));</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160;      <span class="keyword">auto</span> strb = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><a class="code" href="structflatbuffers_1_1_string.html">String</a> *<span class="keyword">&gt;</span>(buf_-&gt;data_at(b.o));</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160;      <span class="keywordflow">return</span> strncmp(stra-&gt;c_str(), strb-&gt;c_str(),</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160;                     (std::min)(stra-&gt;size(), strb-&gt;size()) + 1) &lt; 0;</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160;    }</div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>&#160;    <span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1vector__downward.html">vector_downward</a> *buf_;</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160;  };</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>&#160;</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>&#160;  <span class="comment">// For use with CreateSharedString. Instantiated on first use only.</span></div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160;  <span class="keyword">typedef</span> std::set&lt;Offset&lt;String&gt;, <a class="code" href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html">StringOffsetCompare</a>&gt; StringOffsetMap;</div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>&#160;  StringOffsetMap *string_pool;</div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160;</div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160;  <span class="comment">// Allocates space for a vector of structures.</span></div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160;  <span class="comment">// Must be completed with EndVectorOfStructs().</span></div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; T *StartVectorOfStructs(<span class="keywordtype">size_t</span> vector_size) {</div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>&#160;    StartVector(vector_size * <span class="keyword">sizeof</span>(T) / AlignOf&lt;T&gt;(), AlignOf&lt;T&gt;());</div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(buf_.make_space(vector_size * <span class="keyword">sizeof</span>(T)));</div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>&#160;  }</div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>&#160;</div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>&#160;  <span class="comment">// End the vector of structues in the flatbuffers.</span></div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160;  <span class="comment">// Vector should have previously be started with StartVectorOfStructs().</span></div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160;  <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt; EndVectorOfStructs(<span class="keywordtype">size_t</span> vector_size) {</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;Vector&lt;const T *&gt;</a>&gt;(EndVector(vector_size));</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160;  }</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160;};<span class="comment"></span></div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160;<span class="comment">/// @}</span></div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160;<span class="comment"></span><span class="comment"></span></div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>&#160;<span class="comment">/// @cond FLATBUFFERS_INTERNAL</span></div><div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>&#160;<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="l01662"></a><span class="lineno"> 1662</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; T *GetMutableRoot(<span class="keywordtype">void</span> *buf) {</div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160;  EndianCheck();</div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(</div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160;      <span class="keyword">reinterpret_cast&lt;</span>uint8_t *<span class="keyword">&gt;</span>(buf) +</div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160;      EndianScalar(*reinterpret_cast&lt;uoffset_t *&gt;(buf)));</div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160;}</div><div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>&#160;</div><div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">const</span> T *GetRoot(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf) {</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160;  <span class="keywordflow">return</span> GetMutableRoot&lt;T&gt;(<span class="keyword">const_cast&lt;</span><span class="keywordtype">void</span> *<span class="keyword">&gt;</span>(buf));</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160;}</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160;</div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">const</span> T *GetSizePrefixedRoot(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf) {</div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160;  <span class="keywordflow">return</span> GetRoot&lt;T&gt;(<span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(buf) + <span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160;}</div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;<span class="comment">/// Helpers to get a typed pointer to objects that are currently being built.</span></div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160;<span class="comment">/// @warning Creating new objects will lead to reallocations and invalidates</span></div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160;<span class="comment">/// the pointer!</span></div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160;<span class="comment"></span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>&#160;T *GetMutableTemporaryPointer(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &amp;fbb, <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> offset) {</div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>T *<span class="keyword">&gt;</span>(fbb.<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a099810f03046139d1854d20a1c2a2e41">GetCurrentBufferPointer</a>() + fbb.<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#a66c8fd33ab9b3b237954c9ea38648f7f">GetSize</a>() -</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160;                               offset.o);</div><div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>&#160;}</div><div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>&#160;</div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160;<span class="keyword">const</span> T *GetTemporaryPointer(<a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a> &amp;fbb, <a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a> offset) {</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160;  <span class="keywordflow">return</span> GetMutableTemporaryPointer&lt;T&gt;(fbb, offset);</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;}</div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160;<span class="comment">/// @brief Get a pointer to the the file_identifier section of the buffer.</span></div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160;<span class="comment">/// @return Returns a const char pointer to the start of the file_identifier</span></div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160;<span class="comment">/// characters in the buffer.  The returned char * has length</span></div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>&#160;<span class="comment">/// &#39;flatbuffers::FlatBufferBuilder::kFileIdentifierLength&#39;.</span></div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160;<span class="comment">/// This function is UNDEFINED for FlatBuffers whose schema does not include</span></div><div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160;<span class="comment">/// a file_identifier (likely points at padding or the start of a the root</span></div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160;<span class="comment">/// vtable).</span></div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>&#160;<span class="comment"></span><span class="keyword">inline</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *GetBufferIdentifier(<span class="keyword">const</span> <span class="keywordtype">void</span> *buf, <span class="keywordtype">bool</span> size_prefixed = <span class="keyword">false</span>) {</div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">char</span> *<span class="keyword">&gt;</span>(buf) +</div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160;         ((size_prefixed) ? 2 * <span class="keyword">sizeof</span>(uoffset_t) : <span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160;}</div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160;</div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>&#160;<span class="comment">// Helper to see if the identifier in a buffer has the expected value.</span></div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160;<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, <span class="keywordtype">bool</span> size_prefixed = <span class="keyword">false</span>) {</div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160;  <span class="keywordflow">return</span> strncmp(GetBufferIdentifier(buf, size_prefixed), identifier,</div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160;                 <a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19">FlatBufferBuilder::kFileIdentifierLength</a>) == 0;</div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160;}</div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>&#160;</div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>&#160;<span class="comment">// Helper class to verify the integrity of a FlatBuffer</span></div><div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>&#160;<span class="keyword">class </span>Verifier FLATBUFFERS_FINAL_CLASS {</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160;  Verifier(<span class="keyword">const</span> uint8_t *buf, <span class="keywordtype">size_t</span> buf_len, uoffset_t _max_depth = 64,</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160;           uoffset_t _max_tables = 1000000)</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160;      : buf_(buf),</div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>&#160;        end_(buf + buf_len),</div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160;        depth_(0),</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160;        max_depth_(_max_depth),</div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160;        num_tables_(0),</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;        max_tables_(_max_tables)</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160;    <span class="preprocessor">#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160;        , upper_bound_(buf)</div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160;    <span class="preprocessor">#endif</span></div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160;  {</div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160;  }</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160;</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;  <span class="comment">// Central location where any verification failures register.</span></div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;  <span class="keywordtype">bool</span> Check(<span class="keywordtype">bool</span> ok)<span class="keyword"> const </span>{</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;    <span class="comment">// clang-format off</span></div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;<span class="preprocessor">    #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE</span></div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160;      FLATBUFFERS_ASSERT(ok);</div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160;<span class="preprocessor">    #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160;      <span class="keywordflow">if</span> (!ok)</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>&#160;        upper_bound_ = buf_;</div><div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160;    <span class="comment">// clang-format on</span></div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160;    <span class="keywordflow">return</span> ok;</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>&#160;  }</div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>&#160;</div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160;  <span class="comment">// Verify any range within the buffer.</span></div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160;  <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="l01744"></a><span class="lineno"> 1744</span>&#160;    <span class="comment">// clang-format off</span></div><div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>&#160;<span class="preprocessor">    #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>&#160;      <span class="keyword">auto</span> upper_bound = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(elem) + elem_len;</div><div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>&#160;      <span class="keywordflow">if</span> (upper_bound_ &lt; upper_bound)</div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160;        upper_bound_ =  upper_bound;</div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160;    <span class="comment">// clang-format on</span></div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160;    <span class="keywordflow">return</span> Check(elem_len &lt;= (<span class="keywordtype">size_t</span>)(end_ - buf_) &amp;&amp; elem &gt;= buf_ &amp;&amp;</div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>&#160;                 elem &lt;= end_ - elem_len);</div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>&#160;  }</div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>&#160;</div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160;  <span class="comment">// Verify a range indicated by sizeof(T).</span></div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <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="l01757"></a><span class="lineno"> 1757</span>&#160;    <span class="keywordflow">return</span> Verify(elem, <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160;  }</div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160;</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160;  <span class="comment">// Verify a pointer (may be NULL) of a table type.</span></div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> VerifyTable(<span class="keyword">const</span> T *table) {</div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160;    <span class="keywordflow">return</span> !table || table-&gt;Verify(*<span class="keyword">this</span>);</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160;  }</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160;  <span class="comment">// Verify a pointer (may be NULL) of any vector type.</span></div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;T&gt;</a> *vec)<span class="keyword"> const </span>{</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160;    <span class="keyword">const</span> uint8_t *end;</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160;    <span class="keywordflow">return</span> !vec || VerifyVector(reinterpret_cast&lt;const uint8_t *&gt;(vec),</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160;                                <span class="keyword">sizeof</span>(T), &amp;end);</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160;  }</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160;</div><div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160;  <span class="comment">// Verify a pointer (may be NULL) of a vector to struct.</span></div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;const T *&gt;</a> *vec)<span class="keyword"> const </span>{</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;    <span class="keywordflow">return</span> Verify(<span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span><a class="code" href="classflatbuffers_1_1_vector.html">Vector&lt;T&gt;</a> *<span class="keyword">&gt;</span>(vec));</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;  }</div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;</div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160;  <span class="comment">// Verify a pointer (may be NULL) to string.</span></div><div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160;  <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> <a class="code" href="structflatbuffers_1_1_string.html">String</a> *str)<span class="keyword"> const </span>{</div><div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160;    <span class="keyword">const</span> uint8_t *end;</div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160;    <span class="keywordflow">return</span> !str ||</div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160;           (VerifyVector(reinterpret_cast&lt;const uint8_t *&gt;(str), 1, &amp;end) &amp;&amp;</div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160;            Verify(end, 1) &amp;&amp;      <span class="comment">// Must have terminator</span></div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160;            Check(*end == <span class="charliteral">&#39;\0&#39;</span>));  <span class="comment">// Terminating byte must be 0.</span></div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160;  }</div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160;</div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160;  <span class="comment">// Common code between vectors and strings.</span></div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160;  <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="l01788"></a><span class="lineno"> 1788</span>&#160;                    <span class="keyword">const</span> uint8_t **end)<span class="keyword"> const </span>{</div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160;    <span class="comment">// Check we can read the size field.</span></div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160;    <span class="keywordflow">if</span> (!Verify&lt;uoffset_t&gt;(vec)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160;    <span class="comment">// Check the whole array. If this is a string, the byte past the array</span></div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;    <span class="comment">// must be 0.</span></div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160;    <span class="keyword">auto</span> size = ReadScalar&lt;uoffset_t&gt;(vec);</div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160;    <span class="keyword">auto</span> max_elems = FLATBUFFERS_MAX_BUFFER_SIZE / elem_size;</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;    <span class="keywordflow">if</span> (!Check(size &lt; max_elems))</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;      <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="l01797"></a><span class="lineno"> 1797</span>&#160;    <span class="keyword">auto</span> byte_size = <span class="keyword">sizeof</span>(size) + elem_size * size;</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;    *end = vec + byte_size;</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;    <span class="keywordflow">return</span> Verify(vec, byte_size);</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;  }</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160;</div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160;  <span class="comment">// Special case for string contents, after the above has been called.</span></div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160;  <span class="keywordtype">bool</span> VerifyVectorOfStrings(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>&lt;<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;String&gt;</a>&gt; *vec)<span class="keyword"> const </span>{</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;    <span class="keywordflow">if</span> (vec) {</div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160;      <span class="keywordflow">for</span> (uoffset_t i = 0; i &lt; vec-&gt;size(); i++) {</div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160;        <span class="keywordflow">if</span> (!Verify(vec-&gt;Get(i))) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160;      }</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;    }</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;  }</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160;  <span class="comment">// Special case for table contents, after the above has been called.</span></div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> VerifyVectorOfTables(<span class="keyword">const</span> <a class="code" href="classflatbuffers_1_1_vector.html">Vector</a>&lt;<a class="code" href="structflatbuffers_1_1_offset.html">Offset&lt;T&gt;</a>&gt; *vec) {</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;    <span class="keywordflow">if</span> (vec) {</div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160;      <span class="keywordflow">for</span> (uoffset_t i = 0; i &lt; vec-&gt;size(); i++) {</div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160;        <span class="keywordflow">if</span> (!vec-&gt;Get(i)-&gt;Verify(*<span class="keyword">this</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160;      }</div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160;    }</div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160;  }</div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160;</div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160;  <span class="keywordtype">bool</span> VerifyBufferFromStart(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier, <span class="keyword">const</span> uint8_t *start) {</div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160;    <span class="keywordflow">if</span> (identifier &amp;&amp;</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160;        (<span class="keywordtype">size_t</span>(end_ - start) &lt; 2 * <span class="keyword">sizeof</span>(flatbuffers::uoffset_t) ||</div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160;         !BufferHasIdentifier(start, identifier))) {</div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160;      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160;    }</div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160;</div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160;    <span class="comment">// Call T::Verify, which must be in the generated code for this type.</span></div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;    <span class="keyword">auto</span> o = VerifyOffset(start);</div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;    <span class="keywordflow">return</span> o &amp;&amp; <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>T *<span class="keyword">&gt;</span>(start + o)-&gt;Verify(*<span class="keyword">this</span>)</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160;<span class="preprocessor">#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160;           &amp;&amp; GetComputedSize()</div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160;        ;</div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160;  }</div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160;</div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160;  <span class="comment">// Verify this whole buffer, starting with root type T.</span></div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> VerifyBuffer() { <span class="keywordflow">return</span> VerifyBuffer&lt;T&gt;(<span class="keyword">nullptr</span>); }</div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>&#160;</div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> VerifyBuffer(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160;    <span class="keywordflow">return</span> VerifyBufferFromStart&lt;T&gt;(identifier, buf_);</div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160;  }</div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160;</div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> VerifySizePrefixedBuffer(<span class="keyword">const</span> <span class="keywordtype">char</span> *identifier) {</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160;    <span class="keywordflow">return</span> Verify&lt;uoffset_t&gt;(buf_) &amp;&amp;</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160;           ReadScalar&lt;uoffset_t&gt;(buf_) == end_ - buf_ - <span class="keyword">sizeof</span>(uoffset_t) &amp;&amp;</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>&#160;           VerifyBufferFromStart&lt;T&gt;(identifier, buf_ + <span class="keyword">sizeof</span>(uoffset_t));</div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160;  }</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160;</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160;  uoffset_t VerifyOffset(<span class="keyword">const</span> uint8_t *start)<span class="keyword"> const </span>{</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160;    <span class="keywordflow">if</span> (!Verify&lt;uoffset_t&gt;(start)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160;    <span class="keyword">auto</span> o = ReadScalar&lt;uoffset_t&gt;(start);</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>&#160;    Check(o != 0);</div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160;    <span class="keywordflow">return</span> o;</div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160;  }</div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>&#160;</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160;  <span class="comment">// Called at the start of a table to increase counters measuring data</span></div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160;  <span class="comment">// structure depth and amount, and possibly bails out with false if</span></div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160;  <span class="comment">// limits set by the constructor have been hit. Needs to be balanced</span></div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160;  <span class="comment">// with EndTable().</span></div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>&#160;  <span class="keywordtype">bool</span> VerifyComplexity() {</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160;    depth_++;</div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160;    num_tables_++;</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160;    <span class="keywordflow">return</span> Check(depth_ &lt;= max_depth_ &amp;&amp; num_tables_ &lt;= max_tables_);</div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>&#160;  }</div><div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>&#160;</div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160;  <span class="comment">// Called at the end of a table to pop the depth count.</span></div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>&#160;  <span class="keywordtype">bool</span> EndTable() {</div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160;    depth_--;</div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>&#160;  }</div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>&#160;</div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>&#160;<span class="preprocessor">  #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160;  <span class="comment">// Returns the message size in bytes</span></div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>&#160;  <span class="keywordtype">size_t</span> GetComputedSize()<span class="keyword"> const </span>{</div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>&#160;    uintptr_t size = upper_bound_ - buf_;</div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>&#160;    <span class="comment">// Align the size to uoffset_t</span></div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160;    size = (size - 1 + <span class="keyword">sizeof</span>(uoffset_t)) &amp; ~(<span class="keyword">sizeof</span>(uoffset_t) - 1);</div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160;    <span class="keywordflow">return</span> (buf_  + size &gt; end_) ?  0 : size;</div><div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>&#160;  }</div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>&#160;<span class="preprocessor">  #endif</span></div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>&#160;</div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>&#160;  <span class="keyword">const</span> uint8_t *buf_;</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>&#160;  <span class="keyword">const</span> uint8_t *end_;</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>&#160;  uoffset_t depth_;</div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>&#160;  uoffset_t max_depth_;</div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>&#160;  uoffset_t num_tables_;</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160;  uoffset_t max_tables_;</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160;  <span class="comment">// clang-format off</span></div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160;<span class="preprocessor">  #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE</span></div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160;    <span class="keyword">mutable</span> <span class="keyword">const</span> uint8_t *upper_bound_;</div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160;<span class="preprocessor">  #endif</span></div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>&#160;  <span class="comment">// clang-format on</span></div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160;};</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160;</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160;<span class="comment">// Convenient way to bundle a buffer and its length, to pass it around</span></div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160;<span class="comment">// typed by its root.</span></div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160;<span class="comment">// A BufferRef does not own its buffer.</span></div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160;<span class="keyword">struct </span>BufferRefBase {};  <span class="comment">// for std::is_base_of</span></div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">struct </span>BufferRef : BufferRefBase {</div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160;  BufferRef() : buf(<span class="keyword">nullptr</span>), len(0), must_free(<span class="keyword">false</span>) {}</div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160;  BufferRef(uint8_t *_buf, uoffset_t _len)</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160;      : buf(_buf), len(_len), must_free(<span class="keyword">false</span>) {}</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160;</div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160;  ~BufferRef() {</div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160;    <span class="keywordflow">if</span> (must_free) free(buf);</div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>&#160;  }</div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160;</div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160;  <span class="keyword">const</span> T *GetRoot()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> flatbuffers::GetRoot&lt;T&gt;(buf); }</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160;</div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>&#160;  <span class="keywordtype">bool</span> Verify() {</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160;    Verifier verifier(buf, len);</div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160;    <span class="keywordflow">return</span> verifier.VerifyBuffer&lt;T&gt;(<span class="keyword">nullptr</span>);</div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>&#160;  }</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160;</div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160;  uint8_t *buf;</div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160;  uoffset_t len;</div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160;  <span class="keywordtype">bool</span> must_free;</div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160;};</div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160;</div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160;<span class="comment">// &quot;structs&quot; are flat structures that do not have an offset table, thus</span></div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160;<span class="comment">// always have all members present and do not support forwards/backwards</span></div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160;<span class="comment">// compatible extensions.</span></div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160;</div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160;<span class="keyword">class </span>Struct FLATBUFFERS_FINAL_CLASS {</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; T GetField(uoffset_t o)<span class="keyword"> const </span>{</div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160;    <span class="keywordflow">return</span> ReadScalar&lt;T&gt;(&amp;data_[o]);</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;  }</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160;</div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; T GetStruct(uoffset_t o)<span class="keyword"> const </span>{</div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span>T<span class="keyword">&gt;</span>(&amp;data_[o]);</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;  }</div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160;</div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160;  <span class="keyword">const</span> uint8_t *GetAddressOf(uoffset_t o)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &amp;data_[o]; }</div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;  uint8_t *GetAddressOf(uoffset_t o) { <span class="keywordflow">return</span> &amp;data_[o]; }</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160;  uint8_t data_[1];</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;};</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160;</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160;<span class="comment">// &quot;tables&quot; use an offset table (possibly shared) that allows fields to be</span></div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160;<span class="comment">// omitted and added at will, but uses an extra indirection to read.</span></div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160;<span class="keyword">class </span>Table {</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160;  <span class="keyword">const</span> uint8_t *GetVTable()<span class="keyword"> const </span>{</div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160;    <span class="keywordflow">return</span> data_ - ReadScalar&lt;soffset_t&gt;(data_);</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160;  }</div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160;</div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160;  <span class="comment">// This gets the field offset for any of the functions below it, or 0</span></div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160;  <span class="comment">// if the field was not present.</span></div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160;  voffset_t GetOptionalFieldOffset(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160;    <span class="comment">// The vtable offset is always at the start.</span></div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160;    <span class="keyword">auto</span> vtable = GetVTable();</div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160;    <span class="comment">// The first element is the size of the vtable (fields + type id + itself).</span></div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>&#160;    <span class="keyword">auto</span> vtsize = ReadScalar&lt;voffset_t&gt;(vtable);</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160;    <span class="comment">// If the field we&#39;re accessing is outside the vtable, we&#39;re reading older</span></div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160;    <span class="comment">// data, so it&#39;s the same as if the offset was 0 (not present).</span></div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160;    <span class="keywordflow">return</span> field &lt; vtsize ? ReadScalar&lt;voffset_t&gt;(vtable + field) : 0;</div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160;  }</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160;</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; T GetField(voffset_t field, T defaultval)<span class="keyword"> const </span>{</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160;    <span class="keywordflow">return</span> field_offset ? ReadScalar&lt;T&gt;(data_ + field_offset) : defaultval;</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160;  }</div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160;</div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> P&gt; P GetPointer(voffset_t field) {</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160;    <span class="keyword">auto</span> p = data_ + field_offset;</div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160;    <span class="keywordflow">return</span> field_offset ? <span class="keyword">reinterpret_cast&lt;</span>P<span class="keyword">&gt;</span>(p + ReadScalar&lt;uoffset_t&gt;(p))</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160;                        : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160;  }</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> P&gt; P GetPointer(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span>Table *<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;GetPointer&lt;P&gt;(field);</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160;  }</div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160;</div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> P&gt; P GetStruct(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160;    <span class="keyword">auto</span> p = <span class="keyword">const_cast&lt;</span>uint8_t *<span class="keyword">&gt;</span>(data_ + field_offset);</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160;    <span class="keywordflow">return</span> field_offset ? <span class="keyword">reinterpret_cast&lt;</span>P<span class="keyword">&gt;</span>(p) : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;  }</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> SetField(voffset_t field, T val, T def) {</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160;    <span class="keywordflow">if</span> (!field_offset) <span class="keywordflow">return</span> val == def;</div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;    WriteScalar(data_ + field_offset, val);</div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>&#160;  }</div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>&#160;</div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>&#160;  <span class="keywordtype">bool</span> SetPointer(voffset_t field, <span class="keyword">const</span> uint8_t *val) {</div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>&#160;    <span class="keywordflow">if</span> (!field_offset) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>&#160;    WriteScalar(data_ + field_offset,</div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>&#160;                static_cast&lt;uoffset_t&gt;(val - (data_ + field_offset)));</div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160;  }</div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>&#160;</div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>&#160;  uint8_t *GetAddressOf(voffset_t field) {</div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>&#160;    <span class="keywordflow">return</span> field_offset ? data_ + field_offset : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160;  }</div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160;  <span class="keyword">const</span> uint8_t *GetAddressOf(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span>Table *<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;GetAddressOf(field);</div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160;  }</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160;</div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>&#160;  <span class="keywordtype">bool</span> CheckField(voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>&#160;    <span class="keywordflow">return</span> GetOptionalFieldOffset(field) != 0;</div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>&#160;  }</div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>&#160;</div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>&#160;  <span class="comment">// Verify the vtable of this table.</span></div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>&#160;  <span class="comment">// Call this once per table, followed by VerifyField once per field.</span></div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>&#160;  <span class="keywordtype">bool</span> VerifyTableStart(Verifier &amp;verifier)<span class="keyword"> const </span>{</div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160;    <span class="comment">// Check the vtable offset.</span></div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160;    <span class="keywordflow">if</span> (!verifier.Verify&lt;soffset_t&gt;(data_)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160;    <span class="keyword">auto</span> vtable = GetVTable();</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160;    <span class="comment">// Check the vtable size field, then check vtable fits in its entirety.</span></div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160;    <span class="keywordflow">return</span> verifier.VerifyComplexity() &amp;&amp; verifier.Verify&lt;voffset_t&gt;(vtable) &amp;&amp;</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160;           (ReadScalar&lt;voffset_t&gt;(vtable) &amp; (<span class="keyword">sizeof</span>(voffset_t) - 1)) == 0 &amp;&amp;</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>&#160;           verifier.Verify(vtable, ReadScalar&lt;voffset_t&gt;(vtable));</div><div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>&#160;  }</div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160;</div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160;  <span class="comment">// Verify a particular field.</span></div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160;  <span class="keywordtype">bool</span> VerifyField(<span class="keyword">const</span> Verifier &amp;verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160;    <span class="comment">// Calling GetOptionalFieldOffset should be safe now thanks to</span></div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160;    <span class="comment">// VerifyTable().</span></div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160;    <span class="comment">// Check the actual field.</span></div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160;    <span class="keywordflow">return</span> !field_offset || verifier.Verify&lt;T&gt;(data_ + field_offset);</div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160;  }</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160;</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;  <span class="comment">// VerifyField for required fields.</span></div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160;  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160;  <span class="keywordtype">bool</span> VerifyFieldRequired(<span class="keyword">const</span> Verifier &amp;verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;    <span class="keywordflow">return</span> verifier.Check(field_offset != 0) &amp;&amp;</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;           verifier.Verify&lt;T&gt;(data_ + field_offset);</div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160;  }</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;  <span class="comment">// Versions for offsets.</span></div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;  <span class="keywordtype">bool</span> VerifyOffset(<span class="keyword">const</span> Verifier &amp;verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160;    <span class="keywordflow">return</span> !field_offset || verifier.VerifyOffset(data_ + field_offset);</div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160;  }</div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>&#160;</div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160;  <span class="keywordtype">bool</span> VerifyOffsetRequired(<span class="keyword">const</span> Verifier &amp;verifier, voffset_t field)<span class="keyword"> const </span>{</div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160;    <span class="keyword">auto</span> field_offset = GetOptionalFieldOffset(field);</div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160;    <span class="keywordflow">return</span> verifier.Check(field_offset != 0) &amp;&amp;</div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160;           verifier.VerifyOffset(data_ + field_offset);</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;  }</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;</div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;  <span class="comment">// private constructor &amp; copy constructor: you obtain instances of this</span></div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;  <span class="comment">// class by pointing to existing data only</span></div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;  Table();</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160;  Table(<span class="keyword">const</span> Table &amp;other);</div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160;</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160;  uint8_t data_[1];</div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160;};</div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160;<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="l02067"></a><span class="lineno"> 2067</span>&#160;<span class="comment">/// it is the opposite transformation of GetRoot().</span></div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160;<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="l02069"></a><span class="lineno"> 2069</span>&#160;<span class="comment">/// delete the buffer afterwards.</span></div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160;<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="l02071"></a><span class="lineno"> 2071</span>&#160;  <span class="keyword">auto</span> table = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>Table *<span class="keyword">&gt;</span>(root);</div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160;  <span class="keyword">auto</span> vtable = table-&gt;GetVTable();</div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160;  <span class="comment">// Either the vtable is before the root or after the root.</span></div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160;  <span class="keyword">auto</span> start = (std::min)(vtable, reinterpret_cast&lt;const uint8_t *&gt;(root));</div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160;  <span class="comment">// Align to at least sizeof(uoffset_t).</span></div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160;  start = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(<span class="keyword">reinterpret_cast&lt;</span>uintptr_t<span class="keyword">&gt;</span>(start) &amp;</div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160;                                            ~(<span class="keyword">sizeof</span>(uoffset_t) - 1));</div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160;  <span class="comment">// Additionally, there may be a file_identifier in the buffer, and the root</span></div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160;  <span class="comment">// offset. The buffer may have been aligned to any size between</span></div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160;  <span class="comment">// sizeof(uoffset_t) and FLATBUFFERS_MAX_ALIGNMENT (see &quot;force_align&quot;).</span></div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160;  <span class="comment">// Sadly, the exact alignment is only known when constructing the buffer,</span></div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160;  <span class="comment">// since it depends on the presence of values with said alignment properties.</span></div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;  <span class="comment">// So instead, we simply look at the next uoffset_t values (root,</span></div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;  <span class="comment">// file_identifier, and alignment padding) to see which points to the root.</span></div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160;  <span class="comment">// None of the other values can &quot;impersonate&quot; the root since they will either</span></div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>&#160;  <span class="comment">// be 0 or four ASCII characters.</span></div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160;  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="l02088"></a><span class="lineno"> 2088</span>&#160;                <span class="stringliteral">&quot;file_identifier is assumed to be the same size as uoffset_t&quot;</span>);</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160;  <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="l02090"></a><span class="lineno"> 2090</span>&#160;       possible_roots; possible_roots--) {</div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160;    start -= <span class="keyword">sizeof</span>(uoffset_t);</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160;    <span class="keywordflow">if</span> (ReadScalar&lt;uoffset_t&gt;(start) + start ==</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>&#160;        <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>uint8_t *<span class="keyword">&gt;</span>(root))</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>&#160;      <span class="keywordflow">return</span> start;</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160;  }</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>&#160;  <span class="comment">// We didn&#39;t find the root, either the &quot;root&quot; passed isn&#39;t really a root,</span></div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160;  <span class="comment">// or the buffer is corrupt.</span></div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>&#160;  <span class="comment">// Assert, because calling this function with bad data may cause reads</span></div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>&#160;  <span class="comment">// outside of buffer boundaries.</span></div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>&#160;  FLATBUFFERS_ASSERT(<span class="keyword">false</span>);</div><div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>&#160;}</div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>&#160;<span class="comment">/// @brief This return the prefixed size of a FlatBuffer.</span></div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160;<span class="comment"></span><span class="keyword">inline</span> uoffset_t GetPrefixedSize(<span class="keyword">const</span> uint8_t* buf){ <span class="keywordflow">return</span> ReadScalar&lt;uoffset_t&gt;(buf); }</div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>&#160;</div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>&#160;<span class="comment">// Base class for native objects (FlatBuffer data de-serialized into native</span></div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>&#160;<span class="comment">// C++ data structures).</span></div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>&#160;<span class="comment">// Contains no functionality, purely documentative.</span></div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160;<span class="keyword">struct </span>NativeTable {};</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160;<span class="comment">/// @brief Function types to be used with resolving hashes into objects and</span></div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160;<span class="comment">/// back again. The resolver gets a pointer to a field inside an object API</span></div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160;<span class="comment">/// object that is of the type specified in the schema using the attribute</span></div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>&#160;<span class="comment">/// `cpp_type` (it is thus important whatever you write to this address</span></div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160;<span class="comment">/// matches that type). The value of this field is initially null, so you</span></div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>&#160;<span class="comment">/// may choose to implement a delayed binding lookup using this function</span></div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>&#160;<span class="comment">/// if you wish. The resolver does the opposite lookup, for when the object</span></div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160;<span class="comment">/// is being serialized again.</span></div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>&#160;<span class="comment"></span><span class="keyword">typedef</span> uint64_t hash_value_t;</div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>&#160;<span class="comment">// clang-format off</span></div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>&#160;<span class="preprocessor">#ifdef FLATBUFFERS_CPP98_STL</span></div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>&#160;  <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="l02124"></a><span class="lineno"> 2124</span>&#160;  <span class="keyword">typedef</span> hash_value_t (*rehasher_function_t)(<span class="keywordtype">void</span> *pointer);</div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>&#160;  <span class="keyword">typedef</span> std::function&lt;void (void **pointer_adr, hash_value_t hash)&gt;</div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>&#160;          resolver_function_t;</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160;  <span class="keyword">typedef</span> std::function&lt;hash_value_t (void *pointer)&gt; rehasher_function_t;</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;<span class="comment">// clang-format on</span></div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>&#160;</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>&#160;<span class="comment">// Helper function to test if a field is present, using any of the field</span></div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>&#160;<span class="comment">// enums in the generated code.</span></div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160;<span class="comment">// `table` must be a generated table type. Since this is a template parameter,</span></div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160;<span class="comment">// this is not typechecked to be a subclass of Table, so beware!</span></div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>&#160;<span class="comment">// Note: this function will return false for fields equal to the default</span></div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>&#160;<span class="comment">// value, since they&#39;re not stored in the buffer (unless force_defaults was</span></div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>&#160;<span class="comment">// used).</span></div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keywordtype">bool</span> IsFieldPresent(<span class="keyword">const</span> T *table, voffset_t field) {</div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>&#160;  <span class="comment">// Cast, since Table is a private baseclass of any table types.</span></div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160;  <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>Table *<span class="keyword">&gt;</span>(table)-&gt;CheckField(field);</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160;}</div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160;</div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160;<span class="comment">// Utility function for reverse lookups on the EnumNames*() functions</span></div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160;<span class="comment">// (in the generated C++ code)</span></div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160;<span class="comment">// names must be NULL terminated.</span></div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>&#160;<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="l02148"></a><span class="lineno"> 2148</span>&#160;  <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="l02149"></a><span class="lineno"> 2149</span>&#160;    <span class="keywordflow">if</span> (!strcmp(*p, name)) <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">int</span><span class="keyword">&gt;</span>(p - names);</div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>&#160;  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>&#160;}</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>&#160;</div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>&#160;<span class="comment">// These macros allow us to layout a struct with a guarantee that they&#39;ll end</span></div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160;<span class="comment">// up looking the same on different compilers and platforms.</span></div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>&#160;<span class="comment">// It does this by disallowing the compiler to do any padding, and then</span></div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>&#160;<span class="comment">// does padding itself by inserting extra padding fields that make every</span></div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160;<span class="comment">// element aligned to its own size.</span></div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>&#160;<span class="comment">// Additionally, it manually sets the alignment of the struct as a whole,</span></div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160;<span class="comment">// which is typically its largest element, or a custom size set in the schema</span></div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160;<span class="comment">// by the force_align attribute.</span></div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>&#160;<span class="comment">// These are used in the generated code only.</span></div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>&#160;</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>&#160;<span class="comment">// clang-format off</span></div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160;<span class="preprocessor">#if defined(_MSC_VER)</span></div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>&#160;<span class="preprocessor">  #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \</span></div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>&#160;<span class="preprocessor">    __pragma(pack(1)); \</span></div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>&#160;<span class="preprocessor">    struct __declspec(align(alignment))</span></div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>&#160;<span class="preprocessor">  #define FLATBUFFERS_STRUCT_END(name, size) \</span></div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>&#160;<span class="preprocessor">    __pragma(pack()); \</span></div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>&#160;<span class="preprocessor">    static_assert(sizeof(name) == size, &quot;compiler breaks packing rules&quot;)</span></div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>&#160;<span class="preprocessor">#elif defined(__GNUC__) || defined(__clang__)</span></div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>&#160;<span class="preprocessor">  #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \</span></div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>&#160;<span class="preprocessor">    _Pragma(&quot;pack(1)&quot;) \</span></div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>&#160;<span class="preprocessor">    struct __attribute__((aligned(alignment)))</span></div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>&#160;<span class="preprocessor">  #define FLATBUFFERS_STRUCT_END(name, size) \</span></div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>&#160;<span class="preprocessor">    _Pragma(&quot;pack()&quot;) \</span></div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>&#160;<span class="preprocessor">    static_assert(sizeof(name) == size, &quot;compiler breaks packing rules&quot;)</span></div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>&#160;<span class="preprocessor">  #error Unknown compiler, please define structure alignment macros</span></div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>&#160;<span class="comment">// clang-format on</span></div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>&#160;</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160;<span class="comment">// Minimal reflection via code generation.</span></div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>&#160;<span class="comment">// Besides full-fat reflection (see reflection.h) and parsing/printing by</span></div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>&#160;<span class="comment">// loading schemas (see idl.h), we can also have code generation for mimimal</span></div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>&#160;<span class="comment">// reflection data which allows pretty-printing and other uses without needing</span></div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>&#160;<span class="comment">// a schema or a parser.</span></div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>&#160;<span class="comment">// Generate code with --reflect-types (types only) or --reflect-names (names</span></div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>&#160;<span class="comment">// also) to enable.</span></div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>&#160;<span class="comment">// See minireflect.h for utilities using this functionality.</span></div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>&#160;</div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>&#160;<span class="comment">// These types are organized slightly differently as the ones in idl.h.</span></div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>&#160;<span class="keyword">enum</span> SequenceType { ST_TABLE, ST_STRUCT, ST_UNION, ST_ENUM };</div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>&#160;</div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>&#160;<span class="comment">// Scalars have the same order as in idl.h</span></div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>&#160;<span class="comment">// clang-format off</span></div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>&#160;<span class="preprocessor">#define FLATBUFFERS_GEN_ELEMENTARY_TYPES(ET) \</span></div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>&#160;<span class="preprocessor">  ET(ET_UTYPE) \</span></div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160;<span class="preprocessor">  ET(ET_BOOL) \</span></div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;<span class="preprocessor">  ET(ET_CHAR) \</span></div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>&#160;<span class="preprocessor">  ET(ET_UCHAR) \</span></div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>&#160;<span class="preprocessor">  ET(ET_SHORT) \</span></div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160;<span class="preprocessor">  ET(ET_USHORT) \</span></div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>&#160;<span class="preprocessor">  ET(ET_INT) \</span></div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>&#160;<span class="preprocessor">  ET(ET_UINT) \</span></div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>&#160;<span class="preprocessor">  ET(ET_LONG) \</span></div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>&#160;<span class="preprocessor">  ET(ET_ULONG) \</span></div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>&#160;<span class="preprocessor">  ET(ET_FLOAT) \</span></div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>&#160;<span class="preprocessor">  ET(ET_DOUBLE) \</span></div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>&#160;<span class="preprocessor">  ET(ET_STRING) \</span></div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>&#160;<span class="preprocessor">  ET(ET_SEQUENCE)  // See SequenceType.</span></div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>&#160;</div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>&#160;<span class="keyword">enum</span> ElementaryType {</div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>&#160;<span class="preprocessor">  #define FLATBUFFERS_ET(E) E,</span></div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>&#160;    FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET)</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>&#160;  <span class="preprocessor">#undef FLATBUFFERS_ET</span></div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>&#160;};</div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>&#160;</div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>&#160;<span class="keyword">inline</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> *ElementaryTypeNames() {</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>&#160;  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> names[] = {</div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>&#160;<span class="preprocessor">    #define FLATBUFFERS_ET(E) #E,</span></div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>&#160;      FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET)</div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>&#160;    <span class="preprocessor">#undef FLATBUFFERS_ET</span></div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>&#160;  };</div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>&#160;  <span class="keywordflow">return</span> names;</div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>&#160;}</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160;<span class="comment">// clang-format on</span></div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160;</div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160;<span class="comment">// Basic type info cost just 16bits per field!</span></div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;<span class="keyword">struct </span>TypeCode {</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160;  uint16_t base_type : 4;  <span class="comment">// ElementaryType</span></div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>&#160;  uint16_t is_vector : 1;</div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>&#160;  int16_t sequence_ref : 11;  <span class="comment">// Index into type_refs below, or -1 for none.</span></div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>&#160;};</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>&#160;</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>&#160;static_assert(<span class="keyword">sizeof</span>(TypeCode) == 2, <span class="stringliteral">&quot;TypeCode&quot;</span>);</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>&#160;</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>&#160;<span class="keyword">struct </span>TypeTable;</div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>&#160;</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>&#160;<span class="comment">// Signature of the static method present in each type.</span></div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>&#160;<span class="keyword">typedef</span> <span class="keyword">const</span> TypeTable *(*TypeFunction)();</div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>&#160;</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>&#160;<span class="keyword">struct </span>TypeTable {</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>&#160;  SequenceType st;</div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>&#160;  <span class="keywordtype">size_t</span> num_elems;  <span class="comment">// of each of the arrays below.</span></div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>&#160;  <span class="keyword">const</span> TypeCode *type_codes;</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160;  <span class="keyword">const</span> TypeFunction *type_refs;</div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>&#160;  <span class="keyword">const</span> int32_t *values;  <span class="comment">// Only set for non-consecutive enum/union or structs.</span></div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>&#160;  <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> *names;     <span class="comment">// Only set if compiled with --reflect-names.</span></div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>&#160;};</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160;</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>&#160;<span class="comment">// String which identifies the current version of FlatBuffers.</span></div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>&#160;<span class="comment">// flatbuffer_version_string is used by Google developers to identify which</span></div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>&#160;<span class="comment">// applications uploaded to Google Play are using this library.  This allows</span></div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>&#160;<span class="comment">// the development team at Google to determine the popularity of the library.</span></div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>&#160;<span class="comment">// How it works: Applications that are uploaded to the Google Play Store are</span></div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>&#160;<span class="comment">// scanned for this version string.  We track which applications are using it</span></div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>&#160;<span class="comment">// to measure popularity.  You are free to remove it (of course) but we would</span></div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>&#160;<span class="comment">// appreciate if you left it in.</span></div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>&#160;</div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>&#160;<span class="comment">// Weak linkage is culled by VS &amp; doesn&#39;t work on cygwin.</span></div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>&#160;<span class="comment">// clang-format off</span></div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>&#160;<span class="preprocessor">#if !defined(_WIN32) &amp;&amp; !defined(__CYGWIN__)</span></div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>&#160;</div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>&#160;<span class="keyword">extern</span> <span class="keyword">volatile</span> __attribute__((weak)) <span class="keyword">const</span> <span class="keywordtype">char</span> *flatbuffer_version_string;</div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>&#160;<span class="keyword">volatile</span> __attribute__((weak)) <span class="keyword">const</span> <span class="keywordtype">char</span> *flatbuffer_version_string =</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>&#160;  <span class="stringliteral">&quot;FlatBuffers &quot;</span></div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>&#160;  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR) <span class="stringliteral">&quot;.&quot;</span></div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>&#160;  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MINOR) <span class="stringliteral">&quot;.&quot;</span></div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>&#160;  FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION);</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>&#160;</div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>&#160;<span class="preprocessor">#endif  // !defined(_WIN32) &amp;&amp; !defined(__CYGWIN__)</span></div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160;</div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>&#160;<span class="preprocessor">#define FLATBUFFERS_DEFINE_BITMASK_OPERATORS(E, T)\</span></div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>&#160;<span class="preprocessor">    inline E operator | (E lhs, E rhs){\</span></div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>&#160;<span class="preprocessor">        return E(T(lhs) | T(rhs));\</span></div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>&#160;<span class="preprocessor">    inline E operator &amp; (E lhs, E rhs){\</span></div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>&#160;<span class="preprocessor">        return E(T(lhs) &amp; T(rhs));\</span></div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>&#160;<span class="preprocessor">    inline E operator ^ (E lhs, E rhs){\</span></div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>&#160;<span class="preprocessor">        return E(T(lhs) ^ T(rhs));\</span></div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>&#160;<span class="preprocessor">    inline E operator ~ (E lhs){\</span></div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>&#160;<span class="preprocessor">        return E(~T(lhs));\</span></div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>&#160;<span class="preprocessor">    inline E operator |= (E &amp;lhs, E rhs){\</span></div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>&#160;<span class="preprocessor">        lhs = lhs | rhs;\</span></div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>&#160;<span class="preprocessor">        return lhs;\</span></div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>&#160;<span class="preprocessor">    inline E operator &amp;= (E &amp;lhs, E rhs){\</span></div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>&#160;<span class="preprocessor">        lhs = lhs &amp; rhs;\</span></div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>&#160;<span class="preprocessor">        return lhs;\</span></div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>&#160;<span class="preprocessor">    inline E operator ^= (E &amp;lhs, E rhs){\</span></div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>&#160;<span class="preprocessor">        lhs = lhs ^ rhs;\</span></div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>&#160;<span class="preprocessor">        return lhs;\</span></div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>&#160;<span class="preprocessor">    }\</span></div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>&#160;<span class="preprocessor">    inline bool operator !(E rhs) \</span></div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>&#160;<span class="preprocessor">    {\</span></div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>&#160;<span class="preprocessor">        return !bool(T(rhs)); \</span></div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>&#160;<span class="preprocessor">    }</span></div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>&#160;<span class="comment">/// @endcond</span></div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>&#160;<span class="comment"></span>}  <span class="comment">// namespace flatbuffers</span></div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>&#160;</div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>&#160;<span class="preprocessor">#if defined(_MSC_VER)</span></div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>&#160;<span class="preprocessor">  #pragma warning(pop)</span></div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>&#160;<span class="comment">// clang-format on</span></div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>&#160;</div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>&#160;<span class="preprocessor">#endif  // FLATBUFFERS_H_</span></div><div class="ttc" id="structflatbuffers_1_1_offset_html"><div class="ttname"><a href="structflatbuffers_1_1_offset.html">flatbuffers::Offset</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:25</div></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&lt; Vector&lt; T &gt; &gt; CreateVector(size_t vector_size, const std::function&lt; T(size_t i)&gt; &amp;f)</div><div class="ttdoc">Serialize values returned by a function into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1264</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:1522</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&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfStructs(size_t vector_size, const std::function&lt; void(size_t i, T *)&gt; &amp;filler)</div><div class="ttdoc">Serialize an array of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1344</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ab1f44cc1b130e13b41e9a80de76e25cf"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ab1f44cc1b130e13b41e9a80de76e25cf">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfSortedStructs(T *v, size_t len)</div><div class="ttdoc">Serialize an array of structs into a FlatBuffer vector in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1448</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a23aa4c910e053446cc404bc486012e54"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedNativeStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfSortedNativeStructs(std::vector&lt; S &gt; *v)</div><div class="ttdoc">Serialize a std::vector of native structs into a FlatBuffer vector in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1434</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a66c8fd33ab9b3b237954c9ea38648f7f"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a66c8fd33ab9b3b237954c9ea38648f7f">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:787</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&lt; Vector&lt; Offset&lt; T &gt; &gt; &gt; CreateVectorOfSortedTables(std::vector&lt; Offset&lt; T &gt;&gt; *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:1510</div></div>
+<div class="ttc" id="structflatbuffers_1_1_vector_iterator_html"><div class="ttname"><a href="structflatbuffers_1_1_vector_iterator.html">flatbuffers::VectorIterator</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:91</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:735</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ac51db9083ac815eb81420b6d51f42154"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset&lt; String &gt; CreateString(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:1085</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:776</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a9cc09fa59ff9732e972877cfe911c8a5"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a9cc09fa59ff9732e972877cfe911c8a5">flatbuffers::FlatBufferBuilder::CreateVectorOfStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfStructs(size_t vector_size, F f, S *state)</div><div class="ttdoc">Serialize an array of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1366</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a3d57074082aaab8cdeb8474ff9df0b53"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a3d57074082aaab8cdeb8474ff9df0b53">flatbuffers::FlatBufferBuilder::CreateVectorOfNativeStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfNativeStructs(const S *v, size_t len)</div><div class="ttdoc">Serialize an array of native structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1325</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a43f51ba9c8f4f24ea2247a3979d095b8"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8">flatbuffers::FlatBufferBuilder::CreateStruct</a></div><div class="ttdeci">Offset&lt; const T * &gt; CreateStruct(const T &amp;structobj)</div><div class="ttdoc">Write a struct by itself, typically to be part of a union. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1549</div></div>
 <div class="ttc" id="namespaceflatbuffers_html"><div class="ttname"><a href="namespaceflatbuffers.html">flatbuffers</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:22</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&lt; T &gt; 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:1544</div></div>
-<div class="ttc" id="classflatbuffers_1_1_detached_buffer_html"><div class="ttname"><a href="classflatbuffers_1_1_detached_buffer.html">flatbuffers::DetachedBuffer</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:413</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&lt; String &gt; 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:1122</div></div>
-<div class="ttc" id="classflatbuffers_1_1_vector_of_any_html"><div class="ttname"><a href="classflatbuffers_1_1_vector_of_any.html">flatbuffers::VectorOfAny</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:304</div></div>
-<div class="ttc" id="structflatbuffers_1_1_indirect_helper_html"><div class="ttname"><a href="structflatbuffers_1_1_indirect_helper.html">flatbuffers::IndirectHelper</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:62</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&lt; String &gt; 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:1047</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&amp;#39;t get serialized into the buff...</div><div class="ttdef"><b>Definition:</b> flatbuffers.h:825</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ab81ab8aa273c270b0942fd81489cad83"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ab81ab8aa273c270b0942fd81489cad83">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:775</div></div>
-<div class="ttc" id="classflatbuffers_1_1_default_allocator_html"><div class="ttname"><a href="classflatbuffers_1_1_default_allocator.html">flatbuffers::DefaultAllocator</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:394</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:829</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:1526</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ab0173786ea4ec3e4ae10555639b2996c"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ab0173786ea4ec3e4ae10555639b2996c">flatbuffers::FlatBufferBuilder::FlatBufferBuilder</a></div><div class="ttdeci">FlatBufferBuilder(size_t initial_size=1024, Allocator *allocator=nullptr, bool own_allocator=false, size_t buffer_minalign=AlignOf&lt; largest_scalar_t &gt;())</div><div class="ttdoc">Default constructor for FlatBufferBuilder. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:731</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&lt; String &gt; 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:1080</div></div>
-<div class="ttc" id="classflatbuffers_1_1vector__downward_html"><div class="ttname"><a href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:526</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a799701af34c398d8eb86e049b73bcecf"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedNativeStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfSortedNativeStructs(S *v, size_t len)</div><div class="ttdoc">Serialize an array of native structs into a FlatBuffer vector in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1433</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&lt; String &gt; 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:1140</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a099810f03046139d1854d20a1c2a2e41"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a099810f03046139d1854d20a1c2a2e41">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:782</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ab77d800e77fa76bc758a6c399fd37685"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset&lt; String &gt; CreateString(const T &amp;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:1088</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a7cc10b709dfa3e72083843d1a5e36c15"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfSortedStructs(std::vector&lt; T &gt; *v)</div><div class="ttdoc">Serialize a std::vector of structs into a FlatBuffer vector in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1391</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&lt; Vector&lt; Offset&lt; String &gt; &gt; &gt; CreateVectorOfStrings(const std::vector&lt; std::string &gt; &amp;v)</div><div class="ttdoc">Serialize a std::vector&lt;std::string&gt; into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1265</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a53504fc2cab681a7980b03260f8b2f7a"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a53504fc2cab681a7980b03260f8b2f7a">flatbuffers::FlatBufferBuilder::CreateVector</a></div><div class="ttdeci">Offset&lt; Vector&lt; T &gt; &gt; CreateVector(size_t vector_size, F f, S *state)</div><div class="ttdoc">Serialize values returned by a function into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1253</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:806</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a110c2a3298aebef1a9dfa3c44ee84f42"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a110c2a3298aebef1a9dfa3c44ee84f42">flatbuffers::FlatBufferBuilder::CreateVectorOfStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfStructs(const std::vector&lt; T, Alloc &gt; &amp;v)</div><div class="ttdoc">Serialize a std::vector of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1353</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&lt; Vector&lt; const T * &gt; &gt; 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:1280</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a11c291ccd2159604c149600ee6180b95"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95">flatbuffers::FlatBufferBuilder::CreateVectorOfNativeStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfNativeStructs(const std::vector&lt; S &gt; &amp;v)</div><div class="ttdoc">Serialize a std::vector of native structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1367</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&lt; String &gt; 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:1059</div></div>
-<div class="ttc" id="classflatbuffers_1_1_allocator_html"><div class="ttname"><a href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:353</div></div>
-<div class="ttc" id="structflatbuffers_1_1_string_html"><div class="ttname"><a href="structflatbuffers_1_1_string.html">flatbuffers::String</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:342</div></div>
-<div class="ttc" id="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc_html"><div class="ttname"><a href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">flatbuffers::FlatBufferBuilder::FieldLoc</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1571</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&lt; String &gt; CreateString(const std::string &amp;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:1073</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&lt; Vector&lt; T &gt; &gt; CreateVector(const std::vector&lt; T &gt; &amp;v)</div><div class="ttdoc">Serialize a std::vector into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1210</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&lt; Vector&lt; T &gt; &gt; 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:1512</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&lt; Vector&lt; T &gt; &gt; 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:1176</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&lt; String &gt; CreateSharedString(const std::string &amp;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:1131</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&lt; Vector&lt; Offset&lt; T &gt; &gt; &gt; CreateVectorOfSortedTables(Offset&lt; T &gt; *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:1466</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a5e2c3a1e47f0ab4a3a3f07a07a52fb45"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45">flatbuffers::FlatBufferBuilder::Release</a></div><div class="ttdeci">DetachedBuffer Release()</div><div class="ttdoc">Get the released DetachedBuffer. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:796</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&lt; String &gt; 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:1098</div></div>
-<div class="ttc" id="classflatbuffers_1_1_vector_html"><div class="ttname"><a href="classflatbuffers_1_1_vector.html">flatbuffers::Vector</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:181</div></div>
-<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a0e715d9019060b4b753c4e5228be56e8"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8">flatbuffers::FlatBufferBuilder::ReleaseBufferPointer</a></div><div class="ttdeci">DetachedBuffer ReleaseBufferPointer()</div><div class="ttdoc">Get the released pointer to the serialized buffer. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:789</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&lt; T &gt; 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:1532</div></div>
-<div class="ttc" id="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare_html"><div class="ttname"><a href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html">flatbuffers::FlatBufferBuilder::StringOffsetCompare</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1597</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&lt; T &gt; 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:1575</div></div>
+<div class="ttc" id="classflatbuffers_1_1_detached_buffer_html"><div class="ttname"><a href="classflatbuffers_1_1_detached_buffer.html">flatbuffers::DetachedBuffer</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:441</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&lt; String &gt; 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:1152</div></div>
+<div class="ttc" id="classflatbuffers_1_1_vector_of_any_html"><div class="ttname"><a href="classflatbuffers_1_1_vector_of_any.html">flatbuffers::VectorOfAny</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:305</div></div>
+<div class="ttc" id="structflatbuffers_1_1_indirect_helper_html"><div class="ttname"><a href="structflatbuffers_1_1_indirect_helper.html">flatbuffers::IndirectHelper</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:63</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&lt; String &gt; 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:1066</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&amp;#39;t get serialized into the buff...</div><div class="ttdef"><b>Definition:</b> flatbuffers.h:842</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ab81ab8aa273c270b0942fd81489cad83"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ab81ab8aa273c270b0942fd81489cad83">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:792</div></div>
+<div class="ttc" id="classflatbuffers_1_1_default_allocator_html"><div class="ttname"><a href="classflatbuffers_1_1_default_allocator.html">flatbuffers::DefaultAllocator</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:403</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:846</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:1557</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ab0173786ea4ec3e4ae10555639b2996c"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ab0173786ea4ec3e4ae10555639b2996c">flatbuffers::FlatBufferBuilder::FlatBufferBuilder</a></div><div class="ttdeci">FlatBufferBuilder(size_t initial_size=1024, Allocator *allocator=nullptr, bool own_allocator=false, size_t buffer_minalign=AlignOf&lt; largest_scalar_t &gt;())</div><div class="ttdoc">Default constructor for FlatBufferBuilder. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:748</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&lt; String &gt; 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:1110</div></div>
+<div class="ttc" id="classflatbuffers_1_1vector__downward_html"><div class="ttname"><a href="classflatbuffers_1_1vector__downward.html">flatbuffers::vector_downward</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:548</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a799701af34c398d8eb86e049b73bcecf"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedNativeStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfSortedNativeStructs(S *v, size_t len)</div><div class="ttdoc">Serialize an array of native structs into a FlatBuffer vector in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1463</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&lt; String &gt; 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:1170</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a099810f03046139d1854d20a1c2a2e41"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a099810f03046139d1854d20a1c2a2e41">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:799</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_ab77d800e77fa76bc758a6c399fd37685"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset&lt; String &gt; CreateString(const T &amp;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:1118</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a7cc10b709dfa3e72083843d1a5e36c15"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15">flatbuffers::FlatBufferBuilder::CreateVectorOfSortedStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfSortedStructs(std::vector&lt; T &gt; *v)</div><div class="ttdoc">Serialize a std::vector of structs into a FlatBuffer vector in sorted order. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1421</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&lt; Vector&lt; Offset&lt; String &gt; &gt; &gt; CreateVectorOfStrings(const std::vector&lt; std::string &gt; &amp;v)</div><div class="ttdoc">Serialize a std::vector&lt;std::string&gt; into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1295</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a53504fc2cab681a7980b03260f8b2f7a"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a53504fc2cab681a7980b03260f8b2f7a">flatbuffers::FlatBufferBuilder::CreateVector</a></div><div class="ttdeci">Offset&lt; Vector&lt; T &gt; &gt; CreateVector(size_t vector_size, F f, S *state)</div><div class="ttdoc">Serialize values returned by a function into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1283</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:823</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a110c2a3298aebef1a9dfa3c44ee84f42"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a110c2a3298aebef1a9dfa3c44ee84f42">flatbuffers::FlatBufferBuilder::CreateVectorOfStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfStructs(const std::vector&lt; T, Alloc &gt; &amp;v)</div><div class="ttdoc">Serialize a std::vector of structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1383</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&lt; Vector&lt; const T * &gt; &gt; 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:1310</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a11c291ccd2159604c149600ee6180b95"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95">flatbuffers::FlatBufferBuilder::CreateVectorOfNativeStructs</a></div><div class="ttdeci">Offset&lt; Vector&lt; const T * &gt; &gt; CreateVectorOfNativeStructs(const std::vector&lt; S &gt; &amp;v)</div><div class="ttdoc">Serialize a std::vector of native structs into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1397</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&lt; String &gt; 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:1078</div></div>
+<div class="ttc" id="classflatbuffers_1_1_allocator_html"><div class="ttname"><a href="classflatbuffers_1_1_allocator.html">flatbuffers::Allocator</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:362</div></div>
+<div class="ttc" id="structflatbuffers_1_1_string_html"><div class="ttname"><a href="structflatbuffers_1_1_string.html">flatbuffers::String</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:343</div></div>
+<div class="ttc" id="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc_html"><div class="ttname"><a href="structflatbuffers_1_1_flat_buffer_builder_1_1_field_loc.html">flatbuffers::FlatBufferBuilder::FieldLoc</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1602</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&lt; String &gt; CreateString(const std::string &amp;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:1092</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&lt; Vector&lt; T &gt; &gt; CreateVector(const std::vector&lt; T &gt; &amp;v)</div><div class="ttdoc">Serialize a std::vector into a FlatBuffer vector. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1240</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&lt; Vector&lt; T &gt; &gt; 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:1542</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a9a3a955fbff1c69e944c3560460dd7a6"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a9a3a955fbff1c69e944c3560460dd7a6">flatbuffers::FlatBufferBuilder::CreateString</a></div><div class="ttdeci">Offset&lt; String &gt; CreateString(flatbuffers::string_view 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:1101</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&lt; Vector&lt; T &gt; &gt; 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:1206</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&lt; String &gt; CreateSharedString(const std::string &amp;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:1161</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&lt; Vector&lt; Offset&lt; T &gt; &gt; &gt; CreateVectorOfSortedTables(Offset&lt; T &gt; *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:1496</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a5e2c3a1e47f0ab4a3a3f07a07a52fb45"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45">flatbuffers::FlatBufferBuilder::Release</a></div><div class="ttdeci">DetachedBuffer Release()</div><div class="ttdoc">Get the released DetachedBuffer. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:813</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&lt; String &gt; 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:1128</div></div>
+<div class="ttc" id="classflatbuffers_1_1_vector_html"><div class="ttname"><a href="classflatbuffers_1_1_vector.html">flatbuffers::Vector</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:182</div></div>
+<div class="ttc" id="classflatbuffers_1_1_flat_buffer_builder_html_a0e715d9019060b4b753c4e5228be56e8"><div class="ttname"><a href="classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8">flatbuffers::FlatBufferBuilder::ReleaseBufferPointer</a></div><div class="ttdeci">DetachedBuffer ReleaseBufferPointer()</div><div class="ttdoc">Get the released pointer to the serialized buffer. </div><div class="ttdef"><b>Definition:</b> flatbuffers.h:806</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&lt; T &gt; 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:1563</div></div>
+<div class="ttc" id="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare_html"><div class="ttname"><a href="structflatbuffers_1_1_flat_buffer_builder_1_1_string_offset_compare.html">flatbuffers::FlatBufferBuilder::StringOffsetCompare</a></div><div class="ttdef"><b>Definition:</b> flatbuffers.h:1628</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
 <!-- Google Analytics -->
diff --git a/flatbuffers_grammar.html b/flatbuffers_grammar.html
index 352187113f133821580be1db0da7525286056e75..4be72242cda2e7fb9c800135352694beefcd93cd 100644
--- a/flatbuffers_grammar.html
+++ b/flatbuffers_grammar.html
@@ -94,7 +94,7 @@ $(document).ready(function(){initNavTree('flatbuffers_grammar.html','');});
 <div class="textblock"><p>schema = include* ( namespace_decl | type_decl | enum_decl | root_decl | file_extension_decl | file_identifier_decl | attribute_decl | rpc_decl | object )*</p>
 <p>include = <code>include</code> string_constant <code>;</code></p>
 <p>namespace_decl = <code>namespace</code> ident ( <code>.</code> ident )* <code>;</code></p>
-<p>attribute_decl = <code>attribute</code> string_constant <code>;</code></p>
+<p>attribute_decl = <code>attribute</code> ident | <code>"&lt;/tt&gt;ident&lt;tt&gt;"</code> <code>;</code></p>
 <p>type_decl = ( <code>table</code> | <code>struct</code> ) ident metadata <code>{</code> field_decl+ <code>}</code></p>
 <p>enum_decl = ( <code>enum</code> ident [ <code>:</code> type ] | <code>union</code> ident ) metadata <code>{</code> commasep( enumval_decl ) <code>}</code></p>
 <p>root_decl = <code>root_type</code> ident <code>;</code></p>
diff --git a/flatbuffers_guide_tutorial.html b/flatbuffers_guide_tutorial.html
index de51a84765fc76fe7a0b2bb3631a60302cd04d53..58c51d11cd7f86f2a2a63bf5c0b4284b5ff06bb6 100644
--- a/flatbuffers_guide_tutorial.html
+++ b/flatbuffers_guide_tutorial.html
@@ -111,6 +111,7 @@ $(document).ready(function(){initNavTree('flatbuffers_guide_tutorial.html','');}
   <input type="radio" name="language" value="typescript">TypeScript</input>
   <input type="radio" name="language" value="php">PHP</input>
   <input type="radio" name="language" value="c">C</input>
+  <input type="radio" name="language" value="dart">Dart</input>
 </form>
 </p>
 <p> 
@@ -175,7 +176,7 @@ $(document).ready(function(){initNavTree('flatbuffers_guide_tutorial.html','');}
 <h2>Where to Find the Example Code</h2>
 <p>Samples demonstating the concepts in this example are located in the source code package, under the <code>samples</code> directory. You can browse the samples on GitHub <a href="https://github.com/google/flatbuffers/tree/master/samples">here</a>.</p>
 <div class="language-c"> <em>Note: The above does not apply to C, instead <a href="https://github.com/dvidelabs/flatcc/tree/master/samples">look here</a>.</em> </div><p>For your chosen language, please cross-reference with:</p>
-<div class="language-cpp"> <a href="https://github.com/google/flatbuffers/blob/master/samples/sample_binary.cpp">sample_binary.cpp</a> </div> <div class="language-java"> <a href="https://github.com/google/flatbuffers/blob/master/samples/SampleBinary.java">SampleBinary.java</a> </div> <div class="language-csharp"> <a href="https://github.com/google/flatbuffers/blob/master/samples/SampleBinary.cs">SampleBinary.cs</a> </div> <div class="language-go"> <a href="https://github.com/google/flatbuffers/blob/master/samples/sample_binary.go">sample_binary.go</a> </div> <div class="language-python"> <a href="https://github.com/google/flatbuffers/blob/master/samples/sample_binary.py">sample_binary.py</a> </div> <div class="language-javascript"> <a href="https://github.com/google/flatbuffers/blob/master/samples/samplebinary.js">samplebinary.js</a> </div> <div class="language-typescript"> <em>none yet</em> </div> <div class="language-php"> <a href="https://github.com/google/flatbuffers/blob/master/samples/SampleBinary.php">SampleBinary.php</a> </div> <div class="language-c"> <a href="https://github.com/dvidelabs/flatcc/blob/master/samples/monster/monster.c">monster.c</a> </div><h2>Writing the Monsters' FlatBuffer Schema</h2>
+<div class="language-cpp"> <a href="https://github.com/google/flatbuffers/blob/master/samples/sample_binary.cpp">sample_binary.cpp</a> </div> <div class="language-java"> <a href="https://github.com/google/flatbuffers/blob/master/samples/SampleBinary.java">SampleBinary.java</a> </div> <div class="language-csharp"> <a href="https://github.com/google/flatbuffers/blob/master/samples/SampleBinary.cs">SampleBinary.cs</a> </div> <div class="language-go"> <a href="https://github.com/google/flatbuffers/blob/master/samples/sample_binary.go">sample_binary.go</a> </div> <div class="language-python"> <a href="https://github.com/google/flatbuffers/blob/master/samples/sample_binary.py">sample_binary.py</a> </div> <div class="language-javascript"> <a href="https://github.com/google/flatbuffers/blob/master/samples/samplebinary.js">samplebinary.js</a> </div> <div class="language-typescript"> <em>none yet</em> </div> <div class="language-php"> <a href="https://github.com/google/flatbuffers/blob/master/samples/SampleBinary.php">SampleBinary.php</a> </div> <div class="language-c"> <a href="https://github.com/dvidelabs/flatcc/blob/master/samples/monster/monster.c">monster.c</a> </div> <div class="language-dart"> <a href="https://github.com/google/flatbuffers/blob/master/dart/example/example.dart">example.dart</a> </div><h2>Writing the Monsters' FlatBuffer Schema</h2>
 <p>To start working with FlatBuffers, you first need to create a <code>schema</code> file, which defines the format for each data structure you wish to serialize. Here is the <code>schema</code> that defines the template for our monsters:</p>
 <div class="fragment"><div class="line">// Example IDL file for our monster&#39;s schema.</div><div class="line"></div><div class="line">namespace MyGame.Sample;</div><div class="line"></div><div class="line">enum Color:byte { Red = 0, Green, Blue = 2 }</div><div class="line"></div><div class="line">union Equipment { Weapon } // Optionally add more tables.</div><div class="line"></div><div class="line">struct Vec3 {</div><div class="line">  x:float;</div><div class="line">  y:float;</div><div class="line">  z:float;</div><div class="line">}</div><div class="line"></div><div class="line">table Monster {</div><div class="line">  pos:Vec3; // Struct.</div><div class="line">  mana:short = 150;</div><div class="line">  hp:short = 100;</div><div class="line">  name:string;</div><div class="line">  friendly:bool = false (deprecated);</div><div class="line">  inventory:[ubyte];  // Vector of scalars.</div><div class="line">  color:Color = Blue; // Enum.</div><div class="line">  weapons:[Weapon];   // Vector of tables.</div><div class="line">  equipped:Equipment; // Union.</div><div class="line">  path:[Vec3];        // Vector of structs.</div><div class="line">}</div><div class="line"></div><div class="line">table Weapon {</div><div class="line">  name:string;</div><div class="line">  damage:short;</div><div class="line">}</div><div class="line"></div><div class="line">root_type Monster;</div></div><!-- fragment --><p>As you can see, the syntax for the <code>schema</code> <a href="https://en.wikipedia.org/wiki/Interface_description_language">Interface Definition Language (IDL)</a> is similar to those of the C family of languages, and other IDL languages. Let's examine each part of this <code>schema</code> to determine what it does.</p>
 <p>The <code>schema</code> starts with a <code>namespace</code> declaration. This determines the corresponding package/namespace for the generated code. In our example, we have the <code>Sample</code> namespace inside of the <code>MyGame</code> namespace.</p>
@@ -196,23 +197,23 @@ $(document).ready(function(){initNavTree('flatbuffers_guide_tutorial.html','');}
 <div class="language-c"> <em>Note: If you're working in C, you need to use the separate project <a href="https://github.com/dvidelabs/flatcc">FlatCC</a> which contains a schema compiler and runtime library in C for C.</em> <br />
  See <a href="https://github.com/dvidelabs/flatcc#building">flatcc build instructions</a>. <br />
  Please be aware of the difference between <code>flatc</code> and <code>flatcc</code> tools. <br />
- </div><div class="language-cpp"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --cpp samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --java samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --csharp samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --go samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --python samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --js samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --ts samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --php samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">cd flatcc</div><div class="line">mkdir -p build/tmp/samples/monster</div><div class="line">bin/flatcc -a -o build/tmp/samples/monster samples/monster/monster.fbs</div><div class="line"># or just</div><div class="line">flatcc/samples/monster/build.sh</div></div><!-- fragment --> </div><p>For a more complete guide to using the <code>flatc</code> compiler, please read the <a class="el" href="flatbuffers_guide_using_schema_compiler.html">Using the schema compiler</a> section of the Programmer's Guide.</p>
+ </div><div class="language-cpp"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --cpp samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --java samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --csharp samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --go samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --python samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --js samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --ts samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --php samples/monster.fbs</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">cd flatcc</div><div class="line">mkdir -p build/tmp/samples/monster</div><div class="line">bin/flatcc -a -o build/tmp/samples/monster samples/monster/monster.fbs</div><div class="line"># or just</div><div class="line">flatcc/samples/monster/build.sh</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">cd flatbuffers/sample</div><div class="line">./../flatc --dart samples/monster.fbs</div></div><!-- fragment --> </div><p>For a more complete guide to using the <code>flatc</code> compiler, please read the <a class="el" href="flatbuffers_guide_using_schema_compiler.html">Using the schema compiler</a> section of the Programmer's Guide.</p>
 <h2>Reading and Writing Monster FlatBuffers</h2>
 <p>Now that we have compiled the schema for our programming language, we can start creating some monsters and serializing/deserializing them from FlatBuffers.</p>
 <h4>Creating and Writing Orc FlatBuffers</h4>
 <p>The first step is to import/include the library, generated files, etc.</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="preprocessor">#include &quot;monster_generate.h&quot;</span> <span class="comment">// This was generated by `flatc`.</span></div><div class="line"></div><div class="line"><span class="keyword">using namespace </span>MyGame::Sample; <span class="comment">// Specified in the schema.</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keyword">import</span> MyGame.Sample.*; <span class="comment">//The `flatc` generated files. (Monster, Vec3, etc.)</span></div><div class="line"></div><div class="line"><span class="keyword">import</span> <a class="code" href="namespacecom.html">com</a>.<a class="code" href="namespacecom_1_1google.html">google</a>.<a class="code" href="namespacecom_1_1google_1_1flatbuffers.html">flatbuffers</a>.<a class="code" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a>;</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="keyword">using</span> <a class="code" href="namespace_flat_buffers.html">FlatBuffers</a>;</div><div class="line"><span class="keyword">using</span> MyGame.Sample; <span class="comment">// The `flatc` generated files. (Monster, Vec3, etc.)</span></div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">import (</div><div class="line">        flatbuffers &quot;github.com/google/flatbuffers/go&quot;</div><div class="line">        sample &quot;MyGame/Sample&quot;</div><div class="line">)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="keyword">import</span> flatbuffers</div><div class="line"></div><div class="line"><span class="comment"># Generated by `flatc`.</span></div><div class="line"><span class="keyword">import</span> MyGame.Sample.Color</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Equipment</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Monster</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Vec3</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Weapon</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// The following code is for JavaScript module loaders (e.g. Node.js). See</div><div class="line">// below for a browser-based HTML/JavaScript example of including the library.</div><div class="line">var flatbuffers = require(&#39;/js/flatbuffers&#39;).flatbuffers;</div><div class="line">var MyGame = require(&#39;./monster_generated&#39;).MyGame; // Generated by `flatc`.</div><div class="line"></div><div class="line">//--------------------------------------------------------------------------//</div><div class="line"></div><div class="line">// The following code is for browser-based HTML/JavaScript. Use the above code</div><div class="line">// for JavaScript module loaders (e.g. Node.js).</div><div class="line">&lt;script src=&quot;../js/flatbuffers.js&quot;&gt;&lt;/script&gt;</div><div class="line">&lt;script src=&quot;monster_generated.js&quot;&gt;&lt;/script&gt; // Generated by `flatc`.</div></div><!-- fragment --> </div> <div class="language-typescript"> // note: import flabuffers with your desired import method</div><div class="language-typescript"> import { MyGame } from './monster_generated'; </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// It is recommended that your use PSR autoload when using FlatBuffers in PHP.</span></div><div class="line"><span class="comment">// Here is an example from `SampleBinary.php`:</span></div><div class="line"><span class="keyword">function</span> __autoload($class_name) {</div><div class="line">  <span class="comment">// The last segment of the class name matches the file name.</span></div><div class="line">  $class = substr($class_name, strrpos($class_name, <span class="stringliteral">&quot;\\&quot;</span>) + 1);</div><div class="line">  $root_dir = join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)))); <span class="comment">// `flatbuffers` root.</span></div><div class="line"></div><div class="line">  <span class="comment">// Contains the `*.php` files for the FlatBuffers library and the `flatc` generated files.</span></div><div class="line">  $paths = array(join(DIRECTORY_SEPARATOR, array($root_dir, <span class="stringliteral">&quot;php&quot;</span>)),</div><div class="line">                 join(DIRECTORY_SEPARATOR, array($root_dir, <span class="stringliteral">&quot;samples&quot;</span>, <span class="stringliteral">&quot;MyGame&quot;</span>, <span class="stringliteral">&quot;Sample&quot;</span>)));</div><div class="line">  <span class="keywordflow">foreach</span> ($paths as $path) {</div><div class="line">    $file = join(DIRECTORY_SEPARATOR, array($path, $class . <span class="stringliteral">&quot;.php&quot;</span>));</div><div class="line">    <span class="keywordflow">if</span> (file_exists($file)) {</div><div class="line">      require($file);</div><div class="line">      <span class="keywordflow">break</span>;</div><div class="line">    }</div><div class="line">  }</div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="preprocessor">#include &quot;monster_builder.h&quot;</span> <span class="comment">// Generated by `flatcc`.</span></div><div class="line"></div><div class="line"><span class="comment">// Convenient namespace macro to manage long namespace prefix.</span></div><div class="line"><span class="preprocessor">#undef ns</span></div><div class="line"><span class="preprocessor">#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(MyGame_Sample, x) // Specified in the schema.</span></div><div class="line"></div><div class="line"><span class="comment">// A helper to simplify creating vectors from C-arrays.</span></div><div class="line"><span class="preprocessor">#define c_vec_len(V) (sizeof(V)/sizeof((V)[0]))</span></div></div><!-- fragment --> </div><p>Now we are ready to start building some buffers. In order to start, we need to create an instance of the <code>FlatBufferBuilder</code>, which will contain the buffer as it grows. You can pass an initial size of the buffer (here 1024 bytes), which will grow automatically if needed:</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="comment">// Create a `FlatBufferBuilder`, which will be used to create our</span></div><div class="line"><span class="comment">// monsters&#39; FlatBuffers.</span></div><div class="line"><a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a> builder(1024);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="comment">// Create a `FlatBufferBuilder`, which will be used to create our</span></div><div class="line"><span class="comment">// monsters&#39; FlatBuffers.</span></div><div class="line">FlatBufferBuilder builder = <span class="keyword">new</span> FlatBufferBuilder(1024);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="comment">// Create a `FlatBufferBuilder`, which will be used to create our</span></div><div class="line"><span class="comment">// monsters&#39; FlatBuffers.</span></div><div class="line">var builder = <span class="keyword">new</span> FlatBufferBuilder(1024);</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// Create a `FlatBufferBuilder`, which will be used to create our</div><div class="line">// monsters&#39; FlatBuffers.</div><div class="line">builder := flatbuffers.NewBuilder(1024)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="comment"># Create a `FlatBufferBuilder`, which will be used to create our</span></div><div class="line"><span class="comment"># monsters&#39; FlatBuffers.</span></div><div class="line">builder = flatbuffers.Builder(1024)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// Create a `flatbuffer.Builder`, which will be used to create our</div><div class="line">// monsters&#39; FlatBuffers.</div><div class="line">var builder = new flatbuffers.Builder(1024);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// Create a `flatbuffer.Builder`, which will be used to create our</div><div class="line">// monsters&#39; FlatBuffers.</div><div class="line">let builder = new flatbuffers.Builder(1024);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// Create a `FlatBufferBuilder`, which will be used to create our</span></div><div class="line"><span class="comment">// monsters&#39; FlatBuffers.</span></div><div class="line">$builder = <span class="keyword">new</span> <a class="code" href="class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html">Google\FlatBuffers\FlatbufferBuilder</a>(1024);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">flatcc_builder_t builder, *B;</div><div class="line">B = &amp;builder;</div><div class="line"><span class="comment">// Initialize the builder object.</span></div><div class="line">flatcc_builder_init(B);</div></div><!-- fragment --> </div><p>After creating the <code>builder</code>, we can start serializing our data. Before we make our <code>orc</code> Monster, lets create some <code>Weapon</code>s: a <code>Sword</code> and an <code>Axe</code>.</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> weapon_one_name = builder.CreateString(<span class="stringliteral">&quot;Sword&quot;</span>);</div><div class="line"><span class="keywordtype">short</span> weapon_one_damage = 3;</div><div class="line"></div><div class="line"><span class="keyword">auto</span> weapon_two_name = builder.CreateString(<span class="stringliteral">&quot;Axe&quot;</span>);</div><div class="line"><span class="keywordtype">short</span> weapon_two_damage = 5;</div><div class="line"></div><div class="line"><span class="comment">// Use the `CreateWeapon` shortcut to create Weapons with all the fields set.</span></div><div class="line"><span class="keyword">auto</span> sword = CreateWeapon(builder, weapon_one_name, weapon_one_damage);</div><div class="line"><span class="keyword">auto</span> axe = CreateWeapon(builder, weapon_two_name, weapon_two_damage);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keywordtype">int</span> weaponOneName = builder.createString(<span class="stringliteral">&quot;Sword&quot;</span>)</div><div class="line"><span class="keywordtype">short</span> weaponOneDamage = 3;</div><div class="line"></div><div class="line"><span class="keywordtype">int</span> weaponTwoName = builder.createString(<span class="stringliteral">&quot;Axe&quot;</span>);</div><div class="line"><span class="keywordtype">short</span> weaponTwoDamage = 5;</div><div class="line"></div><div class="line"><span class="comment">// Use the `createWeapon()` helper function to create the weapons, since we set every field.</span></div><div class="line"><span class="keywordtype">int</span> sword = Weapon.createWeapon(builder, weaponOneName, weaponOneDamage);</div><div class="line"><span class="keywordtype">int</span> axe = Weapon.createWeapon(builder, weaponTwoName, weaponTwoDamage);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">var weaponOneName = builder.CreateString(<span class="stringliteral">&quot;Sword&quot;</span>);</div><div class="line">var weaponOneDamage = 3;</div><div class="line"></div><div class="line">var weaponTwoName = builder.CreateString(<span class="stringliteral">&quot;Axe&quot;</span>);</div><div class="line">var weaponTwoDamage = 5;</div><div class="line"></div><div class="line"><span class="comment">// Use the `CreateWeapon()` helper function to create the weapons, since we set every field.</span></div><div class="line">var sword = Weapon.CreateWeapon(builder, weaponOneName, (<span class="keywordtype">short</span>)weaponOneDamage);</div><div class="line">var axe = Weapon.CreateWeapon(builder, weaponTwoName, (<span class="keywordtype">short</span>)weaponTwoDamage);</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">weaponOne := builder.CreateString(&quot;Sword&quot;)</div><div class="line">weaponTwo := builder.CreateString(&quot;Axe&quot;)</div><div class="line"></div><div class="line">// Create the first `Weapon` (&quot;Sword&quot;).</div><div class="line">sample.WeaponStart(builder)</div><div class="line">sample.Weapon.AddName(builder, weaponOne)</div><div class="line">sample.Weapon.AddDamage(builder, 3)</div><div class="line">sword := sample.WeaponEnd(builder)</div><div class="line"></div><div class="line">// Create the second `Weapon` (&quot;Axe&quot;).</div><div class="line">sample.WeaponStart(builder)</div><div class="line">sample.Weapon.AddName(builder, weaponTwo)</div><div class="line">sample.Weapon.AddDamage(builder, 5)</div><div class="line">axe := sample.WeaponEnd(builder)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">weapon_one = builder.CreateString(<span class="stringliteral">&#39;Sword&#39;</span>)</div><div class="line">weapon_two = builder.CreateString(<span class="stringliteral">&#39;Axe&#39;</span>)</div><div class="line"></div><div class="line"><span class="comment"># Create the first `Weapon` (&#39;Sword&#39;).</span></div><div class="line">MyGame.Sample.Weapon.WeaponStart(builder)</div><div class="line">MyGame.Sample.Weapon.WeaponAddName(builder, weapon_one)</div><div class="line">MyGame.Sample.Weapon.WeaponAddDamage(builder, 3)</div><div class="line">sword = MyGame.Sample.Weapon.WeaponEnd(builder)</div><div class="line"></div><div class="line"><span class="comment"># Create the second `Weapon` (&#39;Axe&#39;).</span></div><div class="line">MyGame.Sample.Weapon.WeaponStart(builder)</div><div class="line">MyGame.Sample.Weapon.WeaponAddName(builder, weapon_two)</div><div class="line">MyGame.Sample.Weapon.WeaponAddDamage(builder, 5)</div><div class="line">axe = MyGame.Sample.Weapon.WeaponEnd(builder)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var weaponOne = builder.createString(&#39;Sword&#39;);</div><div class="line">var weaponTwo = builder.createString(&#39;Axe&#39;);</div><div class="line"></div><div class="line">// Create the first `Weapon` (&#39;Sword&#39;).</div><div class="line">MyGame.Sample.Weapon.startWeapon(builder);</div><div class="line">MyGame.Sample.Weapon.addName(builder, weaponOne);</div><div class="line">MyGame.Sample.Weapon.addDamage(builder, 3);</div><div class="line">var sword = MyGame.Sample.Weapon.endWeapon(builder);</div><div class="line"></div><div class="line">// Create the second `Weapon` (&#39;Axe&#39;).</div><div class="line">MyGame.Sample.Weapon.startWeapon(builder);</div><div class="line">MyGame.Sample.Weapon.addName(builder, weaponTwo);</div><div class="line">MyGame.Sample.Weapon.addDamage(builder, 5);</div><div class="line">var axe = MyGame.Sample.Weapon.endWeapon(builder);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let weaponOne = builder.createString(&#39;Sword&#39;);</div><div class="line">let weaponTwo = builder.createString(&#39;Axe&#39;);</div><div class="line"></div><div class="line">// Create the first `Weapon` (&#39;Sword&#39;).</div><div class="line">MyGame.Sample.Weapon.startWeapon(builder);</div><div class="line">MyGame.Sample.Weapon.addName(builder, weaponOne);</div><div class="line">MyGame.Sample.Weapon.addDamage(builder, 3);</div><div class="line">let sword = MyGame.Sample.Weapon.endWeapon(builder);</div><div class="line"></div><div class="line">// Create the second `Weapon` (&#39;Axe&#39;).</div><div class="line">MyGame.Sample.Weapon.startWeapon(builder);</div><div class="line">MyGame.Sample.Weapon.addName(builder, weaponTwo);</div><div class="line">MyGame.Sample.Weapon.addDamage(builder, 5);</div><div class="line">let axe = MyGame.Sample.Weapon.endWeapon(builder);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// Create the `Weapon`s using the `createWeapon()` helper function.</span></div><div class="line">$weapon_one_name = $builder-&gt;createString(<span class="stringliteral">&quot;Sword&quot;</span>);</div><div class="line">$sword = \MyGame\Sample\Weapon::CreateWeapon($builder, $weapon_one_name, 3);</div><div class="line"></div><div class="line">$weapon_two_name = $builder-&gt;createString(<span class="stringliteral">&quot;Axe&quot;</span>);</div><div class="line">$axe = \MyGame\Sample\Weapon::CreateWeapon($builder, $weapon_two_name, 5);</div><div class="line"></div><div class="line"><span class="comment">// Create an array from the two `Weapon`s and pass it to the</span></div><div class="line"><span class="comment">// `CreateWeaponsVector()` method to create a FlatBuffer vector.</span></div><div class="line">$weaps = array($sword, $axe);</div><div class="line">$weapons = \MyGame\Sample\Monster::CreateWeaponsVector($builder, $weaps);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">ns(Weapon_ref_t) weapon_one_name = flatbuffers_string_create_str(B, <span class="stringliteral">&quot;Sword&quot;</span>);</div><div class="line">uint16_t weapon_one_damage = 3;</div><div class="line"></div><div class="line">ns(Weapon_ref_t) weapon_two_name = flatbuffers_string_create_str(B, <span class="stringliteral">&quot;Axe&quot;</span>);</div><div class="line">uint16_t weapon_two_damage = 5;</div><div class="line"></div><div class="line">ns(Weapon_ref_t) sword = ns(Weapon_create(B, weapon_one_name, weapon_one_damage));</div><div class="line">ns(Weapon_ref_t) axe = ns(Weapon_create(B, weapon_two_name, weapon_two_damage));</div></div><!-- fragment --> </div><p>Now let's create our monster, the <code>orc</code>. For this <code>orc</code>, lets make him <code>red</code> with rage, positioned at <code>(1.0, 2.0, 3.0)</code>, and give him a large pool of hit points with <code>300</code>. We can give him a vector of weapons to choose from (our <code>Sword</code> and <code>Axe</code> from earlier). In this case, we will equip him with the <code>Axe</code>, since it is the most powerful of the two. Lastly, let's fill his inventory with some potential treasures that can be taken once he is defeated.</p>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="preprocessor">#include &quot;monster_generate.h&quot;</span> <span class="comment">// This was generated by `flatc`.</span></div><div class="line"></div><div class="line"><span class="keyword">using namespace </span>MyGame::Sample; <span class="comment">// Specified in the schema.</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keyword">import</span> MyGame.Sample.*; <span class="comment">//The `flatc` generated files. (Monster, Vec3, etc.)</span></div><div class="line"></div><div class="line"><span class="keyword">import</span> <a class="code" href="namespacecom.html">com</a>.<a class="code" href="namespacecom_1_1google.html">google</a>.<a class="code" href="namespacecom_1_1google_1_1flatbuffers.html">flatbuffers</a>.<a class="code" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a>;</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="keyword">using</span> <a class="code" href="namespace_flat_buffers.html">FlatBuffers</a>;</div><div class="line"><span class="keyword">using</span> MyGame.Sample; <span class="comment">// The `flatc` generated files. (Monster, Vec3, etc.)</span></div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">import (</div><div class="line">        flatbuffers &quot;github.com/google/flatbuffers/go&quot;</div><div class="line">        sample &quot;MyGame/Sample&quot;</div><div class="line">)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="keyword">import</span> flatbuffers</div><div class="line"></div><div class="line"><span class="comment"># Generated by `flatc`.</span></div><div class="line"><span class="keyword">import</span> MyGame.Sample.Color</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Equipment</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Monster</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Vec3</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Weapon</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// The following code is for JavaScript module loaders (e.g. Node.js). See</div><div class="line">// below for a browser-based HTML/JavaScript example of including the library.</div><div class="line">var flatbuffers = require(&#39;/js/flatbuffers&#39;).flatbuffers;</div><div class="line">var MyGame = require(&#39;./monster_generated&#39;).MyGame; // Generated by `flatc`.</div><div class="line"></div><div class="line">//--------------------------------------------------------------------------//</div><div class="line"></div><div class="line">// The following code is for browser-based HTML/JavaScript. Use the above code</div><div class="line">// for JavaScript module loaders (e.g. Node.js).</div><div class="line">&lt;script src=&quot;../js/flatbuffers.js&quot;&gt;&lt;/script&gt;</div><div class="line">&lt;script src=&quot;monster_generated.js&quot;&gt;&lt;/script&gt; // Generated by `flatc`.</div></div><!-- fragment --> </div> <div class="language-typescript"> // note: import flabuffers with your desired import method</div><div class="language-typescript"> import { MyGame } from './monster_generated'; </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// It is recommended that your use PSR autoload when using FlatBuffers in PHP.</span></div><div class="line"><span class="comment">// Here is an example from `SampleBinary.php`:</span></div><div class="line"><span class="keyword">function</span> __autoload($class_name) {</div><div class="line">  <span class="comment">// The last segment of the class name matches the file name.</span></div><div class="line">  $class = substr($class_name, strrpos($class_name, <span class="stringliteral">&quot;\\&quot;</span>) + 1);</div><div class="line">  $root_dir = join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)))); <span class="comment">// `flatbuffers` root.</span></div><div class="line"></div><div class="line">  <span class="comment">// Contains the `*.php` files for the FlatBuffers library and the `flatc` generated files.</span></div><div class="line">  $paths = array(join(DIRECTORY_SEPARATOR, array($root_dir, <span class="stringliteral">&quot;php&quot;</span>)),</div><div class="line">                 join(DIRECTORY_SEPARATOR, array($root_dir, <span class="stringliteral">&quot;samples&quot;</span>, <span class="stringliteral">&quot;MyGame&quot;</span>, <span class="stringliteral">&quot;Sample&quot;</span>)));</div><div class="line">  <span class="keywordflow">foreach</span> ($paths as $path) {</div><div class="line">    $file = join(DIRECTORY_SEPARATOR, array($path, $class . <span class="stringliteral">&quot;.php&quot;</span>));</div><div class="line">    <span class="keywordflow">if</span> (file_exists($file)) {</div><div class="line">      require($file);</div><div class="line">      <span class="keywordflow">break</span>;</div><div class="line">    }</div><div class="line">  }</div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="preprocessor">#include &quot;monster_builder.h&quot;</span> <span class="comment">// Generated by `flatcc`.</span></div><div class="line"></div><div class="line"><span class="comment">// Convenient namespace macro to manage long namespace prefix.</span></div><div class="line"><span class="preprocessor">#undef ns</span></div><div class="line"><span class="preprocessor">#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(MyGame_Sample, x) // Specified in the schema.</span></div><div class="line"></div><div class="line"><span class="comment">// A helper to simplify creating vectors from C-arrays.</span></div><div class="line"><span class="preprocessor">#define c_vec_len(V) (sizeof(V)/sizeof((V)[0]))</span></div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">import &#39;package:flat_buffers/flat_buffers.dart&#39; as fb;</div><div class="line"></div><div class="line">// Generated by `flatc`.</div><div class="line">import &#39;monster_my_game.sample_generated.dart&#39; as myGame;</div></div><!-- fragment --> </div><p>Now we are ready to start building some buffers. In order to start, we need to create an instance of the <code>FlatBufferBuilder</code>, which will contain the buffer as it grows. You can pass an initial size of the buffer (here 1024 bytes), which will grow automatically if needed:</p>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="comment">// Create a `FlatBufferBuilder`, which will be used to create our</span></div><div class="line"><span class="comment">// monsters&#39; FlatBuffers.</span></div><div class="line"><a class="code" href="classflatbuffers_1_1_flat_buffer_builder.html">flatbuffers::FlatBufferBuilder</a> builder(1024);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="comment">// Create a `FlatBufferBuilder`, which will be used to create our</span></div><div class="line"><span class="comment">// monsters&#39; FlatBuffers.</span></div><div class="line">FlatBufferBuilder builder = <span class="keyword">new</span> FlatBufferBuilder(1024);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="comment">// Create a `FlatBufferBuilder`, which will be used to create our</span></div><div class="line"><span class="comment">// monsters&#39; FlatBuffers.</span></div><div class="line">var builder = <span class="keyword">new</span> FlatBufferBuilder(1024);</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// Create a `FlatBufferBuilder`, which will be used to create our</div><div class="line">// monsters&#39; FlatBuffers.</div><div class="line">builder := flatbuffers.NewBuilder(1024)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="comment"># Create a `FlatBufferBuilder`, which will be used to create our</span></div><div class="line"><span class="comment"># monsters&#39; FlatBuffers.</span></div><div class="line">builder = flatbuffers.Builder(1024)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// Create a `flatbuffer.Builder`, which will be used to create our</div><div class="line">// monsters&#39; FlatBuffers.</div><div class="line">var builder = new flatbuffers.Builder(1024);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// Create a `flatbuffer.Builder`, which will be used to create our</div><div class="line">// monsters&#39; FlatBuffers.</div><div class="line">let builder = new flatbuffers.Builder(1024);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// Create a `FlatBufferBuilder`, which will be used to create our</span></div><div class="line"><span class="comment">// monsters&#39; FlatBuffers.</span></div><div class="line">$builder = <span class="keyword">new</span> <a class="code" href="class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html">Google\FlatBuffers\FlatbufferBuilder</a>(1024);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">flatcc_builder_t builder, *B;</div><div class="line">B = &amp;builder;</div><div class="line"><span class="comment">// Initialize the builder object.</span></div><div class="line">flatcc_builder_init(B);</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">// Create the fb.Builder object that will be used by our generated builders</div><div class="line">// Note that if you are only planning to immediately get the byte array this builder would create,</div><div class="line">// you can use the convenience method `toBytes()` on the generated builders.</div><div class="line">// For example, you could do something like `new myGame.MonsterBuilder(...).toBytes()`</div><div class="line">var builder = new fb.Builder(initialSize: 1024);</div></div><!-- fragment --> </div><p>After creating the <code>builder</code>, we can start serializing our data. Before we make our <code>orc</code> Monster, lets create some <code>Weapon</code>s: a <code>Sword</code> and an <code>Axe</code>.</p>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> weapon_one_name = builder.CreateString(<span class="stringliteral">&quot;Sword&quot;</span>);</div><div class="line"><span class="keywordtype">short</span> weapon_one_damage = 3;</div><div class="line"></div><div class="line"><span class="keyword">auto</span> weapon_two_name = builder.CreateString(<span class="stringliteral">&quot;Axe&quot;</span>);</div><div class="line"><span class="keywordtype">short</span> weapon_two_damage = 5;</div><div class="line"></div><div class="line"><span class="comment">// Use the `CreateWeapon` shortcut to create Weapons with all the fields set.</span></div><div class="line"><span class="keyword">auto</span> sword = CreateWeapon(builder, weapon_one_name, weapon_one_damage);</div><div class="line"><span class="keyword">auto</span> axe = CreateWeapon(builder, weapon_two_name, weapon_two_damage);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keywordtype">int</span> weaponOneName = builder.createString(<span class="stringliteral">&quot;Sword&quot;</span>)</div><div class="line"><span class="keywordtype">short</span> weaponOneDamage = 3;</div><div class="line"></div><div class="line"><span class="keywordtype">int</span> weaponTwoName = builder.createString(<span class="stringliteral">&quot;Axe&quot;</span>);</div><div class="line"><span class="keywordtype">short</span> weaponTwoDamage = 5;</div><div class="line"></div><div class="line"><span class="comment">// Use the `createWeapon()` helper function to create the weapons, since we set every field.</span></div><div class="line"><span class="keywordtype">int</span> sword = Weapon.createWeapon(builder, weaponOneName, weaponOneDamage);</div><div class="line"><span class="keywordtype">int</span> axe = Weapon.createWeapon(builder, weaponTwoName, weaponTwoDamage);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">var weaponOneName = builder.CreateString(<span class="stringliteral">&quot;Sword&quot;</span>);</div><div class="line">var weaponOneDamage = 3;</div><div class="line"></div><div class="line">var weaponTwoName = builder.CreateString(<span class="stringliteral">&quot;Axe&quot;</span>);</div><div class="line">var weaponTwoDamage = 5;</div><div class="line"></div><div class="line"><span class="comment">// Use the `CreateWeapon()` helper function to create the weapons, since we set every field.</span></div><div class="line">var sword = Weapon.CreateWeapon(builder, weaponOneName, (<span class="keywordtype">short</span>)weaponOneDamage);</div><div class="line">var axe = Weapon.CreateWeapon(builder, weaponTwoName, (<span class="keywordtype">short</span>)weaponTwoDamage);</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">weaponOne := builder.CreateString(&quot;Sword&quot;)</div><div class="line">weaponTwo := builder.CreateString(&quot;Axe&quot;)</div><div class="line"></div><div class="line">// Create the first `Weapon` (&quot;Sword&quot;).</div><div class="line">sample.WeaponStart(builder)</div><div class="line">sample.Weapon.AddName(builder, weaponOne)</div><div class="line">sample.Weapon.AddDamage(builder, 3)</div><div class="line">sword := sample.WeaponEnd(builder)</div><div class="line"></div><div class="line">// Create the second `Weapon` (&quot;Axe&quot;).</div><div class="line">sample.WeaponStart(builder)</div><div class="line">sample.Weapon.AddName(builder, weaponTwo)</div><div class="line">sample.Weapon.AddDamage(builder, 5)</div><div class="line">axe := sample.WeaponEnd(builder)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">weapon_one = builder.CreateString(<span class="stringliteral">&#39;Sword&#39;</span>)</div><div class="line">weapon_two = builder.CreateString(<span class="stringliteral">&#39;Axe&#39;</span>)</div><div class="line"></div><div class="line"><span class="comment"># Create the first `Weapon` (&#39;Sword&#39;).</span></div><div class="line">MyGame.Sample.Weapon.WeaponStart(builder)</div><div class="line">MyGame.Sample.Weapon.WeaponAddName(builder, weapon_one)</div><div class="line">MyGame.Sample.Weapon.WeaponAddDamage(builder, 3)</div><div class="line">sword = MyGame.Sample.Weapon.WeaponEnd(builder)</div><div class="line"></div><div class="line"><span class="comment"># Create the second `Weapon` (&#39;Axe&#39;).</span></div><div class="line">MyGame.Sample.Weapon.WeaponStart(builder)</div><div class="line">MyGame.Sample.Weapon.WeaponAddName(builder, weapon_two)</div><div class="line">MyGame.Sample.Weapon.WeaponAddDamage(builder, 5)</div><div class="line">axe = MyGame.Sample.Weapon.WeaponEnd(builder)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var weaponOne = builder.createString(&#39;Sword&#39;);</div><div class="line">var weaponTwo = builder.createString(&#39;Axe&#39;);</div><div class="line"></div><div class="line">// Create the first `Weapon` (&#39;Sword&#39;).</div><div class="line">MyGame.Sample.Weapon.startWeapon(builder);</div><div class="line">MyGame.Sample.Weapon.addName(builder, weaponOne);</div><div class="line">MyGame.Sample.Weapon.addDamage(builder, 3);</div><div class="line">var sword = MyGame.Sample.Weapon.endWeapon(builder);</div><div class="line"></div><div class="line">// Create the second `Weapon` (&#39;Axe&#39;).</div><div class="line">MyGame.Sample.Weapon.startWeapon(builder);</div><div class="line">MyGame.Sample.Weapon.addName(builder, weaponTwo);</div><div class="line">MyGame.Sample.Weapon.addDamage(builder, 5);</div><div class="line">var axe = MyGame.Sample.Weapon.endWeapon(builder);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let weaponOne = builder.createString(&#39;Sword&#39;);</div><div class="line">let weaponTwo = builder.createString(&#39;Axe&#39;);</div><div class="line"></div><div class="line">// Create the first `Weapon` (&#39;Sword&#39;).</div><div class="line">MyGame.Sample.Weapon.startWeapon(builder);</div><div class="line">MyGame.Sample.Weapon.addName(builder, weaponOne);</div><div class="line">MyGame.Sample.Weapon.addDamage(builder, 3);</div><div class="line">let sword = MyGame.Sample.Weapon.endWeapon(builder);</div><div class="line"></div><div class="line">// Create the second `Weapon` (&#39;Axe&#39;).</div><div class="line">MyGame.Sample.Weapon.startWeapon(builder);</div><div class="line">MyGame.Sample.Weapon.addName(builder, weaponTwo);</div><div class="line">MyGame.Sample.Weapon.addDamage(builder, 5);</div><div class="line">let axe = MyGame.Sample.Weapon.endWeapon(builder);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// Create the `Weapon`s using the `createWeapon()` helper function.</span></div><div class="line">$weapon_one_name = $builder-&gt;createString(<span class="stringliteral">&quot;Sword&quot;</span>);</div><div class="line">$sword = \MyGame\Sample\Weapon::CreateWeapon($builder, $weapon_one_name, 3);</div><div class="line"></div><div class="line">$weapon_two_name = $builder-&gt;createString(<span class="stringliteral">&quot;Axe&quot;</span>);</div><div class="line">$axe = \MyGame\Sample\Weapon::CreateWeapon($builder, $weapon_two_name, 5);</div><div class="line"></div><div class="line"><span class="comment">// Create an array from the two `Weapon`s and pass it to the</span></div><div class="line"><span class="comment">// `CreateWeaponsVector()` method to create a FlatBuffer vector.</span></div><div class="line">$weaps = array($sword, $axe);</div><div class="line">$weapons = \MyGame\Sample\Monster::CreateWeaponsVector($builder, $weaps);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">ns(Weapon_ref_t) weapon_one_name = flatbuffers_string_create_str(B, <span class="stringliteral">&quot;Sword&quot;</span>);</div><div class="line">uint16_t weapon_one_damage = 3;</div><div class="line"></div><div class="line">ns(Weapon_ref_t) weapon_two_name = flatbuffers_string_create_str(B, <span class="stringliteral">&quot;Axe&quot;</span>);</div><div class="line">uint16_t weapon_two_damage = 5;</div><div class="line"></div><div class="line">ns(Weapon_ref_t) sword = ns(Weapon_create(B, weapon_one_name, weapon_one_damage));</div><div class="line">ns(Weapon_ref_t) axe = ns(Weapon_create(B, weapon_two_name, weapon_two_damage));</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">// The generated Builder classes work much like in other languages,</div><div class="line">final int weaponOneName = builder.writeString(&quot;Sword&quot;);</div><div class="line">final int weaponOneDamage = 3;</div><div class="line"></div><div class="line">final int weaponTwoName = builder.writeString(&quot;Axe&quot;);</div><div class="line">final int weaponTwoDamage = 5;</div><div class="line"></div><div class="line">final swordBuilder = new myGame.WeaponBuilder(builder)</div><div class="line">  ..begin()</div><div class="line">  ..addNameOffset(weaponOneName)</div><div class="line">  ..addDamage(weaponOneDamage);</div><div class="line">final int sword = swordBuilder.finish();</div><div class="line"></div><div class="line">final axeBuilder = new myGame.WeaponBuilder(builder)</div><div class="line">  ..begin()</div><div class="line">  ..addNameOffset(weaponTwoName)</div><div class="line">  ..addDamage(weaponTwoDamage);</div><div class="line">final int axe = axeBuilder.finish();</div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line">// The genearted ObjectBuilder classes offer an easier to use alternative</div><div class="line">// at the cost of requiring some additional reference allocations. If memory</div><div class="line">// usage is critical, or if you&#39;ll be working with especially large messages</div><div class="line">// or tables, you should prefer using the generated Builder classes.</div><div class="line">// The following code would produce an identical buffer as above.</div><div class="line">final String weaponOneName = &quot;Sword&quot;;</div><div class="line">final int weaponOneDamage = 3;</div><div class="line"></div><div class="line">final String weaponTwoName = &quot;Axe&quot;;</div><div class="line">final int weaponTwoDamage = 5;</div><div class="line"></div><div class="line">final myGame.WeaponBuilder sword = new myGame.WeaponObjectBuilder(</div><div class="line">  name: weaponOneName,</div><div class="line">  damage: weaponOneDamage,</div><div class="line">);</div><div class="line"></div><div class="line">final myGame.WeaponBuilder axe = new myGame.WeaponObjectBuilder(</div><div class="line">  name: weaponTwoName,</div><div class="line">  damage: weaponTwoDamage,</div><div class="line">);</div></div><!-- fragment --> </div><p>Now let's create our monster, the <code>orc</code>. For this <code>orc</code>, lets make him <code>red</code> with rage, positioned at <code>(1.0, 2.0, 3.0)</code>, and give him a large pool of hit points with <code>300</code>. We can give him a vector of weapons to choose from (our <code>Sword</code> and <code>Axe</code> from earlier). In this case, we will equip him with the <code>Axe</code>, since it is the most powerful of the two. Lastly, let's fill his inventory with some potential treasures that can be taken once he is defeated.</p>
 <p>Before we serialize a monster, we need to first serialize any objects that are contained there-in, i.e. we serialize the data tree using depth-first, pre-order traversal. This is generally easy to do on any tree structures.</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="comment">// Serialize a name for our monster, called &quot;Orc&quot;.</span></div><div class="line"><span class="keyword">auto</span> name = builder.CreateString(<span class="stringliteral">&quot;Orc&quot;</span>);</div><div class="line"></div><div class="line"><span class="comment">// Create a `vector` representing the inventory of the Orc. Each number</span></div><div class="line"><span class="comment">// could correspond to an item that can be claimed after he is slain.</span></div><div class="line"><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> treasure[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};</div><div class="line"><span class="keyword">auto</span> inventory = builder.CreateVector(treasure, 10);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="comment">// Serialize a name for our monster, called &quot;Orc&quot;.</span></div><div class="line"><span class="keywordtype">int</span> name = builder.createString(<span class="stringliteral">&quot;Orc&quot;</span>);</div><div class="line"></div><div class="line"><span class="comment">// Create a `vector` representing the inventory of the Orc. Each number</span></div><div class="line"><span class="comment">// could correspond to an item that can be claimed after he is slain.</span></div><div class="line">byte[] treasure = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};</div><div class="line"><span class="keywordtype">int</span> inv = Monster.createInventoryVector(builder, treasure);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="comment">// Serialize a name for our monster, called &quot;Orc&quot;.</span></div><div class="line">var name = builder.CreateString(<span class="stringliteral">&quot;Orc&quot;</span>);</div><div class="line"></div><div class="line"><span class="comment">// Create a `vector` representing the inventory of the Orc. Each number</span></div><div class="line"><span class="comment">// could correspond to an item that can be claimed after he is slain.</span></div><div class="line"><span class="comment">// Note: Since we prepend the bytes, this loop iterates in reverse order.</span></div><div class="line">Monster.StartInventoryVector(builder, 10);</div><div class="line"><span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 9; i &gt;= 0; i--)</div><div class="line">{</div><div class="line">  builder.AddByte((byte)i);</div><div class="line">}</div><div class="line">var inv = builder.EndVector();</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// Serialize a name for our monster, called &quot;Orc&quot;.</div><div class="line">name := builder.CreateString(&quot;Orc&quot;)</div><div class="line"></div><div class="line">// Create a `vector` representing the inventory of the Orc. Each number</div><div class="line">// could correspond to an item that can be claimed after he is slain.</div><div class="line">// Note: Since we prepend the bytes, this loop iterates in reverse.</div><div class="line">sample.MonsterStartInventoryVector(builder, 10)</div><div class="line">for i := 9; i &gt;= 0; i-- {</div><div class="line">        builder.PrependByte(byte(i))</div><div class="line">}</div><div class="line">int := builder.EndVector(10)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="comment"># Serialize a name for our monster, called &quot;Orc&quot;.</span></div><div class="line">name = builder.CreateString(<span class="stringliteral">&quot;Orc&quot;</span>)</div><div class="line"></div><div class="line"><span class="comment"># Create a `vector` representing the inventory of the Orc. Each number</span></div><div class="line"><span class="comment"># could correspond to an item that can be claimed after he is slain.</span></div><div class="line"><span class="comment"># Note: Since we prepend the bytes, this loop iterates in reverse.</span></div><div class="line">MyGame.Sample.Monster.MonsterStartInventoryVector(builder, 10)</div><div class="line"><span class="keywordflow">for</span> i <span class="keywordflow">in</span> reversed(range(0, 10)):</div><div class="line">  builder.PrependByte(i)</div><div class="line">inv = builder.EndVector(10)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// Serialize a name for our monster, called &#39;Orc&#39;.</div><div class="line">var name = builder.createString(&#39;Orc&#39;);</div><div class="line"></div><div class="line">// Create a `vector` representing the inventory of the Orc. Each number</div><div class="line">// could correspond to an item that can be claimed after he is slain.</div><div class="line">var treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];</div><div class="line">var inv = MyGame.Sample.Monster.createInventoryVector(builder, treasure);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// Serialize a name for our monster, called &#39;Orc&#39;.</div><div class="line">let name = builder.createString(&#39;Orc&#39;);</div><div class="line"></div><div class="line">// Create a `vector` representing the inventory of the Orc. Each number</div><div class="line">// could correspond to an item that can be claimed after he is slain.</div><div class="line">let treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];</div><div class="line">let inv = MyGame.Sample.Monster.createInventoryVector(builder, treasure);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// Serialize a name for our monster, called &quot;Orc&quot;.</span></div><div class="line">$name = $builder-&gt;createString(<span class="stringliteral">&quot;Orc&quot;</span>);</div><div class="line"></div><div class="line"><span class="comment">// Create a `vector` representing the inventory of the Orc. Each number</span></div><div class="line"><span class="comment">// could correspond to an item that can be claimed after he is slain.</span></div><div class="line">$treasure = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);</div><div class="line">$inv = \MyGame\Sample\Monster::CreateInventoryVector($builder, $treasure);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Serialize a name for our monster, called &quot;Orc&quot;.</span></div><div class="line"><span class="comment">// The _str suffix indicates the source is an ascii-z string.</span></div><div class="line">flatbuffers_string_ref_t name = flatbuffers_string_create_str(B, <span class="stringliteral">&quot;Orc&quot;</span>);</div><div class="line"></div><div class="line"><span class="comment">// Create a `vector` representing the inventory of the Orc. Each number</span></div><div class="line"><span class="comment">// could correspond to an item that can be claimed after he is slain.</span></div><div class="line">uint8_t treasure[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};</div><div class="line">flatbuffers_uint8_vec_ref_t inventory;</div><div class="line"><span class="comment">// `c_vec_len` is the convenience macro we defined earlier.</span></div><div class="line">inventory = flatbuffers_uint8_vec_create(B, treasure, c_vec_len(treasure));</div></div><!-- fragment --> </div><p>We serialized two built-in data types (<code>string</code> and <code>vector</code>) and captured their return values. These values are offsets into the serialized data, indicating where they are stored, such that we can refer to them below when adding fields to our monster.</p>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="comment">// Serialize a name for our monster, called &quot;Orc&quot;.</span></div><div class="line"><span class="keyword">auto</span> name = builder.CreateString(<span class="stringliteral">&quot;Orc&quot;</span>);</div><div class="line"></div><div class="line"><span class="comment">// Create a `vector` representing the inventory of the Orc. Each number</span></div><div class="line"><span class="comment">// could correspond to an item that can be claimed after he is slain.</span></div><div class="line"><span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> treasure[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};</div><div class="line"><span class="keyword">auto</span> inventory = builder.CreateVector(treasure, 10);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="comment">// Serialize a name for our monster, called &quot;Orc&quot;.</span></div><div class="line"><span class="keywordtype">int</span> name = builder.createString(<span class="stringliteral">&quot;Orc&quot;</span>);</div><div class="line"></div><div class="line"><span class="comment">// Create a `vector` representing the inventory of the Orc. Each number</span></div><div class="line"><span class="comment">// could correspond to an item that can be claimed after he is slain.</span></div><div class="line">byte[] treasure = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};</div><div class="line"><span class="keywordtype">int</span> inv = Monster.createInventoryVector(builder, treasure);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="comment">// Serialize a name for our monster, called &quot;Orc&quot;.</span></div><div class="line">var name = builder.CreateString(<span class="stringliteral">&quot;Orc&quot;</span>);</div><div class="line"></div><div class="line"><span class="comment">// Create a `vector` representing the inventory of the Orc. Each number</span></div><div class="line"><span class="comment">// could correspond to an item that can be claimed after he is slain.</span></div><div class="line"><span class="comment">// Note: Since we prepend the bytes, this loop iterates in reverse order.</span></div><div class="line">Monster.StartInventoryVector(builder, 10);</div><div class="line"><span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 9; i &gt;= 0; i--)</div><div class="line">{</div><div class="line">  builder.AddByte((byte)i);</div><div class="line">}</div><div class="line">var inv = builder.EndVector();</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// Serialize a name for our monster, called &quot;Orc&quot;.</div><div class="line">name := builder.CreateString(&quot;Orc&quot;)</div><div class="line"></div><div class="line">// Create a `vector` representing the inventory of the Orc. Each number</div><div class="line">// could correspond to an item that can be claimed after he is slain.</div><div class="line">// Note: Since we prepend the bytes, this loop iterates in reverse.</div><div class="line">sample.MonsterStartInventoryVector(builder, 10)</div><div class="line">for i := 9; i &gt;= 0; i-- {</div><div class="line">        builder.PrependByte(byte(i))</div><div class="line">}</div><div class="line">inv := builder.EndVector(10)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="comment"># Serialize a name for our monster, called &quot;Orc&quot;.</span></div><div class="line">name = builder.CreateString(<span class="stringliteral">&quot;Orc&quot;</span>)</div><div class="line"></div><div class="line"><span class="comment"># Create a `vector` representing the inventory of the Orc. Each number</span></div><div class="line"><span class="comment"># could correspond to an item that can be claimed after he is slain.</span></div><div class="line"><span class="comment"># Note: Since we prepend the bytes, this loop iterates in reverse.</span></div><div class="line">MyGame.Sample.Monster.MonsterStartInventoryVector(builder, 10)</div><div class="line"><span class="keywordflow">for</span> i <span class="keywordflow">in</span> reversed(range(0, 10)):</div><div class="line">  builder.PrependByte(i)</div><div class="line">inv = builder.EndVector(10)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// Serialize a name for our monster, called &#39;Orc&#39;.</div><div class="line">var name = builder.createString(&#39;Orc&#39;);</div><div class="line"></div><div class="line">// Create a `vector` representing the inventory of the Orc. Each number</div><div class="line">// could correspond to an item that can be claimed after he is slain.</div><div class="line">var treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];</div><div class="line">var inv = MyGame.Sample.Monster.createInventoryVector(builder, treasure);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// Serialize a name for our monster, called &#39;Orc&#39;.</div><div class="line">let name = builder.createString(&#39;Orc&#39;);</div><div class="line"></div><div class="line">// Create a `vector` representing the inventory of the Orc. Each number</div><div class="line">// could correspond to an item that can be claimed after he is slain.</div><div class="line">let treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];</div><div class="line">let inv = MyGame.Sample.Monster.createInventoryVector(builder, treasure);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// Serialize a name for our monster, called &quot;Orc&quot;.</span></div><div class="line">$name = $builder-&gt;createString(<span class="stringliteral">&quot;Orc&quot;</span>);</div><div class="line"></div><div class="line"><span class="comment">// Create a `vector` representing the inventory of the Orc. Each number</span></div><div class="line"><span class="comment">// could correspond to an item that can be claimed after he is slain.</span></div><div class="line">$treasure = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);</div><div class="line">$inv = \MyGame\Sample\Monster::CreateInventoryVector($builder, $treasure);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Serialize a name for our monster, called &quot;Orc&quot;.</span></div><div class="line"><span class="comment">// The _str suffix indicates the source is an ascii-z string.</span></div><div class="line">flatbuffers_string_ref_t name = flatbuffers_string_create_str(B, <span class="stringliteral">&quot;Orc&quot;</span>);</div><div class="line"></div><div class="line"><span class="comment">// Create a `vector` representing the inventory of the Orc. Each number</span></div><div class="line"><span class="comment">// could correspond to an item that can be claimed after he is slain.</span></div><div class="line">uint8_t treasure[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};</div><div class="line">flatbuffers_uint8_vec_ref_t inventory;</div><div class="line"><span class="comment">// `c_vec_len` is the convenience macro we defined earlier.</span></div><div class="line">inventory = flatbuffers_uint8_vec_create(B, treasure, c_vec_len(treasure));</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">// Serialize a name for our monster, called &quot;Orc&quot;.</div><div class="line">final int name = builder.writeString(&#39;Orc&#39;);</div><div class="line"></div><div class="line">// Create a list representing the inventory of the Orc. Each number</div><div class="line">// could correspond to an item that can be claimed after he is slain.</div><div class="line">final List&lt;int&gt; treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];</div><div class="line">final inventory = builder.writeListUint8(treasure);</div><div class="line"></div><div class="line">// The following code should be used instead if you intend to use the</div><div class="line">// ObjectBuilder classes:</div><div class="line">// Serialize a name for our monster, called &quot;Orc&quot;.</div><div class="line">final String name = &#39;Orc&#39;;</div><div class="line"></div><div class="line">// Create a list representing the inventory of the Orc. Each number</div><div class="line">// could correspond to an item that can be claimed after he is slain.</div><div class="line">final List&lt;int&gt; treasure = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];</div></div><!-- fragment --> </div><p>We serialized two built-in data types (<code>string</code> and <code>vector</code>) and captured their return values. These values are offsets into the serialized data, indicating where they are stored, such that we can refer to them below when adding fields to our monster.</p>
 <p><em>Note: To create a <code>vector</code> of nested objects (e.g. <code>table</code>s, <code>string</code>s, or other <code>vector</code>s), collect their offsets into a temporary data structure, and then create an additional <code>vector</code> containing their offsets.</em></p>
 <p>If instead of creating a vector from an existing array you serialize elements individually one by one, take care to note that this happens in reverse order, as buffers are built back to front.</p>
 <p>For example, take a look at the two <code>Weapon</code>s that we created earlier (<code>Sword</code> and <code>Axe</code>). These are both FlatBuffer <code>table</code>s, whose offsets we now store in memory. Therefore we can create a FlatBuffer <code>vector</code> to contain these offsets.</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="comment">// Place the weapons into a `std::vector`, then convert that into a FlatBuffer `vector`.</span></div><div class="line">std::vector&lt;flatbuffers::Offset&lt;Weapon&gt;&gt; weapons_vector;</div><div class="line">weapons_vector.push_back(sword);</div><div class="line">weapons_vector.push_back(axe);</div><div class="line"><span class="keyword">auto</span> weapons = builder.CreateVector(weapons_vector);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="comment">// Place the two weapons into an array, and pass it to the `createWeaponsVector()` method to</span></div><div class="line"><span class="comment">// create a FlatBuffer vector.</span></div><div class="line"><span class="keywordtype">int</span>[] weaps = <span class="keyword">new</span> <span class="keywordtype">int</span>[2];</div><div class="line">weaps[0] = sword;</div><div class="line">weaps[1] = axe;</div><div class="line"></div><div class="line"><span class="comment">// Pass the `weaps` array into the `createWeaponsVector()` method to create a FlatBuffer vector.</span></div><div class="line"><span class="keywordtype">int</span> weapons = Monster.createWeaponsVector(builder, weaps);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">var weaps = <span class="keyword">new</span> Offset&lt;Weapon&gt;[2];</div><div class="line">weaps[0] = sword;</div><div class="line">weaps[1] = axe;</div><div class="line"></div><div class="line"><span class="comment">// Pass the `weaps` array into the `CreateWeaponsVector()` method to create a FlatBuffer vector.</span></div><div class="line">var weapons = Monster.CreateWeaponsVector(builder, weaps);</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// Create a FlatBuffer vector and prepend the weapons.</div><div class="line">// Note: Since we prepend the data, prepend them in reverse order.</div><div class="line">sample.MonsterStartWeaponsVector(builder, 2)</div><div class="line">builder.PrependUOffsetT(axe)</div><div class="line">builder.PrependUOffsetT(sword)</div><div class="line">weapons := builder.EndVector(2)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="comment"># Create a FlatBuffer vector and prepend the weapons.</span></div><div class="line"><span class="comment"># Note: Since we prepend the data, prepend them in reverse order.</span></div><div class="line">MyGame.Sample.Monster.MonsterStartWeaponsVector(builder, 2)</div><div class="line">builder.PrependUOffsetTRelative(axe)</div><div class="line">builder.PrependUOffsetTRelative(sword)</div><div class="line">weapons = builder.EndVector(2)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// Create an array from the two `Weapon`s and pass it to the</div><div class="line">// `createWeaponsVector()` method to create a FlatBuffer vector.</div><div class="line">var weaps = [sword, axe];</div><div class="line">var weapons = MyGame.Sample.Monster.createWeaponsVector(builder, weaps);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// Create an array from the two `Weapon`s and pass it to the</div><div class="line">// `createWeaponsVector()` method to create a FlatBuffer vector.</div><div class="line">let weaps = [sword, axe];</div><div class="line">let weapons = MyGame.Sample.Monster.createWeaponsVector(builder, weaps);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// Create an array from the two `Weapon`s and pass it to the</span></div><div class="line"><span class="comment">// `CreateWeaponsVector()` method to create a FlatBuffer vector.</span></div><div class="line">$weaps = array($sword, $axe);</div><div class="line">$weapons = \MyGame\Sample\Monster::CreateWeaponsVector($builder, $weaps);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// We use the internal builder stack to implement a dynamic vector.</span></div><div class="line">ns(Weapon_vec_start(B));</div><div class="line">ns(Weapon_vec_push(B, sword));</div><div class="line">ns(Weapon_vec_push(B, axe));</div><div class="line">ns(Weapon_vec_ref_t) weapons = ns(Weapon_vec_end(B));</div></div><!-- fragment --> </div><div class="language-cpp"> <br />
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="comment">// Place the weapons into a `std::vector`, then convert that into a FlatBuffer `vector`.</span></div><div class="line">std::vector&lt;flatbuffers::Offset&lt;Weapon&gt;&gt; weapons_vector;</div><div class="line">weapons_vector.push_back(sword);</div><div class="line">weapons_vector.push_back(axe);</div><div class="line"><span class="keyword">auto</span> weapons = builder.CreateVector(weapons_vector);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="comment">// Place the two weapons into an array, and pass it to the `createWeaponsVector()` method to</span></div><div class="line"><span class="comment">// create a FlatBuffer vector.</span></div><div class="line"><span class="keywordtype">int</span>[] weaps = <span class="keyword">new</span> <span class="keywordtype">int</span>[2];</div><div class="line">weaps[0] = sword;</div><div class="line">weaps[1] = axe;</div><div class="line"></div><div class="line"><span class="comment">// Pass the `weaps` array into the `createWeaponsVector()` method to create a FlatBuffer vector.</span></div><div class="line"><span class="keywordtype">int</span> weapons = Monster.createWeaponsVector(builder, weaps);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">var weaps = <span class="keyword">new</span> Offset&lt;Weapon&gt;[2];</div><div class="line">weaps[0] = sword;</div><div class="line">weaps[1] = axe;</div><div class="line"></div><div class="line"><span class="comment">// Pass the `weaps` array into the `CreateWeaponsVector()` method to create a FlatBuffer vector.</span></div><div class="line">var weapons = Monster.CreateWeaponsVector(builder, weaps);</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// Create a FlatBuffer vector and prepend the weapons.</div><div class="line">// Note: Since we prepend the data, prepend them in reverse order.</div><div class="line">sample.MonsterStartWeaponsVector(builder, 2)</div><div class="line">builder.PrependUOffsetT(axe)</div><div class="line">builder.PrependUOffsetT(sword)</div><div class="line">weapons := builder.EndVector(2)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="comment"># Create a FlatBuffer vector and prepend the weapons.</span></div><div class="line"><span class="comment"># Note: Since we prepend the data, prepend them in reverse order.</span></div><div class="line">MyGame.Sample.Monster.MonsterStartWeaponsVector(builder, 2)</div><div class="line">builder.PrependUOffsetTRelative(axe)</div><div class="line">builder.PrependUOffsetTRelative(sword)</div><div class="line">weapons = builder.EndVector(2)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// Create an array from the two `Weapon`s and pass it to the</div><div class="line">// `createWeaponsVector()` method to create a FlatBuffer vector.</div><div class="line">var weaps = [sword, axe];</div><div class="line">var weapons = MyGame.Sample.Monster.createWeaponsVector(builder, weaps);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// Create an array from the two `Weapon`s and pass it to the</div><div class="line">// `createWeaponsVector()` method to create a FlatBuffer vector.</div><div class="line">let weaps = [sword, axe];</div><div class="line">let weapons = MyGame.Sample.Monster.createWeaponsVector(builder, weaps);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// Create an array from the two `Weapon`s and pass it to the</span></div><div class="line"><span class="comment">// `CreateWeaponsVector()` method to create a FlatBuffer vector.</span></div><div class="line">$weaps = array($sword, $axe);</div><div class="line">$weapons = \MyGame\Sample\Monster::CreateWeaponsVector($builder, $weaps);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// We use the internal builder stack to implement a dynamic vector.</span></div><div class="line">ns(Weapon_vec_start(B));</div><div class="line">ns(Weapon_vec_push(B, sword));</div><div class="line">ns(Weapon_vec_push(B, axe));</div><div class="line">ns(Weapon_vec_ref_t) weapons = ns(Weapon_vec_end(B));</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">// If using the Builder classes, serialize the `[sword,axe]`</div><div class="line">final weapons = builder.writeList([sword, axe]);</div><div class="line"></div><div class="line">// If using the ObjectBuilders, just create an array from the two `Weapon`s</div><div class="line">final List&lt;myGame.WeaponBuilder&gt; weaps = [sword, axe];</div></div><!-- fragment --> </div><div class="language-cpp"> <br />
  Note there's additional convenience overloads of <code>CreateVector</code>, allowing you to work with data that's not in a <code>std::vector</code>, or allowing you to generate elements by calling a lambda. For the common case of <code>std::vector&lt;std::string&gt;</code> there's also <code>CreateVectorOfStrings</code>. </div><p>Note that vectors of structs are serialized differently from tables, since structs are stored in-line in the vector. For example, to create a vector for the <code>path</code> field above:</p>
-<div class="language-cpp"> <div class="fragment"><div class="line">Vec3 points[] = { Vec3(1.0f, 2.0f, 3.0f), Vec3(4.0f, 5.0f, 6.0f) };</div><div class="line"><span class="keyword">auto</span> path = builder.CreateVectorOfStructs(points, 2);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line">Monster.startPathVector(fbb, 2);</div><div class="line">Vec3.createVec3(builder, 1.0f, 2.0f, 3.0f);</div><div class="line">Vec3.createVec3(builder, 4.0f, 5.0f, 6.0f);</div><div class="line"><span class="keywordtype">int</span> path = fbb.endVector();</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">Monster.StartPathVector(fbb, 2);</div><div class="line">Vec3.CreateVec3(builder, 1.0f, 2.0f, 3.0f);</div><div class="line">Vec3.CreateVec3(builder, 4.0f, 5.0f, 6.0f);</div><div class="line">var path = fbb.EndVector();</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">sample.MonsterStartPathVector(builder, 2)</div><div class="line">sample.CreateVec3(builder, 1.0, 2.0, 3.0)</div><div class="line">sample.CreateVec3(builder, 4.0, 5.0, 6.0)</div><div class="line">path := builder.EndVector(2)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">MyGame.Sample.Monster.MonsterStartPathVector(builder, 2)</div><div class="line">MyGame.Sample.Vec3.CreateVec3(builder, 1.0, 2.0, 3.0)</div><div class="line">MyGame.Sample.Vec3.CreateVec3(builder, 4.0, 5.0, 6.0)</div><div class="line">path = builder.EndVector(2)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">MyGame.Sample.Monster.startPathVector(builder, 2);</div><div class="line">MyGame.Sample.Vec3.createVec3(builder, 1.0, 2.0, 3.0);</div><div class="line">MyGame.Sample.Vec3.createVec3(builder, 4.0, 5.0, 6.0);</div><div class="line">var path = builder.endVector();</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">MyGame.Sample.Monster.startPathVector(builder, 2);</div><div class="line">MyGame.Sample.Vec3.createVec3(builder, 1.0, 2.0, 3.0);</div><div class="line">MyGame.Sample.Vec3.createVec3(builder, 4.0, 5.0, 6.0);</div><div class="line">let path = builder.endVector();</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">\MyGame\Example\Monster::StartPathVector($builder, 2);</div><div class="line">\MyGame\Sample\Vec3::CreateVec3($builder, 1.0, 2.0, 3.0);</div><div class="line">\MyGame\Sample\Vec3::CreateVec3($builder, 1.0, 2.0, 3.0);</div><div class="line">$path = $builder-&gt;endVector();</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// TBD</span></div></div><!-- fragment --> </div><p>We have now serialized the non-scalar components of the orc, so we can serialize the monster itself:</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="comment">// Create the position struct</span></div><div class="line"><span class="keyword">auto</span> position = Vec3(1.0f, 2.0f, 3.0f);</div><div class="line"></div><div class="line"><span class="comment">// Set his hit points to 300 and his mana to 150.</span></div><div class="line"><span class="keywordtype">int</span> hp = 300;</div><div class="line"><span class="keywordtype">int</span> mana = 150;</div><div class="line"></div><div class="line"><span class="comment">// Finally, create the monster using the `CreateMonster` helper function</span></div><div class="line"><span class="comment">// to set all fields.</span></div><div class="line"><span class="keyword">auto</span> orc = CreateMonster(builder, &amp;position, mana, hp, name, inventory,</div><div class="line">                        Color_Red, weapons, Equipment_Weapon, axe.Union(),</div><div class="line">                        path);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="comment">// Create our monster using `startMonster()` and `endMonster()`.</span></div><div class="line">Monster.startMonster(builder);</div><div class="line">Monster.addPos(builder, Vec3.createVec3(builder, 1.0f, 2.0f, 3.0f));</div><div class="line">Monster.addName(builder, name);</div><div class="line">Monster.addColor(builder, Color.Red);</div><div class="line">Monster.addHp(builder, (<span class="keywordtype">short</span>)300);</div><div class="line">Monster.addInventory(builder, inv);</div><div class="line">Monster.addWeapons(builder, weapons);</div><div class="line">Monster.addEquippedType(builder, Equipment.Weapon);</div><div class="line">Monster.addEquipped(builder, axe);</div><div class="line">Monster.addPath(builder, path);</div><div class="line"><span class="keywordtype">int</span> orc = Monster.endMonster(builder);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="comment">// Create our monster using `StartMonster()` and `EndMonster()`.</span></div><div class="line">Monster.StartMonster(builder);</div><div class="line">Monster.AddPos(builder, Vec3.CreateVec3(builder, 1.0f, 2.0f, 3.0f));</div><div class="line">Monster.AddHp(builder, (<span class="keywordtype">short</span>)300);</div><div class="line">Monster.AddName(builder, name);</div><div class="line">Monster.AddInventory(builder, inv);</div><div class="line">Monster.AddColor(builder, Color.Red);</div><div class="line">Monster.AddWeapons(builder, weapons);</div><div class="line">Monster.AddEquippedType(builder, Equipment.Weapon);</div><div class="line">Monster.AddEquipped(builder, axe.Value); <span class="comment">// Axe</span></div><div class="line">Monster.AddPath(builder, path);</div><div class="line">var orc = Monster.EndMonster(builder);</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// Create our monster using `MonsterStart()` and `MonsterEnd()`.</div><div class="line">sample.MonsterStart(builder)</div><div class="line">sample.MonsterAddPos(builder, sample.CreateVec3(builder, 1.0, 2.0, 3.0))</div><div class="line">sample.MonsterAddHp(builder, 300)</div><div class="line">sample.MonsterAddName(builder, name)</div><div class="line">sample.MonsterAddInventory(builder, inv)</div><div class="line">sample.MonsterAddColor(builder, sample.ColorRed)</div><div class="line">sample.MonsterAddWeapons(builder, weapons)</div><div class="line">sample.MonsterAddEquippedType(builder, sample.EquipmentWeapon)</div><div class="line">sample.MonsterAddEquipped(builder, axe)</div><div class="line">sample.MonsterAddPath(builder, path)</div><div class="line">orc := sample.MonsterEnd(builder)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="comment"># Create our monster by using `MonsterStart()` and `MonsterEnd()`.</span></div><div class="line">MyGame.Sample.Monster.MonsterStart(builder)</div><div class="line">MyGame.Sample.Monster.MonsterAddPos(builder,</div><div class="line">                        MyGame.Sample.Vec3.CreateVec3(builder, 1.0, 2.0, 3.0))</div><div class="line">MyGame.Sample.Monster.MonsterAddHp(builder, 300)</div><div class="line">MyGame.Sample.Monster.MonsterAddName(builder, name)</div><div class="line">MyGame.Sample.Monster.MonsterAddInventory(builder, inv)</div><div class="line">MyGame.Sample.Monster.MonsterAddColor(builder,</div><div class="line">                                      MyGame.Sample.Color.Color().Red)</div><div class="line">MyGame.Sample.Monster.MonsterAddWeapons(builder, weapons)</div><div class="line">MyGame.Sample.Monster.MonsterAddEquippedType(</div><div class="line">    builder, MyGame.Sample.Equipment.Equipment().Weapon)</div><div class="line">MyGame.Sample.Monster.MonsterAddEquipped(builder, axe)</div><div class="line">MyGame.Sample.Monster.MonsterAddPath(builder, path)</div><div class="line">orc = MyGame.Sample.Monster.MonsterEnd(builder)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// Create our monster by using `startMonster()` and `endMonster()`.</div><div class="line">MyGame.Sample.Monster.startMonster(builder);</div><div class="line">MyGame.Sample.Monster.addPos(builder,</div><div class="line">                       MyGame.Sample.Vec3.createVec3(builder, 1.0, 2.0, 3.0));</div><div class="line">MyGame.Sample.Monster.addHp(builder, 300);</div><div class="line">MyGame.Sample.Monster.addColor(builder, MyGame.Sample.Color.Red)</div><div class="line">MyGame.Sample.Monster.addName(builder, name);</div><div class="line">MyGame.Sample.Monster.addInventory(builder, inv);</div><div class="line">MyGame.Sample.Monster.addWeapons(builder, weapons);</div><div class="line">MyGame.Sample.Monster.addEquippedType(builder, MyGame.Sample.Equipment.Weapon);</div><div class="line">MyGame.Sample.Monster.addEquipped(builder, axe);</div><div class="line">MyGame.Sample.Monster.addPath(builder, path);</div><div class="line">var orc = MyGame.Sample.Monster.endMonster(builder);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// Create our monster by using `startMonster()` and `endMonster()`.</div><div class="line">MyGame.Sample.Monster.startMonster(builder);</div><div class="line">MyGame.Sample.Monster.addPos(builder,</div><div class="line">                       MyGame.Sample.Vec3.createVec3(builder, 1.0, 2.0, 3.0));</div><div class="line">MyGame.Sample.Monster.addHp(builder, 300);</div><div class="line">MyGame.Sample.Monster.addColor(builder, MyGame.Sample.Color.Red)</div><div class="line">MyGame.Sample.Monster.addName(builder, name);</div><div class="line">MyGame.Sample.Monster.addInventory(builder, inv);</div><div class="line">MyGame.Sample.Monster.addWeapons(builder, weapons);</div><div class="line">MyGame.Sample.Monster.addEquippedType(builder, MyGame.Sample.Equipment.Weapon);</div><div class="line">MyGame.Sample.Monster.addEquipped(builder, axe);</div><div class="line">MyGame.Sample.Monster.addPath(builder, path);</div><div class="line">let orc = MyGame.Sample.Monster.endMonster(builder);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// Create our monster by using `StartMonster()` and `EndMonster()`.</span></div><div class="line">\MyGame\Sample\Monster::StartMonster($builder);</div><div class="line">\MyGame\Sample\Monster::AddPos($builder,</div><div class="line">                    \MyGame\Sample\Vec3::CreateVec3($builder, 1.0, 2.0, 3.0));</div><div class="line">\MyGame\Sample\Monster::AddHp($builder, 300);</div><div class="line">\MyGame\Sample\Monster::AddName($builder, $name);</div><div class="line">\MyGame\Sample\Monster::AddInventory($builder, $inv);</div><div class="line">\MyGame\Sample\Monster::AddColor($builder, \MyGame\Sample\Color::Red);</div><div class="line">\MyGame\Sample\Monster::AddWeapons($builder, $weapons);</div><div class="line">\MyGame\Sample\Monster::AddEquippedType($builder, \MyGame\Sample\Equipment::Weapon);</div><div class="line">\MyGame\Sample\Monster::AddEquipped($builder, $axe);</div><div class="line">\MyGame\Sample\Monster::AddPath($builder, $path);</div><div class="line">$orc = \MyGame\Sample\Monster::EndMonster($builder);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Set his hit points to 300 and his mana to 150.</span></div><div class="line">uint16_t hp = 300;</div><div class="line">uint16_t mana = 150;</div><div class="line"></div><div class="line"><span class="comment">// Define an equipment union. `create` calls in C has a single</span></div><div class="line"><span class="comment">// argument for unions where C++ has both a type and a data argument.</span></div><div class="line">ns(Equipment_union_ref_t) equipped = ns(Equipment_as_Weapon(axe));</div><div class="line">ns(Vec3_t) pos = { 1.0f, 2.0f, 3.0f };</div><div class="line">ns(Monster_create_as_root(B, &amp;pos, mana, hp, name, inventory, ns(Color_Red),</div><div class="line">        weapons, equipped, path));</div></div><!-- fragment --> </div><p>Note how we create <code>Vec3</code> struct in-line in the table. Unlike tables, structs are simple combinations of scalars that are always stored inline, just like scalars themselves.</p>
+<div class="language-cpp"> <div class="fragment"><div class="line">Vec3 points[] = { Vec3(1.0f, 2.0f, 3.0f), Vec3(4.0f, 5.0f, 6.0f) };</div><div class="line"><span class="keyword">auto</span> path = builder.CreateVectorOfStructs(points, 2);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line">Monster.startPathVector(fbb, 2);</div><div class="line">Vec3.createVec3(builder, 1.0f, 2.0f, 3.0f);</div><div class="line">Vec3.createVec3(builder, 4.0f, 5.0f, 6.0f);</div><div class="line"><span class="keywordtype">int</span> path = fbb.endVector();</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">Monster.StartPathVector(fbb, 2);</div><div class="line">Vec3.CreateVec3(builder, 1.0f, 2.0f, 3.0f);</div><div class="line">Vec3.CreateVec3(builder, 4.0f, 5.0f, 6.0f);</div><div class="line">var path = fbb.EndVector();</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">sample.MonsterStartPathVector(builder, 2)</div><div class="line">sample.CreateVec3(builder, 1.0, 2.0, 3.0)</div><div class="line">sample.CreateVec3(builder, 4.0, 5.0, 6.0)</div><div class="line">path := builder.EndVector(2)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">MyGame.Sample.Monster.MonsterStartPathVector(builder, 2)</div><div class="line">MyGame.Sample.Vec3.CreateVec3(builder, 1.0, 2.0, 3.0)</div><div class="line">MyGame.Sample.Vec3.CreateVec3(builder, 4.0, 5.0, 6.0)</div><div class="line">path = builder.EndVector(2)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">MyGame.Sample.Monster.startPathVector(builder, 2);</div><div class="line">MyGame.Sample.Vec3.createVec3(builder, 1.0, 2.0, 3.0);</div><div class="line">MyGame.Sample.Vec3.createVec3(builder, 4.0, 5.0, 6.0);</div><div class="line">var path = builder.endVector();</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">MyGame.Sample.Monster.startPathVector(builder, 2);</div><div class="line">MyGame.Sample.Vec3.createVec3(builder, 1.0, 2.0, 3.0);</div><div class="line">MyGame.Sample.Vec3.createVec3(builder, 4.0, 5.0, 6.0);</div><div class="line">let path = builder.endVector();</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">\MyGame\Example\Monster::StartPathVector($builder, 2);</div><div class="line">\MyGame\Sample\Vec3::CreateVec3($builder, 1.0, 2.0, 3.0);</div><div class="line">\MyGame\Sample\Vec3::CreateVec3($builder, 1.0, 2.0, 3.0);</div><div class="line">$path = $builder-&gt;endVector();</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// TBD</span></div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">// Using the Builder classes, you can write a list of structs like so:</div><div class="line">// Note that the intended order should be reversed if order is important.</div><div class="line">final vec3Builder = new myGame.Vec3Builder(builder);</div><div class="line">vec3Builder.finish(4.0, 5.0, 6.0);</div><div class="line">vec3Builder.finish(1.0, 2.0, 3.0);</div><div class="line">final int path = builder.endStructVector(2); // the lenght of the vector</div><div class="line"></div><div class="line">// Otherwise, using the ObjectBuilder classes:</div><div class="line">// The dart implementation provides a simple interface for writing vectors</div><div class="line">// of structs, in `writeListOfStructs`. This method takes</div><div class="line">// `List&lt;ObjectBuilder&gt;` and is used by the generated builder classes.</div><div class="line">final List&lt;myGame.Vec3ObjectBuilder&gt; path = [</div><div class="line">  new myGame.Vec3ObjectBuilder(x: 1.0, y: 2.0, z: 3.0),</div><div class="line">  new myGame.Vec3ObjectBuilder(x: 4.0, y: 5.0, z: 6.0)</div><div class="line">];</div></div><!-- fragment --> </div><p>We have now serialized the non-scalar components of the orc, so we can serialize the monster itself:</p>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="comment">// Create the position struct</span></div><div class="line"><span class="keyword">auto</span> position = Vec3(1.0f, 2.0f, 3.0f);</div><div class="line"></div><div class="line"><span class="comment">// Set his hit points to 300 and his mana to 150.</span></div><div class="line"><span class="keywordtype">int</span> hp = 300;</div><div class="line"><span class="keywordtype">int</span> mana = 150;</div><div class="line"></div><div class="line"><span class="comment">// Finally, create the monster using the `CreateMonster` helper function</span></div><div class="line"><span class="comment">// to set all fields.</span></div><div class="line"><span class="keyword">auto</span> orc = CreateMonster(builder, &amp;position, mana, hp, name, inventory,</div><div class="line">                        Color_Red, weapons, Equipment_Weapon, axe.Union(),</div><div class="line">                        path);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="comment">// Create our monster using `startMonster()` and `endMonster()`.</span></div><div class="line">Monster.startMonster(builder);</div><div class="line">Monster.addPos(builder, Vec3.createVec3(builder, 1.0f, 2.0f, 3.0f));</div><div class="line">Monster.addName(builder, name);</div><div class="line">Monster.addColor(builder, Color.Red);</div><div class="line">Monster.addHp(builder, (<span class="keywordtype">short</span>)300);</div><div class="line">Monster.addInventory(builder, inv);</div><div class="line">Monster.addWeapons(builder, weapons);</div><div class="line">Monster.addEquippedType(builder, Equipment.Weapon);</div><div class="line">Monster.addEquipped(builder, axe);</div><div class="line">Monster.addPath(builder, path);</div><div class="line"><span class="keywordtype">int</span> orc = Monster.endMonster(builder);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="comment">// Create our monster using `StartMonster()` and `EndMonster()`.</span></div><div class="line">Monster.StartMonster(builder);</div><div class="line">Monster.AddPos(builder, Vec3.CreateVec3(builder, 1.0f, 2.0f, 3.0f));</div><div class="line">Monster.AddHp(builder, (<span class="keywordtype">short</span>)300);</div><div class="line">Monster.AddName(builder, name);</div><div class="line">Monster.AddInventory(builder, inv);</div><div class="line">Monster.AddColor(builder, Color.Red);</div><div class="line">Monster.AddWeapons(builder, weapons);</div><div class="line">Monster.AddEquippedType(builder, Equipment.Weapon);</div><div class="line">Monster.AddEquipped(builder, axe.Value); <span class="comment">// Axe</span></div><div class="line">Monster.AddPath(builder, path);</div><div class="line">var orc = Monster.EndMonster(builder);</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// Create our monster using `MonsterStart()` and `MonsterEnd()`.</div><div class="line">sample.MonsterStart(builder)</div><div class="line">sample.MonsterAddPos(builder, sample.CreateVec3(builder, 1.0, 2.0, 3.0))</div><div class="line">sample.MonsterAddHp(builder, 300)</div><div class="line">sample.MonsterAddName(builder, name)</div><div class="line">sample.MonsterAddInventory(builder, inv)</div><div class="line">sample.MonsterAddColor(builder, sample.ColorRed)</div><div class="line">sample.MonsterAddWeapons(builder, weapons)</div><div class="line">sample.MonsterAddEquippedType(builder, sample.EquipmentWeapon)</div><div class="line">sample.MonsterAddEquipped(builder, axe)</div><div class="line">sample.MonsterAddPath(builder, path)</div><div class="line">orc := sample.MonsterEnd(builder)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="comment"># Create our monster by using `MonsterStart()` and `MonsterEnd()`.</span></div><div class="line">MyGame.Sample.Monster.MonsterStart(builder)</div><div class="line">MyGame.Sample.Monster.MonsterAddPos(builder,</div><div class="line">                        MyGame.Sample.Vec3.CreateVec3(builder, 1.0, 2.0, 3.0))</div><div class="line">MyGame.Sample.Monster.MonsterAddHp(builder, 300)</div><div class="line">MyGame.Sample.Monster.MonsterAddName(builder, name)</div><div class="line">MyGame.Sample.Monster.MonsterAddInventory(builder, inv)</div><div class="line">MyGame.Sample.Monster.MonsterAddColor(builder,</div><div class="line">                                      MyGame.Sample.Color.Color().Red)</div><div class="line">MyGame.Sample.Monster.MonsterAddWeapons(builder, weapons)</div><div class="line">MyGame.Sample.Monster.MonsterAddEquippedType(</div><div class="line">    builder, MyGame.Sample.Equipment.Equipment().Weapon)</div><div class="line">MyGame.Sample.Monster.MonsterAddEquipped(builder, axe)</div><div class="line">MyGame.Sample.Monster.MonsterAddPath(builder, path)</div><div class="line">orc = MyGame.Sample.Monster.MonsterEnd(builder)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// Create our monster by using `startMonster()` and `endMonster()`.</div><div class="line">MyGame.Sample.Monster.startMonster(builder);</div><div class="line">MyGame.Sample.Monster.addPos(builder,</div><div class="line">                       MyGame.Sample.Vec3.createVec3(builder, 1.0, 2.0, 3.0));</div><div class="line">MyGame.Sample.Monster.addHp(builder, 300);</div><div class="line">MyGame.Sample.Monster.addColor(builder, MyGame.Sample.Color.Red)</div><div class="line">MyGame.Sample.Monster.addName(builder, name);</div><div class="line">MyGame.Sample.Monster.addInventory(builder, inv);</div><div class="line">MyGame.Sample.Monster.addWeapons(builder, weapons);</div><div class="line">MyGame.Sample.Monster.addEquippedType(builder, MyGame.Sample.Equipment.Weapon);</div><div class="line">MyGame.Sample.Monster.addEquipped(builder, axe);</div><div class="line">MyGame.Sample.Monster.addPath(builder, path);</div><div class="line">var orc = MyGame.Sample.Monster.endMonster(builder);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// Create our monster by using `startMonster()` and `endMonster()`.</div><div class="line">MyGame.Sample.Monster.startMonster(builder);</div><div class="line">MyGame.Sample.Monster.addPos(builder,</div><div class="line">                       MyGame.Sample.Vec3.createVec3(builder, 1.0, 2.0, 3.0));</div><div class="line">MyGame.Sample.Monster.addHp(builder, 300);</div><div class="line">MyGame.Sample.Monster.addColor(builder, MyGame.Sample.Color.Red)</div><div class="line">MyGame.Sample.Monster.addName(builder, name);</div><div class="line">MyGame.Sample.Monster.addInventory(builder, inv);</div><div class="line">MyGame.Sample.Monster.addWeapons(builder, weapons);</div><div class="line">MyGame.Sample.Monster.addEquippedType(builder, MyGame.Sample.Equipment.Weapon);</div><div class="line">MyGame.Sample.Monster.addEquipped(builder, axe);</div><div class="line">MyGame.Sample.Monster.addPath(builder, path);</div><div class="line">let orc = MyGame.Sample.Monster.endMonster(builder);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// Create our monster by using `StartMonster()` and `EndMonster()`.</span></div><div class="line">\MyGame\Sample\Monster::StartMonster($builder);</div><div class="line">\MyGame\Sample\Monster::AddPos($builder,</div><div class="line">                    \MyGame\Sample\Vec3::CreateVec3($builder, 1.0, 2.0, 3.0));</div><div class="line">\MyGame\Sample\Monster::AddHp($builder, 300);</div><div class="line">\MyGame\Sample\Monster::AddName($builder, $name);</div><div class="line">\MyGame\Sample\Monster::AddInventory($builder, $inv);</div><div class="line">\MyGame\Sample\Monster::AddColor($builder, \MyGame\Sample\Color::Red);</div><div class="line">\MyGame\Sample\Monster::AddWeapons($builder, $weapons);</div><div class="line">\MyGame\Sample\Monster::AddEquippedType($builder, \MyGame\Sample\Equipment::Weapon);</div><div class="line">\MyGame\Sample\Monster::AddEquipped($builder, $axe);</div><div class="line">\MyGame\Sample\Monster::AddPath($builder, $path);</div><div class="line">$orc = \MyGame\Sample\Monster::EndMonster($builder);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Set his hit points to 300 and his mana to 150.</span></div><div class="line">uint16_t hp = 300;</div><div class="line">uint16_t mana = 150;</div><div class="line"></div><div class="line"><span class="comment">// Define an equipment union. `create` calls in C has a single</span></div><div class="line"><span class="comment">// argument for unions where C++ has both a type and a data argument.</span></div><div class="line">ns(Equipment_union_ref_t) equipped = ns(Equipment_as_Weapon(axe));</div><div class="line">ns(Vec3_t) pos = { 1.0f, 2.0f, 3.0f };</div><div class="line">ns(Monster_create_as_root(B, &amp;pos, mana, hp, name, inventory, ns(Color_Red),</div><div class="line">        weapons, equipped, path));</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">// Using the Builder API:</div><div class="line">// Set his hit points to 300 and his mana to 150.</div><div class="line">final int hp = 300;</div><div class="line">final int mana = 150;</div><div class="line"></div><div class="line">final monster = new myGame.MonsterBuilder(builder)</div><div class="line">  ..begin()</div><div class="line">  ..addNameOffset(name)</div><div class="line">  ..addInventoryOffset(inventory)</div><div class="line">  ..addWeaponsOffset(weapons)</div><div class="line">  ..addEquippedType(myGame.EquipmentTypeId.Weapon)</div><div class="line">  ..addEquippedOffset(axe)</div><div class="line">  ..addHp(hp)</div><div class="line">  ..addMana(mana)</div><div class="line">  ..addPos(vec3Builder.finish(1.0, 2.0, 3.0))</div><div class="line">  ..addPathOffset(path)</div><div class="line">  ..addColor(myGame.Color.Red);</div><div class="line"></div><div class="line">final int orc = monster.finish();</div><div class="line"></div><div class="line">// -Or- using the ObjectBuilder API:</div><div class="line">// Set his hit points to 300 and his mana to 150.</div><div class="line">final int hp = 300;</div><div class="line">final int mana = 150;</div><div class="line"></div><div class="line">// Note that these parameters are optional - it is not necessary to set</div><div class="line">// all of them.</div><div class="line">// Also note that it is not necessary to `finish` the builder helpers above</div><div class="line">// - the generated code will automatically reuse offsets if the same object</div><div class="line">// is used in more than one place (e.g. the axe appearing in `weapons` and</div><div class="line">// `equipped`).</div><div class="line">final myGame.MonsterBuilder orcBuilder = new myGame.MonsterBuilder(</div><div class="line">  name: name,</div><div class="line">  inventory: treasure,</div><div class="line">  weapons: weaps,</div><div class="line">  equippedType: myGame.EquipmentTypeId.Weapon,</div><div class="line">  equipped: axe,</div><div class="line">  path: path,</div><div class="line">  hp: hp,</div><div class="line">  mana: mana,</div><div class="line">  pos: new myGame.Vec3Builder(x: 1.0, y: 2.0, z: 3.0),</div><div class="line">  color: myGame.Color.Red,</div><div class="line">  path: [</div><div class="line">      new myGame.Vec3ObjectBuilder(x: 1.0, y: 2.0, z: 3.0),</div><div class="line">      new myGame.Vec3ObjectBuilder(x: 4.0, y: 5.0, z: 6.0)</div><div class="line">  ]);</div><div class="line"></div><div class="line">final int orc = orcBuilder.finish(builder);</div></div><!-- fragment --> </div><p>Note how we create <code>Vec3</code> struct in-line in the table. Unlike tables, structs are simple combinations of scalars that are always stored inline, just like scalars themselves.</p>
 <p><b>Important</b>: Unlike structs, you should not nest tables or other objects, which is why we created all the strings/vectors/tables that this monster refers to before <code>start</code>. If you try to create any of them between <code>start</code> and <code>end</code>, you will get an assert/exception/panic depending on your language.</p>
 <p><em>Note: Since we are passing <code>150</code> as the <code>mana</code> field, which happens to be the default value, the field will not actually be written to the buffer, since the default value will be returned on query anyway. This is a nice space savings, especially if default values are common in your data. It also means that you do not need to be worried of adding a lot of fields that are only used in a small number of instances, as it will not bloat the buffer if unused.</em></p>
 <div class="language-cpp"> <br />
@@ -221,30 +222,30 @@ $(document).ready(function(){initNavTree('flatbuffers_guide_tutorial.html','');}
  <div class="fragment"><div class="line"><span class="comment">// It is important to pair `start_as_root` with `end_as_root`.</span></div><div class="line">ns(Monster_start_as_root(B));</div><div class="line">ns(Monster_pos_create(B, 1.0f, 2.0f, 3.0f));</div><div class="line"><span class="comment">// or alternatively</span></div><div class="line"><span class="comment">//ns(Monster_pos_add(&amp;pos);</span></div><div class="line"></div><div class="line">ns(Monster_hp_add(B, hp));</div><div class="line"><span class="comment">// Notice that `Monser_name_add` adds a string reference unlike the</span></div><div class="line"><span class="comment">// add_str and add_strn variants.</span></div><div class="line">ns(Monster_name_add(B, name));</div><div class="line">ns(Monster_inventory_add(B, inventory));</div><div class="line">ns(Monster_color_add(B, ns(Color_Red)));</div><div class="line">ns(Monster_weapons_add(B, weapons));</div><div class="line">ns(Monster_equipped_add(B, equipped));</div><div class="line"><span class="comment">// Complete the monster object and make it the buffer root object.</span></div><div class="line">ns(Monster_end_as_root(B));</div></div><!-- fragment --> </div><p>Before finishing the serialization, let's take a quick look at FlatBuffer <code>union Equipped</code>. There are two parts to each FlatBuffer <code>union</code>. The first, is a hidden field <code>_type</code>, that is generated to hold the type of <code>table</code> referred to by the <code>union</code>. This allows you to know which type to cast to at runtime. Second, is the <code>union</code>'s data.</p>
 <p>In our example, the last two things we added to our <code>Monster</code> were the <code>Equipped Type</code> and the <code>Equipped</code> union itself.</p>
 <p>Here is a repetition these lines, to help highlight them more clearly:</p>
-<div class="language-cpp"> <div class="fragment"><div class="line">monster_builder.add_equipped_type(Equipment_Weapon); <span class="comment">// Union type</span></div><div class="line">monster_builder.add_equipped(axe); <span class="comment">// Union data</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line">Monster.addEquippedType(builder, Equipment.Weapon); <span class="comment">// Union type</span></div><div class="line">Monster.addEquipped(axe); <span class="comment">// Union data</span></div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">Monster.AddEquippedType(builder, Equipment.Weapon); <span class="comment">// Union type</span></div><div class="line">Monster.AddEquipped(builder, axe.Value); <span class="comment">// Union data</span></div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">sample.MonsterAddEquippedType(builder, sample.EquipmentWeapon) // Union type</div><div class="line">sample.MonsterAddEquipped(builder, axe) // Union data</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">MyGame.Sample.Monster.MonsterAddEquippedType(            <span class="comment"># Union type</span></div><div class="line">    builder, MyGame.Sample.Equipment.Equipment().Weapon)</div><div class="line">MyGame.Sample.Monster.MonsterAddEquipped(builder, axe)   <span class="comment"># Union data</span></div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">MyGame.Sample.Monster.addEquippedType(builder, MyGame.Sample.Equipment.Weapon); // Union type</div><div class="line">MyGame.Sample.Monster.addEquipped(builder, axe); // Union data</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">MyGame.Sample.Monster.addEquippedType(builder, MyGame.Sample.Equipment.Weapon); // Union type</div><div class="line">MyGame.Sample.Monster.addEquipped(builder, axe); // Union data</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">\MyGame\Sample\Monster::AddEquippedType($builder, \MyGame\Sample\Equipment::Weapon); <span class="comment">// Union type</span></div><div class="line">\MyGame\Sample\Monster::AddEquipped($builder, $axe); <span class="comment">// Union data</span></div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Add union type and data simultanously.</span></div><div class="line">ns(Monster_equipped_Weapon_add(B, axe));</div></div><!-- fragment --> </div><p>After you have created your buffer, you will have the offset to the root of the data in the <code>orc</code> variable, so you can finish the buffer by calling the appropriate <code>finish</code> method.</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="comment">// Call `Finish()` to instruct the builder that this monster is complete.</span></div><div class="line"><span class="comment">// Note: Regardless of how you created the `orc`, you still need to call</span></div><div class="line"><span class="comment">// `Finish()` on the `FlatBufferBuilder`.</span></div><div class="line">builder.Finish(orc); <span class="comment">// You could also call `FinishMonsterBuffer(builder,</span></div><div class="line">                     <span class="comment">//                                          orc);`.</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="comment">// Call `finish()` to instruct the builder that this monster is complete.</span></div><div class="line">builder.finish(orc); <span class="comment">// You could also call `Monster.finishMonsterBuffer(builder, orc);`.</span></div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="comment">// Call `Finish()` to instruct the builder that this monster is complete.</span></div><div class="line">builder.Finish(orc.Value); <span class="comment">// You could also call `Monster.FinishMonsterBuffer(builder, orc);`.</span></div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// Call `Finish()` to instruct the builder that this monster is complete.</div><div class="line">builder.Finish(orc)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="comment"># Call `Finish()` to instruct the builder that this monster is complete.</span></div><div class="line">builder.Finish(orc)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// Call `finish()` to instruct the builder that this monster is complete.</div><div class="line">builder.finish(orc); // You could also call `MyGame.Sample.Monster.finishMonsterBuffer(builder,</div><div class="line">                     //                                                                 orc);`.</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// Call `finish()` to instruct the builder that this monster is complete.</div><div class="line">builder.finish(orc); // You could also call `MyGame.Sample.Monster.finishMonsterBuffer(builder,</div><div class="line">                     //                                                                 orc);`.</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// Call `finish()` to instruct the builder that this monster is complete.</span></div><div class="line"> $builder-&gt;finish($orc); <span class="comment">// You may also call `\MyGame\Sample\Monster::FinishMonsterBuffer(</span></div><div class="line">                         <span class="comment">//                        $builder, $orc);`.</span></div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Because we used `Monster_create_as_root`, we do not need a `finish` call in C`.</span></div></div><!-- fragment --> </div><p>The buffer is now ready to be stored somewhere, sent over the network, be compressed, or whatever you'd like to do with it. You can access the buffer like so:</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="comment">// This must be called after `Finish()`.</span></div><div class="line">uint8_t *buf = builder.GetBufferPointer();</div><div class="line"><span class="keywordtype">int</span> size = builder.GetSize(); <span class="comment">// Returns the size of the buffer that</span></div><div class="line">                              <span class="comment">// `GetBufferPointer()` points to.</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="comment">// This must be called after `finish()`.</span></div><div class="line">java.nio.ByteBuffer buf = builder.dataBuffer();</div><div class="line"><span class="comment">// The data in this ByteBuffer does NOT start at 0, but at buf.position().</span></div><div class="line"><span class="comment">// The number of bytes is buf.remaining().</span></div><div class="line"></div><div class="line"><span class="comment">// Alternatively this copies the above data out of the ByteBuffer for you:</span></div><div class="line">bytes[] buf = builder.sizedByteArray();</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="comment">// This must be called after `Finish()`.</span></div><div class="line">var buf = builder.DataBuffer; <span class="comment">// Of type `FlatBuffers.ByteBuffer`.</span></div><div class="line"><span class="comment">// The data in this ByteBuffer does NOT start at 0, but at buf.Position.</span></div><div class="line"><span class="comment">// The end of the data is marked by buf.Length, so the size is</span></div><div class="line"><span class="comment">// buf.Length - buf.Position.</span></div><div class="line"></div><div class="line"><span class="comment">// Alternatively this copies the above data out of the ByteBuffer for you:</span></div><div class="line">bytes[] buf = builder.SizedByteArray();</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// This must be called after `Finish()`.</div><div class="line">buf := builder.FinishedBytes() // Of type `byte[]`.</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="comment"># This must be called after `Finish()`.</span></div><div class="line">buf = builder.Output() // Of type `bytearray`.</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// This must be called after `finish()`.</div><div class="line">var buf = builder.asUint8Array(); // Of type `Uint8Array`.</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// This must be called after `finish()`.</div><div class="line">let buf = builder.asUint8Array(); // Of type `Uint8Array`.</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// This must be called after `finish()`.</span></div><div class="line">$buf = $builder-&gt;dataBuffer(); <span class="comment">// Of type `Google\FlatBuffers\ByteBuffer`</span></div><div class="line"><span class="comment">// The data in this ByteBuffer does NOT start at 0, but at buf-&gt;getPosition().</span></div><div class="line"><span class="comment">// The end of the data is marked by buf-&gt;capacity(), so the size is</span></div><div class="line"><span class="comment">// buf-&gt;capacity() - buf-&gt;getPosition().</span></div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">uint8_t *buf;</div><div class="line"><span class="keywordtype">size_t</span> size;</div><div class="line"></div><div class="line"><span class="comment">// Allocate and extract a readable buffer from internal builder heap.</span></div><div class="line"><span class="comment">// The returned buffer must be deallocated using `free`.</span></div><div class="line"><span class="comment">// NOTE: Finalizing the buffer does NOT change the builder, it</span></div><div class="line"><span class="comment">// just creates a snapshot of the builder content.</span></div><div class="line">buf = flatcc_builder_finalize_buffer(B, &amp;size);</div><div class="line"><span class="comment">// use buf</span></div><div class="line">free(buf);</div><div class="line"></div><div class="line"><span class="comment">// Optionally reset builder to reuse builder without deallocating</span></div><div class="line"><span class="comment">// internal stack and heap.</span></div><div class="line">flatcc_builder_reset(B);</div><div class="line"><span class="comment">// build next buffer.</span></div><div class="line"><span class="comment">// ...</span></div><div class="line"></div><div class="line"><span class="comment">// Cleanup.</span></div><div class="line">flatcc_builder_clear(B);</div></div><!-- fragment --> </div><p>Now you can write the bytes to a file, send them over the network.. <b>Make sure your file mode (or tranfer protocol) is set to BINARY, not text.</b> If you transfer a FlatBuffer in text mode, the buffer will be corrupted, which will lead to hard to find problems when you read the buffer.</p>
+<div class="language-cpp"> <div class="fragment"><div class="line">monster_builder.add_equipped_type(Equipment_Weapon); <span class="comment">// Union type</span></div><div class="line">monster_builder.add_equipped(axe); <span class="comment">// Union data</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line">Monster.addEquippedType(builder, Equipment.Weapon); <span class="comment">// Union type</span></div><div class="line">Monster.addEquipped(axe); <span class="comment">// Union data</span></div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">Monster.AddEquippedType(builder, Equipment.Weapon); <span class="comment">// Union type</span></div><div class="line">Monster.AddEquipped(builder, axe.Value); <span class="comment">// Union data</span></div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">sample.MonsterAddEquippedType(builder, sample.EquipmentWeapon) // Union type</div><div class="line">sample.MonsterAddEquipped(builder, axe) // Union data</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">MyGame.Sample.Monster.MonsterAddEquippedType(            <span class="comment"># Union type</span></div><div class="line">    builder, MyGame.Sample.Equipment.Equipment().Weapon)</div><div class="line">MyGame.Sample.Monster.MonsterAddEquipped(builder, axe)   <span class="comment"># Union data</span></div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">MyGame.Sample.Monster.addEquippedType(builder, MyGame.Sample.Equipment.Weapon); // Union type</div><div class="line">MyGame.Sample.Monster.addEquipped(builder, axe); // Union data</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">MyGame.Sample.Monster.addEquippedType(builder, MyGame.Sample.Equipment.Weapon); // Union type</div><div class="line">MyGame.Sample.Monster.addEquipped(builder, axe); // Union data</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">\MyGame\Sample\Monster::AddEquippedType($builder, \MyGame\Sample\Equipment::Weapon); <span class="comment">// Union type</span></div><div class="line">\MyGame\Sample\Monster::AddEquipped($builder, $axe); <span class="comment">// Union data</span></div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Add union type and data simultanously.</span></div><div class="line">ns(Monster_equipped_Weapon_add(B, axe));</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">// using the builder API:</div><div class="line">..addEquippedType(myGame.EquipmentTypeId.Weapon)</div><div class="line">..addEquippedOffset(axe)</div><div class="line"></div><div class="line">// in the ObjectBuilder API:</div><div class="line">equippedTypeId: myGame.EquipmentTypeId.Weapon,  // Union type</div><div class="line">equipped: axe,                                  // Union data</div></div><!-- fragment --> </div><p>After you have created your buffer, you will have the offset to the root of the data in the <code>orc</code> variable, so you can finish the buffer by calling the appropriate <code>finish</code> method.</p>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="comment">// Call `Finish()` to instruct the builder that this monster is complete.</span></div><div class="line"><span class="comment">// Note: Regardless of how you created the `orc`, you still need to call</span></div><div class="line"><span class="comment">// `Finish()` on the `FlatBufferBuilder`.</span></div><div class="line">builder.Finish(orc); <span class="comment">// You could also call `FinishMonsterBuffer(builder,</span></div><div class="line">                     <span class="comment">//                                          orc);`.</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="comment">// Call `finish()` to instruct the builder that this monster is complete.</span></div><div class="line">builder.finish(orc); <span class="comment">// You could also call `Monster.finishMonsterBuffer(builder, orc);`.</span></div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="comment">// Call `Finish()` to instruct the builder that this monster is complete.</span></div><div class="line">builder.Finish(orc.Value); <span class="comment">// You could also call `Monster.FinishMonsterBuffer(builder, orc);`.</span></div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// Call `Finish()` to instruct the builder that this monster is complete.</div><div class="line">builder.Finish(orc)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="comment"># Call `Finish()` to instruct the builder that this monster is complete.</span></div><div class="line">builder.Finish(orc)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// Call `finish()` to instruct the builder that this monster is complete.</div><div class="line">builder.finish(orc); // You could also call `MyGame.Sample.Monster.finishMonsterBuffer(builder,</div><div class="line">                     //                                                                 orc);`.</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// Call `finish()` to instruct the builder that this monster is complete.</div><div class="line">builder.finish(orc); // You could also call `MyGame.Sample.Monster.finishMonsterBuffer(builder,</div><div class="line">                     //                                                                 orc);`.</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// Call `finish()` to instruct the builder that this monster is complete.</span></div><div class="line"> $builder-&gt;finish($orc); <span class="comment">// You may also call `\MyGame\Sample\Monster::FinishMonsterBuffer(</span></div><div class="line">                         <span class="comment">//                        $builder, $orc);`.</span></div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Because we used `Monster_create_as_root`, we do not need a `finish` call in C`.</span></div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">// Call `finish()` to instruct the builder that this monster is complete.</div><div class="line">// See the next code section, as in Dart `finish` will also return the byte array.</div></div><!-- fragment --> </div><p>The buffer is now ready to be stored somewhere, sent over the network, be compressed, or whatever you'd like to do with it. You can access the buffer like so:</p>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="comment">// This must be called after `Finish()`.</span></div><div class="line">uint8_t *buf = builder.GetBufferPointer();</div><div class="line"><span class="keywordtype">int</span> size = builder.GetSize(); <span class="comment">// Returns the size of the buffer that</span></div><div class="line">                              <span class="comment">// `GetBufferPointer()` points to.</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="comment">// This must be called after `finish()`.</span></div><div class="line">java.nio.ByteBuffer buf = builder.dataBuffer();</div><div class="line"><span class="comment">// The data in this ByteBuffer does NOT start at 0, but at buf.position().</span></div><div class="line"><span class="comment">// The number of bytes is buf.remaining().</span></div><div class="line"></div><div class="line"><span class="comment">// Alternatively this copies the above data out of the ByteBuffer for you:</span></div><div class="line">byte[] buf = builder.sizedByteArray();</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="comment">// This must be called after `Finish()`.</span></div><div class="line">var buf = builder.DataBuffer; <span class="comment">// Of type `FlatBuffers.ByteBuffer`.</span></div><div class="line"><span class="comment">// The data in this ByteBuffer does NOT start at 0, but at buf.Position.</span></div><div class="line"><span class="comment">// The end of the data is marked by buf.Length, so the size is</span></div><div class="line"><span class="comment">// buf.Length - buf.Position.</span></div><div class="line"></div><div class="line"><span class="comment">// Alternatively this copies the above data out of the ByteBuffer for you:</span></div><div class="line">byte[] buf = builder.SizedByteArray();</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// This must be called after `Finish()`.</div><div class="line">buf := builder.FinishedBytes() // Of type `byte[]`.</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="comment"># This must be called after `Finish()`.</span></div><div class="line">buf = builder.Output() // Of type `bytearray`.</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// This must be called after `finish()`.</div><div class="line">var buf = builder.asUint8Array(); // Of type `Uint8Array`.</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// This must be called after `finish()`.</div><div class="line">let buf = builder.asUint8Array(); // Of type `Uint8Array`.</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// This must be called after `finish()`.</span></div><div class="line">$buf = $builder-&gt;dataBuffer(); <span class="comment">// Of type `Google\FlatBuffers\ByteBuffer`</span></div><div class="line"><span class="comment">// The data in this ByteBuffer does NOT start at 0, but at buf-&gt;getPosition().</span></div><div class="line"><span class="comment">// The end of the data is marked by buf-&gt;capacity(), so the size is</span></div><div class="line"><span class="comment">// buf-&gt;capacity() - buf-&gt;getPosition().</span></div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">uint8_t *buf;</div><div class="line"><span class="keywordtype">size_t</span> size;</div><div class="line"></div><div class="line"><span class="comment">// Allocate and extract a readable buffer from internal builder heap.</span></div><div class="line"><span class="comment">// The returned buffer must be deallocated using `free`.</span></div><div class="line"><span class="comment">// NOTE: Finalizing the buffer does NOT change the builder, it</span></div><div class="line"><span class="comment">// just creates a snapshot of the builder content.</span></div><div class="line">buf = flatcc_builder_finalize_buffer(B, &amp;size);</div><div class="line"><span class="comment">// use buf</span></div><div class="line">free(buf);</div><div class="line"></div><div class="line"><span class="comment">// Optionally reset builder to reuse builder without deallocating</span></div><div class="line"><span class="comment">// internal stack and heap.</span></div><div class="line">flatcc_builder_reset(B);</div><div class="line"><span class="comment">// build next buffer.</span></div><div class="line"><span class="comment">// ...</span></div><div class="line"></div><div class="line"><span class="comment">// Cleanup.</span></div><div class="line">flatcc_builder_clear(B);</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">final Uint8List buf = builder.finish(orc);</div></div><!-- fragment --> </div><p>Now you can write the bytes to a file, send them over the network.. <b>Make sure your file mode (or tranfer protocol) is set to BINARY, not text.</b> If you transfer a FlatBuffer in text mode, the buffer will be corrupted, which will lead to hard to find problems when you read the buffer.</p>
 <h4>Reading Orc FlatBuffers</h4>
 <p>Now that we have successfully created an <code>Orc</code> FlatBuffer, the monster data can be saved, sent over a network, etc. Let's now adventure into the inverse, and deserialize a FlatBuffer.</p>
 <p>This section requires the same import/include, namespace, etc. requirements as before:</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="preprocessor">#include &quot;monster_generate.h&quot;</span> <span class="comment">// This was generated by `flatc`.</span></div><div class="line"></div><div class="line"><span class="keyword">using namespace </span>MyGame::Sample; <span class="comment">// Specified in the schema.</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keyword">import</span> MyGame.Sample.*; <span class="comment">//The `flatc` generated files. (Monster, Vec3, etc.)</span></div><div class="line"></div><div class="line"><span class="keyword">import</span> <a class="code" href="namespacecom.html">com</a>.<a class="code" href="namespacecom_1_1google.html">google</a>.<a class="code" href="namespacecom_1_1google_1_1flatbuffers.html">flatbuffers</a>.<a class="code" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a>;</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="keyword">using</span> <a class="code" href="namespace_flat_buffers.html">FlatBuffers</a>;</div><div class="line"><span class="keyword">using</span> MyGame.Sample; <span class="comment">// The `flatc` generated files. (Monster, Vec3, etc.)</span></div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">import (</div><div class="line">        flatbuffers &quot;github.com/google/flatbuffers/go&quot;</div><div class="line">        sample &quot;MyGame/Sample&quot;</div><div class="line">)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="keyword">import</span> flatbuffers</div><div class="line"></div><div class="line"><span class="comment"># Generated by `flatc`.</span></div><div class="line"><span class="keyword">import</span> MyGame.Sample.Any</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Color</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Monster</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Vec3</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// The following code is for JavaScript module loaders (e.g. Node.js). See</div><div class="line">// below for a browser-based HTML/JavaScript example of including the library.</div><div class="line">var flatbuffers = require(&#39;/js/flatbuffers&#39;).flatbuffers;</div><div class="line">var MyGame = require(&#39;./monster_generated&#39;).MyGame; // Generated by `flatc`.</div><div class="line"></div><div class="line">//--------------------------------------------------------------------------//</div><div class="line"></div><div class="line">// The following code is for browser-based HTML/JavaScript. Use the above code</div><div class="line">// for JavaScript module loaders (e.g. Node.js).</div><div class="line">&lt;script src=&quot;../js/flatbuffers.js&quot;&gt;&lt;/script&gt;</div><div class="line">&lt;script src=&quot;monster_generated.js&quot;&gt;&lt;/script&gt; // Generated by `flatc`.</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// note: import flabuffers with your desired import method</div><div class="line"></div><div class="line">import { MyGame } from &#39;./monster_generated&#39;;</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// It is recommended that your use PSR autoload when using FlatBuffers in PHP.</span></div><div class="line"><span class="comment">// Here is an example from `SampleBinary.php`:</span></div><div class="line"><span class="keyword">function</span> __autoload($class_name) {</div><div class="line">  <span class="comment">// The last segment of the class name matches the file name.</span></div><div class="line">  $class = substr($class_name, strrpos($class_name, <span class="stringliteral">&quot;\\&quot;</span>) + 1);</div><div class="line">  $root_dir = join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)))); <span class="comment">// `flatbuffers` root.</span></div><div class="line"></div><div class="line">  <span class="comment">// Contains the `*.php` files for the FlatBuffers library and the `flatc` generated files.</span></div><div class="line">  $paths = array(join(DIRECTORY_SEPARATOR, array($root_dir, <span class="stringliteral">&quot;php&quot;</span>)),</div><div class="line">                 join(DIRECTORY_SEPARATOR, array($root_dir, <span class="stringliteral">&quot;samples&quot;</span>, <span class="stringliteral">&quot;MyGame&quot;</span>, <span class="stringliteral">&quot;Sample&quot;</span>)));</div><div class="line">  <span class="keywordflow">foreach</span> ($paths as $path) {</div><div class="line">    $file = join(DIRECTORY_SEPARATOR, array($path, $class . <span class="stringliteral">&quot;.php&quot;</span>));</div><div class="line">    <span class="keywordflow">if</span> (file_exists($file)) {</div><div class="line">      require($file);</div><div class="line">      <span class="keywordflow">break</span>;</div><div class="line">    }</div><div class="line">  }</div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Only needed if we don&#39;t have `#include &quot;monster_builder.h&quot;`.</span></div><div class="line"><span class="preprocessor">#include &quot;monster_reader.h&quot;</span></div><div class="line"></div><div class="line"><span class="preprocessor">#undef ns</span></div><div class="line"><span class="preprocessor">#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(MyGame_Sample, x) // Specified in the schema.</span></div></div><!-- fragment --> </div><p>Then, assuming you have a buffer of bytes received from disk, network, etc., you can create start accessing the buffer like so:</p>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="preprocessor">#include &quot;monster_generate.h&quot;</span> <span class="comment">// This was generated by `flatc`.</span></div><div class="line"></div><div class="line"><span class="keyword">using namespace </span>MyGame::Sample; <span class="comment">// Specified in the schema.</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keyword">import</span> MyGame.Sample.*; <span class="comment">//The `flatc` generated files. (Monster, Vec3, etc.)</span></div><div class="line"></div><div class="line"><span class="keyword">import</span> <a class="code" href="namespacecom.html">com</a>.<a class="code" href="namespacecom_1_1google.html">google</a>.<a class="code" href="namespacecom_1_1google_1_1flatbuffers.html">flatbuffers</a>.<a class="code" href="classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html">FlatBufferBuilder</a>;</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="keyword">using</span> <a class="code" href="namespace_flat_buffers.html">FlatBuffers</a>;</div><div class="line"><span class="keyword">using</span> MyGame.Sample; <span class="comment">// The `flatc` generated files. (Monster, Vec3, etc.)</span></div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">import (</div><div class="line">        flatbuffers &quot;github.com/google/flatbuffers/go&quot;</div><div class="line">        sample &quot;MyGame/Sample&quot;</div><div class="line">)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line"><span class="keyword">import</span> flatbuffers</div><div class="line"></div><div class="line"><span class="comment"># Generated by `flatc`.</span></div><div class="line"><span class="keyword">import</span> MyGame.Sample.Any</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Color</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Monster</div><div class="line"><span class="keyword">import</span> MyGame.Sample.Vec3</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">// The following code is for JavaScript module loaders (e.g. Node.js). See</div><div class="line">// below for a browser-based HTML/JavaScript example of including the library.</div><div class="line">var flatbuffers = require(&#39;/js/flatbuffers&#39;).flatbuffers;</div><div class="line">var MyGame = require(&#39;./monster_generated&#39;).MyGame; // Generated by `flatc`.</div><div class="line"></div><div class="line">//--------------------------------------------------------------------------//</div><div class="line"></div><div class="line">// The following code is for browser-based HTML/JavaScript. Use the above code</div><div class="line">// for JavaScript module loaders (e.g. Node.js).</div><div class="line">&lt;script src=&quot;../js/flatbuffers.js&quot;&gt;&lt;/script&gt;</div><div class="line">&lt;script src=&quot;monster_generated.js&quot;&gt;&lt;/script&gt; // Generated by `flatc`.</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">// note: import flabuffers with your desired import method</div><div class="line"></div><div class="line">import { MyGame } from &#39;./monster_generated&#39;;</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line"><span class="comment">// It is recommended that your use PSR autoload when using FlatBuffers in PHP.</span></div><div class="line"><span class="comment">// Here is an example from `SampleBinary.php`:</span></div><div class="line"><span class="keyword">function</span> __autoload($class_name) {</div><div class="line">  <span class="comment">// The last segment of the class name matches the file name.</span></div><div class="line">  $class = substr($class_name, strrpos($class_name, <span class="stringliteral">&quot;\\&quot;</span>) + 1);</div><div class="line">  $root_dir = join(DIRECTORY_SEPARATOR, array(dirname(dirname(__FILE__)))); <span class="comment">// `flatbuffers` root.</span></div><div class="line"></div><div class="line">  <span class="comment">// Contains the `*.php` files for the FlatBuffers library and the `flatc` generated files.</span></div><div class="line">  $paths = array(join(DIRECTORY_SEPARATOR, array($root_dir, <span class="stringliteral">&quot;php&quot;</span>)),</div><div class="line">                 join(DIRECTORY_SEPARATOR, array($root_dir, <span class="stringliteral">&quot;samples&quot;</span>, <span class="stringliteral">&quot;MyGame&quot;</span>, <span class="stringliteral">&quot;Sample&quot;</span>)));</div><div class="line">  <span class="keywordflow">foreach</span> ($paths as $path) {</div><div class="line">    $file = join(DIRECTORY_SEPARATOR, array($path, $class . <span class="stringliteral">&quot;.php&quot;</span>));</div><div class="line">    <span class="keywordflow">if</span> (file_exists($file)) {</div><div class="line">      require($file);</div><div class="line">      <span class="keywordflow">break</span>;</div><div class="line">    }</div><div class="line">  }</div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Only needed if we don&#39;t have `#include &quot;monster_builder.h&quot;`.</span></div><div class="line"><span class="preprocessor">#include &quot;monster_reader.h&quot;</span></div><div class="line"></div><div class="line"><span class="preprocessor">#undef ns</span></div><div class="line"><span class="preprocessor">#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(MyGame_Sample, x) // Specified in the schema.</span></div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">import &#39;package:flat_buffers/flat_buffers.dart&#39; as fb;</div><div class="line">import &#39;./monster_my_game.sample_generated.dart&#39; as myGame;</div></div><!-- fragment --> </div><p>Then, assuming you have a buffer of bytes received from disk, network, etc., you can create start accessing the buffer like so:</p>
 <p><b>Again, make sure you read the bytes in BINARY mode, otherwise the code below won't work</b></p>
-<div class="language-cpp"> <div class="fragment"><div class="line">uint8_t *buffer_pointer = <span class="comment">/* the data you just read */</span>;</div><div class="line"></div><div class="line"><span class="comment">// Get a pointer to the root object inside the buffer.</span></div><div class="line"><span class="keyword">auto</span> monster = GetMonster(buffer_pointer);</div><div class="line"></div><div class="line"><span class="comment">// `monster` is of type `Monster *`.</span></div><div class="line"><span class="comment">// Note: root object pointers are NOT the same as `buffer_pointer`.</span></div><div class="line"><span class="comment">// `GetMonster` is a convenience function that calls `GetRoot&lt;Monster&gt;`,</span></div><div class="line"><span class="comment">// the latter is also available for non-root types.</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line">byte[] bytes = <span class="comment">/* the data you just read */</span></div><div class="line">java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(bytes);</div><div class="line"></div><div class="line"><span class="comment">// Get an accessor to the root object inside the buffer.</span></div><div class="line">Monster monster = Monster.getRootAsMonster(buf);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">byte[] bytes = <span class="comment">/* the data you just read */</span></div><div class="line">var buf = <span class="keyword">new</span> ByteBuffer(bytes);</div><div class="line"></div><div class="line"><span class="comment">// Get an accessor to the root object inside the buffer.</span></div><div class="line">var monster = Monster.GetRootAsMonster(buf);</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">var buf []byte = /* the data you just read */</div><div class="line"></div><div class="line">// Get an accessor to the root object inside the buffer.</div><div class="line">monster := sample.GetRootAsMonster(buf, 0)</div><div class="line"></div><div class="line">// Note: We use `0` for the offset here, which is typical for most buffers</div><div class="line">// you would read. If you wanted to read from `builder.Bytes` directly, you</div><div class="line">// would need to pass in the offset of `builder.Head()`, as the builder</div><div class="line">// constructs the buffer backwards, so may not start at offset 0.</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">buf = /* the data you just read, <span class="keywordflow">in</span> an object of type <span class="stringliteral">&quot;bytearray&quot;</span> */</div><div class="line"></div><div class="line">// Get an accessor to the root object inside the buffer.</div><div class="line">monster = MyGame.Sample.Monster.Monster.GetRootAsMonster(buf, 0)</div><div class="line"></div><div class="line"><span class="comment"># Note: We use `0` for the offset here, which is typical for most buffers</span></div><div class="line"><span class="comment"># you would read.  If you wanted to read from the `builder.Bytes` directly,</span></div><div class="line"><span class="comment"># you would need to pass in the offset of `builder.Head()`, as the builder</span></div><div class="line"><span class="comment"># constructs the buffer backwards, so may not start at offset 0.</span></div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var bytes = /* the data you just read, in an object of type &quot;Uint8Array&quot; */</div><div class="line">var buf = new flatbuffers.ByteBuffer(bytes);</div><div class="line"></div><div class="line">// Get an accessor to the root object inside the buffer.</div><div class="line">var monster = MyGame.Sample.Monster.getRootAsMonster(buf);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let bytes = /* the data you just read, in an object of type &quot;Uint8Array&quot; */</div><div class="line">let buf = new flatbuffers.ByteBuffer(bytes);</div><div class="line"></div><div class="line">// Get an accessor to the root object inside the buffer.</div><div class="line">let monster = MyGame.Sample.Monster.getRootAsMonster(buf);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">$bytes = <span class="comment">/* the data you just read, in a string */</span></div><div class="line">$buf = Google\FlatBuffers\ByteBuffer::wrap($bytes);</div><div class="line"></div><div class="line"><span class="comment">// Get an accessor to the root object inside the buffer.</span></div><div class="line">$monster = \MyGame\Sample\Monster::GetRootAsMonster($buf);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Note that we use the `table_t` suffix when reading a table object</span></div><div class="line"><span class="comment">// as opposed to the `ref_t` suffix used during the construction of</span></div><div class="line"><span class="comment">// the buffer.</span></div><div class="line">ns(Monster_table_t) monster = ns(Monster_as_root(buffer));</div><div class="line"></div><div class="line"><span class="comment">// Note: root object pointers are NOT the same as the `buffer` pointer.</span></div></div><!-- fragment --> </div><p>If you look in the generated files from the schema compiler, you will see it generated accessors for all non-<code>deprecated</code> fields. For example:</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> hp = monster-&gt;hp();</div><div class="line"><span class="keyword">auto</span> mana = monster-&gt;mana();</div><div class="line"><span class="keyword">auto</span> name = monster-&gt;name()-&gt;c_str();</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keywordtype">short</span> hp = monster.hp();</div><div class="line"><span class="keywordtype">short</span> mana = monster.mana();</div><div class="line">String name = monster.name();</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="comment">// For C#, unlike other languages support by FlatBuffers, most values (except for</span></div><div class="line"><span class="comment">// vectors and unions) are available as propreties instead of asccessor methods.</span></div><div class="line">var hp = monster.Hp</div><div class="line">var mana = monster.Mana</div><div class="line">var name = monster.Name</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">hp := monster.Hp()</div><div class="line">mana := monster.Mana()</div><div class="line">name := string(monster.Name()) // Note: `monster.Name()` returns a byte[].</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">hp = monster.Hp()</div><div class="line">mana = monster.Mana()</div><div class="line">name = monster.Name()</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var hp = $monster.hp();</div><div class="line">var mana = $monster.mana();</div><div class="line">var name = $monster.name();</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let hp = $monster.hp();</div><div class="line">let mana = $monster.mana();</div><div class="line">let name = $monster.name();</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">$hp = $monster-&gt;getHp();</div><div class="line">$mana = $monster-&gt;getMana();</div><div class="line">$name = monster-&gt;getName();</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">uint16_t hp = ns(Monster_hp(monster));</div><div class="line">uint16_t mana = ns(Monster_mana(monster));</div><div class="line">flatbuffers_string_t name = ns(Monster_name(monster));</div></div><!-- fragment --> </div><p>These should hold <code>300</code>, <code>150</code>, and <code>"Orc"</code> respectively.</p>
+<div class="language-cpp"> <div class="fragment"><div class="line">uint8_t *buffer_pointer = <span class="comment">/* the data you just read */</span>;</div><div class="line"></div><div class="line"><span class="comment">// Get a pointer to the root object inside the buffer.</span></div><div class="line"><span class="keyword">auto</span> monster = GetMonster(buffer_pointer);</div><div class="line"></div><div class="line"><span class="comment">// `monster` is of type `Monster *`.</span></div><div class="line"><span class="comment">// Note: root object pointers are NOT the same as `buffer_pointer`.</span></div><div class="line"><span class="comment">// `GetMonster` is a convenience function that calls `GetRoot&lt;Monster&gt;`,</span></div><div class="line"><span class="comment">// the latter is also available for non-root types.</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line">byte[] bytes = <span class="comment">/* the data you just read */</span></div><div class="line">java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(bytes);</div><div class="line"></div><div class="line"><span class="comment">// Get an accessor to the root object inside the buffer.</span></div><div class="line">Monster monster = Monster.getRootAsMonster(buf);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">byte[] bytes = <span class="comment">/* the data you just read */</span></div><div class="line">var buf = <span class="keyword">new</span> ByteBuffer(bytes);</div><div class="line"></div><div class="line"><span class="comment">// Get an accessor to the root object inside the buffer.</span></div><div class="line">var monster = Monster.GetRootAsMonster(buf);</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">var buf []byte = /* the data you just read */</div><div class="line"></div><div class="line">// Get an accessor to the root object inside the buffer.</div><div class="line">monster := sample.GetRootAsMonster(buf, 0)</div><div class="line"></div><div class="line">// Note: We use `0` for the offset here, which is typical for most buffers</div><div class="line">// you would read. If you wanted to read from `builder.Bytes` directly, you</div><div class="line">// would need to pass in the offset of `builder.Head()`, as the builder</div><div class="line">// constructs the buffer backwards, so may not start at offset 0.</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">buf = /* the data you just read, <span class="keywordflow">in</span> an object of type <span class="stringliteral">&quot;bytearray&quot;</span> */</div><div class="line"></div><div class="line">// Get an accessor to the root object inside the buffer.</div><div class="line">monster = MyGame.Sample.Monster.Monster.GetRootAsMonster(buf, 0)</div><div class="line"></div><div class="line"><span class="comment"># Note: We use `0` for the offset here, which is typical for most buffers</span></div><div class="line"><span class="comment"># you would read.  If you wanted to read from the `builder.Bytes` directly,</span></div><div class="line"><span class="comment"># you would need to pass in the offset of `builder.Head()`, as the builder</span></div><div class="line"><span class="comment"># constructs the buffer backwards, so may not start at offset 0.</span></div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var bytes = /* the data you just read, in an object of type &quot;Uint8Array&quot; */</div><div class="line">var buf = new flatbuffers.ByteBuffer(bytes);</div><div class="line"></div><div class="line">// Get an accessor to the root object inside the buffer.</div><div class="line">var monster = MyGame.Sample.Monster.getRootAsMonster(buf);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let bytes = /* the data you just read, in an object of type &quot;Uint8Array&quot; */</div><div class="line">let buf = new flatbuffers.ByteBuffer(bytes);</div><div class="line"></div><div class="line">// Get an accessor to the root object inside the buffer.</div><div class="line">let monster = MyGame.Sample.Monster.getRootAsMonster(buf);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">$bytes = <span class="comment">/* the data you just read, in a string */</span></div><div class="line">$buf = Google\FlatBuffers\ByteBuffer::wrap($bytes);</div><div class="line"></div><div class="line"><span class="comment">// Get an accessor to the root object inside the buffer.</span></div><div class="line">$monster = \MyGame\Sample\Monster::GetRootAsMonster($buf);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Note that we use the `table_t` suffix when reading a table object</span></div><div class="line"><span class="comment">// as opposed to the `ref_t` suffix used during the construction of</span></div><div class="line"><span class="comment">// the buffer.</span></div><div class="line">ns(Monster_table_t) monster = ns(Monster_as_root(buffer));</div><div class="line"></div><div class="line"><span class="comment">// Note: root object pointers are NOT the same as the `buffer` pointer.</span></div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">List&lt;int&gt; data = ... // the data, e.g. from file or network</div><div class="line">// A generated factory constructor that will read the data.</div><div class="line">myGame.Monster monster = new myGame.Monster(data);</div></div><!-- fragment --> </div><p>If you look in the generated files from the schema compiler, you will see it generated accessors for all non-<code>deprecated</code> fields. For example:</p>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> hp = monster-&gt;hp();</div><div class="line"><span class="keyword">auto</span> mana = monster-&gt;mana();</div><div class="line"><span class="keyword">auto</span> name = monster-&gt;name()-&gt;c_str();</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keywordtype">short</span> hp = monster.hp();</div><div class="line"><span class="keywordtype">short</span> mana = monster.mana();</div><div class="line">String name = monster.name();</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="comment">// For C#, unlike most other languages support by FlatBuffers, most values (except for</span></div><div class="line"><span class="comment">// vectors and unions) are available as propreties instead of asccessor methods.</span></div><div class="line">var hp = monster.Hp</div><div class="line">var mana = monster.Mana</div><div class="line">var name = monster.Name</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">hp := monster.Hp()</div><div class="line">mana := monster.Mana()</div><div class="line">name := string(monster.Name()) // Note: `monster.Name()` returns a byte[].</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">hp = monster.Hp()</div><div class="line">mana = monster.Mana()</div><div class="line">name = monster.Name()</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var hp = $monster.hp();</div><div class="line">var mana = $monster.mana();</div><div class="line">var name = $monster.name();</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let hp = $monster.hp();</div><div class="line">let mana = $monster.mana();</div><div class="line">let name = $monster.name();</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">$hp = $monster-&gt;getHp();</div><div class="line">$mana = $monster-&gt;getMana();</div><div class="line">$name = monster-&gt;getName();</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">uint16_t hp = ns(Monster_hp(monster));</div><div class="line">uint16_t mana = ns(Monster_mana(monster));</div><div class="line">flatbuffers_string_t name = ns(Monster_name(monster));</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">// For Dart, unlike other languages support by FlatBuffers, most values</div><div class="line">// are available as propreties instead of asccessor methods.</div><div class="line">var hp = monster.hp;</div><div class="line">var mana = monster.mana;</div><div class="line">var name = monster.name;</div></div><!-- fragment --> </div><p>These should hold <code>300</code>, <code>150</code>, and <code>"Orc"</code> respectively.</p>
 <p><em>Note: The default value <code>150</code> wasn't stored in <code>mana</code>, but we are still able to retrieve it.</em></p>
 <p>To access sub-objects, in the case of our <code>pos</code>, which is a <code>Vec3</code>:</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> pos = monster-&gt;pos();</div><div class="line"><span class="keyword">auto</span> x = pos-&gt;x();</div><div class="line"><span class="keyword">auto</span> y = pos-&gt;y();</div><div class="line"><span class="keyword">auto</span> z = pos-&gt;z();</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line">Vec3 pos = monster.pos();</div><div class="line"><span class="keywordtype">float</span> x = pos.x();</div><div class="line"><span class="keywordtype">float</span> y = pos.y();</div><div class="line"><span class="keywordtype">float</span> z = pos.z();</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">var pos = monster.Pos.Value;</div><div class="line">var x = pos.X;</div><div class="line">var y = pos.Y;</div><div class="line">var z = pos.Z;</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">pos := monster.Pos(nil)</div><div class="line">x := pos.X()</div><div class="line">y := pos.Y()</div><div class="line">z := pos.Z()</div><div class="line"></div><div class="line">// Note: Whenever you access a new object, like in `Pos()`, a new temporary</div><div class="line">// accessor object gets created. If your code is very performance sensitive,</div><div class="line">// you can pass in a pointer to an existing `Vec3` instead of `nil`. This</div><div class="line">// allows you to reuse it across many calls to reduce the amount of object</div><div class="line">// allocation/garbage collection.</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">pos = monster.Pos()</div><div class="line">x = pos.X()</div><div class="line">y = pos.Y()</div><div class="line">z = pos.Z()</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var pos = monster.pos();</div><div class="line">var x = pos.x();</div><div class="line">var y = pos.y();</div><div class="line">var z = pos.z();</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let pos = monster.pos();</div><div class="line">let x = pos.x();</div><div class="line">let y = pos.y();</div><div class="line">let z = pos.z();</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">$pos = $monster-&gt;getPos();</div><div class="line">$x = $pos-&gt;getX();</div><div class="line">$y = $pos-&gt;getY();</div><div class="line">$z = $pos-&gt;getZ();</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">ns(Vec3_struct_t) pos = ns(Monster_pos(monster));</div><div class="line"><span class="keywordtype">float</span> x = ns(Vec3_x(pos));</div><div class="line"><span class="keywordtype">float</span> y = ns(Vec3_y(pos));</div><div class="line"><span class="keywordtype">float</span> z = ns(Vec3_z(pos));</div></div><!-- fragment --> </div><p><code>x</code>, <code>y</code>, and <code>z</code> will contain <code>1.0</code>, <code>2.0</code>, and <code>3.0</code>, respectively.</p>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> pos = monster-&gt;pos();</div><div class="line"><span class="keyword">auto</span> x = pos-&gt;x();</div><div class="line"><span class="keyword">auto</span> y = pos-&gt;y();</div><div class="line"><span class="keyword">auto</span> z = pos-&gt;z();</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line">Vec3 pos = monster.pos();</div><div class="line"><span class="keywordtype">float</span> x = pos.x();</div><div class="line"><span class="keywordtype">float</span> y = pos.y();</div><div class="line"><span class="keywordtype">float</span> z = pos.z();</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">var pos = monster.Pos.Value;</div><div class="line">var x = pos.X;</div><div class="line">var y = pos.Y;</div><div class="line">var z = pos.Z;</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">pos := monster.Pos(nil)</div><div class="line">x := pos.X()</div><div class="line">y := pos.Y()</div><div class="line">z := pos.Z()</div><div class="line"></div><div class="line">// Note: Whenever you access a new object, like in `Pos()`, a new temporary</div><div class="line">// accessor object gets created. If your code is very performance sensitive,</div><div class="line">// you can pass in a pointer to an existing `Vec3` instead of `nil`. This</div><div class="line">// allows you to reuse it across many calls to reduce the amount of object</div><div class="line">// allocation/garbage collection.</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">pos = monster.Pos()</div><div class="line">x = pos.X()</div><div class="line">y = pos.Y()</div><div class="line">z = pos.Z()</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var pos = monster.pos();</div><div class="line">var x = pos.x();</div><div class="line">var y = pos.y();</div><div class="line">var z = pos.z();</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let pos = monster.pos();</div><div class="line">let x = pos.x();</div><div class="line">let y = pos.y();</div><div class="line">let z = pos.z();</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">$pos = $monster-&gt;getPos();</div><div class="line">$x = $pos-&gt;getX();</div><div class="line">$y = $pos-&gt;getY();</div><div class="line">$z = $pos-&gt;getZ();</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">ns(Vec3_struct_t) pos = ns(Monster_pos(monster));</div><div class="line"><span class="keywordtype">float</span> x = ns(Vec3_x(pos));</div><div class="line"><span class="keywordtype">float</span> y = ns(Vec3_y(pos));</div><div class="line"><span class="keywordtype">float</span> z = ns(Vec3_z(pos));</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">myGame.Vec3 pos = monster.pos;</div><div class="line">double x = pos.x;</div><div class="line">double y = pos.y;</div><div class="line">double z = pos.z;</div></div><!-- fragment --> </div><p><code>x</code>, <code>y</code>, and <code>z</code> will contain <code>1.0</code>, <code>2.0</code>, and <code>3.0</code>, respectively.</p>
 <p><em>Note: Had we not set <code>pos</code> during serialization, it would be a <code>NULL</code>-value.</em></p>
 <p>Similarly, we can access elements of the inventory <code>vector</code> by indexing it. You can also iterate over the length of the array/vector representing the FlatBuffers <code>vector</code>.</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> inv = monster-&gt;inventory(); <span class="comment">// A pointer to a `flatbuffers::Vector&lt;&gt;`.</span></div><div class="line"><span class="keyword">auto</span> inv_len = inv-&gt;Length();</div><div class="line"><span class="keyword">auto</span> third_item = inv-&gt;Get(2);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keywordtype">int</span> invLength = monster.inventoryLength();</div><div class="line">byte thirdItem = monster.inventory(2);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="keywordtype">int</span> invLength = monster.InventoryLength;</div><div class="line">var thirdItem = monster.Inventory(2);</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">invLength := monster.InventoryLength()</div><div class="line">thirdItem := monster.Inventory(2)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">inv_len = monster.InventoryLength()</div><div class="line">third_item = monster.Inventory(2)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var invLength = monster.inventoryLength();</div><div class="line">var thirdItem = monster.inventory(2);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let invLength = monster.inventoryLength();</div><div class="line">let thirdItem = monster.inventory(2);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">$inv_len = $monster-&gt;getInventoryLength();</div><div class="line">$third_item = $monster-&gt;getInventory(2);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// If `inv` hasn&#39;t been set, it will be null. It is valid get</span></div><div class="line"><span class="comment">// the length of null which will be 0, useful for iteration.</span></div><div class="line">flatbuffers_uint8_vec_t inv = ns(Monster_inventory(monster));</div><div class="line"><span class="keywordtype">size_t</span> inv_len = flatbuffers_uint8_vec_len(inv);</div></div><!-- fragment --> </div><p>For <code>vector</code>s of <code>table</code>s, you can access the elements like any other vector, except your need to handle the result as a FlatBuffer <code>table</code>:</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> weapons = monster-&gt;weapons(); <span class="comment">// A pointer to a `flatbuffers::Vector&lt;&gt;`.</span></div><div class="line"><span class="keyword">auto</span> weapon_len = weapons-&gt;Length();</div><div class="line"><span class="keyword">auto</span> second_weapon_name = weapons-&gt;Get(1)-&gt;name()-&gt;str();</div><div class="line"><span class="keyword">auto</span> second_weapon_damage = weapons-&gt;Get(1)-&gt;damage()</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keywordtype">int</span> weaponsLength = monster.weaponsLength();</div><div class="line">String secondWeaponName = monster.weapons(1).name();</div><div class="line"><span class="keywordtype">short</span> secondWeaponDamage = monster.weapons(1).damage();</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="keywordtype">int</span> weaponsLength = monster.WeaponsLength;</div><div class="line">var secondWeaponName = monster.Weapons(1).Name;</div><div class="line">var secondWeaponDamage = monster.Weapons(1).Damage;</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">weaponLength := monster.WeaponsLength()</div><div class="line">weapon := new(sample.Weapon) // We need a `sample.Weapon` to pass into `monster.Weapons()`</div><div class="line">                             // to capture the output of the function.</div><div class="line">if monster.Weapons(weapon, 1) {</div><div class="line">        secondWeaponName := weapon.Name()</div><div class="line">        secondWeaponDamage := weapon.Damage()</div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">weapons_length = monster.WeaponsLength()</div><div class="line">second_weapon_name = monster.Weapons(1).Name()</div><div class="line">second_weapon_damage = monster.Weapons(1).Damage()</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var weaponsLength = monster.weaponsLength();</div><div class="line">var secondWeaponName = monster.weapons(1).name();</div><div class="line">var secondWeaponDamage = monster.weapons(1).damage();</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let weaponsLength = monster.weaponsLength();</div><div class="line">let secondWeaponName = monster.weapons(1).name();</div><div class="line">let secondWeaponDamage = monster.weapons(1).damage();</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">$weapons_len = $monster-&gt;getWeaponsLength();</div><div class="line">$second_weapon_name = $monster-&gt;getWeapons(1)-&gt;getName();</div><div class="line">$second_weapon_damage = $monster-&gt;getWeapons(1)-&gt;getDamage();</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">ns(Weapon_vec_t) weapons = ns(Monster_weapons(monster));</div><div class="line"><span class="keywordtype">size_t</span> weapons_len = ns(Weapon_vec_len(weapons));</div><div class="line"><span class="comment">// We can use `const char *` instead of `flatbuffers_string_t`.</span></div><div class="line"><span class="keyword">const</span> <span class="keywordtype">char</span> *second_weapon_name = ns(Weapon_name(ns(Weapon_vec_at(weapons, 1))));</div><div class="line">uint16_t second_weapon_damage =  ns(Weapon_damage(ns(Weapon_vec_at(weapons, 1))));</div></div><!-- fragment --> </div><p>Last, we can access our <code>Equipped</code> FlatBuffer <code>union</code>. Just like when we created the <code>union</code>, we need to get both parts of the <code>union</code>: the type and the data.</p>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> inv = monster-&gt;inventory(); <span class="comment">// A pointer to a `flatbuffers::Vector&lt;&gt;`.</span></div><div class="line"><span class="keyword">auto</span> inv_len = inv-&gt;Length();</div><div class="line"><span class="keyword">auto</span> third_item = inv-&gt;Get(2);</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keywordtype">int</span> invLength = monster.inventoryLength();</div><div class="line">byte thirdItem = monster.inventory(2);</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="keywordtype">int</span> invLength = monster.InventoryLength;</div><div class="line">var thirdItem = monster.Inventory(2);</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">invLength := monster.InventoryLength()</div><div class="line">thirdItem := monster.Inventory(2)</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">inv_len = monster.InventoryLength()</div><div class="line">third_item = monster.Inventory(2)</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var invLength = monster.inventoryLength();</div><div class="line">var thirdItem = monster.inventory(2);</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let invLength = monster.inventoryLength();</div><div class="line">let thirdItem = monster.inventory(2);</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">$inv_len = $monster-&gt;getInventoryLength();</div><div class="line">$third_item = $monster-&gt;getInventory(2);</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// If `inv` hasn&#39;t been set, it will be null. It is valid get</span></div><div class="line"><span class="comment">// the length of null which will be 0, useful for iteration.</span></div><div class="line">flatbuffers_uint8_vec_t inv = ns(Monster_inventory(monster));</div><div class="line"><span class="keywordtype">size_t</span> inv_len = flatbuffers_uint8_vec_len(inv);</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">int invLength = monster.inventory.length;</div><div class="line">var thirdItem = monster.inventory[2];</div></div><!-- fragment --> </div><p>For <code>vector</code>s of <code>table</code>s, you can access the elements like any other vector, except your need to handle the result as a FlatBuffer <code>table</code>:</p>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> weapons = monster-&gt;weapons(); <span class="comment">// A pointer to a `flatbuffers::Vector&lt;&gt;`.</span></div><div class="line"><span class="keyword">auto</span> weapon_len = weapons-&gt;Length();</div><div class="line"><span class="keyword">auto</span> second_weapon_name = weapons-&gt;Get(1)-&gt;name()-&gt;str();</div><div class="line"><span class="keyword">auto</span> second_weapon_damage = weapons-&gt;Get(1)-&gt;damage()</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keywordtype">int</span> weaponsLength = monster.weaponsLength();</div><div class="line">String secondWeaponName = monster.weapons(1).name();</div><div class="line"><span class="keywordtype">short</span> secondWeaponDamage = monster.weapons(1).damage();</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line"><span class="keywordtype">int</span> weaponsLength = monster.WeaponsLength;</div><div class="line">var secondWeaponName = monster.Weapons(1).Name;</div><div class="line">var secondWeaponDamage = monster.Weapons(1).Damage;</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">weaponLength := monster.WeaponsLength()</div><div class="line">weapon := new(sample.Weapon) // We need a `sample.Weapon` to pass into `monster.Weapons()`</div><div class="line">                             // to capture the output of the function.</div><div class="line">if monster.Weapons(weapon, 1) {</div><div class="line">        secondWeaponName := weapon.Name()</div><div class="line">        secondWeaponDamage := weapon.Damage()</div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">weapons_length = monster.WeaponsLength()</div><div class="line">second_weapon_name = monster.Weapons(1).Name()</div><div class="line">second_weapon_damage = monster.Weapons(1).Damage()</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var weaponsLength = monster.weaponsLength();</div><div class="line">var secondWeaponName = monster.weapons(1).name();</div><div class="line">var secondWeaponDamage = monster.weapons(1).damage();</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let weaponsLength = monster.weaponsLength();</div><div class="line">let secondWeaponName = monster.weapons(1).name();</div><div class="line">let secondWeaponDamage = monster.weapons(1).damage();</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">$weapons_len = $monster-&gt;getWeaponsLength();</div><div class="line">$second_weapon_name = $monster-&gt;getWeapons(1)-&gt;getName();</div><div class="line">$second_weapon_damage = $monster-&gt;getWeapons(1)-&gt;getDamage();</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">ns(Weapon_vec_t) weapons = ns(Monster_weapons(monster));</div><div class="line"><span class="keywordtype">size_t</span> weapons_len = ns(Weapon_vec_len(weapons));</div><div class="line"><span class="comment">// We can use `const char *` instead of `flatbuffers_string_t`.</span></div><div class="line"><span class="keyword">const</span> <span class="keywordtype">char</span> *second_weapon_name = ns(Weapon_name(ns(Weapon_vec_at(weapons, 1))));</div><div class="line">uint16_t second_weapon_damage =  ns(Weapon_damage(ns(Weapon_vec_at(weapons, 1))));</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">int weaponsLength = monster.weapons.length;</div><div class="line">var secondWeaponName = monster.weapons[1].name;</div><div class="line">var secondWeaponDamage = monster.Weapons[1].damage;</div></div><!-- fragment --> </div><p>Last, we can access our <code>Equipped</code> FlatBuffer <code>union</code>. Just like when we created the <code>union</code>, we need to get both parts of the <code>union</code>: the type and the data.</p>
 <p>We can access the type to dynamically cast the data as needed (since the <code>union</code> only stores a FlatBuffer <code>table</code>).</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> union_type = monster.equipped_type();</div><div class="line"></div><div class="line"><span class="keywordflow">if</span> (union_type == Equipment_Weapon) {</div><div class="line">  <span class="keyword">auto</span> weapon = <span class="keyword">static_cast&lt;</span><span class="keyword">const </span>Weapon*<span class="keyword">&gt;</span>(monster-&gt;equipped()); <span class="comment">// Requires `static_cast`</span></div><div class="line">                                                                 <span class="comment">// to type `const Weapon*`.</span></div><div class="line"></div><div class="line">  <span class="keyword">auto</span> weapon_name = weapon-&gt;name()-&gt;str(); <span class="comment">// &quot;Axe&quot;</span></div><div class="line">  <span class="keyword">auto</span> weapon_damage = weapon-&gt;damage();    <span class="comment">// 5</span></div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keywordtype">int</span> unionType = monster.EquippedType();</div><div class="line"></div><div class="line"><span class="keywordflow">if</span> (unionType == Equipment.Weapon) {</div><div class="line">  Weapon weapon = (Weapon)monster.equipped(<span class="keyword">new</span> Weapon()); <span class="comment">// Requires explicit cast</span></div><div class="line">                                                          <span class="comment">// to `Weapon`.</span></div><div class="line"></div><div class="line">  String weaponName = weapon.name();    <span class="comment">// &quot;Axe&quot;</span></div><div class="line">  <span class="keywordtype">short</span> weaponDamage = weapon.damage(); <span class="comment">// 5</span></div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">var unionType = monster.EquippedType;</div><div class="line"></div><div class="line"><span class="keywordflow">if</span> (unionType == Equipment.Weapon) {</div><div class="line">  var weapon = monster.Equipped&lt;Weapon&gt;().Value;</div><div class="line"></div><div class="line">  var weaponName = weapon.Name;     <span class="comment">// &quot;Axe&quot;</span></div><div class="line">  var weaponDamage = weapon.Damage; <span class="comment">// 5</span></div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// We need a `flatbuffers.Table` to capture the output of the</div><div class="line">// `monster.Equipped()` function.</div><div class="line">unionTable := new(flatbuffers.Table)</div><div class="line"></div><div class="line">if monster.Equipped(unionTable) {</div><div class="line">        unionType := monster.EquippedType()</div><div class="line"></div><div class="line">        if unionType == sample.EquipmentWeapon {</div><div class="line">                // Create a `sample.Weapon` object that can be initialized with the contents</div><div class="line">                // of the `flatbuffers.Table` (`unionTable`), which was populated by</div><div class="line">                // `monster.Equipped()`.</div><div class="line">                unionWeapon = new(sample.Weapon)</div><div class="line">                unionWeapon.Init(unionTable.Bytes, unionTable.Pos)</div><div class="line"></div><div class="line">                weaponName = unionWeapon.Name()</div><div class="line">                weaponDamage = unionWeapon.Damage()</div><div class="line">        }</div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">union_type = monster.EquippedType()</div><div class="line"></div><div class="line"><span class="keywordflow">if</span> union_type == MyGame.Sample.Equipment.Equipment().Weapon:</div><div class="line">  <span class="comment"># `monster.Equipped()` returns a `flatbuffers.Table`, which can be used to</span></div><div class="line">  <span class="comment"># initialize a `MyGame.Sample.Weapon.Weapon()`.</span></div><div class="line">  union_weapon = MyGame.Sample.Weapon.Weapon()</div><div class="line">  union_weapon.Init(monster.Equipped().Bytes, monster.Equipped().Pos)</div><div class="line"></div><div class="line">  weapon_name = union_weapon.Name()     // <span class="stringliteral">&#39;Axe&#39;</span></div><div class="line">  weapon_damage = union_weapon.Damage() // 5</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var unionType = monster.equippedType();</div><div class="line"></div><div class="line">if (unionType == MyGame.Sample.Equipment.Weapon) {</div><div class="line">  var weapon_name = monster.equipped(new MyGame.Sample.Weapon()).name();     // &#39;Axe&#39;</div><div class="line">  var weapon_damage = monster.equipped(new MyGame.Sample.Weapon()).damage(); // 5</div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let unionType = monster.equippedType();</div><div class="line"></div><div class="line">if (unionType == MyGame.Sample.Equipment.Weapon) {</div><div class="line">  let weapon_name = monster.equipped(new MyGame.Sample.Weapon()).name();     // &#39;Axe&#39;</div><div class="line">  let weapon_damage = monster.equipped(new MyGame.Sample.Weapon()).damage(); // 5</div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">$union_type = $monster-&gt;getEquippedType();</div><div class="line"></div><div class="line"><span class="keywordflow">if</span> ($union_type == \MyGame\Sample\Equipment::Weapon) {</div><div class="line">  $weapon_name = $monster-&gt;getEquipped(<span class="keyword">new</span> \MyGame\Sample\Weapon())-&gt;getName();     <span class="comment">// &quot;Axe&quot;</span></div><div class="line">  $weapon_damage = $monster-&gt;getEquipped(<span class="keyword">new</span> \MyGame\Sample\Weapon())-&gt;getDamage(); <span class="comment">// 5</span></div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Access union type field.</span></div><div class="line"><span class="keywordflow">if</span> (ns(Monster_equipped_type(monster)) == ns(Equipment_Weapon)) {</div><div class="line">    <span class="comment">// Cast to appropriate type:</span></div><div class="line">    <span class="comment">// C allows for silent void pointer assignment, so we need no explicit cast.</span></div><div class="line">    ns(Weapon_table_t) weapon = ns(Monster_equipped(monster));</div><div class="line">    <span class="keyword">const</span> <span class="keywordtype">char</span> *weapon_name = ns(Weapon_name(weapon)); <span class="comment">// &quot;Axe&quot;</span></div><div class="line">    uint16_t weapon_damage = ns(Weapon_damage(weapon)); <span class="comment">// 5</span></div><div class="line">}</div></div><!-- fragment --> </div><h2>Mutating FlatBuffers</h2>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> union_type = monster.equipped_type();</div><div class="line"></div><div class="line"><span class="keywordflow">if</span> (union_type == Equipment_Weapon) {</div><div class="line">  <span class="keyword">auto</span> weapon = <span class="keyword">static_cast&lt;</span><span class="keyword">const </span>Weapon*<span class="keyword">&gt;</span>(monster-&gt;equipped()); <span class="comment">// Requires `static_cast`</span></div><div class="line">                                                                 <span class="comment">// to type `const Weapon*`.</span></div><div class="line"></div><div class="line">  <span class="keyword">auto</span> weapon_name = weapon-&gt;name()-&gt;str(); <span class="comment">// &quot;Axe&quot;</span></div><div class="line">  <span class="keyword">auto</span> weapon_damage = weapon-&gt;damage();    <span class="comment">// 5</span></div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line"><span class="keywordtype">int</span> unionType = monster.EquippedType();</div><div class="line"></div><div class="line"><span class="keywordflow">if</span> (unionType == Equipment.Weapon) {</div><div class="line">  Weapon weapon = (Weapon)monster.equipped(<span class="keyword">new</span> Weapon()); <span class="comment">// Requires explicit cast</span></div><div class="line">                                                          <span class="comment">// to `Weapon`.</span></div><div class="line"></div><div class="line">  String weaponName = weapon.name();    <span class="comment">// &quot;Axe&quot;</span></div><div class="line">  <span class="keywordtype">short</span> weaponDamage = weapon.damage(); <span class="comment">// 5</span></div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">var unionType = monster.EquippedType;</div><div class="line"></div><div class="line"><span class="keywordflow">if</span> (unionType == Equipment.Weapon) {</div><div class="line">  var weapon = monster.Equipped&lt;Weapon&gt;().Value;</div><div class="line"></div><div class="line">  var weaponName = weapon.Name;     <span class="comment">// &quot;Axe&quot;</span></div><div class="line">  var weaponDamage = weapon.Damage; <span class="comment">// 5</span></div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">// We need a `flatbuffers.Table` to capture the output of the</div><div class="line">// `monster.Equipped()` function.</div><div class="line">unionTable := new(flatbuffers.Table)</div><div class="line"></div><div class="line">if monster.Equipped(unionTable) {</div><div class="line">        unionType := monster.EquippedType()</div><div class="line"></div><div class="line">        if unionType == sample.EquipmentWeapon {</div><div class="line">                // Create a `sample.Weapon` object that can be initialized with the contents</div><div class="line">                // of the `flatbuffers.Table` (`unionTable`), which was populated by</div><div class="line">                // `monster.Equipped()`.</div><div class="line">                unionWeapon = new(sample.Weapon)</div><div class="line">                unionWeapon.Init(unionTable.Bytes, unionTable.Pos)</div><div class="line"></div><div class="line">                weaponName = unionWeapon.Name()</div><div class="line">                weaponDamage = unionWeapon.Damage()</div><div class="line">        }</div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">union_type = monster.EquippedType()</div><div class="line"></div><div class="line"><span class="keywordflow">if</span> union_type == MyGame.Sample.Equipment.Equipment().Weapon:</div><div class="line">  <span class="comment"># `monster.Equipped()` returns a `flatbuffers.Table`, which can be used to</span></div><div class="line">  <span class="comment"># initialize a `MyGame.Sample.Weapon.Weapon()`.</span></div><div class="line">  union_weapon = MyGame.Sample.Weapon.Weapon()</div><div class="line">  union_weapon.Init(monster.Equipped().Bytes, monster.Equipped().Pos)</div><div class="line"></div><div class="line">  weapon_name = union_weapon.Name()     // <span class="stringliteral">&#39;Axe&#39;</span></div><div class="line">  weapon_damage = union_weapon.Damage() // 5</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">var unionType = monster.equippedType();</div><div class="line"></div><div class="line">if (unionType == MyGame.Sample.Equipment.Weapon) {</div><div class="line">  var weapon_name = monster.equipped(new MyGame.Sample.Weapon()).name();     // &#39;Axe&#39;</div><div class="line">  var weapon_damage = monster.equipped(new MyGame.Sample.Weapon()).damage(); // 5</div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">let unionType = monster.equippedType();</div><div class="line"></div><div class="line">if (unionType == MyGame.Sample.Equipment.Weapon) {</div><div class="line">  let weapon_name = monster.equipped(new MyGame.Sample.Weapon()).name();     // &#39;Axe&#39;</div><div class="line">  let weapon_damage = monster.equipped(new MyGame.Sample.Weapon()).damage(); // 5</div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">$union_type = $monster-&gt;getEquippedType();</div><div class="line"></div><div class="line"><span class="keywordflow">if</span> ($union_type == \MyGame\Sample\Equipment::Weapon) {</div><div class="line">  $weapon_name = $monster-&gt;getEquipped(<span class="keyword">new</span> \MyGame\Sample\Weapon())-&gt;getName();     <span class="comment">// &quot;Axe&quot;</span></div><div class="line">  $weapon_damage = $monster-&gt;getEquipped(<span class="keyword">new</span> \MyGame\Sample\Weapon())-&gt;getDamage(); <span class="comment">// 5</span></div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line"><span class="comment">// Access union type field.</span></div><div class="line"><span class="keywordflow">if</span> (ns(Monster_equipped_type(monster)) == ns(Equipment_Weapon)) {</div><div class="line">    <span class="comment">// Cast to appropriate type:</span></div><div class="line">    <span class="comment">// C allows for silent void pointer assignment, so we need no explicit cast.</span></div><div class="line">    ns(Weapon_table_t) weapon = ns(Monster_equipped(monster));</div><div class="line">    <span class="keyword">const</span> <span class="keywordtype">char</span> *weapon_name = ns(Weapon_name(weapon)); <span class="comment">// &quot;Axe&quot;</span></div><div class="line">    uint16_t weapon_damage = ns(Weapon_damage(weapon)); <span class="comment">// 5</span></div><div class="line">}</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">var unionType = monster.equippedType.value;</div><div class="line"></div><div class="line">if (unionType == myGame.EquipmentTypeId.Weapon.value) {</div><div class="line">  myGame.Weapon weapon = mon.equipped as myGame.Weapon;</div><div class="line"></div><div class="line">  var weaponName = weapon.name;     // &quot;Axe&quot;</div><div class="line">  var weaponDamage = weapon.damage; // 5</div><div class="line">}</div></div><!-- fragment --> </div><h2>Mutating FlatBuffers</h2>
 <p>As you saw above, typically once you have created a FlatBuffer, it is read-only from that moment on. There are, however, cases where you have just received a FlatBuffer, and you'd like to modify something about it before sending it on to another recipient. With the above functionality, you'd have to generate an entirely new FlatBuffer, while tracking what you modified in your own data structures. This is inconvenient.</p>
 <p>For this reason FlatBuffers can also be mutated in-place. While this is great for making small fixes to an existing buffer, you generally want to create buffers from scratch whenever possible, since it is much more efficient and the API is much more general purpose.</p>
 <p>To get non-const accessors, invoke <code>flatc</code> with <code>--gen-mutable</code>.</p>
 <p>Similar to how we read fields using the accessors above, we can now use the mutators like so:</p>
-<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> monster = GetMutableMonster(buffer_pointer);  <span class="comment">// non-const</span></div><div class="line">monster-&gt;mutate_hp(10);                      <span class="comment">// Set the table `hp` field.</span></div><div class="line">monster-&gt;mutable_pos()-&gt;mutate_z(4);         <span class="comment">// Set struct field.</span></div><div class="line">monster-&gt;mutable_inventory()-&gt;Mutate(0, 1);  <span class="comment">// Set vector element.</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line">Monster monster = Monster.getRootAsMonster(buf);</div><div class="line">monster.mutateHp(10);            <span class="comment">// Set table field.</span></div><div class="line">monster.pos().mutateZ(4);        <span class="comment">// Set struct field.</span></div><div class="line">monster.mutateInventory(0, 1);   <span class="comment">// Set vector element.</span></div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">var monster = Monster.GetRootAsMonster(buf);</div><div class="line">monster.MutateHp(10);            <span class="comment">// Set table field.</span></div><div class="line">monster.Pos.MutateZ(4);          <span class="comment">// Set struct field.</span></div><div class="line">monster.MutateInventory(0, 1);   <span class="comment">// Set vector element.</span></div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">&lt;API for mutating FlatBuffers is not yet available in Go.&gt;</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">&lt;API <span class="keywordflow">for</span> mutating FlatBuffers <span class="keywordflow">is</span> <span class="keywordflow">not</span> yet available <span class="keywordflow">in</span> Python.&gt;</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">&lt;API for mutating FlatBuffers is not yet supported in JavaScript.&gt;</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">&lt;API for mutating FlatBuffers is not yet supported in TypeScript.&gt;</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">&lt;API <span class="keywordflow">for</span> mutating <a class="code" href="namespace_flat_buffers.html">FlatBuffers</a> is not yet supported in PHP.&gt;</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">&lt;API <span class="keywordflow">for</span> in-place mutating <a class="code" href="namespace_flat_buffers.html">FlatBuffers</a> will not be supported in C</div><div class="line">(except in-place vector sorting is possible).&gt;</div></div><!-- fragment --> </div><p>We use the somewhat verbose term <code>mutate</code> instead of <code>set</code> to indicate that this is a special use case, not to be confused with the default way of constructing FlatBuffer data.</p>
+<div class="language-cpp"> <div class="fragment"><div class="line"><span class="keyword">auto</span> monster = GetMutableMonster(buffer_pointer);  <span class="comment">// non-const</span></div><div class="line">monster-&gt;mutate_hp(10);                      <span class="comment">// Set the table `hp` field.</span></div><div class="line">monster-&gt;mutable_pos()-&gt;mutate_z(4);         <span class="comment">// Set struct field.</span></div><div class="line">monster-&gt;mutable_inventory()-&gt;Mutate(0, 1);  <span class="comment">// Set vector element.</span></div></div><!-- fragment --> </div> <div class="language-java"> <div class="fragment"><div class="line">Monster monster = Monster.getRootAsMonster(buf);</div><div class="line">monster.mutateHp(10);            <span class="comment">// Set table field.</span></div><div class="line">monster.pos().mutateZ(4);        <span class="comment">// Set struct field.</span></div><div class="line">monster.mutateInventory(0, 1);   <span class="comment">// Set vector element.</span></div></div><!-- fragment --> </div> <div class="language-csharp"> <div class="fragment"><div class="line">var monster = Monster.GetRootAsMonster(buf);</div><div class="line">monster.MutateHp(10);            <span class="comment">// Set table field.</span></div><div class="line">monster.Pos.MutateZ(4);          <span class="comment">// Set struct field.</span></div><div class="line">monster.MutateInventory(0, 1);   <span class="comment">// Set vector element.</span></div></div><!-- fragment --> </div> <div class="language-go"> <div class="fragment"><div class="line">&lt;API for mutating FlatBuffers is not yet available in Go.&gt;</div></div><!-- fragment --> </div> <div class="language-python"> <div class="fragment"><div class="line">&lt;API <span class="keywordflow">for</span> mutating FlatBuffers <span class="keywordflow">is</span> <span class="keywordflow">not</span> yet available <span class="keywordflow">in</span> Python.&gt;</div></div><!-- fragment --> </div> <div class="language-javascript"> <div class="fragment"><div class="line">&lt;API for mutating FlatBuffers is not yet supported in JavaScript.&gt;</div></div><!-- fragment --> </div> <div class="language-typescript"> <div class="fragment"><div class="line">&lt;API for mutating FlatBuffers is not yet supported in TypeScript.&gt;</div></div><!-- fragment --> </div> <div class="language-php"> <div class="fragment"><div class="line">&lt;API <span class="keywordflow">for</span> mutating <a class="code" href="namespace_flat_buffers.html">FlatBuffers</a> is not yet supported in PHP.&gt;</div></div><!-- fragment --> </div> <div class="language-c"> <div class="fragment"><div class="line">&lt;API <span class="keywordflow">for</span> in-place mutating <a class="code" href="namespace_flat_buffers.html">FlatBuffers</a> will not be supported in C</div><div class="line">(except in-place vector sorting is possible).&gt;</div></div><!-- fragment --> </div> <div class="language-dart"> <div class="fragment"><div class="line">&lt;API for mutating FlatBuffers not yet available in Dart.&gt;</div></div><!-- fragment --> </div><p>We use the somewhat verbose term <code>mutate</code> instead of <code>set</code> to indicate that this is a special use case, not to be confused with the default way of constructing FlatBuffer data.</p>
 <p>After the above mutations, you can send on the FlatBuffer to a new recipient without any further work!</p>
 <p>Note that any <code>mutate</code> functions on a table will return a boolean, which is <code>false</code> if the field we're trying to set is not present in the buffer. Fields that are not present if they weren't set, or even if they happen to be equal to the default value. For example, in the creation code above, the <code>mana</code> field is equal to <code>150</code>, which is the default value, so it was never stored in the buffer. Trying to call the corresponding <code>mutate</code> method for <code>mana</code> on such data will return <code>false</code>, and the value won't actually be modified!</p>
 <p>One way to solve this is to call <code>ForceDefaults</code> on a FlatBufferBuilder to force all fields you set to actually be written. This, of course, increases the size of the buffer somewhat, but this may be acceptable for a mutable buffer.</p>
@@ -259,7 +260,7 @@ $(document).ready(function(){initNavTree('flatbuffers_guide_tutorial.html','');}
 <div class="language-cpp"> <em>Note: If you're working in C++, you can also parse JSON at runtime. See the <a class="el" href="flatbuffers_guide_use_cpp.html">Use in C++</a> section of the Programmer's Guide for more information.</em> </div> <div class="language-c"> <em>Note: If you're working in C, the <code>flatcc --json</code> (not <code>flatc</code>) compiler will generate schema specific high performance json parsers and printers that you can compile and use at runtime. The <code>flatc</code> compiler (not <code>flatcc</code>) on the other hand, is still useful for general offline json to flatbuffer conversion from a given schema. There are no current plans for <code>flatcc</code> to support this.</em> </div><h2>Advanced Features for Each Language</h2>
 <p>Each language has a dedicated <code>Use in XXX</code> page in the Programmer's Guide to cover the nuances of FlatBuffers in that language.</p>
 <p>For your chosen language, see:</p>
-<div class="language-cpp"> <a class="el" href="flatbuffers_guide_use_cpp.html">Use in C++</a> </div> <div class="language-java"> <a class="el" href="flatbuffers_guide_use_java_c-sharp.html">Use in Java/C#</a> </div> <div class="language-csharp"> <a class="el" href="flatbuffers_guide_use_java_c-sharp.html">Use in Java/C#</a> </div> <div class="language-go"> <a class="el" href="flatbuffers_guide_use_go.html">Use in Go</a> </div> <div class="language-python"> <a class="el" href="flatbuffers_guide_use_python.html">Use in Python</a> </div> <div class="language-javascript"> <a class="el" href="flatbuffers_guide_use_javascript.html">Use in JavaScript</a> </div> <div class="language-typescript"> Use in TypeScript </div> <div class="language-php"> <a class="el" href="flatbuffers_guide_use_php.html">Use in PHP</a> </div> <div class="language-c"> <a class="el" href="flatbuffers_guide_use_c.html">Use in C</a> </div><p><br />
+<div class="language-cpp"> <a class="el" href="flatbuffers_guide_use_cpp.html">Use in C++</a> </div> <div class="language-java"> <a class="el" href="flatbuffers_guide_use_java_c-sharp.html">Use in Java/C#</a> </div> <div class="language-csharp"> <a class="el" href="flatbuffers_guide_use_java_c-sharp.html">Use in Java/C#</a> </div> <div class="language-go"> <a class="el" href="flatbuffers_guide_use_go.html">Use in Go</a> </div> <div class="language-python"> <a class="el" href="flatbuffers_guide_use_python.html">Use in Python</a> </div> <div class="language-javascript"> <a class="el" href="flatbuffers_guide_use_javascript.html">Use in JavaScript</a> </div> <div class="language-typescript"> <a class="el" href="flatbuffers_guide_use_typescript.html">Use in TypeScript</a> </div> <div class="language-php"> <a class="el" href="flatbuffers_guide_use_php.html">Use in PHP</a> </div> <div class="language-c"> <a class="el" href="flatbuffers_guide_use_c.html">Use in C</a> </div> <div class="language-dart"> <a class="el" href="flatbuffers_guide_use_dart.html">Use in Dart</a> </div><p><br />
  </p>
 </div></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/flatbuffers_guide_use_dart.html b/flatbuffers_guide_use_dart.html
new file mode 100644
index 0000000000000000000000000000000000000000..5c88ec96abdf7d0a0c84eda89e23794ab1ebdccf
--- /dev/null
+++ b/flatbuffers_guide_use_dart.html
@@ -0,0 +1,136 @@
+<!-- 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.13"/>
+<title>FlatBuffers: Use in Dart</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<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.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('flatbuffers_guide_use_dart.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)">
+</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">Use in Dart </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h2>Before you get started</h2>
+<p>Before diving into the FlatBuffers usage in Dart, it should be noted that the <a class="el" href="flatbuffers_guide_tutorial.html">Tutorial</a> page has a complete guide to general FlatBuffers usage in all of the supported languages (including Dart). This page is designed to cover the nuances of FlatBuffers usage, specific to Dart.</p>
+<p>You should also have read the <a class="el" href="flatbuffers_guide_building.html">Building</a> documentation to build <code>flatc</code> and should be familiar with <a class="el" href="flatbuffers_guide_using_schema_compiler.html">Using the schema compiler</a> and <a class="el" href="flatbuffers_guide_writing_schema.html">Writing a schema</a>.</p>
+<h2>FlatBuffers Dart library code location</h2>
+<p>The code for the FlatBuffers Go library can be found at <code>flatbuffers/dart</code>. You can browse the library code on the <a href="https://github.com/google/flatbuffers/tree/master/dart">FlatBuffers GitHub page</a>.</p>
+<h2>Testing the FlatBuffers Dart library</h2>
+<p>The code to test the Dart library can be found at <code>flatbuffers/tests</code>. The test code itself is located in <a href="https://github.com/google/
+flatbuffers/blob/master/tests/dart_test.dart">dart_test.dart</a>.</p>
+<p>To run the tests, use the <a href="https://github.com/google/flatbuffers/
+blob/master/tests/DartTest.sh">DartTest.sh</a> shell script.</p>
+<p><em>Note: The shell script requires the <a href="https://www.dartlang.org/tools/sdk">Dart SDK</a> to be installed.</em></p>
+<h2>Using the FlatBuffers Dart library</h2>
+<p><em>Note: See <a class="el" href="flatbuffers_guide_tutorial.html">Tutorial</a> for a more in-depth example of how to use FlatBuffers in Dart.</em></p>
+<p>FlatBuffers supports reading and writing binary FlatBuffers in Dart.</p>
+<p>To use FlatBuffers in your own code, first generate Dart classes from your schema with the <code>--dart</code> option to <code>flatc</code>. Then you can include both FlatBuffers and the generated code to read or write a FlatBuffer.</p>
+<p>For example, here is how you would read a FlatBuffer binary file in Dart: First, include the library and generated code. Then read a FlatBuffer binary file into a <code>List&lt;int&gt;</code>, which you pass to the factory constructor for <code>Monster</code>:</p>
+<div class="fragment"><div class="line">import &#39;dart:io&#39; as io;</div><div class="line"></div><div class="line">import &#39;package:flat_buffers/flat_buffers.dart&#39; as fb;</div><div class="line">import &#39;./monster_my_game.sample_generated.dart&#39; as myGame;</div><div class="line"></div><div class="line">List&lt;int&gt; data = await new io.File(&#39;monster.dat&#39;).readAsBytes();</div><div class="line">var monster = new myGame.Monster(data);</div></div><!-- fragment --><p>Now you can access values like this:</p>
+<div class="fragment"><div class="line">var hp = monster.hp;</div><div class="line">var pos = monster.pos;</div></div><!-- fragment --><h2>Differences from the Dart SDK Front End flat_buffers</h2>
+<p>The work in this repository is signfiicantly based on the implementation used internally by the Dart SDK in the front end/analyzer package. Several significant changes have been made.</p>
+<ol type="1">
+<li>Support for packed boolean lists has been removed. This is not standard in other implementations and is not compatible with them. Do note that, like in the JavaScript implementation, <b>null values in boolean lists will be treated as false</b>. It is also still entirely possible to pack data in a single scalar field, but that would have to be done on the application side.</li>
+<li>The SDK implementation supports enums with regular Dart enums, which works if enums are always indexed at 1; however, FlatBuffers does not require that. This implementation uses specialized enum-like classes to ensure proper mapping from FlatBuffers to Dart and other platforms.</li>
+<li>The SDK implementation does not appear to support FlatBuffer structs or vectors of structs - it treated everything as a built-in scalar or a table. This implementation treats structs in a way that is compatible with other non-Dart implementations, and properly handles vectors of structs. Many of the methods prefixed with 'low' have been prepurposed to support this.</li>
+<li>The SDK implementation treats int64 and uint64 as float64s. This implementation does not. This may cause problems with JavaScript compatibility - however, it should be possible to use the JavaScript implementation, or to do a customized implementation that treats all 64 bit numbers as floats. Supporting the Dart VM and Flutter was a more important goal of this implementation. Support for 16 bit integers was also added.</li>
+<li>The code generation in this offers an "ObjectBuilder", which generates code very similar to the SDK classes that consume FlatBuffers, as well as Builder classes, which produces code which more closely resembles the builders in other languages. The ObjectBuilder classes are easier to use, at the cost of additional references allocated.</li>
+</ol>
+<h2>Text Parsing</h2>
+<p>There currently is no support for parsing text (Schema's and JSON) directly from Dart, though you could use the C++ parser through Dart Native Extensions. Please see the C++ documentation for more on text parsing (note that this is not currently an option in Flutter - follow <a href="https://github.com/flutter/flutter/issues/7053">this issue</a> for the latest).</p>
+<p><br />
+ </p>
+</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/flatbuffers_guide_use_typescript.html b/flatbuffers_guide_use_typescript.html
new file mode 100644
index 0000000000000000000000000000000000000000..ffbc961e262a00e9dc1462fd6cc2e46d2fb49e8e
--- /dev/null
+++ b/flatbuffers_guide_use_typescript.html
@@ -0,0 +1,123 @@
+<!-- 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.13"/>
+<title>FlatBuffers: Use in TypeScript</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtreedata.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+  $(document).ready(initResizable);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+<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.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+  <div id="nav-tree">
+    <div id="nav-tree-contents">
+      <div id="nav-sync" class="sync"></div>
+    </div>
+  </div>
+  <div id="splitbar" style="-moz-user-select:none;" 
+       class="ui-resizable-handle">
+  </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('flatbuffers_guide_use_typescript.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)">
+</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">Use in TypeScript </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h2>Before you get started</h2>
+<p>Before diving into the FlatBuffers usage in TypeScript, it should be noted that the <a class="el" href="flatbuffers_guide_tutorial.html">Tutorial</a> page has a complete guide to general FlatBuffers usage in all of the supported languages (including TypeScript). This page is specifically designed to cover the nuances of FlatBuffers usage in TypeScript.</p>
+<p>You should also have read the <a class="el" href="flatbuffers_guide_building.html">Building</a> documentation to build <code>flatc</code> and should be familiar with <a class="el" href="flatbuffers_guide_using_schema_compiler.html">Using the schema compiler</a> and <a class="el" href="flatbuffers_guide_writing_schema.html">Writing a schema</a>.</p>
+<h2>FlatBuffers TypeScript library code location</h2>
+<p>The code for the FlatBuffers TypeScript library can be found at <code>flatbuffers/js</code> with typings available at /flatubffers.</p>
+<h2>Testing the FlatBuffers TypeScript library</h2>
+<p>To run the tests, use the <a href="https://github.com/google/
+flatbuffers/blob/master/tests/TypeScriptTest.sh">TypeScriptTest.sh</a> shell script.</p>
+<p><em>Note: The TypeScript test file requires <a href="https://nodejs.org/en/">Node.js</a>.</em></p>
+<h2>Using the FlatBuffers TypeScript libary</h2>
+<p><em>Note: See <a class="el" href="flatbuffers_guide_tutorial.html">Tutorial</a> for a more in-depth example of how to use FlatBuffers in TypeScript.</em></p>
+<p>FlatBuffers supports both reading and writing FlatBuffers in TypeScript.</p>
+<p>To use FlatBuffers in your own code, first generate TypeScript classes from your schema with the <code>--ts</code> option to <code>flatc</code>. Then you can include both FlatBuffers and the generated code to read or write a FlatBuffer.</p>
+<p>For example, here is how you would read a FlatBuffer binary file in TypeScript: First, include the library and generated code. Then read the file into an <code>Uint8Array</code>. Make a <code>flatbuffers.ByteBuffer</code> out of the <code>Uint8Array</code>, and pass the ByteBuffer to the <code>getRootAsMonster</code> function.</p>
+<div class="fragment"><div class="line">// note: import flabuffers with your desired import method</div><div class="line"></div><div class="line">import { MyGame } from &#39;./monster_generated&#39;;</div><div class="line"></div><div class="line">let data = new Uint8Array(fs.readFileSync(&#39;monster.dat&#39;));</div><div class="line">let buf = new flatbuffers.ByteBuffer(data);</div><div class="line"></div><div class="line">let monster = MyGame.Example.Monster.getRootAsMonster(buf);</div></div><!-- fragment --><p>Now you can access values like this:</p>
+<div class="fragment"><div class="line">let hp = monster.hp();</div><div class="line">let pos = monster.pos();</div></div><!-- fragment --><h2>Text parsing FlatBuffers in TypeScript</h2>
+<p>There currently is no support for parsing text (Schema's and JSON) directly from TypeScript. </p>
+</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/flatbuffers_guide_using_schema_compiler.html b/flatbuffers_guide_using_schema_compiler.html
index 3768cdddc1f479b89c262317add6510c658d62c8..3d07c0991d9fdee3394e590777500a5fd4b0cee2 100644
--- a/flatbuffers_guide_using_schema_compiler.html
+++ b/flatbuffers_guide_using_schema_compiler.html
@@ -106,6 +106,7 @@ $(document).ready(function(){initNavTree('flatbuffers_guide_using_schema_compile
 <li><code>--js</code>, <code>-s</code>: Generate JavaScript code.</li>
 <li><code>--php</code>: Generate PHP code.</li>
 <li><code>--grpc</code>: Generate RPC stub code for GRPC.</li>
+<li><code>--dart</code>: Generate Dart code.</li>
 </ul>
 <p>For any data input files:</p>
 <ul>
@@ -130,6 +131,7 @@ $(document).ready(function(){initNavTree('flatbuffers_guide_using_schema_compile
 <li><code>--gen-all</code>: Generate not just code for the current schema files, but for all files it includes as well. If the language uses a single file for output (by default the case for C++ and JS), all code will end up in this one file.</li>
 <li><code>--no-js-exports</code> : Removes Node.js style export lines (useful for JS)</li>
 <li><code>--goog-js-export</code> : Uses goog.exportsSymbol and goog.exportsProperty instead of Node.js style exporting. Needed for compatibility with the Google closure compiler (useful for JS).</li>
+<li><code>--es6-js-export</code> : Generates ECMAScript v6 style export definitions instead of Node.js style exporting. Useful when integrating flatbuffers with modern Javascript projects.</li>
 <li><code>--raw-binary</code> : Allow binaries without a file_indentifier to be read. This may crash flatc given a mismatched schema.</li>
 <li><code>--proto</code>: Expect input files to be .proto files (protocol buffers). Output the corresponding .fbs file. Currently supports: <code>package</code>, <code>message</code>, <code>enum</code>, nested declarations, <code>import</code> (use <code>-I</code> for paths), <code>extend</code>, <code>oneof</code>, <code>group</code>. Does not support, but will skip without error: <code>option</code>, <code>service</code>, <code>extensions</code>, and most everything else.</li>
 <li><code>--schema</code>: Serialize schemas instead of JSON (use with -b). This will output a binary version of the specified schema that itself corresponds to the reflection/reflection.fbs schema. Loading this binary file is the basis for reflection functionality.</li>
@@ -139,6 +141,7 @@ $(document).ready(function(){initNavTree('flatbuffers_guide_using_schema_compile
 <li><code>--keep-prefix</code> : Keep original prefix of schema include statement.</li>
 <li><code>--reflect-types</code> : Add minimal type reflection to code generation.</li>
 <li><code>--reflect-names</code> : Add minimal type/name reflection.</li>
+<li><code>--root-type T</code> : Select or override the default root_type.</li>
 </ul>
 <p>NOTE: short-form options for generators are deprecated, use the long form whenever possible. </p>
 </div></div><!-- contents -->
diff --git a/flatbuffers_internals.html b/flatbuffers_internals.html
index ab3f8bf72d88c341c6c0f86743511ec95b7470ba..89aa60681a591af4245ec5f0833d033914702c95 100644
--- a/flatbuffers_internals.html
+++ b/flatbuffers_internals.html
@@ -146,7 +146,7 @@ inline const char **EnumNamesAny() {
 inline const char *EnumNameAny(int e) { return EnumNamesAny()[e]; }
 </pre><p>Unions share a lot with enums. </p><pre class="fragment">struct Vec3;
 struct Monster;
-</pre><p>Predeclare all data types since circular references between types are allowed (circular references between object are not, though). </p><pre class="fragment">MANUALLY_ALIGNED_STRUCT(4) Vec3 {
+</pre><p>Predeclare all data types since circular references between types are allowed (circular references between object are not, though). </p><pre class="fragment">FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Vec3 {
  private:
   float x_;
   float y_;
@@ -160,7 +160,7 @@ struct Monster;
   float y() const { return flatbuffers::EndianScalar(y_); }
   float z() const { return flatbuffers::EndianScalar(z_); }
 };
-STRUCT_END(Vec3, 12);
+FLATBUFFERS_STRUCT_END(Vec3, 12);
 </pre><p>These ugly macros do a couple of things: they turn off any padding the compiler might normally do, since we add padding manually (though none in this example), and they enforce alignment chosen by FlatBuffers. This ensures the layout of this struct will look the same regardless of compiler and platform. Note that the fields are private: this is because these store little endian scalars regardless of platform (since this is part of the serialized data). <code>EndianScalar</code> then converts back and forth, which is a no-op on all current mobile and desktop platforms, and a single machine instruction on the few remaining big endian platforms. </p><pre class="fragment">struct Monster : private flatbuffers::Table {
   const Vec3 *pos() const { return GetStruct&lt;const Vec3 *&gt;(4); }
   int16_t mana() const { return GetField&lt;int16_t&gt;(6, 150); }
diff --git a/flatbuffers_support.html b/flatbuffers_support.html
index 219bfb17230513e39496f4817a1ff2e20b2b1083..ae01993f032a3bd9e4b1d69d292cd17405378ebb 100644
--- a/flatbuffers_support.html
+++ b/flatbuffers_support.html
@@ -101,37 +101,37 @@ $(document).ready(function(){initNavTree('flatbuffers_support.html','');});
 <p>NOTE: this table is a start, it needs to be extended.</p>
 <table class="doxtable">
 <tr>
-<th>Feature </th><th>C++ </th><th>Java </th><th>C# </th><th>Go </th><th>Python </th><th>JS </th><th>TS </th><th>C </th><th>PHP </th><th>Ruby  </th></tr>
+<th>Feature </th><th>C++ </th><th>Java </th><th>C# </th><th>Go </th><th>Python </th><th>JS </th><th>TS </th><th>C </th><th>PHP </th><th>Ruby </th><th>Dart  </th></tr>
 <tr>
-<td>Codegen for all basic features </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>WiP </td><td>WiP </td></tr>
+<td>Codegen for all basic features </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>WiP </td><td>WiP </td><td>Yes </td></tr>
 <tr>
-<td>JSON parsing </td><td>Yes </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>Yes </td><td>No </td><td>No </td></tr>
+<td>JSON parsing </td><td>Yes </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>Yes </td><td>No </td><td>No </td><td>No </td></tr>
 <tr>
-<td>Simple mutation </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td></tr>
+<td>Simple mutation </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td></tr>
 <tr>
-<td>Reflection </td><td>Yes </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>Basic </td><td>No </td><td>No </td></tr>
+<td>Reflection </td><td>Yes </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>Basic </td><td>No </td><td>No </td><td>No </td></tr>
 <tr>
-<td>Buffer verifier </td><td>Yes </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>Yes </td><td>No </td><td>No </td></tr>
+<td>Buffer verifier </td><td>Yes </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>No </td><td>Yes </td><td>No </td><td>No </td><td>No </td></tr>
 <tr>
-<td>Testing: basic </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>? </td><td>? </td></tr>
+<td>Testing: basic </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>Yes </td><td>? </td><td>? </td><td>Yes </td></tr>
 <tr>
-<td>Testing: fuzz </td><td>Yes </td><td>No </td><td>No </td><td>Yes </td><td>Yes </td><td>No </td><td>No </td><td>No </td><td>? </td><td>? </td></tr>
+<td>Testing: fuzz </td><td>Yes </td><td>No </td><td>No </td><td>Yes </td><td>Yes </td><td>No </td><td>No </td><td>No </td><td>? </td><td>? </td><td>No </td></tr>
 <tr>
-<td>Performance: </td><td>Superb </td><td>Great </td><td>Great </td><td>Great </td><td>Ok </td><td>? </td><td>? </td><td>Superb </td><td>? </td><td>? </td></tr>
+<td>Performance: </td><td>Superb </td><td>Great </td><td>Great </td><td>Great </td><td>Ok </td><td>? </td><td>? </td><td>Superb </td><td>? </td><td>? </td><td>? </td></tr>
 <tr>
-<td>Platform: Windows </td><td>VS2010 </td><td>Yes </td><td>Yes </td><td>? </td><td>? </td><td>? </td><td>Yes </td><td>VS2010 </td><td>? </td><td>? </td></tr>
+<td>Platform: Windows </td><td>VS2010 </td><td>Yes </td><td>Yes </td><td>? </td><td>? </td><td>? </td><td>Yes </td><td>VS2010 </td><td>? </td><td>? </td><td>Yes </td></tr>
 <tr>
-<td>Platform: Linux </td><td>GCC282 </td><td>Yes </td><td>? </td><td>Yes </td><td>Yes </td><td>? </td><td>Yes </td><td>Yes </td><td>? </td><td>? </td></tr>
+<td>Platform: Linux </td><td>GCC282 </td><td>Yes </td><td>? </td><td>Yes </td><td>Yes </td><td>? </td><td>Yes </td><td>Yes </td><td>? </td><td>? </td><td>Yes </td></tr>
 <tr>
-<td>Platform: OS X </td><td>Xcode4 </td><td>? </td><td>? </td><td>? </td><td>Yes </td><td>? </td><td>Yes </td><td>Yes </td><td>? </td><td>? </td></tr>
+<td>Platform: OS X </td><td>Xcode4 </td><td>? </td><td>? </td><td>? </td><td>Yes </td><td>? </td><td>Yes </td><td>Yes </td><td>? </td><td>? </td><td>Yes </td></tr>
 <tr>
-<td>Platform: Android </td><td>NDK10d </td><td>Yes </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td></tr>
+<td>Platform: Android </td><td>NDK10d </td><td>Yes </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>Flutter </td></tr>
 <tr>
-<td>Platform: iOS </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td></tr>
+<td>Platform: iOS </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>Flutter </td></tr>
 <tr>
-<td>Engine: Unity </td><td>? </td><td>? </td><td>Yes </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td></tr>
+<td>Engine: Unity </td><td>? </td><td>? </td><td>Yes </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td><td>? </td></tr>
 <tr>
-<td>Primary authors (github) </td><td>gwvo </td><td>gwvo </td><td>ev*/js*</td><td>rw </td><td>rw </td><td>evanw/ev* </td><td>kr </td><td>mik* </td><td>ch* </td><td>rw </td></tr>
+<td>Primary authors (github) </td><td>gwvo </td><td>gwvo </td><td>ev*/js*</td><td>rw </td><td>rw </td><td>evanw/ev* </td><td>kr </td><td>mik* </td><td>ch* </td><td>rw </td><td>dnfield </td></tr>
 </table>
 <ul>
 <li>ev = evolutional</li>
diff --git a/functions.html b/functions.html
index fda192744056c2c028751da6247c15df59b75325..7cc45b5dd44c897169ed82a1f5dbef23cad2a0ed 100644
--- a/functions.html
+++ b/functions.html
@@ -222,7 +222,7 @@ $(document).ready(function(){initNavTree('functions.html','');});
 </li>
 <li>CreateString()
 : <a class="el" href="class_flat_buffers_1_1_flat_buffer_builder.html#a3b6e42519f278e4a060895633d048070">FlatBuffers.FlatBufferBuilder</a>
-, <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685">flatbuffers::FlatBufferBuilder</a>
+, <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f">flatbuffers::FlatBufferBuilder</a>
 </li>
 <li>createString()
 : <a class="el" href="class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#ac54a8acfac1dda020b610da53b2d9a0f">Google\FlatBuffers\FlatbufferBuilder</a>
@@ -240,22 +240,22 @@ $(document).ready(function(){initNavTree('functions.html','');});
 : <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">flatbuffers::FlatBufferBuilder</a>
 </li>
 <li>CreateVectorOfNativeStructs()
-: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a3d57074082aaab8cdeb8474ff9df0b53">flatbuffers::FlatBufferBuilder</a>
+: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95">flatbuffers::FlatBufferBuilder</a>
 </li>
 <li>CreateVectorOfSortedNativeStructs()
-: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf">flatbuffers::FlatBufferBuilder</a>
+: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54">flatbuffers::FlatBufferBuilder</a>
 </li>
 <li>CreateVectorOfSortedStructs()
-: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#ab1f44cc1b130e13b41e9a80de76e25cf">flatbuffers::FlatBufferBuilder</a>
+: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15">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#a6e90ada59d9553636f72ce8e4a892f72">flatbuffers::FlatBufferBuilder</a>
+: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a9cc09fa59ff9732e972877cfe911c8a5">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>
diff --git a/functions_func.html b/functions_func.html
index 316e07f3e7dd947b12e113ef0e1e70011e621351..403d92490229f8c75eaa00e3ea5be218842df90c 100644
--- a/functions_func.html
+++ b/functions_func.html
@@ -215,7 +215,7 @@ $(document).ready(function(){initNavTree('functions_func.html','');});
 </li>
 <li>CreateString()
 : <a class="el" href="class_flat_buffers_1_1_flat_buffer_builder.html#a3b6e42519f278e4a060895633d048070">FlatBuffers.FlatBufferBuilder</a>
-, <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f">flatbuffers::FlatBufferBuilder</a>
+, <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154">flatbuffers::FlatBufferBuilder</a>
 </li>
 <li>createString()
 : <a class="el" href="class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#ac54a8acfac1dda020b610da53b2d9a0f">Google\FlatBuffers\FlatbufferBuilder</a>
@@ -233,22 +233,22 @@ $(document).ready(function(){initNavTree('functions_func.html','');});
 : <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3">flatbuffers::FlatBufferBuilder</a>
 </li>
 <li>CreateVectorOfNativeStructs()
-: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a3d57074082aaab8cdeb8474ff9df0b53">flatbuffers::FlatBufferBuilder</a>
+: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95">flatbuffers::FlatBufferBuilder</a>
 </li>
 <li>CreateVectorOfSortedNativeStructs()
-: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf">flatbuffers::FlatBufferBuilder</a>
+: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54">flatbuffers::FlatBufferBuilder</a>
 </li>
 <li>CreateVectorOfSortedStructs()
-: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#ab1f44cc1b130e13b41e9a80de76e25cf">flatbuffers::FlatBufferBuilder</a>
+: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15">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#a6e90ada59d9553636f72ce8e4a892f72">flatbuffers::FlatBufferBuilder</a>
+: <a class="el" href="classflatbuffers_1_1_flat_buffer_builder.html#a9cc09fa59ff9732e972877cfe911c8a5">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>
diff --git a/group__flatbuffers__cpp__api.js b/group__flatbuffers__cpp__api.js
index ff43133e3faa4445a110f219c1866219ff5108fb..02e649841372a3cbbe9745094ed27f5ea3472019 100644
--- a/group__flatbuffers__cpp__api.js
+++ b/group__flatbuffers__cpp__api.js
@@ -23,6 +23,7 @@ var group__flatbuffers__cpp__api =
       [ "CreateString", "classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5", null ],
       [ "CreateString", "classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154", null ],
       [ "CreateString", "classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f", null ],
+      [ "CreateString", "classflatbuffers_1_1_flat_buffer_builder.html#a9a3a955fbff1c69e944c3560460dd7a6", null ],
       [ "CreateString", "classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506", null ],
       [ "CreateString", "classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685", null ],
       [ "CreateStruct", "classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8", null ],
diff --git a/index.html b/index.html
index 751422d118a3b01e92f900a7aac747a9c7544ece..093b9c98b593ec43574133a9098fc14e84e9d018 100644
--- a/index.html
+++ b/index.html
@@ -137,7 +137,7 @@ Overview</h1>
 <li>How to <a class="el" href="flatbuffers_guide_use_java_c-sharp.html">use the generated Java/C# code</a> in your own programs.</li>
 <li>How to <a class="el" href="flatbuffers_guide_use_go.html">use the generated Go code</a> in your own programs.</li>
 <li>How to <a class="el" href="flatbuffers_guide_use_javascript.html">use the generated JavaScript code</a> in your own programs.</li>
-<li>How to use the generated TypeScript code in your own programs.</li>
+<li>How to <a class="el" href="flatbuffers_guide_use_typescript.html">use the generated TypeScript code</a> in your own programs.</li>
 <li>How to <a class="el" href="flatbuffers_guide_use_c.html">use FlatBuffers in C with `flatcc`</a> in your own programs.</li>
 <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>
diff --git a/menudata.js b/menudata.js
index da240018e36c23b2beae4aba0075074cbb0b9054..d973f52cf7d231c3adaabc06c9044c26fd1ec86c 100644
--- a/menudata.js
+++ b/menudata.js
@@ -9,9 +9,10 @@ var menudata={children:[
 {text:"Use in Go",url:"flatbuffers_guide_use_go.html"},
 {text:"Use in Java/C#",url:"flatbuffers_guide_use_java_c-sharp.html"},
 {text:"Use in JavaScript",url:"flatbuffers_guide_use_javascript.html"},
-{text:"Use in TypeScript",url:"@ref flatbuffers_guide_use_typescript"},
+{text:"Use in TypeScript",url:"flatbuffers_guide_use_typescript.html"},
 {text:"Use in PHP",url:"flatbuffers_guide_use_php.html"},
 {text:"Use in Python",url:"flatbuffers_guide_use_python.html"},
+{text:"Use in Dart",url:"flatbuffers_guide_use_dart.html"},
 {text:"Schema-less version",url:"flexbuffers.html"},
 {text:"gRPC",url:"usergroup1.html",children:[
 {text:"Use in C++",url:"flatbuffers_grpc_guide_use_cpp.html"}]}]},
diff --git a/navtreedata.js b/navtreedata.js
index 8ae44da10491930726aaf7cac3e4ad2214ce7641..a236bf24a6e778dd2266eb9e03067f680d28af57 100644
--- a/navtreedata.js
+++ b/navtreedata.js
@@ -12,9 +12,10 @@ var NAVTREE =
       [ "Use in Go", "flatbuffers_guide_use_go.html", null ],
       [ "Use in Java/C#", "flatbuffers_guide_use_java_c-sharp.html", null ],
       [ "Use in JavaScript", "flatbuffers_guide_use_javascript.html", null ],
-      [ "Use in TypeScript", "@ref flatbuffers_guide_use_typescript", null ],
+      [ "Use in TypeScript", "flatbuffers_guide_use_typescript.html", null ],
       [ "Use in PHP", "flatbuffers_guide_use_php.html", null ],
       [ "Use in Python", "flatbuffers_guide_use_python.html", null ],
+      [ "Use in Dart", "flatbuffers_guide_use_dart.html", null ],
       [ "Schema-less version", "flexbuffers.html", null ],
       [ "gRPC", "usergroup1.html", [
         [ "Use in C++", "flatbuffers_grpc_guide_use_cpp.html", null ]
@@ -46,7 +47,7 @@ var NAVTREE =
 var NAVTREEINDEX =
 [
 ".html",
-"classflatbuffers_1_1vector__downward.html#aefa75049c70c00591f7786aeb9def1fe"
+"contributing.html"
 ];
 
 var SYNCONMSG = 'click to disable panel synchronisation';
diff --git a/navtreeindex0.js b/navtreeindex0.js
index f446ba1ff2593e32bd8b5b2c5c00194b4657cdbf..173924fb2c9a1dea9b966e3d8e6a97f7ec12144b 100644
--- a/navtreeindex0.js
+++ b/navtreeindex0.js
@@ -6,7 +6,6 @@ var NAVTREEINDEX0 =
 ".html":[7,1,0,1],
 ".html":[7,1,0,3],
 ".html":[7,1,0,3,0],
-"@ref flatbuffers_guide_use_typescript":[1,9],
 "annotated.html":[7,1,0],
 "class_flat_buffers_1_1_flat_buffer_builder.html":[7,1,0,2,0],
 "class_flat_buffers_1_1_flat_buffer_builder.html#a0b2addc87bde29213424a187b7b08707":[7,1,0,2,0,8],
@@ -110,9 +109,8 @@ var NAVTREEINDEX0 =
 "classflatbuffers_1_1_allocator.html#afa22a0382f1886795440785d7e3bb478":[7,1,0,1,0,3],
 "classflatbuffers_1_1_allocator.html#afbce153366f4087f2876384ecc9d0674":[7,1,0,1,0,1],
 "classflatbuffers_1_1_default_allocator.html":[7,1,0,1,1],
-"classflatbuffers_1_1_default_allocator.html#a57604c8749237a162bb22fcea09482ef":[7,1,0,1,1,2],
-"classflatbuffers_1_1_default_allocator.html#a69f1e08a9f98cd86d04a0bc5ad08b187":[7,1,0,1,1,1],
-"classflatbuffers_1_1_default_allocator.html#a9ddbc3a812e35a46a36b37baa17503d0":[7,1,0,1,1,0],
+"classflatbuffers_1_1_default_allocator.html#acfc866696fe9db8e74d9529d8fc70aac":[7,1,0,1,1,1],
+"classflatbuffers_1_1_default_allocator.html#af14dc83724cf6373c7f757c3e2518e6e":[7,1,0,1,1,0],
 "classflatbuffers_1_1_detached_buffer.html":[7,1,0,1,2],
 "classflatbuffers_1_1_detached_buffer.html#a030d603f1f72c17b515a1e8621a5482c":[7,1,0,1,2,9],
 "classflatbuffers_1_1_detached_buffer.html#a0a33d382b1306177f5b0e5bc8ad4d3fd":[7,1,0,1,2,10],
@@ -135,65 +133,66 @@ var NAVTREEINDEX0 =
 "classflatbuffers_1_1_detached_buffer.html#aef5440a10f42f2c067f2857dc74fc15b":[7,1,0,1,2,7],
 "classflatbuffers_1_1_flat_buffer_builder.html":[7,0,4,0],
 "classflatbuffers_1_1_flat_buffer_builder.html#a01dabf5cdd6b1b2881337e1e84aa1683":[7,0,4,0,4],
-"classflatbuffers_1_1_flat_buffer_builder.html#a099810f03046139d1854d20a1c2a2e41":[7,0,4,0,46],
-"classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912":[7,0,4,0,40],
-"classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8":[7,0,4,0,50],
-"classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b":[7,0,4,0,24],
+"classflatbuffers_1_1_flat_buffer_builder.html#a099810f03046139d1854d20a1c2a2e41":[7,0,4,0,47],
+"classflatbuffers_1_1_flat_buffer_builder.html#a0c9e507b373d598b51052fab4fa34912":[7,0,4,0,41],
+"classflatbuffers_1_1_flat_buffer_builder.html#a0e715d9019060b4b753c4e5228be56e8":[7,0,4,0,51],
+"classflatbuffers_1_1_flat_buffer_builder.html#a1080c9e370e2d9d9d872dadd1131436b":[7,0,4,0,25],
 "classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9":[7,0,4,0,9],
-"classflatbuffers_1_1_flat_buffer_builder.html#a110c2a3298aebef1a9dfa3c44ee84f42":[7,0,4,0,38],
-"classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95":[7,0,4,0,27],
-"classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a":[7,0,4,0,43],
-"classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6":[7,0,4,0,32],
-"classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50":[7,0,4,0,19],
-"classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54":[7,0,4,0,28],
-"classflatbuffers_1_1_flat_buffer_builder.html#a274b1afcfa16bab2c884129b2788db19":[7,0,4,0,23],
-"classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3":[7,0,4,0,20],
-"classflatbuffers_1_1_flat_buffer_builder.html#a2e4de5642bad6dcd01eb7e7eaf719c89":[7,0,4,0,41],
-"classflatbuffers_1_1_flat_buffer_builder.html#a376bb6858e8b1baab9a437f3f9f0b334":[7,0,4,0,48],
-"classflatbuffers_1_1_flat_buffer_builder.html#a3d57074082aaab8cdeb8474ff9df0b53":[7,0,4,0,26],
+"classflatbuffers_1_1_flat_buffer_builder.html#a110c2a3298aebef1a9dfa3c44ee84f42":[7,0,4,0,39],
+"classflatbuffers_1_1_flat_buffer_builder.html#a11c291ccd2159604c149600ee6180b95":[7,0,4,0,28],
+"classflatbuffers_1_1_flat_buffer_builder.html#a16a8fd46b34ad7727406c37b65b6b27a":[7,0,4,0,44],
+"classflatbuffers_1_1_flat_buffer_builder.html#a2130ef232ff405eebe2e7f184ecd06e6":[7,0,4,0,33],
+"classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50":[7,0,4,0,20],
+"classflatbuffers_1_1_flat_buffer_builder.html#a23aa4c910e053446cc404bc486012e54":[7,0,4,0,29],
+"classflatbuffers_1_1_flat_buffer_builder.html#a274b1afcfa16bab2c884129b2788db19":[7,0,4,0,24],
+"classflatbuffers_1_1_flat_buffer_builder.html#a2cca5c89246a53e80e6ad9487f4c36f3":[7,0,4,0,21],
+"classflatbuffers_1_1_flat_buffer_builder.html#a2e4de5642bad6dcd01eb7e7eaf719c89":[7,0,4,0,42],
+"classflatbuffers_1_1_flat_buffer_builder.html#a376bb6858e8b1baab9a437f3f9f0b334":[7,0,4,0,49],
+"classflatbuffers_1_1_flat_buffer_builder.html#a3d57074082aaab8cdeb8474ff9df0b53":[7,0,4,0,27],
 "classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7":[7,0,4,0,8],
-"classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8":[7,0,4,0,17],
-"classflatbuffers_1_1_flat_buffer_builder.html#a44960c5aca0227f960c96a7ed4b881b4":[7,0,4,0,21],
-"classflatbuffers_1_1_flat_buffer_builder.html#a53504fc2cab681a7980b03260f8b2f7a":[7,0,4,0,25],
-"classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6":[7,0,4,0,34],
-"classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45":[7,0,4,0,49],
-"classflatbuffers_1_1_flat_buffer_builder.html#a5e604e3caf95fd0f0e74545af5a8420a":[7,0,4,0,57],
-"classflatbuffers_1_1_flat_buffer_builder.html#a66c8fd33ab9b3b237954c9ea38648f7f":[7,0,4,0,47],
-"classflatbuffers_1_1_flat_buffer_builder.html#a6b31b32fb478a9ec68164e1579c7ebe7":[7,0,4,0,53],
-"classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72":[7,0,4,0,36],
-"classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf":[7,0,4,0,29],
-"classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220":[7,0,4,0,42],
-"classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15":[7,0,4,0,30],
+"classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8":[7,0,4,0,18],
+"classflatbuffers_1_1_flat_buffer_builder.html#a44960c5aca0227f960c96a7ed4b881b4":[7,0,4,0,22],
+"classflatbuffers_1_1_flat_buffer_builder.html#a53504fc2cab681a7980b03260f8b2f7a":[7,0,4,0,26],
+"classflatbuffers_1_1_flat_buffer_builder.html#a592110519a6c8db1926f1365bf2a58e6":[7,0,4,0,35],
+"classflatbuffers_1_1_flat_buffer_builder.html#a5e2c3a1e47f0ab4a3a3f07a07a52fb45":[7,0,4,0,50],
+"classflatbuffers_1_1_flat_buffer_builder.html#a5e604e3caf95fd0f0e74545af5a8420a":[7,0,4,0,58],
+"classflatbuffers_1_1_flat_buffer_builder.html#a66c8fd33ab9b3b237954c9ea38648f7f":[7,0,4,0,48],
+"classflatbuffers_1_1_flat_buffer_builder.html#a6b31b32fb478a9ec68164e1579c7ebe7":[7,0,4,0,54],
+"classflatbuffers_1_1_flat_buffer_builder.html#a6e90ada59d9553636f72ce8e4a892f72":[7,0,4,0,37],
+"classflatbuffers_1_1_flat_buffer_builder.html#a799701af34c398d8eb86e049b73bcecf":[7,0,4,0,30],
+"classflatbuffers_1_1_flat_buffer_builder.html#a7ba8462e408431054c99d25120326220":[7,0,4,0,43],
+"classflatbuffers_1_1_flat_buffer_builder.html#a7cc10b709dfa3e72083843d1a5e36c15":[7,0,4,0,31],
 "classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3":[7,0,4,0,10],
-"classflatbuffers_1_1_flat_buffer_builder.html#a89c2d7c686a2df8014cb453ec70fdccd":[7,0,4,0,55],
+"classflatbuffers_1_1_flat_buffer_builder.html#a89c2d7c686a2df8014cb453ec70fdccd":[7,0,4,0,56],
 "classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f":[7,0,4,0,14],
 "classflatbuffers_1_1_flat_buffer_builder.html#a9190cb2d5a4324ab0c52263b834fff09":[7,0,4,0,2],
-"classflatbuffers_1_1_flat_buffer_builder.html#a952495120d5c56d600640091334b5341":[7,0,4,0,51],
-"classflatbuffers_1_1_flat_buffer_builder.html#a9a3886be63710d8bb88f2ade4ac8420d":[7,0,4,0,52],
-"classflatbuffers_1_1_flat_buffer_builder.html#a9cc09fa59ff9732e972877cfe911c8a5":[7,0,4,0,37],
-"classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b":[7,0,4,0,44],
-"classflatbuffers_1_1_flat_buffer_builder.html#aa7e64b654cef62869c3dfd27def92e5d":[7,0,4,0,61],
-"classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961":[7,0,4,0,39],
+"classflatbuffers_1_1_flat_buffer_builder.html#a952495120d5c56d600640091334b5341":[7,0,4,0,52],
+"classflatbuffers_1_1_flat_buffer_builder.html#a9a3886be63710d8bb88f2ade4ac8420d":[7,0,4,0,53],
+"classflatbuffers_1_1_flat_buffer_builder.html#a9a3a955fbff1c69e944c3560460dd7a6":[7,0,4,0,15],
+"classflatbuffers_1_1_flat_buffer_builder.html#a9cc09fa59ff9732e972877cfe911c8a5":[7,0,4,0,38],
+"classflatbuffers_1_1_flat_buffer_builder.html#aa1ebce1f3f46832946a95952af1e9c2b":[7,0,4,0,45],
+"classflatbuffers_1_1_flat_buffer_builder.html#aa7e64b654cef62869c3dfd27def92e5d":[7,0,4,0,62],
+"classflatbuffers_1_1_flat_buffer_builder.html#aa905b29dce19a1795c7bce375cf29961":[7,0,4,0,40],
 "classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5":[7,0,4,0,12],
 "classflatbuffers_1_1_flat_buffer_builder.html#ab0173786ea4ec3e4ae10555639b2996c":[7,0,4,0,3],
-"classflatbuffers_1_1_flat_buffer_builder.html#ab1f44cc1b130e13b41e9a80de76e25cf":[7,0,4,0,31],
-"classflatbuffers_1_1_flat_buffer_builder.html#ab2cc618aeb6f6c411c7ab734649e1a81":[7,0,4,0,54],
+"classflatbuffers_1_1_flat_buffer_builder.html#ab1f44cc1b130e13b41e9a80de76e25cf":[7,0,4,0,32],
+"classflatbuffers_1_1_flat_buffer_builder.html#ab2cc618aeb6f6c411c7ab734649e1a81":[7,0,4,0,55],
 "classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1":[7,0,4,0,7],
-"classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685":[7,0,4,0,16],
-"classflatbuffers_1_1_flat_buffer_builder.html#ab81ab8aa273c270b0942fd81489cad83":[7,0,4,0,45],
-"classflatbuffers_1_1_flat_buffer_builder.html#ab9942e76ff29eefc702b006b19ce02ba":[7,0,4,0,58],
-"classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506":[7,0,4,0,15],
-"classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c":[7,0,4,0,18],
+"classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685":[7,0,4,0,17],
+"classflatbuffers_1_1_flat_buffer_builder.html#ab81ab8aa273c270b0942fd81489cad83":[7,0,4,0,46],
+"classflatbuffers_1_1_flat_buffer_builder.html#ab9942e76ff29eefc702b006b19ce02ba":[7,0,4,0,59],
+"classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506":[7,0,4,0,16],
+"classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c":[7,0,4,0,19],
 "classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154":[7,0,4,0,13],
-"classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135":[7,0,4,0,33],
+"classflatbuffers_1_1_flat_buffer_builder.html#ac64d11c219559ea51567eab556e13135":[7,0,4,0,34],
 "classflatbuffers_1_1_flat_buffer_builder.html#ace4606286a25d3fedfb1532934d4cea1":[7,0,4,0,5],
-"classflatbuffers_1_1_flat_buffer_builder.html#adb473c5fd1305213b91eecaa779ecafa":[7,0,4,0,60],
-"classflatbuffers_1_1_flat_buffer_builder.html#add6d502accf426e35f91f2539baff6b2":[7,0,4,0,59],
+"classflatbuffers_1_1_flat_buffer_builder.html#adb473c5fd1305213b91eecaa779ecafa":[7,0,4,0,61],
+"classflatbuffers_1_1_flat_buffer_builder.html#add6d502accf426e35f91f2539baff6b2":[7,0,4,0,60],
 "classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412":[7,0,4,0,6],
 "classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe":[7,0,4,0,11],
-"classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207":[7,0,4,0,22],
-"classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19":[7,0,4,0,56],
-"classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7":[7,0,4,0,35],
+"classflatbuffers_1_1_flat_buffer_builder.html#af715dd24dd37cb0151dc7a980ad0f207":[7,0,4,0,23],
+"classflatbuffers_1_1_flat_buffer_builder.html#af8c7583c92e1d1d6f438977da5158d19":[7,0,4,0,57],
+"classflatbuffers_1_1_flat_buffer_builder.html#afede51fd9c32d146cbb1832f57c5e1b7":[7,0,4,0,36],
 "classflatbuffers_1_1_vector.html":[7,1,0,1,9],
 "classflatbuffers_1_1_vector.html#a0ab8113b331fb069dbaa0a108f6077e1":[7,1,0,1,9,8],
 "classflatbuffers_1_1_vector.html#a0c322798bd0cebd2d20b0b0f92de2f9b":[7,1,0,1,9,13],
@@ -234,6 +233,7 @@ var NAVTREEINDEX0 =
 "classflatbuffers_1_1vector__downward.html#a297ab537a68b0a02b4577cfc4b5269a9":[7,1,0,1,10,17],
 "classflatbuffers_1_1vector__downward.html#a37856c0e5288338080818681b8aedb5d":[7,1,0,1,10,21],
 "classflatbuffers_1_1vector__downward.html#a44f77c18fb0aed4b9c22020ea69ff8c9":[7,1,0,1,10,20],
+"classflatbuffers_1_1vector__downward.html#a45866c629916716dd618c55a662b7d99":[7,1,0,1,10,10],
 "classflatbuffers_1_1vector__downward.html#a46e8f7f5035f87fe202419d6c5446eb3":[7,1,0,1,10,7],
 "classflatbuffers_1_1vector__downward.html#a4a0686bb0afe2feefec0502f527a11bf":[7,1,0,1,10,11],
 "classflatbuffers_1_1vector__downward.html#a4a5203e2960492f54ac4428d4caee0fc":[7,1,0,1,10,16],
@@ -245,9 +245,9 @@ var NAVTREEINDEX0 =
 "classflatbuffers_1_1vector__downward.html#a96a36503bc1103a11c4a17d26dcaf770":[7,1,0,1,10,19],
 "classflatbuffers_1_1vector__downward.html#a99e13c5b83569b07df357c76feb1e614":[7,1,0,1,10,9],
 "classflatbuffers_1_1vector__downward.html#aa1f13e25b0c619ba9a9c2d6b408e2587":[7,1,0,1,10,5],
-"classflatbuffers_1_1vector__downward.html#abc8846756ed814d1722913105e0da7a3":[7,1,0,1,10,10],
 "classflatbuffers_1_1vector__downward.html#ad99943ac8c66263f3587e18539e9f176":[7,1,0,1,10,1],
 "classflatbuffers_1_1vector__downward.html#ae701e8e1cc468d1a3141e0fa22dc3a70":[7,1,0,1,10,3],
 "classflatbuffers_1_1vector__downward.html#ae965771454bef2a2f7ad306bfda275f7":[7,1,0,1,10,6],
-"classflatbuffers_1_1vector__downward.html#aec8308b5b544432362049b94c3802800":[7,1,0,1,10,2]
+"classflatbuffers_1_1vector__downward.html#aec8308b5b544432362049b94c3802800":[7,1,0,1,10,2],
+"classflatbuffers_1_1vector__downward.html#aefa75049c70c00591f7786aeb9def1fe":[7,1,0,1,10,15]
 };
diff --git a/navtreeindex1.js b/navtreeindex1.js
index 5732224b4f0874822b03ccb8644e2d855a8c5f6d..1c26549044fd3306be29a1276518be66e2dc27e1 100644
--- a/navtreeindex1.js
+++ b/navtreeindex1.js
@@ -1,25 +1,26 @@
 var NAVTREEINDEX1 =
 {
-"classflatbuffers_1_1vector__downward.html#aefa75049c70c00591f7786aeb9def1fe":[7,1,0,1,10,15],
 "contributing.html":[8],
 "flatbuffers_benchmarks.html":[3],
 "flatbuffers_grammar.html":[6],
-"flatbuffers_grpc_guide_use_cpp.html":[1,13,0],
+"flatbuffers_grpc_guide_use_cpp.html":[1,14,0],
 "flatbuffers_guide_building.html":[1,0],
 "flatbuffers_guide_tutorial.html":[1,1],
 "flatbuffers_guide_use_c.html":[1,5],
 "flatbuffers_guide_use_cpp.html":[1,4],
+"flatbuffers_guide_use_dart.html":[1,12],
 "flatbuffers_guide_use_go.html":[1,6],
 "flatbuffers_guide_use_java_c-sharp.html":[1,7],
 "flatbuffers_guide_use_javascript.html":[1,8],
 "flatbuffers_guide_use_php.html":[1,10],
 "flatbuffers_guide_use_python.html":[1,11],
+"flatbuffers_guide_use_typescript.html":[1,9],
 "flatbuffers_guide_using_schema_compiler.html":[1,2],
 "flatbuffers_guide_writing_schema.html":[1,3],
 "flatbuffers_internals.html":[5],
 "flatbuffers_support.html":[2],
 "flatbuffers_white_paper.html":[4],
-"flexbuffers.html":[1,12],
+"flexbuffers.html":[1,13],
 "functions.html":[7,1,3,0],
 "functions_func.html":[7,1,3,1],
 "functions_prop.html":[7,1,3,3],
@@ -69,7 +70,9 @@ var NAVTREEINDEX1 =
 "structflatbuffers_1_1_string.html#a1028f4733cff070adae7d57bf4325726":[7,1,0,1,8,1],
 "structflatbuffers_1_1_string.html#a4c49c553dfec1da5a6fd8852a97d508e":[7,1,0,1,8,2],
 "structflatbuffers_1_1_string.html#a4d0c586883282e5b93ddbb02f3d71eef":[7,1,0,1,8,0],
+"structflatbuffers_1_1_string.html#afe0bd2ac1acd5616eda6d949e3c15e66":[7,1,0,1,8,3],
 "structflatbuffers_1_1_vector_iterator.html":[7,1,0,1,11],
+"structflatbuffers_1_1_vector_iterator.html#a02c756cdd5ec038a978066c5761dd429":[7,1,0,1,11,0],
 "structflatbuffers_1_1_vector_iterator.html#a0b6a5544a9c48f2409690de7bfff6a63":[7,1,0,1,11,7],
 "structflatbuffers_1_1_vector_iterator.html#a105a4e408b45c324f2ad445f5145bf51":[7,1,0,1,11,16],
 "structflatbuffers_1_1_vector_iterator.html#a19fde04fa43b5967564883517ed10a82":[7,1,0,1,11,8],
@@ -80,11 +83,10 @@ var NAVTREEINDEX1 =
 "structflatbuffers_1_1_vector_iterator.html#a4b0747db5a2080cf4bd8bdbdeb1ceda2":[7,1,0,1,11,20],
 "structflatbuffers_1_1_vector_iterator.html#a5d2754d1859696e7a6d43e74d4f9ae29":[7,1,0,1,11,14],
 "structflatbuffers_1_1_vector_iterator.html#a5fae31cf992a81412140a17dde196890":[7,1,0,1,11,10],
-"structflatbuffers_1_1_vector_iterator.html#a67b44f6c5e62b325e8cb4b91c99f60be":[7,1,0,1,11,0],
 "structflatbuffers_1_1_vector_iterator.html#a74d61458dfc1c25d94f80cae8cebaa2a":[7,1,0,1,11,2],
 "structflatbuffers_1_1_vector_iterator.html#a78eb60f8754af75c1b2b5e0d8710ae6c":[7,1,0,1,11,18],
 "structflatbuffers_1_1_vector_iterator.html#a7e10ae7b14f5f79bf0da6bbed7c17b5d":[7,1,0,1,11,6],
-"structflatbuffers_1_1_vector_iterator.html#a9418ef8352fb8010aa2173a46220225c":[7,1,0,1,11,13],
+"structflatbuffers_1_1_vector_iterator.html#a85a3748c7f97adba199d7421d9962941":[7,1,0,1,11,13],
 "structflatbuffers_1_1_vector_iterator.html#aaf71b80a66b9d7f5220e1cd4d2b27b3c":[7,1,0,1,11,21],
 "structflatbuffers_1_1_vector_iterator.html#aaf980961b89f2b647a07135246b75088":[7,1,0,1,11,4],
 "structflatbuffers_1_1_vector_iterator.html#ab8f96b2057c464d22dd03286ee8af5c0":[7,1,0,1,11,22],
@@ -94,6 +96,6 @@ var NAVTREEINDEX1 =
 "structflatbuffers_1_1_vector_iterator.html#af17653cb8a120a9bbd35dcb35a570729":[7,1,0,1,11,17],
 "structflatbuffers_1_1_vector_iterator.html#aff7a7187d818290ee71274335f079191":[7,1,0,1,11,9],
 "usergroup0.html":[1],
-"usergroup1.html":[1,13],
+"usergroup1.html":[1,14],
 "usergroup2.html":[7]
 };
diff --git a/search/all_12.js b/search/all_12.js
index 9c2265086da636eb7b58254ec179cd9781f83382..9a813ee95a41976d591b0b663de9a1aa6445ed69 100644
--- a/search/all_12.js
+++ b/search/all_12.js
@@ -3,10 +3,12 @@ var searchData=
   ['use_20in_20c_2b_2b',['Use in C++',['../flatbuffers_grpc_guide_use_cpp.html',1,'']]],
   ['use_20in_20c',['Use in C',['../flatbuffers_guide_use_c.html',1,'']]],
   ['use_20in_20c_2b_2b',['Use in C++',['../flatbuffers_guide_use_cpp.html',1,'']]],
+  ['use_20in_20dart',['Use in Dart',['../flatbuffers_guide_use_dart.html',1,'']]],
   ['use_20in_20go',['Use in Go',['../flatbuffers_guide_use_go.html',1,'']]],
   ['use_20in_20java_2fc_23',['Use in Java/C#',['../flatbuffers_guide_use_java_c-sharp.html',1,'']]],
   ['use_20in_20javascript',['Use in JavaScript',['../flatbuffers_guide_use_javascript.html',1,'']]],
   ['use_20in_20php',['Use in PHP',['../flatbuffers_guide_use_php.html',1,'']]],
   ['use_20in_20python',['Use in Python',['../flatbuffers_guide_use_python.html',1,'']]],
+  ['use_20in_20typescript',['Use in TypeScript',['../flatbuffers_guide_use_typescript.html',1,'']]],
   ['using_20the_20schema_20compiler',['Using the schema compiler',['../flatbuffers_guide_using_schema_compiler.html',1,'']]]
 ];
diff --git a/search/all_4.js b/search/all_4.js
index d9880398b51416a356fe47d7870b5476816c9956..5e7d75d68210f06247de46d79bbc965846a63eef 100644
--- a/search/all_4.js
+++ b/search/all_4.js
@@ -4,7 +4,7 @@ var searchData=
   ['contributing',['Contributing',['../contributing.html',1,'']]],
   ['createbytevector',['createByteVector',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a37b5debda58afd1fcb71ec82efe663b9',1,'com::google::flatbuffers::FlatBufferBuilder']]],
   ['createsharedstring',['CreateSharedString',['../classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1',1,'flatbuffers::FlatBufferBuilder::CreateSharedString(const char *str, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7',1,'flatbuffers::FlatBufferBuilder::CreateSharedString(const char *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9',1,'flatbuffers::FlatBufferBuilder::CreateSharedString(const std::string &amp;str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3',1,'flatbuffers::FlatBufferBuilder::CreateSharedString(const String *str)']]],
-  ['createstring',['createString',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#abd3b2f9b239a702ffaa8a1e97894f09e',1,'com.google.flatbuffers.FlatBufferBuilder.createString(CharSequence s)'],['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a8d676eb9973ecba574a220cdef725577',1,'com.google.flatbuffers.FlatBufferBuilder.createString(ByteBuffer s)'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#ac54a8acfac1dda020b610da53b2d9a0f',1,'Google\FlatBuffers\FlatbufferBuilder\createString()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#a3b6e42519f278e4a060895633d048070',1,'FlatBuffers.FlatBufferBuilder.CreateString()'],['../classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe',1,'flatbuffers::FlatBufferBuilder::CreateString(const char *str, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5',1,'flatbuffers::FlatBufferBuilder::CreateString(const char *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154',1,'flatbuffers::FlatBufferBuilder::CreateString(char *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f',1,'flatbuffers::FlatBufferBuilder::CreateString(const std::string &amp;str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506',1,'flatbuffers::FlatBufferBuilder::CreateString(const String *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685',1,'flatbuffers::FlatBufferBuilder::CreateString(const T &amp;str)']]],
+  ['createstring',['createString',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#abd3b2f9b239a702ffaa8a1e97894f09e',1,'com.google.flatbuffers.FlatBufferBuilder.createString(CharSequence s)'],['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a8d676eb9973ecba574a220cdef725577',1,'com.google.flatbuffers.FlatBufferBuilder.createString(ByteBuffer s)'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#ac54a8acfac1dda020b610da53b2d9a0f',1,'Google\FlatBuffers\FlatbufferBuilder\createString()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#a3b6e42519f278e4a060895633d048070',1,'FlatBuffers.FlatBufferBuilder.CreateString()'],['../classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe',1,'flatbuffers::FlatBufferBuilder::CreateString(const char *str, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5',1,'flatbuffers::FlatBufferBuilder::CreateString(const char *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154',1,'flatbuffers::FlatBufferBuilder::CreateString(char *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f',1,'flatbuffers::FlatBufferBuilder::CreateString(const std::string &amp;str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a9a3a955fbff1c69e944c3560460dd7a6',1,'flatbuffers::FlatBufferBuilder::CreateString(flatbuffers::string_view str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506',1,'flatbuffers::FlatBufferBuilder::CreateString(const String *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685',1,'flatbuffers::FlatBufferBuilder::CreateString(const T &amp;str)']]],
   ['createstruct',['CreateStruct',['../classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8',1,'flatbuffers::FlatBufferBuilder']]],
   ['createuninitializedvector',['CreateUninitializedVector',['../classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c',1,'flatbuffers::FlatBufferBuilder::CreateUninitializedVector(size_t len, size_t elemsize, uint8_t **buf)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50',1,'flatbuffers::FlatBufferBuilder::CreateUninitializedVector(size_t len, T **buf)']]],
   ['createunintializedvector',['createUnintializedVector',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#acc889115f91460ca89ce981cb02c2039',1,'com::google::flatbuffers::FlatBufferBuilder']]],
diff --git a/search/functions_2.js b/search/functions_2.js
index eedcfa0123e99a87b5106d38894004d30ff3a6cb..441f53b987026963d044028fe14d2600f7dbfb2a 100644
--- a/search/functions_2.js
+++ b/search/functions_2.js
@@ -3,7 +3,7 @@ var searchData=
   ['clear',['Clear',['../class_flat_buffers_1_1_flat_buffer_builder.html#a74ed0e43043c6e486dbe40b0d2ff63d6',1,'FlatBuffers.FlatBufferBuilder.Clear()'],['../classflatbuffers_1_1_flat_buffer_builder.html#ae94b94ba71ea0aeb2d9a98c43b713412',1,'flatbuffers::FlatBufferBuilder::Clear()'],['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a3a5dd461dc86a2132eaa4f0348b4c001',1,'com.google.flatbuffers.FlatBufferBuilder.clear()']]],
   ['createbytevector',['createByteVector',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a37b5debda58afd1fcb71ec82efe663b9',1,'com::google::flatbuffers::FlatBufferBuilder']]],
   ['createsharedstring',['CreateSharedString',['../classflatbuffers_1_1_flat_buffer_builder.html#ab478a645216d2d613fc7b7c29b0ff9d1',1,'flatbuffers::FlatBufferBuilder::CreateSharedString(const char *str, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a3eb68613e5883dc4b8fff6cf7d1223d7',1,'flatbuffers::FlatBufferBuilder::CreateSharedString(const char *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a10e8ec7d1c8fbdc21b1c7047bbbe38d9',1,'flatbuffers::FlatBufferBuilder::CreateSharedString(const std::string &amp;str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a840b769fbb4148f97d3eed266e4690c3',1,'flatbuffers::FlatBufferBuilder::CreateSharedString(const String *str)']]],
-  ['createstring',['createString',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#abd3b2f9b239a702ffaa8a1e97894f09e',1,'com.google.flatbuffers.FlatBufferBuilder.createString(CharSequence s)'],['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a8d676eb9973ecba574a220cdef725577',1,'com.google.flatbuffers.FlatBufferBuilder.createString(ByteBuffer s)'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#ac54a8acfac1dda020b610da53b2d9a0f',1,'Google\FlatBuffers\FlatbufferBuilder\createString()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#a3b6e42519f278e4a060895633d048070',1,'FlatBuffers.FlatBufferBuilder.CreateString()'],['../classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe',1,'flatbuffers::FlatBufferBuilder::CreateString(const char *str, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5',1,'flatbuffers::FlatBufferBuilder::CreateString(const char *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154',1,'flatbuffers::FlatBufferBuilder::CreateString(char *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f',1,'flatbuffers::FlatBufferBuilder::CreateString(const std::string &amp;str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506',1,'flatbuffers::FlatBufferBuilder::CreateString(const String *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685',1,'flatbuffers::FlatBufferBuilder::CreateString(const T &amp;str)']]],
+  ['createstring',['createString',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#abd3b2f9b239a702ffaa8a1e97894f09e',1,'com.google.flatbuffers.FlatBufferBuilder.createString(CharSequence s)'],['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#a8d676eb9973ecba574a220cdef725577',1,'com.google.flatbuffers.FlatBufferBuilder.createString(ByteBuffer s)'],['../class_google_1_1_flat_buffers_1_1_flatbuffer_builder.html#ac54a8acfac1dda020b610da53b2d9a0f',1,'Google\FlatBuffers\FlatbufferBuilder\createString()'],['../class_flat_buffers_1_1_flat_buffer_builder.html#a3b6e42519f278e4a060895633d048070',1,'FlatBuffers.FlatBufferBuilder.CreateString()'],['../classflatbuffers_1_1_flat_buffer_builder.html#aec6f9df2a0366b540b24822414d92cbe',1,'flatbuffers::FlatBufferBuilder::CreateString(const char *str, size_t len)'],['../classflatbuffers_1_1_flat_buffer_builder.html#aad93d113ac24e86ed04b5236b3f4c0c5',1,'flatbuffers::FlatBufferBuilder::CreateString(const char *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ac51db9083ac815eb81420b6d51f42154',1,'flatbuffers::FlatBufferBuilder::CreateString(char *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a8c3af55e64f5cda9aefa38ac5287ef9f',1,'flatbuffers::FlatBufferBuilder::CreateString(const std::string &amp;str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a9a3a955fbff1c69e944c3560460dd7a6',1,'flatbuffers::FlatBufferBuilder::CreateString(flatbuffers::string_view str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ac0b6a1c5d949f20ad84367fc0f9e1506',1,'flatbuffers::FlatBufferBuilder::CreateString(const String *str)'],['../classflatbuffers_1_1_flat_buffer_builder.html#ab77d800e77fa76bc758a6c399fd37685',1,'flatbuffers::FlatBufferBuilder::CreateString(const T &amp;str)']]],
   ['createstruct',['CreateStruct',['../classflatbuffers_1_1_flat_buffer_builder.html#a43f51ba9c8f4f24ea2247a3979d095b8',1,'flatbuffers::FlatBufferBuilder']]],
   ['createuninitializedvector',['CreateUninitializedVector',['../classflatbuffers_1_1_flat_buffer_builder.html#ac2b96292fa0fb1534fe7fd218a094d0c',1,'flatbuffers::FlatBufferBuilder::CreateUninitializedVector(size_t len, size_t elemsize, uint8_t **buf)'],['../classflatbuffers_1_1_flat_buffer_builder.html#a2305b63d367845972b51669dd995cc50',1,'flatbuffers::FlatBufferBuilder::CreateUninitializedVector(size_t len, T **buf)']]],
   ['createunintializedvector',['createUnintializedVector',['../classcom_1_1google_1_1flatbuffers_1_1_flat_buffer_builder.html#acc889115f91460ca89ce981cb02c2039',1,'com::google::flatbuffers::FlatBufferBuilder']]],
diff --git a/search/pages_6.js b/search/pages_6.js
index 9c2265086da636eb7b58254ec179cd9781f83382..9a813ee95a41976d591b0b663de9a1aa6445ed69 100644
--- a/search/pages_6.js
+++ b/search/pages_6.js
@@ -3,10 +3,12 @@ var searchData=
   ['use_20in_20c_2b_2b',['Use in C++',['../flatbuffers_grpc_guide_use_cpp.html',1,'']]],
   ['use_20in_20c',['Use in C',['../flatbuffers_guide_use_c.html',1,'']]],
   ['use_20in_20c_2b_2b',['Use in C++',['../flatbuffers_guide_use_cpp.html',1,'']]],
+  ['use_20in_20dart',['Use in Dart',['../flatbuffers_guide_use_dart.html',1,'']]],
   ['use_20in_20go',['Use in Go',['../flatbuffers_guide_use_go.html',1,'']]],
   ['use_20in_20java_2fc_23',['Use in Java/C#',['../flatbuffers_guide_use_java_c-sharp.html',1,'']]],
   ['use_20in_20javascript',['Use in JavaScript',['../flatbuffers_guide_use_javascript.html',1,'']]],
   ['use_20in_20php',['Use in PHP',['../flatbuffers_guide_use_php.html',1,'']]],
   ['use_20in_20python',['Use in Python',['../flatbuffers_guide_use_python.html',1,'']]],
+  ['use_20in_20typescript',['Use in TypeScript',['../flatbuffers_guide_use_typescript.html',1,'']]],
   ['using_20the_20schema_20compiler',['Using the schema compiler',['../flatbuffers_guide_using_schema_compiler.html',1,'']]]
 ];
diff --git a/structflatbuffers_1_1_string-members.html b/structflatbuffers_1_1_string-members.html
index 6f10822b559f3dcba82f5f0182329944a7a08b07..f286c40476a134a5904db6d39d0b287c45b412f7 100644
--- a/structflatbuffers_1_1_string-members.html
+++ b/structflatbuffers_1_1_string-members.html
@@ -122,7 +122,8 @@ $(document).ready(function(){initNavTree('structflatbuffers_1_1_string.html','')
   <tr bgcolor="#f0f0f0"><td class="entry"><b>return_type</b> typedef (defined in <a class="el" href="classflatbuffers_1_1_vector.html">flatbuffers::Vector&lt; char &gt;</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_vector.html">flatbuffers::Vector&lt; char &gt;</a></td><td class="entry"></td></tr>
   <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>size</b>() const (defined in <a class="el" href="classflatbuffers_1_1_vector.html">flatbuffers::Vector&lt; char &gt;</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_vector.html">flatbuffers::Vector&lt; char &gt;</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
   <tr bgcolor="#f0f0f0"><td class="entry"><b>str</b>() const (defined in <a class="el" href="structflatbuffers_1_1_string.html">flatbuffers::String</a>)</td><td class="entry"><a class="el" href="structflatbuffers_1_1_string.html">flatbuffers::String</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
-  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>Vector</b>() (defined in <a class="el" href="classflatbuffers_1_1_vector.html">flatbuffers::Vector&lt; char &gt;</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_vector.html">flatbuffers::Vector&lt; char &gt;</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+  <tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>string_view</b>() const (defined in <a class="el" href="structflatbuffers_1_1_string.html">flatbuffers::String</a>)</td><td class="entry"><a class="el" href="structflatbuffers_1_1_string.html">flatbuffers::String</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
+  <tr bgcolor="#f0f0f0"><td class="entry"><b>Vector</b>() (defined in <a class="el" href="classflatbuffers_1_1_vector.html">flatbuffers::Vector&lt; char &gt;</a>)</td><td class="entry"><a class="el" href="classflatbuffers_1_1_vector.html">flatbuffers::Vector&lt; char &gt;</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
 </table></div><!-- contents -->
 </div><!-- doc-content -->
 <!-- Google Analytics -->
diff --git a/structflatbuffers_1_1_string.html b/structflatbuffers_1_1_string.html
index af4eefd0b87a8218781e4279f775076fd767ce1f..3bce5126911651918dde5d5c38f07f987d2d4c34 100644
--- a/structflatbuffers_1_1_string.html
+++ b/structflatbuffers_1_1_string.html
@@ -115,6 +115,9 @@ bool&#160;</td><td class="memItemRight" valign="bottom"><b>operator&lt;</b> (con
 <tr class="memitem:a4c49c553dfec1da5a6fd8852a97d508e"><td class="memItemLeft" align="right" valign="top"><a id="a4c49c553dfec1da5a6fd8852a97d508e"></a>
 std::string&#160;</td><td class="memItemRight" valign="bottom"><b>str</b> () const</td></tr>
 <tr class="separator:a4c49c553dfec1da5a6fd8852a97d508e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe0bd2ac1acd5616eda6d949e3c15e66"><td class="memItemLeft" align="right" valign="top"><a id="afe0bd2ac1acd5616eda6d949e3c15e66"></a>
+flatbuffers::string_view&#160;</td><td class="memItemRight" valign="bottom"><b>string_view</b> () const</td></tr>
+<tr class="separator:afe0bd2ac1acd5616eda6d949e3c15e66"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="inherit_header pub_methods_classflatbuffers_1_1_vector"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classflatbuffers_1_1_vector')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classflatbuffers_1_1_vector.html">flatbuffers::Vector&lt; char &gt;</a></td></tr>
 <tr class="memitem:ac1ab40cdffad6cd50c222fe42c51437b inherit pub_methods_classflatbuffers_1_1_vector"><td class="memItemLeft" align="right" valign="top"><a id="ac1ab40cdffad6cd50c222fe42c51437b"></a>
 <a class="el" href="structflatbuffers_1_1_vector_iterator.html">iterator</a>&#160;</td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
diff --git a/structflatbuffers_1_1_string.js b/structflatbuffers_1_1_string.js
index 80d5d76f65cfb9a20354959d023514e979ffe52e..277de057edc8dd490e465b716d6b9bfd7e5330fe 100644
--- a/structflatbuffers_1_1_string.js
+++ b/structflatbuffers_1_1_string.js
@@ -2,5 +2,6 @@ var structflatbuffers_1_1_string =
 [
     [ "c_str", "structflatbuffers_1_1_string.html#a4d0c586883282e5b93ddbb02f3d71eef", null ],
     [ "operator<", "structflatbuffers_1_1_string.html#a1028f4733cff070adae7d57bf4325726", null ],
-    [ "str", "structflatbuffers_1_1_string.html#a4c49c553dfec1da5a6fd8852a97d508e", null ]
+    [ "str", "structflatbuffers_1_1_string.html#a4c49c553dfec1da5a6fd8852a97d508e", null ],
+    [ "string_view", "structflatbuffers_1_1_string.html#afe0bd2ac1acd5616eda6d949e3c15e66", null ]
 ];
\ No newline at end of file
diff --git a/structflatbuffers_1_1_vector_iterator.html b/structflatbuffers_1_1_vector_iterator.html
index 7cb9e8f16743b6e8977835261170c13ff67f6cca..5b36c2db5e96b3c39b05ff35de302659905f2447 100644
--- a/structflatbuffers_1_1_vector_iterator.html
+++ b/structflatbuffers_1_1_vector_iterator.html
@@ -98,9 +98,9 @@ $(document).ready(function(){initNavTree('structflatbuffers_1_1_vector_iterator.
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a>
 Public Types</h2></td></tr>
-<tr class="memitem:a67b44f6c5e62b325e8cb4b91c99f60be"><td class="memItemLeft" align="right" valign="top"><a id="a67b44f6c5e62b325e8cb4b91c99f60be"></a>
-typedef uoffset_t&#160;</td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-<tr class="separator:a67b44f6c5e62b325e8cb4b91c99f60be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02c756cdd5ec038a978066c5761dd429"><td class="memItemLeft" align="right" valign="top"><a id="a02c756cdd5ec038a978066c5761dd429"></a>
+typedef ptrdiff_t&#160;</td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+<tr class="separator:a02c756cdd5ec038a978066c5761dd429"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ac9e9c7cb6d2cc0a69c22b954bb73dc42"><td class="memItemLeft" align="right" valign="top"><a id="ac9e9c7cb6d2cc0a69c22b954bb73dc42"></a>
 typedef std::random_access_iterator_tag&#160;</td><td class="memItemRight" valign="bottom"><b>iterator_category</b></td></tr>
 <tr class="separator:ac9e9c7cb6d2cc0a69c22b954bb73dc42"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -134,9 +134,9 @@ IT&#160;</td><td class="memItemRight" valign="bottom"><b>operator*</b> () const<
 <tr class="memitem:a368b4ee9b89ab783045f96a2f69dec67"><td class="memItemLeft" align="right" valign="top"><a id="a368b4ee9b89ab783045f96a2f69dec67"></a>
 <a class="el" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><b>operator+=</b> (const uoffset_t &amp;offset)</td></tr>
 <tr class="separator:a368b4ee9b89ab783045f96a2f69dec67"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a9418ef8352fb8010aa2173a46220225c"><td class="memItemLeft" align="right" valign="top"><a id="a9418ef8352fb8010aa2173a46220225c"></a>
-ptrdiff_t&#160;</td><td class="memItemRight" valign="bottom"><b>operator-</b> (const <a class="el" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other) const</td></tr>
-<tr class="separator:a9418ef8352fb8010aa2173a46220225c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a85a3748c7f97adba199d7421d9962941"><td class="memItemLeft" align="right" valign="top"><a id="a85a3748c7f97adba199d7421d9962941"></a>
+difference_type&#160;</td><td class="memItemRight" valign="bottom"><b>operator-</b> (const <a class="el" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a> &amp;other) const</td></tr>
+<tr class="separator:a85a3748c7f97adba199d7421d9962941"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a5d2754d1859696e7a6d43e74d4f9ae29"><td class="memItemLeft" align="right" valign="top"><a id="a5d2754d1859696e7a6d43e74d4f9ae29"></a>
 <a class="el" href="structflatbuffers_1_1_vector_iterator.html">VectorIterator</a>&#160;</td><td class="memItemRight" valign="bottom"><b>operator-</b> (const uoffset_t &amp;offset)</td></tr>
 <tr class="separator:a5d2754d1859696e7a6d43e74d4f9ae29"><td class="memSeparator" colspan="2">&#160;</td></tr>
diff --git a/structflatbuffers_1_1_vector_iterator.js b/structflatbuffers_1_1_vector_iterator.js
index 2805135df6c6f5f2014dae18c059bd56470aa97d..54e7f28e36a47d5f346f2c247a80f09cdae01e8b 100644
--- a/structflatbuffers_1_1_vector_iterator.js
+++ b/structflatbuffers_1_1_vector_iterator.js
@@ -1,6 +1,6 @@
 var structflatbuffers_1_1_vector_iterator =
 [
-    [ "difference_type", "structflatbuffers_1_1_vector_iterator.html#a67b44f6c5e62b325e8cb4b91c99f60be", null ],
+    [ "difference_type", "structflatbuffers_1_1_vector_iterator.html#a02c756cdd5ec038a978066c5761dd429", null ],
     [ "iterator_category", "structflatbuffers_1_1_vector_iterator.html#ac9e9c7cb6d2cc0a69c22b954bb73dc42", null ],
     [ "pointer", "structflatbuffers_1_1_vector_iterator.html#a74d61458dfc1c25d94f80cae8cebaa2a", null ],
     [ "reference", "structflatbuffers_1_1_vector_iterator.html#acb8ab7ba9e8ce289a1c8234e872c708b", null ],
@@ -13,7 +13,7 @@ var structflatbuffers_1_1_vector_iterator =
     [ "operator++", "structflatbuffers_1_1_vector_iterator.html#a5fae31cf992a81412140a17dde196890", null ],
     [ "operator++", "structflatbuffers_1_1_vector_iterator.html#a428a3df67f852563e25a040e41f3aef9", null ],
     [ "operator+=", "structflatbuffers_1_1_vector_iterator.html#a368b4ee9b89ab783045f96a2f69dec67", null ],
-    [ "operator-", "structflatbuffers_1_1_vector_iterator.html#a9418ef8352fb8010aa2173a46220225c", null ],
+    [ "operator-", "structflatbuffers_1_1_vector_iterator.html#a85a3748c7f97adba199d7421d9962941", null ],
     [ "operator-", "structflatbuffers_1_1_vector_iterator.html#a5d2754d1859696e7a6d43e74d4f9ae29", null ],
     [ "operator--", "structflatbuffers_1_1_vector_iterator.html#ae33269dea219a9a690f00c23d67c0208", null ],
     [ "operator--", "structflatbuffers_1_1_vector_iterator.html#a105a4e408b45c324f2ad445f5145bf51", null ],
diff --git a/usergroup0.html b/usergroup0.html
index fcf61b126e05c4732452e979e99871e8975f7ef1..fe2b9b969611f0a8230d02289aa7c1f507b1ad26 100644
--- a/usergroup0.html
+++ b/usergroup0.html
@@ -101,9 +101,10 @@ $(document).ready(function(){initNavTree('usergroup0.html','');});
 <li><a href="flatbuffers_guide_use_go.html"><span>Use&#160;in&#160;Go</span></a></li>
 <li><a href="flatbuffers_guide_use_java_c-sharp.html"><span>Use&#160;in&#160;Java/C#</span></a></li>
 <li><a href="flatbuffers_guide_use_javascript.html"><span>Use&#160;in&#160;JavaScript</span></a></li>
-<li><a href="@ref flatbuffers_guide_use_typescript"><span>Use&#160;in&#160;TypeScript</span></a></li>
+<li><a href="flatbuffers_guide_use_typescript.html"><span>Use&#160;in&#160;TypeScript</span></a></li>
 <li><a href="flatbuffers_guide_use_php.html"><span>Use&#160;in&#160;PHP</span></a></li>
 <li><a href="flatbuffers_guide_use_python.html"><span>Use&#160;in&#160;Python</span></a></li>
+<li><a href="flatbuffers_guide_use_dart.html"><span>Use&#160;in&#160;Dart</span></a></li>
 <li><a href="flexbuffers.html"><span>Schema-less&#160;version</span></a></li>
 <li><a href="usergroup1.html"><span>gRPC</span></a></li>
 </ul>